Brasil: Modificar STOP LOSS em uma operação de VENDA?

Rodrigo Evaldo Schwambach  

Olá pessoal.

Estou com um problema de implementar a rotina de STOP MÓVEL.

Nas operações COMPRADAS, a rotina funciona muito bem.

Problema está nas operação VENDIDAS, a rotina não permite alterar o STOP LOSS (S/L).


void CheckTrailingStop (double AskStop, bool operacao){
      double ValorPerdaNovo;
      int i;
      string symbol1;
      ulong PositionTicket;
      double CurrentStopLoss;
      
      ValorPerdaNovo=NormalizeDouble(Calc_Stop(AskStop,operacao),_Digits);
      
   
      //Verifica todas as posições abertas
      for(i=PositionsTotal()-1;i>=0;i--){
         symbol1=PositionGetSymbol(i);  //pega o nome do papel de todas as posições abertas
         //Se a posição aberta é a respeito desse papel
         if(_Symbol==symbol1){
            //Pega o ticket number dessa posição (ordem)
            PositionTicket=PositionGetInteger(POSITION_TICKET);
            
            //Se comprado, ajusta o STOP LOSS
            if (!operacao){
               //Pega o valor de STOP atribuído
               CurrentStopLoss=PositionGetDouble(POSITION_SL);   
                if (CurrentStopLoss<ValorPerdaNovo){
                  //Altera o valor do STOP LOSS
                  trade.PositionModify(PositionTicket,ValorPerdaNovo,0);
                }         
            }else{
               //Pega o valor do TAKE PROFIT
               CurrentStopLoss=PositionGetDouble(POSITION_SL);
               if (ValorPerdaNovo<CurrentStopLoss){
                  ValorPerdaNovo = CurrentStopLoss -1.0;
                  trade.PositionModify(PositionTicket,ValorPerdaNovo,0); 
                  Print("PositionModify() method failed. Return code=",trade.ResultRetcode(),". Descrição do código: ",trade.ResultRetcodeDescription());  
                  trade.PositionModify(PositionTicket,0,ValorPerdaNovo); 
                  Print("PositionModify() method failed. Return code=",trade.ResultRetcode(),". Descrição do código: ",trade.ResultRetcodeDescription()); 
                  trade.PositionModify(_Symbol,ValorPerdaNovo,0);
                  Print("PositionModify() method failed. Return code=",trade.ResultRetcode(),". Descrição do código: ",trade.ResultRetcodeDescription());           
               }
               
            
            }
            
            
            
            
           
         }
      }

}


No log, todas as tentativaas de modificar a posição na operação vendida, tenho:


2019.09.22 15:26:55.528 2009.08.18 10:25:00   CTrade::OrderSend: modify PETR3 (sl: 32.04, tp: 0.00) [invalid stops]

2019.09.22 15:27:02.794 2009.08.18 10:25:00   PositionModify() method failed. Return code=10016. Descrição do código: invalid stops

2019.09.22 15:27:09.051 2009.08.18 10:25:00   position modified [#4 sell 100.00 PETR3 32.88 tp: 32.04]

2019.09.22 15:27:09.051 2009.08.18 10:25:00   CTrade::OrderSend: modify PETR3 (sl: 0.00, tp: 32.04) [done]

2019.09.22 15:27:35.687 2009.08.18 10:25:00   PositionModify() method failed. Return code=10009. Descrição do código: done

2019.09.22 15:27:42.259 2009.08.18 10:25:00   failed modify #4 sell 100.00 PETR3 sl: 0.00, tp: 32.04 -> sl: 32.04, tp: 0.00 [Invalid stops]

2019.09.22 15:27:42.259 2009.08.18 10:25:00   CTrade::OrderSend: modify PETR3 (sl: 32.04, tp: 0.00) [invalid stops]

2019.09.22 15:27:44.182 2009.08.18 10:25:00   PositionModify() method failed. Return code=10016. Descrição do código: invalid stops


Razão: