domenica 30 gennaio 2011

La progressione di D'Alembert applicata al Money Management

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<hstTotal; 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
 

2 commenti:

carlo10 ha detto...

Mi sono dimenticato di dire che l'indicatore e la funzione accettano 2 variabili esterne in ingresso:

- il Magic Number in modo da applicare la progressione solo sulle operazioni del nostro expert advisor;

- lo scarto iniziale nel caso in cui si voglia simulare una partenza con uno scarto differente da 0.

emanuele ha detto...

ciao volevo chiederti se tu lo applichi a qualche tuo expert advisor ....puoi scrivermi via email a fiorefederik@libero.it

Posta un commento