Como trabalhar corretamente em MT5 com OrderSend - página 10

 
prostotrader:

Use-o.

Este é um bom exemplo. Mas eu tenho uma pergunta. E se a OnTradeTransaction() não devolver os dados sobre o processamento de pedidos? Bem, eles podem estar perdidos de alguma forma. O servidor o enviou, mas o terminal não o recebeu. Quanto é garantido que receberei o número necessário da função OnTradeTransaction() para 100% dos pedidos enviados e todos os relatórios de transação chegarão ao terminal (estou interessado em transaction.type = TRADE_TRANSACTION_REQUEST principalmente).

Porque se eu não obtiver esta resposta (por causa da quebra de conexão, por exemplo), eu não limparei a bandeira e tudo ficará de pé.

 
fxsaber:

Eu não verifiquei, mas talvez depois de encomendar TODOS os EAs receba o evento correspondente para a OnTradeTransaction.

Então tudo é resolvido sem muletas e para múltiplos EAs no mesmo símbolo.

Verifique-o! É assim que as coisas são!
 
Oleg Shenker:

Este é um bom exemplo. Mas aqui está uma pergunta que me incomoda. E se a OnTradeTransaction() não devolver os dados de processamento de pedidos? Bem, eles podem estar perdidos de alguma forma. O servidor o enviou, mas o terminal não recebeu. Quanto é garantido que receberei o número necessário da função OnTradeTransaction() para 100% dos pedidos enviados e todos os relatórios de transação chegarão ao terminal (estou interessado em transaction.type = TRADE_TRANSACTION_REQUEST principalmente).

Porque se eu não obtiver esta resposta (por causa da quebra de conexão, por exemplo) não removerei a bandeira e tudo ficará de pé.

Eu tive várias vezes que o evento da OnTradeTransaction não ocorreu,

portanto, escrevi uma função que verifica o estado dos pedidos usando um timer com um período de 0,5 segundos.

A implementação complica o código geral do Expert Advisor, mas não há 100% de garantia quando se trabalha pela Internet,

que tudo vai funcionar como um relógio.

Adicionado por

Tive a idéia de verificar aqui

https://www.mql5.com/ru/blogs/post/557544

Отслеживание ордера, после команды OrderSendAsync
Отслеживание ордера, после команды OrderSendAsync
  • 2015.04.29
  • Mikhail Filimonov
  • www.mql5.com
Отслеживание ордера, после команды OrderSendAsyncМихаил | 23 апреля, 2015В статье рассказывается принцип отслеживания ордера после команды OrderSendAsync, если нет события TradeTransaction...
 
prostotrader:

Eu tive várias vezes que o evento da OnTradeTransaction não aconteceu,

Portanto, escrevi uma função que verifica o estado dos pedidos usando um timer com um período de 0,5 segundos.

A implementação complica o código geral do Expert Advisor, mas não há 100% de garantia quando se trabalha pela Internet,

que tudo vai funcionar como um relógio.

Adicionado por

Tive a idéia de verificar aqui

https://www.mql5.com/ru/blogs/post/557544

Parece-me que o cara está tentando quebrar uma porta aberta, criando códigos mágicos especiais para cada transação. Existe um order_id pelo qual um pedido pode ser identificado de forma única.

Ou estou perdendo a razão?

 
Oleg Shenker:

Parece-me que o cara está quebrando uma porta aberta ao criar códigos mágicos especiais para cada comércio. Há um order_id que pode ser usado para identificar de forma única o pedido.

Ou estou perdendo a razão?

Sim, há um order_id, mas infelizmente às vezes os eventos não chegam à OnTradeTransaction

(Eu o tive várias vezes pessoalmente).

E então onde "colocar" o order_id ?

Adicionado por

Aqui, houve um atraso na resposta do servidor hoje

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...
 
prostotrader:

Sim, há um order_id, mas infelizmente às vezes os eventos não vêm na OnTradeTransaction

(Eu o tive algumas vezes pessoalmente).

Onde "encher" o order_id então ?

Adicionado por

Aqui, hoje houve um atraso na resposta do servidor

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...

Tive um "desconcerto" diferente no outro dia.

2016.12.23 15:04:02.865 TriArbTrader_8-4 (EURGBP,H1)    1111 DealSell           3 orders are sent.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Retcode = 10009. Slippage = 1631.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Position is closed in 59699 mksec.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Retcode = 10009. Slippage = 1631.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Position is closed in 59712 mksec.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction GBPUSD Retcode = 10009. Slippage = 1379.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction GBPUSD Position is closed in 127691 mksec.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction All reposts are checked. Direction = 0
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction Unexpected transaction request.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURGBP Retcode = 10009. Slippage = -40993.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURGBP Position is closed in 1339448077 mksec.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction All reposts are checked. Direction = -1

Enviei três pedidos e há um registro claro disso em meu diário de bordo. Depois disso, a função OnTradeTransactions() TRADE_TRANSACTION_TYPE foi chamada quatro vezes.

O código de função começa com verificações:

void OnTradeTransaction(const MqlTradeTransaction& transaction,
                        const MqlTradeRequest&     request,
                        const MqlTradeResult&      results)
   {
    if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)
      {
       if(request.magic == ExpertMagic)
         {

Ou seja, somente TRADE_TRANSACTION_REQUIEST com seu próprio selo de especialista pode ir para dentro, onde as impressoras ficam...

O Helpdesk começou a me convencer de que eu tenho dois EAs idênticos de pé (obviamente no mesmo gráfico, a julgar pelo registro). E então eles disseram: "você é um tolo, conserte os erros do código".

Em resumo, de acordo com eles não pode ser. Mas o registro mostra claramente que o evento veio quatro vezes.

 
prostotrader:

Sim, há um order_id, mas infelizmente às vezes os eventos não vêm na OnTradeTransaction

(Eu o tive algumas vezes pessoalmente).

Onde "encher" o order_id então ?

Adicionado por

Aqui, hoje eu tive um atraso na resposta do servidor.

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...

Mas, de qualquer forma, ainda não entendo por que não podemos procurar por encomenda por ticker? É muito fácil verificar quais das ordens que enviamos não chegaram à TradeTransaction. E depois basta olhar para o status do pedido com este bilhete na história.

Embora, o histórico de pedidos mostra apenas os pedidos com o status FILLED.

 
Oleg Shenker:

E ainda não está claro por que a ordem não pode ser procurada por um carrapato? Afinal de contas, é fácil verificar qual ordem não chegou à TradeTransaction. E depois basta olhar para o status da ordem com este ticker na história.

Embora, quando tentei pessoalmente, no histórico do pedido, só existiam pedidos com o status FILLED.

Sim, porque a ordem pode não estar na história(ordem pendente, etc.)

Adicionado

E você tem o código errado

 
prostotrader:

Sim, porque a ordem pode não estar na história(ordem pendente, etc.)

Adicionado por

E você tem o código errado

O que há de errado aí? Quantos erros você pode cometer em duas linhas de código.

 
Oleg Shenker:

O que está errado aí? Quantos erros podem ser cometidos em duas linhas de código.

Não dois, um :)

if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)

TRADE_TRANSACTION_REQUEST é necessário quando você usa OrderSendAsymc para obter o bilhete de pedido.