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

 

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


 

Hola rodrigo como estas

Lo más probable es que el paso del sendero (parada móvil) no funcione en las operaciones de venta porque solo está tomando el precio Ask, que es el precio utilizado solo para la COMPRA.

Cuando la transacción está a la venta, debe obtener el precio de oferta.

Razão: