Take Profit e Stop Loss não estão sendo ativados na conta real

 

Comecei a testar um robo na conta real hoje, mas o take profit e stoploss não estão sendo ativados. 

Na demo ele funciona normalmente com o take e stop. Mas na real não. Niveis de negociação estão ativados.

Segue o log diario e o código:

CH 0 12:19:00.401 Trades '7760778': exchange buy 1 WING22 at market

CS 0 12:19:00.479 Trades '7760778': accepted exchange buy 1 WING22 at market

FS 0 12:19:00.480 Trades '7760778': exchange buy 1 WING22 at market placed for execution (Order received. Sending to OMS.)

FP 0 12:19:00.486 Trades '7760778': order #1661609335 buy 1 / 1 WING22 at market done in 85.655 ms

KH 0 12:19:00.490 Trades '7760778': deal #280242707 buy 1 WING22 at 108685 done (based on order #1661609335)

CE 0 12:19:05.832 Trades '7760778': modify #1661609335 buy 1 WING22 sl: 0, tp: 0 -> sl: 0, tp: 108710

MQ 0 12:19:05.856 Trades '7760778': accepted modify #1661609335 buy 1 WING22 sl: 0, tp: 108710 -> sl: 0, tp: 108710

DR 0 12:19:05.856 Trades '7760778': modify #1661609335 buy 1 WING22 -> sl: 0, tp: 108710 done in 24.085 ms

KQ 0 12:19:12.756 Trades '7760778': deal #280242989 sell 1 WING22 at 108710 done (based on order #1661611340)

JO 2 12:19:13.847 Trades '7760778': failed modify #0 buy 0  sl: 0.00000, tp: 0.00000 -> sl: 108530.00000, tp: 108710.00000 [Invalid request]


ABAIXO O CÓDIGO:

//+------------------------------------------------------------------+
//|                                                      RSIFFFD.mq5 |
//|                                                     TupetiTrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "TupetiTrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;

sinput group "----- Informações do Indicador"
input int                     Periodo_RSI = 3; //PERIODO DO RSI
input ENUM_APPLIED_PRICE      rsi_preco = PRICE_CLOSE;                    //Tipo de Entrada
input ENUM_ORDER_TYPE_FILLING preenchimento = ORDER_FILLING_RETURN;       //Preenchimento da Ordem

sinput group "----- Parâmetros de Negociação"
input ulong                   magicNum = 123456;                          //Magic Number
input ulong                   desvPts = 15;                               //Desvio em Pontos
input double                  takeProfit = 150;
input double                  stopLoss = 150;
input double                  gatilhoBE = 50;                             //Break Even
input double                  gatilhoTS = 60;                             //TraillingStop
input double                  stepTS = 20;                                //Step TraillingStop

sinput group "----- Horário de Negociação"
input int                     InpStartHour = 10;      //Horário Início das Operações
input int                     InpStarMin = 10;        //Minuto Início das Operações
input int                     InpStopHour = 14;       //Horário Encerramento de Entradas
input int                     InpStopMin = 30;        //Minuto Encerramento das Entradas



MqlRates rates[];
MqlDateTime now;
MqlTick ultimoTick;

bool beAtivo;
bool posAberta;
bool ordPendente;

double rsi[];
double addTakeStop[];

datetime candleNovo;
datetime candleAtual;
   
int handle;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
      int P_RSI = Periodo_RSI;

      if(P_RSI < 0)
         {
            P_RSI = 14;
         }

      handle = iRSI(Symbol(), Period(), P_RSI, PRICE_CLOSE);
      if(handle == INVALID_HANDLE)
         {
            Print("Erro ao criar o RSI - ERRO", GetLastError());
            return(INIT_FAILED);
         }
      ArraySetAsSeries(rsi, true);
      ArraySetAsSeries(rates, true);
      
      trade.SetExpertMagicNumber(magicNum);
      trade.SetTypeFilling(preenchimento);
      trade.SetDeviationInPoints(desvPts); 
     

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

      if(!SymbolInfoTick(Symbol(), ultimoTick))
         {
            Alert("Erro ao obter informações de preço: ", GetLastError());
            return;
         }
  
      TimeToStruct(TimeCurrent(), now);
   
      //HORA INICIAL
      if( (now.hour*100)+now.min <= ( InpStartHour*100)+InpStarMin ) 
   
         return;
   
      //HORA FINAL
      if( (now.hour*100)+now.min >= (InpStopHour*100)+InpStopMin ) 
         {
            if (PositionsTotal() > 0 && PositionGetDouble(POSITION_PROFIT) > 0 )
               {
                  trade.PositionClose(_Symbol);
      
               }
            return;
         }



      CopyBuffer(handle, 0, 0, 5, rsi);
      CopyRates(Symbol(), Period(), 0, 5, rates);
   
         posAberta = false;
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic == magicNum)
               {
                  posAberta = true;
                  break;
               }
         }
      
      ordPendente = false;
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            ulong ticket = OrderGetTicket(i);
            string symbol = OrderGetString(ORDER_SYMBOL);
            ulong magic = OrderGetInteger(ORDER_MAGIC);
            if(symbol == _Symbol && magic == magicNum)
               {
                  ordPendente = true;
                  break;
               }
         }
         
         if(!posAberta)
         {
            beAtivo = false;
         }
      if(posAberta && !beAtivo)
         {
            BreakEven(ultimoTick.last);            
         }
      if(posAberta && beAtivo)
         {
            TrailingStop(ultimoTick.last);
         }                      
   
   candleAtual = rates[0].time;
   
   if(candleAtual != candleNovo){
      candleNovo = rates[0].time;
   }else{
      return;
   }

