EA travando no comando OrderSend

 

Olá!


Estou operando com um EA à alguns dias e hoje me deparei com uma situação inusitada:

Ao abrir uma operação utilizando o OrderSend, o EA trava na linha, mas a operação é aberta sem erros, operação é feita na B3, MiniIndice.

Pensei que poderia ser a corretora, mas segundo os mesmos não havia nenhum erro por parte deles.  

Ao realizar a operação utilizando o OrderSendAsync(pelo que entendi é a mesma função do OrderSend, mas ele não aguarda o RETCODE) ele não trava e prossegue normalmente.

O complicado que eu preciso da certeza do RETCODE para prosseguir ... alguém sabe se pode ser algo no fonte?


Corretora Modal, o engraçado que estou operando com esse EA a mais de 15 dias e não ocorreu isso.


OBS.: Se no momento que ele está travado eu troco o servidor no canto inferior direito do MT5 ele retorna o RETCODE 10012.

 
                requestTrade.action   = TRADE_ACTION_DEAL;
                requestTrade.symbol   = Ativo;
                requestTrade.volume   = VL;
                requestTrade.type     = ORDER_TYPE_SELL;
                requestTrade.price    = SymbolInfoDouble(Ativo, SYMBOL_BID);
                requestTrade.deviation = 5;
                requestTrade.sl = (AjustarPreco(requestTrade.price, Ativo) + SL);
                requestTrade.tp = (AjustarPreco(requestTrade.price, Ativo) - (TP + TPSeguro));


                
                if(!OrderSend(requestTrade, resultTrade))
                   {
                    Print(ErroAdicionarVenda + " " + (string)resultTrade.retcode);
                    SendNotification(ErroAdicionarVenda);
                   }

Esse é o fonte para a entrada.

Eu não passo o MAGIC ID devido a utilizar somente um robô em apenas um gráfico, não sei se pode ter relação.

 
investimentosjean:

Esse é o fonte para a entrada.

Eu não passo o MAGIC ID devido a utilizar somente um robô em apenas um gráfico, não sei se pode ter relação.

Não dá pra adivinhar.

O segredo está no seu log das operações e na Aba Diário/Journal. Sem isso é impossível "Achar" nada...

É DMA4? Operou em momento de pico? etc...

;)

 
Flavio Jarabeck:

Não dá pra adivinhar.

O segredo está no seu log das operações e na Aba Diário/Journal. Sem isso é impossível "Achar" nada...

É DMA4? Operou em momento de pico? etc...

;)

Obrigado pelo retorno Flavio!

Ai que está o problema, ele não informada nada no Diário, simplesmente trava. Sim DMA4.

O estranho que hoje ele fez algumas operações de manhã e do nada começou a ocorrer essa situação em todas as operações subsequentes.

Eu acredito que foi algum problema no servidor da modal/MT5 que não estava preenchendo o retorno no MqlResult, assim ele ficava travado esperando, mas eu também acredito que seja impossível identificar a causa, perguntei mesmo para saber se alguém tinha passado por algo parecido. A questão é que o OrderSendAsync resolveu a situação, pesquisei aqui e não encontrei nenhuma desvantagem ao utilizar ele, você sabe me informar se tem algo de negativo ao utilizar ele?

 
investimentosjean:

Obrigado pelo retorno Flavio!

Ai que está o problema, ele não informada nada no Diário, simplesmente trava. Sim DMA4.

O estranho que hoje ele fez algumas operações de manhã e do nada começou a ocorrer essa situação em todas as operações subsequentes.

Eu acredito que foi algum problema no servidor da modal/MT5 que não estava preenchendo o retorno no MqlResult, assim ele ficava travado esperando, mas eu também acredito que seja impossível identificar a causa, perguntei mesmo para saber se alguém tinha passado por algo parecido. A questão é que o OrderSendAsync resolveu a situação, pesquisei aqui e não encontrei nenhuma desvantagem ao utilizar ele, você sabe me informar se tem algo de negativo ao utilizar ele?

O problema do "Async" é que o MQL5 é péssimo em Hooks... Típicos de uma linguagem baseada em eventos. Você vai ter que "cercar a galinha" de todos os lados pra ter certeza de que a operação foi realmente, e, bem executada...
 
Só adicionando, esse "cercar a galinha" vai tornar seu código caótico à medida que ele cresce... Do meu tempo: Spaghetti Code (o famoso Código-Macarronada)... que viola qualquer padronização ou bom senso... E aí, quando o projeto cresce, você Tá na Roça, com manutenções caríssimas e que impactam seus clientes com Bugs "inesperados"...
 
Flavio Jarabeck:
O problema do "Async" é que o MQL5 é péssimo em Hooks... Típicos de uma linguagem baseada em eventos. Você vai ter que "cercar a galinha" de todos os lados pra ter certeza de que a operação foi realmente, e, bem executada...

Faz muito sentido sua afirmação.

Vou fazer um teste com ele (Async) amanhã já que o projeto é pessoal e bem simples, acredito que não vou ter muitos problemas rs.

Mais uma vez obrigado pelo retorno Flavio!

 
Flavio Jarabeck:
Só adicionando, esse "cercar a galinha" vai tornar seu código caótico à medida que ele cresce... Do meu tempo: Spaghetti Code (o famoso Código-Macarronada)... que viola qualquer padronização ou bom senso... E aí, quando o projeto cresce, você Tá na Roça, com manutenções caríssimas e que impactam seus clientes com Bugs "inesperados"...

Flavio tentei usar o Async hoje e realmente não foi possível "cercar a galinha" e ela fugiu de várias formas diferentes, pelo que verifiquei no meu fonte vai dar muito mais trabalho do que eu pensei para resolver isso.


