Implementare un Trailing Stop in MetaTrader 5: Guida Pratica per Trader

Mike 2024.04.05 07:09 17 0 0
Allegato

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"               }            }         }      }










    Elenco
    Commento 0