- chiusura dell'ordine per raggiungimento di take profit o stop loss;
- chiusura dell'ordine in seguito a determinati eventi, ad esempio l'incorcio di due medie mobili o altre condizioni.
Nel secondo caso in particolare si possono verificare dei casi per cui il segnale di ingresso è ancora valido e l'ordine viene quindi chiuso ripetutamente ogni volta che se ne apre uno nuovo.
A seconda della strategia adottata una possibile soluzione può essere quella di non aprire nuovi ordini su di una candela se esiste già un ordine chiuso nella stessa barra.
A questo fine si rivelano molto utili due funzioni di metatrader:
- OrdersHistoryTotal: restituisce il numero di ordini già chiusi presenti all'interno del tab History di metatrader;
- iBarShift: restituisce il numero della candela più vicina all'orario che viene passato come parametro (nel nostro caso utilizzeremo la funzione OrderOpenTime dopo aver selezionato l'ordine che ci interessa).
bool isLastOrderCandle(){
//TRUE è già stato aperto un ordine su questa candela
//FALSE non sono stati aperti ordini su questa candela
int v_LastOrderHistory = OrdersHistoryTotal() - 1;
if (OrderSelect(v_LastOrderHistory, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == e_MagicID))
if (iBarShift(NULL, 0, OrderOpenTime(), true) == 0)
return(True);
return(False);
}
//TRUE è già stato aperto un ordine su questa candela
//FALSE non sono stati aperti ordini su questa candela
int v_LastOrderHistory = OrdersHistoryTotal() - 1;
if (OrderSelect(v_LastOrderHistory, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == e_MagicID))
if (iBarShift(NULL, 0, OrderOpenTime(), true) == 0)
return(True);
return(False);
}
Come potete osservare il controllo si basa esclusivamente sul fatto che la candela restituita da iBarShift sia la numero 0. Lo zero, in questo caso, significa che sulla barra attualmente in formazione è già stato effettuato un trade.
E' possibile integrare questa funzione all'interno dello start dell'expert advisor nell'area dedicata ai controlli per l'apertura di un nuovo ordine oppure subito prima di questa in modo da terminare l'esecuzione dello start, di seguito un possibile esempio:
start(){
....
//gestione ordini aperti
...
if (isLastOrderCandle)
return(0);
...
//apertura nuovi ordini
...
}
....
//gestione ordini aperti
...
if (isLastOrderCandle)
return(0);
...
//apertura nuovi ordini
...
}
Ovviamente esistono modi differenti per fare la stessa cosa, voi quale preferite?
No comments:
Post a Comment