Alteração de posição - TP e SL

 

Olá pessoal



Fiz um EA e utilizei a biblioteca padrão CTrade para envio de ordens a mercado, porém quando tento fazer a modificação da posição, em alguns momentos apenas, a ordem é modificada, em outros casos simplesmente não é alterada os alvos. Segue o trecho que faço a execução da ordem e aciono a função para inserir os alvos. Alguém tem alguma orientação sobre uma rotina melhor do tratamento desse retorno? 

* Rodei o EA pela conta de produção da Modalmais (não sei se influencia muito a execução pela corretora)


Obrigado

 if(PositionsTotal() == 0 && OrdersTotal() == 0){
     
        
     
         if(trade.Sell(lot, Symbol(), 0, 0, 0, "Venda")){
            addTakeStop2(SL,TP);
         }
     }




void addTakeStop2(double p_sl, double p_tp)
  {
  Print("Adiona o modificador");

   for(int i = PositionsTotal() -1; i>=0; i--)
     {
      string symbol = PositionGetSymbol(i);


      if(symbol == Symbol())
        {

         ulong ticket = PositionGetInteger(POSITION_TICKET);
         double entryPrice = PositionGetDouble(POSITION_PRICE_OPEN);

         double newSL;
         double newTP;
         
         Print("POSITION TYPE: ", PositionGetInteger(POSITION_TYPE));


         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
           {

            newSL = NormalizeDouble(entryPrice - (p_sl *_Point), _Digits);
            newTP =  NormalizeDouble(entryPrice + (p_tp *_Point), _Digits);

            Print("Modificando posição");
            Print("Novo newSL", newSL);
            Print("Novo TP", newTP);
            trade.PositionModify(ticket, newSL, newTP);
           }
         else
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
              {

               newSL = NormalizeDouble(entryPrice + (p_sl *_Point), _Digits);
               newTP =  NormalizeDouble(entryPrice - (p_tp *_Point), _Digits);
               Print("Modificando posição");
            Print("Novo newSL", newSL);
            Print("Novo TP", newTP);
               trade.PositionModify(ticket, newSL, newTP);
              }
        }
     }

  }
Documentação sobre MQL5: Biblioteca Padrão
Documentação sobre MQL5: Biblioteca Padrão
  • www.mql5.com
Biblioteca Padrão - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Felipe Lisboa:


Olá

bom, você não mostrou o log, mas passe a usar NormalizePrice() para ajustar o preço corretamente ao TickSize


#include <Trade\SymbolInfo.mqh>         CSymbolInfo       cSymbol;

            newSL = cSymbol.NormalizePrioe(entryPrice - (p_sl *_Point));
            newTP = cSymbol.NormalizePrioe(entryPrice + (p_tp *_Point);


Se continuar dando problema anexe o log diário.

 
Rogerio Giannetti Torres #:

Olá

bom, você não mostrou o log, mas passe a usar NormalizePrice() para ajustar o preço corretamente ao TickSize



Se continuar dando problema anexe o log diário.

Vou ajustar e verificar novamente, muito obrigado pela orientação Rogerio

 

Olá @Rogerio Giannetti Torres 


Fiz o ajuste do preço e a ordem não foi modificada. Até fiz um trace para ver se a função foi acionada, mas o modificador não dá nenhum sinal de execução, e nem de erro. 


Log diário

 
Olá @ Rogerio Giannetti Torres



Identifiquei que o PositionsTotal() estava retornando zerado e coloquei uma função sleep de 2s para acionar a modificação da posição. Vou dar uma olhada para resolver de forma assíncrona, que deve resolver da forma mais correta.


Muito obrigado pelas dicas.

Rogerio Giannetti Torres
Rogerio Giannetti Torres
  • www.mql5.com
Perfil do Trader
 

Olá Felipe!


Só um detalhe, não sei se você confere se o take profit e o stop loss são válidos. Veja esse artigo:


https://www.mql5.com/pt/articles/2555#invalid_SL_TP_for_position


Att,

Que testes deve passar o robô de negociação antes da publicação no Mercado
Que testes deve passar o robô de negociação antes da publicação no Mercado
  • www.mql5.com
Todos os produtos do Mercado, antes de serem publicados, passam uma revisão preliminar obrigatória para garantir um único padrão de qualidade. Neste artigo, vamos falar sobre os erros mais comuns que os desenvolvedores cometem ao trabalhar com os seus indicadores técnicos e robôs de negociação. Além disso, mostraremos como testar por si mesmo o seu produto antes de enviá-lo para o Mercado.
 
Edson Cavalca Junior #:

Olá Felipe!


Só um detalhe, não sei se você confere se o take profit e o stop loss são válidos. Veja esse artigo:


https://www.mql5.com/pt/articles/2555#invalid_SL_TP_for_position


Att,

Olá Edson, muito obrigado pela dica! bem completo essa orientação para evitar esse problema :)