Como identificar um request/ordem ao receber notificações via OnTradeTransaction?

 

Ola pessoal,

estou com uma dúvida sobre o feedback de ordens enviadas para o mercado.

Vamos supor que eu enviei algumas ordens limites de compra durante os últimos minutos (em um único ativo).
Podem ter preços/volumes distintos, ou preços/volumes iguais. Varia.

Minha dúvida é quando recebo informações na função OnTradeTransaction(trans, request, result) quando cada ordem muda de estado no mercado.

Eu preciso saber exatamente qual ordem mudou. Há alguma forma de fazer isso no MQL?

Ao ler a documentação, imaginei que o request.order serviria para isso. Mas durante a troca de estados das ordens na conta demo, os campos "order"s sempre me retornam zero.

Assim, não consigo fazer um mapeamento entre as ordens que eu enviei, e as ordens que sofrem modificações no mercado, me informando os trades executados, por exemplo. 

Muito obrigado pela atenção.

Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Account Properties - Reference on algorithmic/automated trading language for MetaTrader 5
 
humbertobrandao:

Ola pessoal,

estou com uma dúvida sobre o feedback de ordens enviadas para o mercado.

Vamos supor que eu enviei algumas ordens limites de compra durante os últimos minutos (em um único ativo).
Podem ter preços/volumes distintos, ou preços/volumes iguais. Varia.

Minha dúvida é quando recebo informações na função OnTradeTransaction(trans, request, result) quando cada ordem muda de estado no mercado.

Eu preciso saber exatamente qual ordem mudou. Há alguma forma de fazer isso no MQL?

Ao ler a documentação, imaginei que o request.order serviria para isso. Mas durante a troca de estados das ordens na conta demo, os campos "order"s sempre me retornam zero.

Assim, não consigo fazer um mapeamento entre as ordens que eu enviei, e as ordens que sofrem modificações no mercado, me informando os trades executados, por exemplo. 

Muito obrigado pela atenção.

Olá Humberto,

Seria interessante se você pudesse especificar exatamente sua necessidade, uma vez que, pelo menos para mim, não está muito claro o que realmente você pretende alcançar.
O "domínio" da função OnTradeTransaction é bastante avançado em programação na linguagem MQL5... 
Dependendo da tua necessidade, seria talvez o caso de buscar o ticket da ordem ou do deal após o envio da ordem, e não necessariamente ligo após o envio da ordem usando a função OTT.
Para isso você poderia até mesmo buscar outros manipuladores de eventos mais simples, como OnTick ou até mesmo OnTimer.
Enfim, como já dito, seria interessante se você pudesse especificar melhor tua necessidade para que possamos te ajudar de uma melhor maneira.
Abraços,
Malacane
 

Obrigado pelo feedback Malacarne.

vou tentar ser mais específico.

suponha que eu dispare 2 ordens quase ao mesmo tempo no mesmo ativo, no mesmo preço e no mesmo volume.

1) É possível, antes de disparar as ordens eu inserir um identificador único em cada uma delas para indentificar suas respectivas mudanças de estado no futuro? Ou o identificador é inserido pelo mercado e só posso acessar seu valor após a aceitação da ordem pelo mercado?

 2) se for possível já identificar cada ordem antes do disparo, em qual campo adiciono este identificador único no Request e em qual campo devo "casar" este identificador no onTradeTransaction? 

Obrigado mais uma vez. 

 

 

 
humbertobrandao:

Olá humbertobrandao,

respondendo suas perguntas: 

1) o ticket da ordem que você está enviando pode ser definido por você ou pelo terminal MT5; caso você não especifique um ticket para a ordem, o terminal MT5 faz isso automaticamente para você; esse ticket da ordem, caso deixado para ser definido pelo próprio terminal MT5, pode ser tranquilamente retornado após o envio da ordem, bastando para tanto que você tenha a confirmação de que ela foi corretamente aceita pelo terminal de negociações da corretora; portanto, mesmo que você possa pegar o ticket durante o envio da ordem através do manipulador de eventos OTT, o ideal mesmo seria você pegar esse ticket após a confirmação de que a ordem foi corretamente aceita pelo servidor de negociações, ou seja, após o seu envio.

2) lendo o que escrevi acima, fica a teu critério determinar se seu interesse é pegar esse ticket da ordem durante ou após o envio da ordem... se não me engano você consegue essa informação através da struct MqlTradeRequest, especificamente request.order; posso estar enganado, mas sugiro verificar isso para confirmar minha suspeita.

Abraços,
Malacarne

 
Malacarne:

Olá humbertobrandao,

respondendo suas perguntas: 

1) o ticket da ordem que você está enviando pode ser definido por você ou pelo terminal MT5; caso você não especifique um ticket para a ordem, o terminal MT5 faz isso automaticamente para você; esse ticket da ordem, caso deixado para ser definido pelo próprio terminal MT5, pode ser tranquilamente retornado após o envio da ordem, bastando para tanto que você tenha a confirmação de que ela foi corretamente aceita pelo terminal de negociações da corretora; portanto, mesmo que você possa pegar o ticket durante o envio da ordem através do manipulador de eventos OTT, o ideal mesmo seria você pegar esse ticket após a confirmação de que a ordem foi corretamente aceita pelo servidor de negociações, ou seja, após o seu envio.

2) lendo o que escrevi acima, fica a teu critério determinar se seu interesse é pegar esse ticket da ordem durante ou após o envio da ordem... se não me engano você consegue essa informação através da struct MqlTradeRequest, especificamente request.order; posso estar enganado, mas sugiro verificar isso para confirmar minha suspeita.

Abraços,
Malacarne

Obrigado Malacarne. Vou fazer os testes em simulação e depois no mundo real aqui.

Bom fim de semana.