Ordem executada com erro no volume

 

Fiz um Expert Advisor MQL5 para trabalhar com um volume de valor 1

Para isso, carreguei uma variável global:

   input double   Lot=1;              // Lots to Trade

E na seção OnTick() preparo a ordem com a sequinte instrução:

   mrequest.volume = Lot;                                                 // number of lots to trade

Em uma das operações a ordem foi executada com volume=2

Isso pode acontecer ?

Que devo fazer para evitar esse erro?

Antecipadamente agradeço.

 
Sergio Gelli:

Fiz um Expert Advisor MQL5 para trabalhar com um volume de valor 1

Para isso, carreguei uma variável global:

   input double   Lot=1;              // Lots to Trade

E na seção OnTick() preparo a ordem com a sequinte instrução:

   mrequest.volume = Lot;                                                 // number of lots to trade

Em uma das operações a ordem foi executada com volume=2

Isso pode acontecer ?

Que devo fazer para evitar esse erro?

Antecipadamente agradeço.

Olá Sergio Gelli,

Acredito que haja algum pequeno problema no seu código... Se na requisição consta o valor da variável global, então o mesmo certamente será respeitado.

Tem certeza que não existem duas variáveis / dois setups onde são enviadas as ordens em seu código, e, em um desses setups o volume informado é eventualmente 2 ou Lote*2?

Seria interessante revisar seu código, pois acredito que possa ser um pequeno erro no mesmo.

Abraços,
Malacarne

 
Rodrigo Malacarne:

Olá Sergio Gelli,

Acredito que haja algum pequeno problema no seu código... Se na requisição consta o valor da variável global, então o mesmo certamente será respeitado.

Tem certeza que não existem duas variáveis / dois setups onde são enviadas as ordens em seu código, e, em um desses setups o volume informado é eventualmente 2 ou Lote*2?

Seria interessante revisar seu código, pois acredito que possa ser um pequeno erro no mesmo.

Abraços,
Malacarne

Examinei cuidadosamente e não encontrei nada que pudesse provocar essa troca de valor. Inclusive, mantive o expert funcionando e o valor "2" não apareceu novamente.

Isso é uma temeridade, né? Estamos lidando com dinheiro....Imaginou as consequências?

 
Sergio Gelli:

Examinei cuidadosamente e não encontrei nada que pudesse provocar essa troca de valor. Inclusive, mantive o expert funcionando e o valor "2" não apareceu novamente.

Isso é uma temeridade, né? Estamos lidando com dinheiro....Imaginou as consequências?

Olá Sergio Gelli,

Nesse caso pode ser um problema de duplicidade de ordens.

É um problema mais comum do que se imagina, ainda mais junto a novos usuários do MT5.

Nesse caso, se já ocorreu uma vez, e caso seja esse o motivo do erro, seria altamente recomendável revisar todo o código para que isso não voltasse a ocorrer.

Abraços,
Malacarne 

 
Sergio Gelli:

Examinei cuidadosamente e não encontrei nada que pudesse provocar essa troca de valor. Inclusive, mantive o expert funcionando e o valor "2" não apareceu novamente.

Isso é uma temeridade, né? Estamos lidando com dinheiro....Imaginou as consequências?

Olá Sergio Gelli, provavelmente a ordem que você viu com lote 2 era de encerramento de uma posição, e você está encaminhando novas ordens mesmo com uma posição já aberta, o que não é controlado apenas pelo forçamento de valor do volume, mas sim pelo seu algoritmo. 
 
Rodrigo Malacarne:

Olá Sergio Gelli,

Nesse caso pode ser um problema de duplicidade de ordens.

É um problema mais comum do que se imagina, ainda mais junto a novos usuários do MT5.

Nesse caso, se já ocorreu uma vez, e caso seja esse o motivo do erro, seria altamente recomendável revisar todo o código para que isso não voltasse a ocorrer.

Abraços,
Malacarne 

Está com aquele "jeitão" de duplicidade mesmo.

Por favor, dá uma olhada e ve se confirma que é duplicidade.

Duplicidade

 

Topei com um erro parecido:

Criei um expert simples com base no wizard+sinal de bollinger (disponível aqui).

E após uma entrada perfeita, ele manda uma ordem inversa com o dobro do volume.

Reverse sem sinal aparente


Aparentemente, apesar de implementar apenas as funções OpenLongCondition() e Short(), o sistema do expert manda a ordem para reverter quando aparece sinal contrário (daí o tal volume "errado", porque dobra para reverter com o mesmo lote fixo). Resolvi com uma função para ele "pular" N barras seguintes, embora não seja o ideal.

 
Anderson Almeida:


Olá,

tente executar numa conta modo Netting.

 
Rogerio Giannetti Torres:

Olá,

tente executar numa conta modo Netting.

Oi!


Obrigado pela atenção. Minha conta demo é netting, acho que esse comportamento é do Wizard mesmo.

Deve ter um jeito de informar para não reverter, mas apenas fechar a posição quando aparece sinal contrário.

 
Anderson Almeida:

Oi!


Ah sim agora entendi, ajuste o fonte gerado pelo WIZARD para não reverter a posição, somente fechar.

 
Rogerio Giannetti Torres:

Ah sim agora entendi, ajuste o fonte gerado pelo WIZARD para não reverter a posição, somente fechar.

Então, esse é o problema :)

O fonte gerado pelo wizard deixa tudo encapsulado nos métodos da classe (ExtExpert.OnTick(), .OnTrade(), etc) e acho que não dá pra mexer sem zoar as bibliotecas base.

Ao invés de usar direto o LongCondition, pelo jeito tenho que fazer a verificação de posição aberta pelo CheckOpenLong

Vou fazer umas experiências com o módulo de sinais e depois posto aqui o resultado ;)

Razão: