lunedì 8 novembre 2010

Gestione del BreakEven Stop in metatrader: portare lo stop a BE

Durante lo sviluppo di un expert advisor capita spesso di dover modificare i valori degli ordini aperti in metatrader ed in particolare di dover spostare lo StopLoss.

Le richieste più frequenti nel forex e nel trading in generale riguardano la gestione di:
- trailing stop: spostare lo stop loss in gain man mano che il profitto della posizione aumenta;
- breakeven stop: spostare lo stop allo stesso valore del prezzo di apertura quando si è in profitto di un certo numero di pips. In questo modo si elimina completamente il rischio di chiudere l'operazione in negativo.

Lo scopo di questo articolo non è quello di analizzare vantaggi e svantaggi delle due tecniche di money management ma è quello di mostrare una possibile realizzazione del breakeven stop in mql.

Andiamo ad analizzare la nostra funzione BreakEvenStop():

void BreakEvenStop(){
   //Lo stop si trova già a BE?
   if (OrderOpenPrice() == OrderStopLoss())
      return(0);

   if (OrderType() == OP_BUY)
    if ((Bid - OrderOpenPrice()) > (e_BreakEvenStop * g_Point)){
         OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Green);
         return(0);
    }
  if (OrderType() == OP_SELL)
    if ((OrderOpenPrice() - Ask) > (e_BreakEvenStop * g_Point)){
         OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red);
         return(0);
    }
}

Per prima cosa si verifica se lo stop loss è già impostato al prezzo di apertura della posizione, in questo caso si termina l'esecuzione della funzione perchè lo stop si trova già a BE.

In caso contrario si prosegue nei successivi controlli e, se l'operazione risulta in gain di un certo numero di pips (valore impostato dalla variabile esterna e_BreakEvenStop), si procede con la modifica dell'ordine.

Nel caso in cui l'ea gestisca un solo ordine alla volta è possibile richiamare questa funzione all'inizio della funzione start():

int v_total = OrdersTotal();
if(v_total<1) {
// no opened orders identified
if(AccountFreeMargin()<(1000*e_Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
}
else{
int v_i = 0;
while (v_i < v_total){
//posizioni aperte? (ricerca per MagicID)
if((OrderSelect(v_i, SELECT_BY_POS, MODE_TRADES)==true) && (OrderMagicNumber() == e_MagicID)){
if (e_BreakEvenStop > 0){
//gestione stop a BE
BreakEvenStop();
return(0);
}
}
v_i++;
}
}
 

0 commenti:

Posta un commento