Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Telegram!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Experts

Code Block for "Trailing Stop" based on current market price. (Ask / Bid) - expert para MetaTrader 5

Visualizações:
108
Avaliação:
(5)
Publicado:
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Esse bloco de código funciona se você usar um Stop Loss ou não.


Requisitos

  • Você precisa incluir "Trade.mqh" para ter acesso à classe CTrade, que permite trabalhar com posições e ordens.

#include <Trade\Trade.mqh> <<------------------------------------------> Inclua este "Trade.mqh" para acessar a classe CTrade 

  • Você precisa definir um parâmetro de entrada para ajustar a distância de arrasto conforme desejar. Isso não é necessário, mas é conveniente.
input double Traling_Step = 3.0;
  • Você precisa definir a instância da classe CTrade. O nome pode ser qualquer um. Seria melhor defini-la após o manipulador de eventos OnInt .

  • Em seguida, você precisa criar uma instrução if para verificar se há alguma posição em execução no momento. Essa instrução chama a função Check_TrailingStop(); para cada tick. Isso é importante porque o EA deve fazer uma trilha nítida e suave. Lembre-se de colocar essa instrução na parte superior do manipulador de eventos OnTick para que funcione corretamente.
//+------------------------------------------------------------------+
//| Função de inicialização especializada|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- criar cronômetro
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }


CTrade trade; // <<------------------------------------------ Declare a chamada "CTrade". Você pode substituir "trade" por qualquer nome que desejar.
void OnTick()
  {
   
   if(PositionsTotal() > 0) // chama a função de trailing stop para cada tick se houver posições em execução. 
     {
      Check_TralingStop(); 
     } 
     
       
  }

  • Você precisa declarar uma função personalizada chamada Check_TrailingStop(); ( neste caso) para fazer o resto. Você pode usar o nome que quiser.
  • A função personalizada percorre todas as posições abertas e as rastreia conforme a distância necessária.
void Check_TralingStop()
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // Obter o número do tíquete de posição usando o 'índice' da posição.

      if(PositionSelectByTicket(TicketNo)) // Selecione uma posição usando o número do tíquete (já escolhemos o número do tíquete)
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Verificar a posição Type.
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<-------------------Get Position Current Stop Loss
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Nenhum stop loss é verdadeiro.
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // É executado apenas uma vez por posição. Define o primeiro SL.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar o trailing stop usando "CTrade.trade"
              }


            if(bidPrice > openPrice && trailingLevel > stopLoss) // verificar se o nível final está acima do nível anterior.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar o 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 + (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Nenhum stop loss é verdadeiro.
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // É executado apenas uma vez por posição. Define o primeiro SL.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar o trailing stop usando "CTrade.trade"
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // verificar se o nível final está acima do nível anterior.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar o trailing stop usando "CTrade.trade"
              }
           }

        }
     }
  }










    Traduzido do inglês pela MetaQuotes Ltd.
    Publicação original: https://www.mql5.com/en/code/49021

    PHSB Screener PHSB Screener

    This Screener was created to simplify the process of finding assets trading at discounted prices. Initial usage may take slightly longer due to the data loading process for all selected instruments. The tool can scan all available broker assets or be limited to specific asset classes.

    ConvertServerTime ConvertServerTime

    Função para converter a hora do servidor de um fuso horário do corretor para outro.

    Simple Code for Detect  A  "New Bar or New Candle " Received Simple Code for Detect A "New Bar or New Candle " Received

    Esse bloco de código detecta uma New Bar ou uma New Candle quando ela é recebida.

    Logarithmic Moving Average Logarithmic Moving Average

    A Média Móvel Logarítmica calcula continuamente a média logarítmica do preço mais alto e do preço mais baixo em um período.