Ordem stop executado a dobrada às vezes.

 
Olá pessoal, bom dia.

Tem ocorrido algumas vezes de uma ordem stop com apenas 1 contrato de mini índice ser executada e a minha posição será aumentada em 2 contratos. Isso tem ocorrido principalmente na genial.

Alguém tem alguma ideia do que eu posso fazer na programação para impedir que isso ocorra?

Muito obrigado
João
 
joaosavioli:

Olá João,

se fosse problema no MT5 ou na CORRETORA esse fórum estaria pipocando de casos.  Certamente o EA não está testando que já foi dado um ORDER_SEND e emite outro ORDER_SEND, lembre-se que emitir a ordem não significa que vai ser executada imediatamente, em outras palavras, DONE não é FILLED.

 
joaosavioli:
Olá pessoal, bom dia.

Tem ocorrido algumas vezes de uma ordem stop com apenas 1 contrato de mini índice ser executada e a minha posição será aumentada em 2 contratos. Isso tem ocorrido principalmente na genial.

Alguém tem alguma ideia do que eu posso fazer na programação para impedir que isso ocorra?

Muito obrigad
joaosavioli:
Olá pessoal, bom dia.

Tem ocorrido algumas vezes de uma ordem stop com apenas 1 contrato de mini índice ser executada e a minha posição será aumentada em 2 contratos. Isso tem ocorrido principalmente na genial.

Alguém tem alguma ideia do que eu posso fazer na programação para impedir que isso ocorra?

Muito obrigado
João


está usando EA?...ele pode estar fazendo preço médio em vez de stopar

 
Rogerio Giannetti Torres #:

Olá João,

se fosse problema no MT5 ou na CORRETORA esse fórum estaria pipocando de casos.  Certamente o EA não está testando que já foi dado um ORDER_SEND e emite outro ORDER_SEND, lembre-se que emitir a ordem não significa que vai ser executada imediatamente, em outras palavras, DONE não é FILLED.

Olá Rogério, muito obrigado por responder.

Por se tratar de uma ordem stop (compra por exemplo), eu posiciono ela acima do preço e espero que o preço "atropele" a ordem para que ocorra o aumento ou abertura de posição. Abaixo é o código que eu estou utilizando.

void CompraSTOP(double preco, double volume, string comment) {

   PRC = NormalizeDouble(preco, _Digits);
   TKP = NormalizeDouble(preco + tkp, _Digits);

   STL = NormalizeDouble(preco - stl, _Digits);


MqlTradeRequest request={};
MqlTradeResult  result={0};
request.action = TRADE_ACTION_PENDING;
request.type_filling = preenchimento;
request.symbol = _Symbol;
request.volume = volume; 
request.type_time = ORDER_TIME_DAY;
request.expiration = 0;
request.deviation = desvPts;
request.magic = magicNum;
request.type = ORDER_TYPE_BUY_STOP;
request.price = PRC;
request.sl = STL;
 request.tp = TKP;

request.comment = comment;

if(!OrderSend(request,result)){
Print("Ordem de Compra - com falha.");
} else {
      Print("Ordem de Compra - sem falha.");    
}
}


A minha impressão é que a ordem é atropelada e algumas vezes ocorre o disparo duas vezes para a corretora. Será isso possível ou é uma impressão minha?

Como essa ordem é posicionada muito antes de ser executada, como eu poderia fazer uma verificação para impedir essa execução duas vezes? Você tem alguma boa prática para recomendar?


Muito obrigado novamente.
João

 
Se você está colocando o codigo no OnTick(), pode acontecer. Você pode que chamar a partir de uma função no ontick e já proibir novas ordens, até que tenha o resultado do request.
 
joaosavioli #:

João,

você tem certeza que o ComprasStop() está sendo chamado corretamente, isto é no momento certo e na quantidade vezes correta?

Examine o log diário.

 
void CompraSTOP(double preco, double volume, string comment) {

static contador;
contador++;
Print("Ordem pendente executada ",contador," vezes.");

   PRC = NormalizeDouble(preco, _Digits);
   TKP = NormalizeDouble(preco + tkp, _Digits);
   STL = NormalizeDouble(preco - stl, _Digits);


MqlTradeRequest request={};
MqlTradeResult  result={0};
request.action = TRADE_ACTION_PENDING;
request.type_filling = preenchimento;
request.symbol = _Symbol;
request.volume = volume; 
request.type_time = ORDER_TIME_DAY;
request.expiration = 0;
request.deviation = desvPts;
request.magic = magicNum;
request.type = ORDER_TYPE_BUY_STOP;
request.price = PRC;
request.sl = STL;
 request.tp = TKP;

request.comment = comment;

if(!OrderSend(request,result)){
Print("Ordem de Compra - com falha.");
} else {
      Print("Ordem de Compra - sem falha.");    
}
}

Aproveitando o conselho do amigo Rogerio, fica ai uma sugestão para vc ver se é o seu codigo que está se repetindo ou problemas da corretora.

 
Olá pessoal, obrigado pelo retorno.

A ordem é posicionada e ela fica corretamente adicionada na aba de negociação do metatrader, ou seja, ela foi criada sem problemas.

A ideia do César em relação ao contador não funcionaria por que a criação da ordem é executada uma vez mesmo com certeza. Normalmente eu posiciono essa ordem no início do dia e ela vai ser executada cerca de uma hora depois, mais ou menos.

Me passou pela cabeça se não poderia ser o offset, como se o preço atropelase a ordem mas de uma vez e causasse essa duplicidade de execução na corretora. Acham que faz algum sentido?

Para eu colocar um offset de por exemplo 30 pontos nessa ordem, devo utilizar o stoplimit?

João
 
joaosavioli #:
Olá pessoal, obrigado pelo retorno.

A ordem é posicionada e ela fica corretamente adicionada na aba de negociação do metatrader, ou seja, ela foi criada sem problemas.

A ideia do César em relação ao contador não funcionaria por que a criação da ordem é executada uma vez mesmo com certeza. Normalmente eu posiciono essa ordem no início do dia e ela vai ser executada cerca de uma hora depois, mais ou menos.

Me passou pela cabeça se não poderia ser o offset, como se o preço atropelase a ordem mas de uma vez e causasse essa duplicidade de execução na corretora. Acham que faz algum sentido?

Para eu colocar um offset de por exemplo 30 pontos nessa ordem, devo utilizar o stoplimit?

João

João,

printa o LOG DIÁRIO completo do dia que apresentou o erro.   Deviation não funciona para exchagens ordem a mercado.

 
Olá pessoal!

Primeiro eu gostaria de agradecer pelas respostas. Esse fórum tem muito bom :)

Eu repensei o código pelo insight do César, realmente tenho uma rotina que verifica se a ordem existe (e recria) no ontick. O que eu imagino que está ocorrendo é que ele está recriando a ordem antes de detectar o aumento de posição, ai executa novamente.

Eu mudei o código e criei um delay para essa verificação, e estou testando. Eu acho que vai resolver!

Muito obrigado novamente.
João
Razão: