Stop Movel não funciona

 

Boa noite pessoal.


Blz?


Estou usando duas médias para trailing stop.

Uma média com valores de máximas para posições vendedoras e uma de mínimas para posições compradoras.

Após o acionamento do break even as médias vão se aproximando da posição de entrada e quando ultrapassam o stop movel começa a seguir á media correspondente da posição.

O problema é que o stop movel não acompanha as médias depois que elas ultrapassam a entrada.


Aqui o stop deveria ter acompanhado a média, mas ficou parado.


Já tentei de tudo mas não sei onde esta o problema.


Alguém poderia, por favor, me ajudar?

Ficaria muito grato.


Segue meu ontick e o método de stopmovel:


void OnTick()
  {
   if(!simbolo.RefreshRates())
      return;

   CopyRates(_Symbol, _Period, 0, 4, rates);

   if(SemPosicao())
     {
      int resultadoLogica;
      resultadoLogica = LogicaSinal();

      if(resultadoLogica == 1)
        {
         Compra(lote, "Abertura de Compra Stop", SL, TP);
        }

      if(resultadoLogica == -1)
        {
         Venda(lote, "Abertura de Venda Stop.", SL, TP);
        }
     }

// Print("Média Máximas: " + maximasArray[0]);
//  Print("Média Minimas: " + minimasArray[0]);


//Break Even
   if(!SemPosicao() && !beAtivo && gatilhodeBE > 0)
      BreakEven();


//Trailling Stop
   if(!SemPosicao() && beAtivo)
     {
      double valorMediaMinimas = simbolo.NormalizePrice(minimasArray[0]);
      double valorMediaMaximas = simbolo.NormalizePrice(maximasArray[0]);
      TraillingStop(valorMediaMinimas, valorMediaMaximas);
     }


   if(HoraFechamento())
     {
      Comment("Horário de Fechamento de Posições", "\nHora atual: ", horaAtual.hour, "\nMinutos Atual: ", horaAtual.min);
      FechaPosicao();
     }
   else
      if(HoraNegociacao())
        {
         Comment("Dentro do horário de negociação!", "\nHora atual: ", horaAtual.hour, "\nMinutos Atual: ", horaAtual.min);
        }
      else
        {
         Comment("Fora do horário de negociação!", "\nHora atual: ", horaAtual.hour, "\nMinutos Atual: ", horaAtual.min);
        }

  }

Aqui o código do meu stopmovel:


void TraillingStop(double valorMediaMinimas, double valorMediaMaximas)
  {
   ulong ticket = PositionGetInteger(POSITION_TICKET);
   double stoploss=PositionGetDouble(POSITION_SL);
   double precoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);


   if(TipoPosicao() == 1)
     {
      if(precoEntrada > valorMediaMinimas && valorMediaMinimas > stoploss)
        {
         if(TP > 0)
           {
            double takeprofit = PositionGetDouble(POSITION_TP);
            double novoSL = valorMediaMinimas;
            trade.PositionModify(ticket, novoSL, takeprofit);
            Print("Stoploss de compra Alterado");
           }
         else
           {
            double novoSL = valorMediaMinimas;
            trade.PositionModify(ticket, novoSL, TP);
            Print("Stoploss de compra Alterado");
           }
        }
      else
        {
         if(simbolo.Last() > valorMediaMaximas)
           {
            if(TP > 0)
              {
               double takeprofit = PositionGetDouble(POSITION_TP);
               double novoSL = valorMediaMinimas;
               trade.PositionModify(ticket, novoSL, takeprofit);
               Print("Stoploss de compra Alterado");
              }
            else
              {
               double novoSL = valorMediaMinimas;
               trade.PositionModify(ticket, novoSL, TP);
               Print("Stoploss de compra Alterado");
              }
           }
        }
     }

   if(TipoPosicao() == -1)
     {
      if(precoEntrada < valorMediaMaximas)
        {
         if(valorMediaMaximas < stoploss)
           {
            if(TP > 0)
              {
               double takeprofit = PositionGetDouble(POSITION_TP);
               double novoSL = valorMediaMaximas;
               trade.PositionModify(ticket, novoSL, takeprofit);
               Print("Stoploss de venda Alterado");
              }
            else
              {
               double novoSL = valorMediaMaximas;
               trade.PositionModify(ticket, novoSL, TP);
               Print("Stoploss de venda Alterado");
              }
           }
        }
      else
        {
         if(simbolo.Last() < valorMediaMinimas)
           {
            if(TP > 0)
              {
               double takeprofit = PositionGetDouble(POSITION_TP);
               double novoSL = valorMediaMaximas;
               trade.PositionModify(ticket, novoSL, takeprofit);
               Print("Stoploss de venda Alterado");
              }
            else
              {
               double novoSL = valorMediaMaximas;
               trade.PositionModify(ticket, novoSL, TP);
               Print("Stoploss de venda Alterado");
              }
           }
        }

     }
  }
 

PROBLEMA COM OS STOPS GAIN, LOSS E MOVEL

NAO  CONECTAM, NAO FUNCIONAM E NEM 

APARECEM NA PLATAFORMA MT 5

0 QUE FAZER

 

OS STOPS NAO CONECTAM META TRADER 5


ME AJUDA


SOU INICIANTE

 
João Bernardes:

Boa noite pessoal.


Blz?


Estou usando duas médias para trailing stop.

Uma média com valores de máximas para posições vendedoras e uma de mínimas para posições compradoras.

Após o acionamento do break even as médias vão se aproximando da posição de entrada e quando ultrapassam o stop movel começa a seguir á media correspondente da posição.

O problema é que o stop movel não acompanha as médias depois que elas ultrapassam a entrada.


Aqui o stop deveria ter acompanhado a média, mas ficou parado.


Já tentei de tudo mas não sei onde esta o problema.


Alguém poderia, por favor, me ajudar?

Ficaria muito grato.


Segue meu ontick e o método de stopmovel:


Aqui o código do meu stopmovel:


É preciso selecionar a posição antes de solicitar as propriedades da posição. Verifique o retorno das funções, e o log no terminal.

Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Samuel Manoel De Souza:

É preciso selecionar a posição antes de solicitar as propriedades da posição. Verifique o retorno das funções, e o log no terminal.

Ative o log mais verboso da classe Trade e se nao quiser fazer isso log GetLastError(). Uma coisa que aviso sempre quando da erro de stop, muitas vezes quer dizer que nao esta sendo obdecido o stop level (algumas corretoras definem que o stop deve ficar no minimo perto em X pontos que o X eh o stop level).
 

O erro está na sua condicional.

Você colocou o seguinte: 

if(precoEntrada > valorMediaMinimas && valorMediaMinimas > stoploss)

Quando o seu stop móvel chegar ao preço de entrada ele não será movido porque você restringiu o seu preço de entrada a ser maior que o ValorMediaMinimas. Ou seja, quando seu preço de entrada for menor ou igual ao valorMediaMinimas não ocorrerá nada.


Você pode arrumar fazendo da seguinte forma:

if((precoEntrada != valorMediaMinimas || precoEntrada == valorMediaMinimas)  && valorMediaMinimas > stoploss)

Dessa forma o seu stop móvel será movido quando o seu stop loss for menor, igual ou maior que o seu preço de entrada.