Questo codice funziona sia che utilizziate un Stop Loss, sia che non lo facciate.
Requisiti
- È necessario includere "Trade.mqh" per avere accesso alla classe CTrade, che permette di lavorare con le posizioni e gli ordini.
#include <Trade\Trade.mqh> // <<------------------------------------------ Includi "Trade.mqh" per accedere alla classe CTrade
- È necessario impostare un parametro di input per regolare la distanza del trailing come desiderate. Questo non è obbligatorio, ma è comodo.
input double Trailing_Step = 3.0;
- È necessario definire un'istanza della classe CTrade. Il nome può essere qualsiasi. È consigliabile definirla dopo l'OnInit event handler.
- Poi, dovete creare un if statement per controllare se ci sono posizioni aperte al momento. Questa condizione chiama la funzione Check_TrailingStop(); ad ogni tick. Questo è fondamentale perché l'EA deve seguire il prezzo in modo preciso e fluido. Ricordate di posizionare questa condizione all'inizio dell'evento OnTick per farla funzionare correttamente.
//+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'Expert | //+------------------------------------------------------------------+ int OnInit() { //--- crea un timer EventSetTimer(60); //--- return(INIT_SUCCEEDED); } CTrade trade; // <<------------------------------------------ Dichiara la classe "CTrade". Puoi sostituire "trade" con qualsiasi nome tu voglia
void OnTick() { if(PositionsTotal() > 0) // chiama la funzione di trailing stop per ogni tick se ci sono posizioni aperte. { Check_TrailingStop(); } }
- Dovete dichiarare una funzione personalizzata chiamata Check_TrailingStop(); (in questo caso) per completare il resto. Potete usare qualsiasi nome desideriate.
- La funzione personalizzata scorre tutte le posizioni aperte e le segue alla distanza richiesta.
void Check_TrailingStop() { int totalPositions = PositionsTotal(); for(int count =0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // Ottieni il numero di ticket della posizione usando l'indice della posizione. if(PositionSelectByTicket(TicketNo)) // Seleziona una posizione usando il numero di ticket { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Controlla il tipo di posizione. { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); // <<-------------------Ottieni il valore attuale dello Stop Loss double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol,SYMBOL_BID); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(bidPrice - (Trailing_Step * Point()),_Digits); if(stopLoss < openPrice) // Se non esiste Stop Loss { if(bidPrice > openPrice && trailingLevel > openPrice) // Eseguito una sola volta per posizione. Imposta il primo SL. trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica il Trailing Stop usando "CTrade.trade" } if(bidPrice > openPrice && trailingLevel > stopLoss) // controlla se il livello di trailing è sopra il livello precedente. { trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica il Trailing Stop usando "CTrade.trade" } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol,SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol,SYMBOL_ASK); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(askPrice + (Trailing_Step * Point()),_Digits); if(stopLoss < openPrice) // Se non esiste Stop Loss { if(askPrice < openPrice && trailingLevel < openPrice) // Eseguito una sola volta per posizione. Imposta il primo SL. trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica il Trailing Stop usando "CTrade.trade" } if(askPrice < openPrice && trailingLevel < stopLoss) // controlla se il livello di trailing è sopra il livello precedente. { trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica il Trailing Stop usando "CTrade.trade" } } } }
Commento 0