//VENDA
   if(rsi[1]<30 && rsi[2]>30)
     {
      ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_SELL, 0,rates[1].time, rates[1].low);

      //Somente será efetuado VENDA se não tiver ordem em aberto
      if(PositionsTotal() == 0 && OrdersTotal() == 0)
        {
            Comment("Ordem de Venda Executada");        
            trade.Sell(1, Symbol(), 0.00, 0.00, 0.00, NULL);
                       addTakeStop(stopLoss, takeProfit);
           }                 
                   
       }



// COMPRA
   if(rsi[1]>70 && rsi[2]<70)
     {
      ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_BUY, 0, rates[1].time, rates[1].high);
        {

         //Somente será efetuado COMPRA se não tiver ordem em aberto
         if(OrdersTotal() == 0 && PositionsTotal() == 0)
           {
            Comment("Ordem de Compra Executada");            
            trade.Buy (1, Symbol(), 0.00, 0.00, 0.00, NULL);
                       addTakeStop(stopLoss, takeProfit);
           }

        }

     }


  

  }

void addTakeStop(double p_sl, double p_tp)
   {

      for(int i = PositionsTotal() -1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
      
      
            if(symbol == Symbol() )
               {
      
                  ulong ticket = PositionGetInteger(POSITION_TICKET);
                  double precoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);
         
                  double NovoSL;
                  double NovoTP;
         
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
               {
         
                  NovoSL = NormalizeDouble( precoEntrada - (p_sl * _Point), _Digits);
                  NovoTP = NormalizeDouble( precoEntrada + (p_tp * _Point), _Digits);
            
                  trade.PositionModify(ticket, NovoSL, NovoTP);
         
               }
            else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
               {
         
                  NovoSL = NormalizeDouble( precoEntrada + (p_sl * _Point), _Digits);
                  NovoTP = NormalizeDouble( precoEntrada - (p_tp * _Point), _Digits);
            
                  trade.PositionModify(ticket, NovoSL, NovoTP);
         
               }
         
        
      
            }
   
      }

   }
