Como Usar o Trailing Stop com MagicNumber no MetaTrader 4

Mike 2021.03.30 22:17 14 0 0
Anexo


O trailing stop é uma ferramenta incrível que ajuda a proteger nossos lucros, ajustando automaticamente o stop loss para a área de lucro. Isso garante que possamos sempre garantir nossas operações com mais segurança.

Vamos começar definindo os parâmetros de entrada para o trailing stop no código.

input    bool     isTrailingStop = true;  //Ativar Trailing Stop
input    int      trailingStart  = 15;    //Início do Trailing (pips)
input    int      trailingStep   = 5;     //Passo do Trailing (pips)

input    int      MagicNumber = 0;        //Número Mágico


Agora, vamos definir uma variável global:

//Variável Global
double   myPoint    = 0.0;


Quando executamos este Expert Advisor, a função OnInit() será chamada pela primeira vez, onde validaremos e inicializaremos as variáveis de entrada.

int OnInit()
  {
  
   if (isTrailingStop && trailingStart <= 0){
      Alert ("Parâmetros incorretos");
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint     = GetPipPoint(Symbol());
   
   return(INIT_SUCCEEDED);
  }


A cada movimento de preço (tick) no gráfico onde este EA está emparelhado, a função OnTick() será executada. Dentro dela, chamaremos a função setTrailingStop().

void OnTick()
  {
//---
   setTrailingStop(MagicNumber);
   
  }


A função setTrailingStop() é onde a mágica acontece:

void setTrailingStop(int magicNumber=0){
   if (isTrailingStop==false) return;
   
   int      tOrder = 0;
   string   pair = "";
   double   sl = 0.0, tp = 0.0;
   
   pair = Symbol();
   
   tOrder = OrdersTotal();
   for (int i=tOrder-1; i>=0; i--){
      bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){
         if (OrderType() == OP_BUY){
            if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice()
                  && (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() )
                ){
               sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                  Print ("#", OrderTicket(), " falha ao atualizar sl");
               }
            }
         }
         
         if (OrderType() == OP_SELL){
            if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice()
                  && ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0)
               )
            {
               sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() );
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                  Print ("#", OrderTicket(), " falha ao atualizar sl");
               }
            }
         }
      } //fim do if magicNumber
   }//fim do for
}


Outra função padrão necessária é a GetPipPoint():

// Função GetPipPoint
double GetPipPoint(string pair)
{
   double point= 0.0;
   int digits = (int) MarketInfo(pair, MODE_DIGITS);
   if(digits == 2 || digits== 3) point= 0.01;
   else if(digits== 4 || digits== 5) point= 0.0001;
   return(point);
}


Se você tiver alguma dúvida, fique à vontade para deixar nos comentários ou junte-se ao nosso grupo de compartilhamento t.me/codeMQL (em português).


Não se esqueça de conferir o nosso aplicativo SignalForex!

Você pode nos apoiar baixando e usando o aplicativo SignalForex para tornar suas operações ainda mais lucrativas.

https://play.google.com/store/apps/details?id=com.autobotfx.signalforex



    Lista
    Comentário 0