Ordem de stop loss e gain não executadas

 
Olá, estou com problema no script abaixo, no gráfico, ele efetua as entradas perfeitamente, lançando o stop loss e gain, simultaneamente, porém, após executar a entrada, quando o preço atinge o stop ou o gain, simplesmente não fecha a operação, continua aberta. Onde posso estar errando? Obrigado. 

#include <Trade\Trade.mqh>
CTrade trade;

double upBand[];
double middleBand[];
double lowBand[];
MqlRates rates[];


datetime candleNovo;
datetime candleAtual;


int handle;

int OnInit(){

   handle = iBands(Symbol(), Period(),20,0, 2.00, PRICE_CLOSE);
   
   return(INIT_SUCCEEDED);
}


void OnTick(){

   ArraySetAsSeries(rates, true);
   ArraySetAsSeries(upBand, true);
   ArraySetAsSeries(middleBand, true);
   ArraySetAsSeries(lowBand, true);
   
   CopyRates(Symbol(), Period(), 0, 5, rates);
   CopyBuffer(handle, 0, 0, 5, middleBand);
   CopyBuffer(handle, 1, 0, 5, upBand);
   CopyBuffer(handle, 2, 0, 5, lowBand);
   
   
   candleAtual = rates[0].time;
   
   if(candleAtual != candleNovo){
      candleNovo = rates[0].time;    
   }else{
      return;
   }
   
   
   // Comment("UpBand: "+ upBand[1] + "\nMiddleBand: "+middleBand[1] + "\nlowBand: "+lowBand[1] + "\nClose: "+rates[1].close);

  if(rates[2].close < lowBand[2] && rates[1].close > lowBand[1]){
    //ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_BUY, 0, rates[1].time, rates[1].low);      
    if(PositionsTotal() == 0 && OrdersTotal() == 0){
       if(trade.Buy(2, Symbol(),0.00, 0.000, 0.000, NULL)){   //quantidade de lotes, simbolo, entrada a mercado(0), stop(0) e alvo(0)
          addTakeStop(150.00, 50.00); //adiciona stop loss (loss, gain) 
       }
    }
  }
   
  if(rates[2].close > upBand[2] && rates[1].close < upBand[1]){
    //ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_SELL, 0, rates[1].time, rates[1].high);
     if(PositionsTotal() == 0 && OrdersTotal() == 0){
       if(trade.Sell(2, Symbol(),0.00, 0.000, 0.000, NULL)){   //quantidade de lotes, simbolo, entrada a mercado(0), stop(0) e alvo(0)
         addTakeStop(150.00, 50.00); //adiciona stop loss (loss, gain)
       }   
     }
        
   }
}   
   



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);
          }
         
      
       }
   
    }

}
 
Vinicius Werneck:
Olá, estou com problema no script abaixo, no gráfico, ele efetua as entradas perfeitamente, lançando o stop loss e gain, simultaneamente, porém, após executar a entrada, quando o preço atinge o stop ou o gain, simplesmente não fecha a operação, continua aberta. Onde posso estar errando? Obrigado. 

Boa tarde. Eu colocaria uns prints para ir entende do o que acontece... É possível usar o depurador também, mas .horas vezes com o print você já vai conseguir entender o erro.
 
Vinicius Werneck:
Olá, estou com problema no script abaixo, no gráfico, ele efetua as entradas perfeitamente, lançando o stop loss e gain, simultaneamente, porém, após executar a entrada, quando o preço atinge o stop ou o gain, simplesmente não fecha a operação, continua aberta. Onde posso estar errando? Obrigado. 

Olá Vinicius,

eu imagino que você esteja lendo o LOG DIÁRIO e  não viu  nenhum INVALID PRICE ou INVALID STOP, então vamos lá:

Se o mercador for FOREX o gráfico é traçado com base no preço BID e isso confunde um pouco, pois por exemplo, em uma venda o gatilho de stop loss é disparado quando ASK atinge o preço do stop loss.  Trace também o preço ASK no gráfico para acompanhar o trade.

Se o mercador for a EXHANGE B3 então o gráfico é traçado pelo preço LAST e nesse caso a corretora deve ser acionada.

 
Rogerio Giannetti Torres #:

Olá Vinicius,

eu imagino que você esteja lendo o LOG DIÁRIO e  não viu  nenhum INVALID PRICE ou INVALID STOP, então vamos lá:

Se o mercador for FOREX o gráfico é traçado com base no preço BID e isso confunde um pouco, pois por exemplo, em uma venda o gatilho de stop loss é disparado quando ASK atinge o preço do stop loss.  Trace também o preço ASK no gráfico para acompanhar o trade.

Se o mercador for a EXHANGE B3 então o gráfico é traçado pelo preço LAST e nesse caso a corretora deve ser acionada.

Olá Rogério,

O mercado é o Exchange B3 mesmo, não executa o stop loss nem o gain, porém, testei no mercado Forex e tudo deu certo. 

 
Vinicius Werneck #:

Olá Rogério,

O mercado é o Exchange B3 mesmo, não executa o stop loss nem o gain, porém, testei no mercado Forex e tudo deu certo. 

Opa,

então reclame com o suporte da corretora pois o problema é no SERVIDOR MT5.

Razão: