ENUM_TRADE_REQUEST_ACTIONS - Problema?

 

Fiz diversos testes com um controle central de ordens e verifiquei o seguinte fato de forma repetitiva: ao colocar uma pending order - ainda sem ser executada -, esta dispara o evento OnTradeTransaction 3 vezes - ORDER_ADD, REQUEST e ORDER_UPDATE. O REQUEST, que geralmente carrega todos os parâmetros relevantes para a pending, está acusando um valor de 5 para o ENUM_TRADE_REQUEST_ACTIONS . Verificando  ENUM_TRADE_REQUEST_ACTIONS, não há uma enumeração para o valor 5. Cogitei que esse retorno poderia ser o valor padrão do sistema, mas ao levantar todos os valores do request.action durante as 3 chamadas do OnTradeTransaction, obtive dois valores 0 - para ORDER_ADD e ORDER_UPDATE - e 5 - para REQUEST. O valor 0 indica TRADE_ACTION_DEAL, valor errôneo para uma PENDING ORDER.

Dessa forma, nenhum desses valores indica uma PENDING ORDER. Erro do sistema?

OBS: estou testando na DEMO. Ainda não fiz o teste na conta real.

 
bremora10:

Fiz diversos testes com um controle central de ordens e verifiquei o seguinte fato de forma repetitiva: ao colocar uma pending order - ainda sem ser executada -, esta dispara o evento OnTradeTransaction 3 vezes - ORDER_ADD, REQUEST e ORDER_UPDATE. O REQUEST, que geralmente carrega todos os parâmetros relevantes para a pending, está acusando um valor de 5 para o ENUM_TRADE_REQUEST_ACTIONS . Verificando  ENUM_TRADE_REQUEST_ACTIONS, não há uma enumeração para o valor 5. Cogitei que esse retorno poderia ser o valor padrão do sistema, mas ao levantar todos os valores do request.action durante as 3 chamadas do OnTradeTransaction, obtive dois valores 0 - para ORDER_ADD e ORDER_UPDATE - e 5 - para REQUEST. O valor 0 indica TRADE_ACTION_DEAL, valor errôneo para uma PENDING ORDER.

Dessa forma, nenhum desses valores indica uma PENDING ORDER. Erro do sistema?

OBS: estou testando na DEMO. Ainda não fiz o teste na conta real.

Olá bremora10,

Apenas pela descrição que você fez, não é possível saber exatamente qual é o problema. Seria interessante se você pudesse postar partes do código, para que possamos tentar te ajudar de alguma forma mais concreta.

Também seria interessante se você pudesse descrever o quê, exatamente, você pretende obter. Provavelmente é possível conseguir fazer o que você quer sem a necessidade sequer de utilizar o manipulador de eventos OTT.

Por fim, alguns ENUMS em linguagem MQL5 podem ter múltiplas opções, mas geralmente eles são enumerados na sequência 1, 2, 4, 8, etc. Assim, o número 3 seria a combinação dos números 1 e 2, indicando mais de uma possibilidade para o ENUM. Não creio que esse seja o caso específico do ENUM_TRADE_REQUEST_ACTIONS, mas é sempre bom saber que os mesmos existem.

Esperamos mais detalhes.

Abraços,
Malacarne 

 

Obrigado pela resposta Malacarne,

o objetivo é possuir um controle central de ordens que seja capaz de filtrar cada ordem por expert, saber a atual situação de cada ordem e informar todas as modificações, cancelamentos, modificações e erros de ordem em tempo real. Basicamente é um controle paralelo ao que há no MT5, mas voltado para ordens - ao contrário de posições.

Para isso, rastreei cada tipo de ordem e quais ENUM_TRADE_REQUEST_ACTIONS eram disparados para cada ação realizada - independente da ordem. Dessa forma, verifiquei os valores assumidos dos parâmetros do Transaction, Request e Result em todas as chamadas do OTT.

O problema reside ao colocar uma PENDING ORDER no sistema - antes da sua execução. Esta ação executa o OTT três vezes, retornando para o MqlTradeTransaction - o único que carrega esse parâmetro dos três - os valores de 0, 10 e 1, ou, respectivamente, TRADE_TRANSACTION_ORDER_ADD, TRADE_TRANSACTION_REQUEST e TRADE_TRANSACTION_ORDER_UPDATE. Dessas três chamadas, busquei verificar o ENUM_TRADE_REQUEST_ACTIONS em cada - ainda que eu saiba que esse valor é apenas preenchido no Request pertencente ao TRADE_TRANSACTION_REQUEST -, obtendo os valores de 0, 5 e 0 para os Requests. O valor esperado deveria ser um 1 - TRADE_ACTION_PENDING - em pelo menos um deles. Os valores 0 - TRADE_ACTION_DEAL - são esperados, uma vez que funcionam como DEFAULT para as chamadas, sendo retornados todas as vezes que os Requests não tem esse parâmetro preenchido, entretanto o valor 5 não possui correspondente no ENUM_TRADE_REQUEST_ACTIONS, uma vez que o último valor, 4, indica REMOVE.

Dessa forma, não há nenhum indicador por meio do ENUM_TRADE_REQUEST_ACTIONS - por outros meios há - que uma ordem PENDING foi colocada no sistema. Especialmente, fico curioso quanto a esse valor 5 que parece não indicar nada e nem possuir correspondente no ENUM. Erro do sistema? Mensagem obscura do além?

Conforme disse, apenas testei no demo. Ainda não verifiquei essa ocorrência na conta real.

 
bremora10:

Obrigado pela resposta Malacarne,

o objetivo é possuir um controle central de ordens que seja capaz de filtrar cada ordem por expert, saber a atual situação de cada ordem e informar todas as modificações, cancelamentos, modificações e erros de ordem em tempo real. Basicamente é um controle paralelo ao que há no MT5, mas voltado para ordens - ao contrário de posições.

Para isso, rastreei cada tipo de ordem e quais ENUM_TRADE_REQUEST_ACTIONS eram disparados para cada ação realizada - independente da ordem. Dessa forma, verifiquei os valores assumidos dos parâmetros do Transaction, Request e Result em todas as chamadas do OTT.

O problema reside ao colocar uma PENDING ORDER no sistema - antes da sua execução. Esta ação executa o OTT três vezes, retornando para o MqlTradeTransaction - o único que carrega esse parâmetro dos três - os valores de 0, 10 e 1, ou, respectivamente, TRADE_TRANSACTION_ORDER_ADD, TRADE_TRANSACTION_REQUEST e TRADE_TRANSACTION_ORDER_UPDATE. Dessas três chamadas, busquei verificar o ENUM_TRADE_REQUEST_ACTIONS em cada - ainda que eu saiba que esse valor é apenas preenchido no Request pertencente ao TRADE_TRANSACTION_REQUEST -, obtendo os valores de 0, 5 e 0 para os Requests. O valor esperado deveria ser um 1 - TRADE_ACTION_PENDING - em pelo menos um deles. Os valores 0 - TRADE_ACTION_DEAL - são esperados, uma vez que funcionam como DEFAULT para as chamadas, sendo retornados todas as vezes que os Requests não tem esse parâmetro preenchido, entretanto o valor 5 não possui correspondente no ENUM_TRADE_REQUEST_ACTIONS, uma vez que o último valor, 4, indica REMOVE.

Dessa forma, não há nenhum indicador por meio do ENUM_TRADE_REQUEST_ACTIONS - por outros meios há - que uma ordem PENDING foi colocada no sistema. Especialmente, fico curioso quanto a esse valor 5 que parece não indicar nada e nem possuir correspondente no ENUM. Erro do sistema? Mensagem obscura do além?

Conforme disse, apenas testei no demo. Ainda não verifiquei essa ocorrência na conta real.

Olá bremora10,

Nesse caso, acredito que você esteja tentando desenvolver um VOM (Virtual Order Manager).

Você já deu uma lida no artigo 88? Ele trata justamente de ordens virtuais dentro da plataforma MetaTrader 5.

Mas no caso específico do seu problema, acredito que você possa estar fazendo alguma pequena confusão entre ENUM_TRADE_TRANSACTION_TYPE ENUM_TRADE_REQUEST_ACTIONS.

Acredito que a melhor forma de esclarecer esses números que você está recendo (0, 5, 10, etc.) é utilizando a função EnumToString(). Em seu processo de debug, experimente imprimir a string resultante do uso dessa função, para saber, exatamente, quem está sendo retornado em cada passagem de OnTradeTransaction.

Peço que reporte aqui os resultados assim que os tiver.

Abraços,
Malacarne 

 
Estou desenvolvendo algo do tipo Malacarne, apesar de já possuir um VOM implementado. Acabei precisando de algo mais complexo, então acabei usando uma Tabela Hash via ponteiro de objetos, de modo a receber as ordens, atualiza-las e deleta-las por meio de acesso direto ao seu index.

Bem, não acho que fiz confusão com ENUM_TRADE_TRANSACTION_TYPE e ENUM_TRADE_REQUEST_ACTIONS em si nos testes. Mas irei refazer usando a função EnumToString(). Logo, posto o resultado.

EDIT: Acabei descobrindo o problema. Alguns ENUM possuem valores Default que alteram a ordem da sua enumeração ou que não necessariamente estão em ordem. Obrigado Malacarne pela ajuda.
Razão: