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);
}
}
//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++;
}
}
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