Как правильно работать в MT5 с OrderSend - страница 10

 
prostotrader:

Пользуйтесь.

Это хороший пример. Но вот меня мучает вопрос. А если OnTradeTransaction() не вернет данные по обработке ордера? Ну, могут же они как-то потеряться. Сервер послал, но терминал не принял. На сколько гарантировано, что на 100% по всем посланным ордерам я получу необходимое количество вызовов функции OnTradeTransaction() и до терминала дойдут все типы отчетов по транзакциям (главным образом меня интересует transaction.type = TRADE_TRANSACTION_REQUEST).

Ведь если я не получу этот ответ (из-за обрыва соединения, например) я не сниму флаг и все встанет. 

 
fxsaber:

Не проверял, но, возможно, после OrderSend ВСЕ советники получают соответствующее событие для OnTradeTransaction.

Тогда все решается без костылей и для нескольких советников на одном символе. 

Проверял! Так оно и есть!
 
Oleg Shenker:

Это хороший пример. Но вот меня мучает вопрос. А если OnTradeTransaction() не вернет данные по обработке ордера? Ну, могут же они как-то потеряться. Сервер послал, но терминал не принял. На сколько гарантировано, что на 100% по всем посланным ордерам я получу необходимое количество вызовов функции OnTradeTransaction() и до терминала дойдут все типы отчетов по транзакциям (главным образом меня интересует transaction.type = TRADE_TRANSACTION_REQUEST).

Ведь если я не получу этот ответ (из-за обрыва соединения, например) я не сниму флаг и все встанет. 

У меня было несколько раз, что не происходидо событие OnTradeTransaction,

поэтому я написал функцию, которая по таймеру с периодом 0,5 сек проверяет состояние ордеров.

Реализация усложняет общий код эксперта, но при работе через Интернет нет 100% гарантии,

что  всё бцдет работать как часы.

Добавлено

Идею реализации проверки взял здесь

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

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

У меня было несколько раз, что не происходидо событие OnTradeTransaction,

поэтому я написал функцию, которая по таймеру с периодом 0,5 сек проверяет состояние ордеров.

Реализация усложняет общий код эксперта, но при работе через Интернет нет 100% гарантии,

что  всё бцдет работать как часы.

Добавлено

Идею реализации проверки взял здесь

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

Мне кажется парень ломится в открытую дверь, создавая специальные magic codes для каждой сделки. Есть же order_id, по которому можно однозначно идентифицировать ордер.

Или я не понял идею? 

 
Oleg Shenker:

Мне кажется парень ломится в открытую дверь, создавая специальные magic codes для каждой сделки. Есть же order_id, по которому можно однозначно идентифицировать ордер.

Или я не понял идею? 

Да, есть order_id, но, к сожалению, иногда события не приходят в OnTradeTransaction

(лично у меня было несколько раз)

И куда тогда "запихнуть" order_id ?

Добавлено

Вот, сегодня была задержка ответа сервера

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:

Да, есть order_id, но, к сожалению, иногда события не приходят в OnTradeTransaction

(лично у меня было несколько раз)

И куда тогда "запихнуть" order_id ?

Добавлено

Вот, сегодня была задержка ответа сервера

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

У меня ту на днях другая "засада" случилась.

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

 Отправлено три ордера, о чем есть четкая запись в логе. После чего, функция OnTradeTransactions() TRADE_TRANSACTION_TYPE была вызвана четыре раза.

Код функции начинается с проверок: 

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)
         {

То есть внутрь, там где принты стоят может пройти только TRADE_TRANSACTION_REQUIEST  со своим штампом эксперта... 

Служба поддержки сначала начала убеждать меня, что у меня два одинаковых эксперта стоит (очевидно на одном чарте, судя по логу). А потом сказали: "сам дурак, исправляй ошибки в коде".

Короче, по их словам этого не может быть. Но из лога ясно видно, что событие пришло четыре раза.
 

 
prostotrader:

Да, есть order_id, но, к сожалению, иногда события не приходят в OnTradeTransaction

(лично у меня было несколько раз)

И куда тогда "запихнуть" order_id ?

Добавлено

Вот, сегодня была задержка ответа сервера

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

И все-равно не понятно, а почему ордер нельзя искать по тикеру? Ведь проверить, какой ордер из отправленных не пришел в TradeTransaction проще простого. А дальше просто посмотри статус ордера с этим тикетом в истории.

Хотя, то что я лично пробовал, в истории ордеров были только ордера со статусом FILLED. 

 
Oleg Shenker:

И все-равно не понятно, а почему ордер нельзя искать по тикеру? Ведь проверить, какой ордер из отправленных не пришел в TradeTransaction проще простого. А дальше просто посмотри статус ордера с этим тикетом в истории.

Хотя, то что я лично пробовал, в истории ордеров были только ордера со статусом FILLED. 

Да потому что ордера может и не быть в истории (отложенный ордер, например и т.д)

Добавлено

И у Вас код не правильный 

 
prostotrader:

Да потому что ордера может и не быть в истории (отложенный ордер, например и т.д)

Добавлено

И у Вас код не правильный 

Что там неправильно? Сколько ошибок можно сделать в двух строках кода.

 
Oleg Shenker:

Что там неправильно? Сколько ошибок можно сделать в двух строках кода.

Да не в двух, а в одной :)

 

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

TRADE_TRANSACTION_REQUEST нужен тогда, когда Вы используете OrderSendAsymc для получения тикета ордера.