'Invalid request' ao alterar stop lost e take profit

 

Boa noite pessoal, estou codificando um EA para day trade em Mini dólar. Quando tento alterar os valores de sl e tp de uma operação aberta, recebo um erro de 'Invalid request'. Alguém pode me indicar a possível saída?

Segue código utilizado.

   MqlTradeRequest request;
   MqlTradeResult  result;
   request.action = TRADE_ACTION_SLTP;
   request.position = PositionGetTicket(0);
   request.symbol = _Symbol;
   request.sl = 4168;
   request.tp = 4171;

   OrderSend(request, result));

Mensagem de erro:

2019.09.02 00:28:59.115 2019.08.29 13:16:43   failed modify #8 buy 1.00 WDOU19 sl: 4155.000, tp: 4170.000 -> sl: 4168.000, tp: 4171.000 [Invalid request]

Observações relevantes:

 - O valor do mini dolar está em 4168.5 quando faço essa chamada, mas já testei colocar o 4160 e também deu mesmo erro.

 - Eu controlo para ter apenas uma operação em aberto, por isso passo indice 0 na position. Já chamei o método PositionsTotal() e confirmei ter uma posição ativa.

 - Caso ajude, segue meu código utilizado para fazer a compra que estou querendo modificar os stops:

    MqlTradeResult mresult;             
    MqlTradeRequest mrequest={0};
    mrequest.sl = stopLoss;                          
    mrequest.tp = stopGain;                          
    mrequest.action = TRADE_ACTION_DEAL;            
    mrequest.price = preco;                         
    mrequest.symbol = _Symbol;                      
    mrequest.volume = 1;
    mrequest.magic = qtdBarrasDia;
    mrequest.type = tipo;                
    mrequest.type_filling = ORDER_FILLING_FOK;      
    mrequest.deviation = 1;
    OrderSend(mrequest,mresult);


Aguardo por alguma ajuda. Muito obrigado.

 
duduulopes:

Boa noite pessoal, estou codificando um EA para day trade em Mini dólar. Quando tento alterar os valores de sl e tp de uma operação aberta, recebo um erro de 'Invalid request'. Alguém pode me indicar a possível saída?


Bom dia,

Você está tentando alterar o trade da posição 0(zero) da lista de posições, request.position=PositionGetTicket(0 ) e eu te pergunto: Tem certeza que a posição de índice zero é do trade do WDOU19 em questão?

 
Rogerio Giannetti Torres:

Bom dia,

Você está tentando alterar o trade da posição 0(zero) da lista de posições, request.position=PositionGetTicket(0 ) e eu te pergunto: Tem certeza que a posição de índice zero é do trade do WDOU19 em questão?

Olá Rogerio, obrigado pela resposta. 

Mas conforme a própria mensagem de erro, ela informa que a falha ocorreu para modificar o #8, que é exatamente o trade em questão.

Já usei o método PositionsTotal() e o retorno é exatamente 1, logo o parâmetro para o PositionsGetTicket deve ser de fato o 0.

Alguma outra sugestão?
 
duduulopes:

Bom dia novamente,

acho que você não entendeu a msg de erro!  A msg diz que você quer alterar o trade #8 para WDOU19, mas não quer dizer que o trade #8 é para WDOU19.

Bom se tem apenas um posição aberta o índice da posição é 0(zero) . Mas o seu código não é o correto.

Para ter certeza que pegou  o TICKET correto da posição do aberta para um instrumento faz o seguinte:

void DoExistsPositions()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)== MagicNumber)
           {
            Ticket=PositionGetTicket(i);
           }           
     }
  }
 
Rogerio Giannetti Torres:

Bom dia novamente,

acho que você não entendeu a msg de erro!  A msg diz que você quer alterar o trade #8 para WDOU19, mas não quer dizer que o trade #8 é para WDOU19.

Bom se tem apenas um posição aberta o índice da posição é 0(zero) . Mas o seu código não é o correto.

Para ter certeza de pegar a posição do aberta para _Symbol dentro da lista de posições abertas faz o seguinte:

Olá Rogério, obrigado por seguir me auxiliando.

Rodei o seguinte código, conforme você sugeriu:

   ulong ticket;
   for(int i=PositionsTotal()-1; i>=0; i--)
   {  
      if(PositionSelectByTicket(PositionGetTicket(i)))
      {
         string position_symbol = PositionGetString(POSITION_SYMBOL);
         string symbol = _Symbol;
         int position_magic = PositionGetInteger(POSITION_MAGIC);
         if(position_symbol == symbol && position_magic == qtdBarrasDia)
         {
            ticket = PositionGetTicket(i);
         }
      }
   }

Alterei para o mini dólar WDOV19, apenas para ser o ativo vigente nesse mês. Como imaginei, caiu dentro do if mais interno do loop, preenchendo a variável ticket com a posição 4 (posição para o exemplo atual). Observe os valores das variáveis do código:

position_symbol: WDOV19
_Symbol:            WDOV19
position_magic: 66
qtdBarrasDia: 66
ticket: 4

Segue o erro:

2019.09.02 09:29:39.546 2019.08.27 12:15:16   failed modify #4 buy 1.00 WDOV19 sl: 4168.000, tp: 4177.000 -> sl: 4175.000, tp: 4178.000 [Invalid request]


Alguma sugestão? obrigado.


 
duduulopes:


Alguma sugestão? obrigado.


Não, mais nenhuma. Boa sorte.

 
Rogerio Giannetti Torres:

Não, mais nenhuma. Boa sorte.

Descobri, era só adicionar o comando ZeroMemory(request) e ZeroMemory(result):


   MqlTradeRequest request;
   MqlTradeResult  result;
   ZeroMemory(request);
   ZeroMemory(result);
   request.action = TRADE_ACTION_SLTP;
   request.position = PositionGetTicket(0);
   request.symbol = _Symbol;
   request.sl = stopLoss;
   request.tp = stopGain;
   request.magic = qtdBarrasDia;
   OrderSend(request, result));


Obrigado.

 
duduulopes:


Parabéns.

Razão: