Position Modify - Mesmo Stop Loss, Take Profit Diferente [Invalid stops]

 

Boa noite, estou apanhando para implementar uma alteração de posição apenas do take profit, o stop loss é o mesmo.

Recebo o erro [Invalid stops], já tentei usar a biblioteca CTrade ou o MqlTradeRequest.


void VerificarTP(double NovoValor)

{

   MqlTradeRequest request;

   MqlTradeResult  result;

   int total=PositionsTotal(); // número de posições abertas   


   for(int i=0; i<total; i++)

   {

       ulong  position_ticket=PositionGetTicket(i);// bilhete da posição

      string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo 

      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição

      double volume=PositionGetDouble(POSITION_VOLUME);    // volume da posição

      double sl=PositionGetDouble(POSITION_SL);  // Stop Loss da posição

      double tp=PositionGetDouble(POSITION_TP);  // Take-Profit da posição

      int type=PositionGetInteger(POSITION_TYPE);  // tipo da posição

      

      if (magic==EXPERT_MAGIC)

      {

            ZeroMemory(request);

            ZeroMemory(result);

                      

            //--- definição dos parâmetros de operação

            request.action  =TRADE_ACTION_SLTP; // tipo de operação de negociação

            request.position=position_ticket;   // bilhete da posição

            request.symbol=position_symbol;     // símbolo        

            request.tp      = NovoValor;            // Take Profit da posição

            request.magic=EXPERT_MAGIC;         // MagicNumber da posição

              

            if(!OrderSend(request,result))

               PrintFormat("OrderSend error %d",GetLastError());  // se não for possível enviar o pedido, exibir o código de erro

            //--- informações sobre a operação   

            PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

         }

   }

}


Exemplo de mensagem de erro (Ctrade):

2018.08.08 19:58:07.883 2018.01.02 10:20:21   failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]

2018.08.08 19:58:07.883 2018.01.02 10:20:21   CTrade::OrderSend: modify WIN$N (sl: 77605, tp: 77345) [invalid stops]


Exemplo de mensagem de erro (MqlTradeRequest):

2018.08.08 20:03:45.639 2018.01.02 10:20:21   failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]
2018.08.08 20:03:45.639 2018.01.02 10:20:21   OrderSend error 4756
2018.08.08 20:03:45.639 2018.01.02 10:20:21   retcode=10016  deal=0  order=0

 

Não seria por que o preço do ativo está fora da faixa entre 77345 e 77605 ?

Se o preço do ativo estiver abaixo de 77345 ou acima de 77605 no momento em que a ordem for enviada, vai retornar esse erro "Invalid Stops".

Se não for isso, acrescente a instrução request.sl = sl , pois o campo "sl" está indo com zero, visto que vc executou um ZeroMemory(request) antes (não sei se isso dá problema, eu sempre preencho sl e tp com os valores vigentes quando não quero modifica-los, não sei o que acontece se mandar valor zero em um deles).

 
gouveia.luiz89:


Exemplo de mensagem de erro (Ctrade):

2018.08.08 19:58:07.883 2018.01.02 10:20:21   failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]

2018.08.08 19:58:07.883 2018.01.02 10:20:21   CTrade::OrderSend: modify WIN$N (sl: 77605, tp: 77345) [invalid stops]


Exemplo de mensagem de erro (MqlTradeRequest):

2018.08.08 20:03:45.639 2018.01.02 10:20:21   failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]
2018.08.08 20:03:45.639 2018.01.02 10:20:21   OrderSend error 4756
2018.08.08 20:03:45.639 2018.01.02 10:20:21   retcode=10016  deal=0  order=0

Olá, 

no log que você postou nenhum dos preços foi alterado, isso dá erro sim! 

 
Trader_Patinhas:

Não seria por que o preço do ativo está fora da faixa entre 77345 e 77605 ?

Se o preço do ativo estiver abaixo de 77345 ou acima de 77605 no momento em que a ordem for enviada, vai retornar esse erro "Invalid Stops".

Se não for isso, acrescente a instrução request.sl = sl , pois o campo "sl" está indo com zero, visto que vc executou um ZeroMemory(request) antes (não sei se isso dá problema, eu sempre preencho sl e tp com os valores vigentes quando não quero modifica-los, não sei o que acontece se mandar valor zero em um deles).

Olá amigo, o sl está recebendo o valor do stop loss da operação     double sl=PositionGetDouble(POSITION_SL);  // Stop Loss da posição


O preço está dentro, pois ele entra no metodo logo apos executar a operação, se vario 1 tick é muito e ambos (TP e SL) estão bem longes do valor.

 
Rogerio Giannetti Torres:

Olá, 

no log que você postou nenhum dos preços foi alterado, isso dá erro sim! 

Eu tinha essa duvida, procurei na documentação e não achei nada sobre isso.

Devia ter testado. #ProgramadorCansado rs

obrigado

 

Bom dia pessoal, novamente eu aqui ressuscitando posts, mas como o assunto é bem similar, acho que é melhor que abrir novos posts e acabar por dificultar as pesquisas dos próximos colegas.

A questão é a seguinte, não consigo entender o motivo de estar dando erro de invalid stops nesse caso. Eu estava definindo o stop na própria operação de abertura, mas como ficou dando esse erro eu resolvi abrir e depois modificar o TP, mas ocorre o mesmo erro.

No caso o que eu estou tentando é aumentar o volume, comprando mais na mesma direção, mas aí eu levanto o TP proporcional ao preço médio e como pode ser visto no log, é uma venda e o TP está abaixo do preço como deveria, então eu não sei o que pode estar ocasionando esse erro, alguém sabe se há alguma regra especial quando se aumenta o volume ou alguma outra ideia de o por que pode estar dando esse erro?

Eu acompanhei todo o processo no debug e ele passa por todo o processo de verificação da biblioteca Ctrade e só dá erro no OrderSend.

2020.01.02 10:59:00   order performed sell 8 at 117540 [#12 sell 8 WIN@N at 117540]
2020.01.02 10:59:00   CTrade::OrderSend: exchange sell 8.00 WIN@N [done]
2020.01.02 10:59:00   failed modify #8 sell 16 WIN@N sl: 0, tp: 0 -> sl: 0, tp: 117373 [Invalid stops]

sds,

 
rsdcampos #:

Bom dia pessoal, novamente eu aqui ressuscitando posts, mas como o assunto é bem similar, acho que é melhor que abrir novos posts e acabar por dificultar as pesquisas dos próximos colegas.

A questão é a seguinte, não consigo entender o motivo de estar dando erro de invalid stops nesse caso. Eu estava definindo o stop na própria operação de abertura, mas como ficou dando esse erro eu resolvi abrir e depois modificar o TP, mas ocorre o mesmo erro.

No caso o que eu estou tentando é aumentar o volume, comprando mais na mesma direção, mas aí eu levanto o TP proporcional ao preço médio e como pode ser visto no log, é uma venda e o TP está abaixo do preço como deveria, então eu não sei o que pode estar ocasionando esse erro, alguém sabe se há alguma regra especial quando se aumenta o volume ou alguma outra ideia de o por que pode estar dando esse erro?

Eu acompanhei todo o processo no debug e ele passa por todo o processo de verificação da biblioteca Ctrade e só dá erro no OrderSend.

sds,

#include <Trade\SymbolInfo.mqh>         CSymbolInfo       cSymbol;

            newSL = cSymbol.NormalizePrioe(entryPrice - (p_sl *_Point));
            newTP = cSymbol.NormalizePrioe(entryPrice + (p_tp *_Point);


Tive esse problema anteriormente e estou repassando a função de normalização da posição.


Att

 
Felipe Lisboa #:


Tive esse problema anteriormente e estou repassando a função de normalização da posição.


Att

Obrigado pela sua resposta, mas eu já estava normalizando o TP antes de enviar para o PositionOpen, mesmo assim eu tentei da sua forma e continua dando o mesmo erro. o que é mais estranho é que não é sempre o erro, as vezes passa sem erro, as vezes dá erro uma vez e na segunda passa e as vezes dá erro direto em sequencia...

Esse expert era para testar de uma estratégia que criei mentalmente que eu queria ver o resultado na prática, a princípio não seria um robô completo, a menos que a estratégia vingasse, o que não posso saber com esses erros estranhos.

De qualquer forma, muito obrigado pelo seu tempo.

 
Felipe Lisboa #:


Tive esse problema anteriormente e estou repassando a função de normalização da posição.


Att

Opa, consegui resolver. Sua solução é perfeita, só que como eu não costumo usar o CSymbolInfo, não sabia que precisava chamar o método Refrash, mas olhando códigos antigos que eu fiz eu percebi que eu estava esquecendo do step do ativo e aí fui ver esse método do CSymbolInfo que fazia a conta completa, mas se não chamar no OnInit o Refrash, ele não define os valores necessários. Dessa forma, inclusive não é necessário o *_Point que você usa, pois o .NormalizePrice do CSymbolInfo já faz isso.

Para alguém com o mesmo problema, segue a solução completa:

#include <Trade\SymbolInfo.mqh>         CSymbolInfo       cSymbol;

int OnInit()
{
  (...)
  if(!cSymbol.Refresh())
      return(INIT_FAILED);
  (...)
}
(...)
  newSL = cSymbol.NormalizePrioe(entryPrice - p_sl);
  newTP = cSymbol.NormalizePrioe(entryPrice + p_tp);
(....)

Novamente agradeço a resposta.

 
rsdcampos #:

Opa, consegui resolver. Sua solução é perfeita, só que como eu não costumo usar o CSymbolInfo, não sabia que precisava chamar o método Refrash, mas olhando códigos antigos que eu fiz eu percebi que eu estava esquecendo do step do ativo e aí fui ver esse método do CSymbolInfo que fazia a conta completa, mas se não chamar no OnInit o Refrash, ele não define os valores necessários. Dessa forma, inclusive não é necessário o *_Point que você usa, pois o .NormalizePrice do CSymbolInfo já faz isso.

Para alguém com o mesmo problema, segue a solução completa:

Novamente agradeço a resposta.

Maravilha, tambem estava precisando fazer esse trecho do refresh pra funcionar!! Valeu!!

 
gouveia.luiz89:

Boa noite, estou apanhando para implementar uma alteração de posição apenas do take profit, o stop loss é o mesmo.

Recebo o erro [Invalid stops], já tentei usar a biblioteca CTrade ou o MqlTradeRequest.


void VerificarTP(double NovoValor)

{

   MqlTradeRequest request;

   MqlTradeResult  result;

   int total=PositionsTotal(); // número de posições abertas   


   for(int i=0; i<total; i++)

   {

       ulong  position_ticket=PositionGetTicket(i);// bilhete da posição

      string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo 

      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição

      double volume=PositionGetDouble(POSITION_VOLUME);    // volume da posição

      double sl=PositionGetDouble(POSITION_SL);  // Stop Loss da posição

      double tp=PositionGetDouble(POSITION_TP);  // Take-Profit da posição

      int type=PositionGetInteger(POSITION_TYPE);  // tipo da posição

      

      if (magic==EXPERT_MAGIC)

      {

            ZeroMemory(request);

            ZeroMemory(result);

                      

            //--- definição dos parâmetros de operação

            request.action  =TRADE_ACTION_SLTP; // tipo de operação de negociação

            request.position=position_ticket;   // bilhete da posição

            request.symbol=position_symbol;     // símbolo        

            request.tp      = NovoValor;            // Take Profit da posição

            request.magic=EXPERT_MAGIC;         // MagicNumber da posição

              

            if(!OrderSend(request,result))

               PrintFormat("OrderSend error %d",GetLastError());  // se não for possível enviar o pedido, exibir o código de erro

            //--- informações sobre a operação   

            PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

         }

   }

}


Exemplo de mensagem de erro (Ctrade):

2018.08.08 19:58:07.883 2018.01.02 10:20:21   failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]

2018.08.08 19:58:07.883 2018.01.02 10:20:21   CTrade::OrderSend: modify WIN$N (sl: 77605, tp: 77345) [invalid stops]


Exemplo de mensagem de erro (MqlTradeRequest):

2018.08.08 20:03:45.639 2018.01.02 10:20:21   failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]
2018.08.08 20:03:45.639 2018.01.02 10:20:21   OrderSend error 4756
2018.08.08 20:03:45.639 2018.01.02 10:20:21   retcode=10016  deal=0  order=0

Você tentou contar o total de posições sem selecionar antes. 

bool  PositionSelect( 
   string  symbol      // Nome Simbolo 
   );

Selecionar e vê...

Sucesso por aí.