Então só me resta resolver a situação do OrderSend ... depois de ver que o Async não funcionou muito bem eu coloquei o OrderSend novamente e funcionou normalmente durante o dia. A questão é que não posso confiar que esse problema irá desaparecer.

Pesquisando aqui encontrei diversas teorias ... desde problemas de rede até a própria corretora estar atrasando as ordens. Segundo esse artigo abaixo uma pessoa fala que realmente é o tempo de retorno da corretora e que isso pode demorar muitos minutos, a questão é:

É possível colocar algum tipo de Timer no retorno OrderSend?


O problema todo dessa situação é que o próximo passo do EA após o OrderSend é colocar uma ordem limit para servir de STOP e quando o EA trava dessa forma a ordem limit não é realizada.


Nesse link há uma situação parecida: https://www.mql5.com/en/forum/45549

Can I get a "trade timeout" error message for "market" orders?
Can I get a "trade timeout" error message for "market" orders?
  • 2006.05.15
  • www.mql5.com
Hello, I could not find out what "trade timeout" means. Can I get a trade timeout error message (error # 128) for a market order...
 

Bom dia, 

vou me intrometer aqui nesse post,

1) Não use ASYNC, como Flávio disse, seu código vai virar um colcha de retalhos para tratar a abertura da posição.

2) Acho que você está testando em conta DEMO em uma das corretoras XP , pois então é muito bom isso estar acontecendo, vai dar a você oportunidade de tratar esse travamento, isso acontece em conta REAL, com pouca frequência e É quase um soluço, mas  se você não tiver dado uma solução pode te dar uma baita prejuízo.

3) Uma recomendação não use ordem limite para STOP LOSS, pois como você mesmo já mencionou a ordem limite pode ficar travada e te levar a um baita prejuízo.

Veja só abaixo o log de um BUY STOP , o travamento que você fala é na linha KI, o comando é enviado para o servidor MT5 e  demorou 76ms para dar retono, mas também pode ocorrer travamento no ACCEPT, ordem aceita no MT5 é enviada para a B3 e o circuito MT5<-->B3 não dá retorno, nesse caso o status da ordem fica permanentemente em ORDER_STATE_STARTED


KI 0 09:24:30.703 Trades '99999999': buy stop 5.00 INDJ20 at 116835 sl: 116740

GQ 0 09:24:30.779 Trades '99999999': accepted buy stop 5.00 INDJ20 at 116835 sl: 116740

HP 0 09:24:30.779 Trades '99999999': order #99999999 buy stop 5.00 / 5.00 INDJ20 at market done in 77.207 ms


Importante mencionar que esse log é de conta DEMO onde não existe o circuito B3<-->MT5 ele é simulado com dados reais da B3

 
Rogerio Giannetti Torres:

Bom dia, 

vou me intrometer aqui nesse post,

1) Não use ASYNC, como Flávio disse, seu código vai virar um colcha de retalhos para tratar a abertura da posição.

2) Acho que você está testando em conta DEMO em uma das corretoras XP , pois então é muito bom isso estar acontecendo, vai dar a você oportunidade de tratar esse travamento, isso acontece em conta REAL, com pouca frequência e É quase um soluço, mas  se você não tiver dado uma solução pode te dar uma baita prejuízo.

3) Uma recomendação não use ordem limite para STOP LOSS, pois como você mesmo já mencionou a ordem limite pode ficar travada e te levar a um baita prejuízo.

Veja só abaixo o log de um BUY STOP , o travamento que você fala é na linha KI, o comando é enviado para o servidor MT5 e  demorou 76ms para dar retono, mas também pode ocorrer travamento no ACCEPT, ordem aceita no MT5 é enviada para a B3 e o circuito MT5<-->B3 não dá retorno, nesse caso o status da ordem fica permanentemente em ORDER_STATE_STARTED


KI 0 09:24:30.703 Trades '99999999': buy stop 5.00 INDJ20 at 116835 sl: 116740

GQ 0 09:24:30.779 Trades '99999999': accepted buy stop 5.00 INDJ20 at 116835 sl: 116740

HP 0 09:24:30.779 Trades '99999999': order #99999999 buy stop 5.00 / 5.00 INDJ20 at market done in 77.207 ms


Importante mencionar que esse log é de conta DEMO onde não existe o circuito B3<-->MT5 ele é simulado com dados reais da B3

Bom dia,


Muito obrigado pelo retorno!

Estou operando em conta real pela Modal e uso o STOP LOSS padrão do MT5, uso Ordem Limit apenas para realizar o lucro(TP). 

A "solução" que encontrei é colocar o TP na ordem padrão também (BEM ACIMA DA ORDEM LIMIT), assim se ele travar a ordem limit não vai ser executada, mas vai ter o TP padrão da própria operação por segurança.


O único problema que encontrei com essa situação é que se o mercado for muito agressivo em direção a ordem limit, ele pode pegar a ordem limit e o TP padrão de uma vez, assim deixando uma posição aberta e "pelada" (sem STOP's). Portanto, para prever e resolver essa possível situação citada vou colocar o TP padrão da ordem bem acima do normal.

 
investimentosjean:


Eita, 

se esse "congelamento" é em conta real a MODAL tem que dar uma resposta, ela só é isenta de responsabilidade no caso de falta de conexão. Eu tenho  robôs operando no MT5 na MODAL e pelo que vi nos logs eu tenho tido sorte de não pegar esses gargalos

Quanto a pegar o SELL LIMIT e pegar o TP, veja só o SELL LIMIT vai fechar a posição e consequentemente o TP (que é uma ordem start ligada ao TICKET  da posição) também vai ser encerrada, mesmo que isso não aconteça o MT5 vai emitir um 10036 quando TP tentar executar a venda de uma posição comprada cujo TICKET já foi fechado.