Tuesday, May 17, 2011

La progressione di D'Alembert applicata al Money Management

type="html">


In questo articolo andiamo ad analizzare una tecnica di money management che sfrutta la progressione di D'Alembert, di seguito un esempio per capire come funziona:

Regole: le posizioni vengono chiuse esclusivamente per il raggiungimento dello stop loss o del take profit impostato in questo caso a 100 pips:
  1. operazione negativa 1 lot = -100 pip = scarto -1
  2. operazione negativa 2 lot = -200 pip = scarto -2
  3. operazione positiva 3 lot = +300 pip = scarto -1
  4. operazione negativa 2 lot = -200 pip = scarto -2
  5. operazione positiva 3 lot = +300 pip = scarto -1
  6. operazione negativa 2 lot = -200 pip = scarto -2
  7. ........

Quello che vogliamo realizzare è un'indicatore che ci fornisca lo scarto attuale in modo da richiamarlo con la funzione iCustom all'interno dei nostri expert advisor in modo da calcolare dinamicamente il numero di lotti da utilizzare in ogni operazione. La chiamata da utilizzare all'interno degli ea sarà la seguente:

int scarto = iCustom( NULL, 0, "Progressione_DAlembert", MagicNumber, 0, 0, 0);

Ho verificato che l'indicatore non funziona in modalità di backtest perchè le funzioni OrdersHistory vanno in ogni caso a prelevare gli ordini del conto demo/reale e non quelle generate in fase di backtest. Per simulare correttamente un backtest in metatrader è necessario quindi integrare la seguente funzione all'interno del consigliere esperto:

extern   int   MagicID  = 0;
extern   int   scarto   = 0;

string FontName="Verdana";
int    FontSize=10;
color  FontColor=White;
int    Corner2=0;
int    XDistance=5;
int    YDistance=100;
int    lastTicket = 0;


int init(){
   return(0);
}

int deinit(){
   return(0);
}

int start(){
   Print("Scarto D\'Alembert: ", ScartoDAlembert());
   return(0);
}

int ScartoDAlembert(){
   int hstTotal=OrdersHistoryTotal();
   Print("hstTotal: ", hstTotal);
   for(int i=0; i      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicID){
         if (lastTicket < OrderTicket() && OrderType() != 6 && OrderType() != 7){
            if (OrderProfit() > 0)
               scarto++;
            if (OrderProfit() < 0)
               scarto--;
            lastTicket = OrderTicket();
         }
      }          
   }
  
   if (ObjectFind("Scarto") != -1) ObjectDelete("Scarto");
   ObjectCreate("Scarto", OBJ_LABEL, 0, 0, 0);
   ObjectSet("Scarto", OBJPROP_CORNER, Corner2);
   ObjectSet("Scarto", OBJPROP_XDISTANCE, XDistance);
   ObjectSet("Scarto", OBJPROP_YDISTANCE, YDistance);
   ObjectSetText("Scarto", StringConcatenate("Scarto: ", scarto) , FontSize, FontName, FontColor);
  
   return(scarto);
}      

Di seguito i link per scaricare l'indicatore:
Sorgente: Progressione_DAlembert.mq4
Eseguibile: Progressione_DAlembert.ex4

No comments:

Post a Comment