//---
//---
void BreakEven(double preco)
   {
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic == magicNum)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double PrecoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);
                  double TakeProfitCorrente = PositionGetDouble(POSITION_TP);
                  if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                     {
                        if( preco >= (PrecoEntrada + gatilhoBE) )
                           {
                              if(trade.PositionModify(PositionTicket, PrecoEntrada, TakeProfitCorrente))
                                 {
                                    Print("BreakEven - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                    beAtivo = true;
                                 }
                              else
                                 {
                                    Print("BreakEven - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }                           
                     }
                  else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                     {
                        if( preco <= (PrecoEntrada - gatilhoBE) )
                           {
                              if(trade.PositionModify(PositionTicket, PrecoEntrada, TakeProfitCorrente))
                                 {
                                    Print("BreakEven - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                    beAtivo = true;
                                 }
                              else
                                 {
                                    Print("BreakEven - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
               }
         }
   }

//---
//---
void TrailingStop(double preco)
   {
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic==magicNum)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double StopLossCorrente = PositionGetDouble(POSITION_SL);
                  double TakeProfitCorrente = PositionGetDouble(POSITION_TP);
                  if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                     {
                        if(preco >= (StopLossCorrente + gatilhoTS) )
                           {
                              double novoSL = NormalizeDouble(StopLossCorrente + stepTS, _Digits);
                              if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                                 {
                                    Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                              else
                                 {
                                    Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
                  else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                     {
                        if(preco <= (StopLossCorrente - gatilhoTS) )
                           {
                              double novoSL = NormalizeDouble(StopLossCorrente - stepTS, _Digits);
                              if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                                 {
                                    Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                              else
                                 {
                                    Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
               }
         }
   }
//+------------------------------------------------------------------+
 
Voce nao pode mandar um buy/sell e logo imediatamente pedir para modificar a posicao adicionando o stop, tu precisa chamar a funcao que adiciona os stops somente depois de confirmar que a posicao foi preenchida no mercado. Melhor forma seria manda-los junto na chamada do buy e sell e dai cortar essa funcao.
 
Ricardo Rodrigues Lucca #:
Voce nao pode mandar um buy/sell e logo imediatamente pedir para modificar a posicao adicionando o stop, tu precisa chamar a funcao que adiciona os stops somente depois de confirmar que a posicao foi preenchida no mercado. Melhor forma seria manda-los junto na chamada do buy e sell e dai cortar essa funcao.

Desculpe minha ignorancia. Sou novo em programação e estou estudando esse código. 

O problema seria aqui? 

                       addTakeStop(stopLoss, takeProfit);

Devo retira-la? 

 
patrickdasilva #:

Desculpe minha ignorancia. Sou novo em programação e estou estudando esse código. 

O problema seria aqui? 

Devo retira-la? 

Se é novo executa seu código com um caderno, lápis e borracha e vai simulando a execução. Só saiba que depois de um buy e sell você enviou uma solicitação e não quer dizer que já tem a resposta, durante esse intervalo você não possui nenhuma posição.
 
Ricardo Rodrigues Lucca #:
Se é novo executa seu código com um caderno, lápis e borracha e vai simulando a execução. Só saiba que depois de um buy e sell você enviou uma solicitação e não quer dizer que já tem a resposta, durante esse intervalo você não possui nenhuma posição.

Irmão, estou testando esse código na conta demo desde o dia 01/12/2021. Hoje decidi coloca-lo pra ser testado na conta real pra observar e ver como ele reage e observar possíveis erros.

Na demo ele funciona perfeitamente com Take Profit e Stop Loss, quando atingi a região de um dos dois a operação é finalizada. Na conta real isso não acontece por que o Take e Stop não aparecem e o preço poderá ir pra onde quiser que não finaliza por que nao tem take e nem stop.

A situação é por que na demo aparece e na real não. Se eu retiro o AddTakeStop ele não faz entradas.

 
patrickdasilva #:

Irmão, estou testando esse código na conta demo desde o dia 01/12/2021. Hoje decidi coloca-lo pra ser testado na conta real pra observar e ver como ele reage e observar possíveis erros.

Na demo ele funciona perfeitamente com Take Profit e Stop Loss, quando atingi a região de um dos dois a operação é finalizada. Na conta real isso não acontece por que o Take e Stop não aparecem e o preço poderá ir pra onde quiser que não finaliza por que nao tem take e nem stop.

A situação é por que na demo aparece e na real não. Se eu retiro o AddTakeStop ele não faz entradas.

Experimenta tirar essa função AddTakeStop e coloque os valores diretos pra ver..Muita gambiarra pra uma coisa simples só atrapalha..

 
patrickdasilva:

Comecei a testar um robo na conta real hoje, mas o take profit e stoploss não estão sendo ativados. 

Na demo ele funciona normalmente com o take e stop. Mas na real não. Niveis de negociação estão ativados.

Segue o log diario e o código:

CH 0 12:19:00.401 Trades '7760778': exchange buy 1 WING22 at market

CS 0 12:19:00.479 Trades '7760778': accepted exchange buy 1 WING22 at market

FS 0 12:19:00.480 Trades '7760778': exchange buy 1 WING22 at market placed for execution (Order received. Sending to OMS.)

FP 0 12:19:00.486 Trades '7760778': order #1661609335 buy 1 / 1 WING22 at market done in 85.655 ms

KH 0 12:19:00.490 Trades '7760778': deal #280242707 buy 1 WING22 at 108685 done (based on order #1661609335)

CE 0 12:19:05.832 Trades '7760778': modify #1661609335 buy 1 WING22 sl: 0, tp: 0 -> sl: 0, tp: 108710

MQ 0 12:19:05.856 Trades '7760778': accepted modify #1661609335 buy 1 WING22 sl: 0, tp: 108710 -> sl: 0, tp: 108710

DR 0 12:19:05.856 Trades '7760778': modify #1661609335 buy 1 WING22 -> sl: 0, tp: 108710 done in 24.085 ms

KQ 0 12:19:12.756 Trades '7760778': deal #280242989 sell 1 WING22 at 108710 done (based on order #1661611340)

JO 2 12:19:13.847 Trades '7760778': failed modify #0 buy 0  sl: 0.00000, tp: 0.00000 -> sl: 108530.00000, tp: 108710.00000 [Invalid request]


ABAIXO O CÓDIGO:

Olá Patrick,

no log acima o trade encerrou por TP  deal #280242989, em seguida você emitiu um MODIFY para uma posição que já não existia. 

Corrija a lógica do programa para isso não acontecer.

Razão: