Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пользуйтесь.
Это хороший пример. Но вот меня мучает вопрос. А если OnTradeTransaction() не вернет данные по обработке ордера? Ну, могут же они как-то потеряться. Сервер послал, но терминал не принял. На сколько гарантировано, что на 100% по всем посланным ордерам я получу необходимое количество вызовов функции OnTradeTransaction() и до терминала дойдут все типы отчетов по транзакциям (главным образом меня интересует transaction.type = TRADE_TRANSACTION_REQUEST).
Ведь если я не получу этот ответ (из-за обрыва соединения, например) я не сниму флаг и все встанет.
Не проверял, но, возможно, после OrderSend ВСЕ советники получают соответствующее событие для OnTradeTransaction.
Тогда все решается без костылей и для нескольких советников на одном символе.
Это хороший пример. Но вот меня мучает вопрос. А если OnTradeTransaction() не вернет данные по обработке ордера? Ну, могут же они как-то потеряться. Сервер послал, но терминал не принял. На сколько гарантировано, что на 100% по всем посланным ордерам я получу необходимое количество вызовов функции OnTradeTransaction() и до терминала дойдут все типы отчетов по транзакциям (главным образом меня интересует transaction.type = TRADE_TRANSACTION_REQUEST).
Ведь если я не получу этот ответ (из-за обрыва соединения, например) я не сниму флаг и все встанет.
У меня было несколько раз, что не происходидо событие OnTradeTransaction,
поэтому я написал функцию, которая по таймеру с периодом 0,5 сек проверяет состояние ордеров.
Реализация усложняет общий код эксперта, но при работе через Интернет нет 100% гарантии,
что всё бцдет работать как часы.
Добавлено
Идею реализации проверки взял здесь
https://www.mql5.com/ru/blogs/post/557544
У меня было несколько раз, что не происходидо событие OnTradeTransaction,
поэтому я написал функцию, которая по таймеру с периодом 0,5 сек проверяет состояние ордеров.
Реализация усложняет общий код эксперта, но при работе через Интернет нет 100% гарантии,
что всё бцдет работать как часы.
Добавлено
Идею реализации проверки взял здесь
https://www.mql5.com/ru/blogs/post/557544
Мне кажется парень ломится в открытую дверь, создавая специальные magic codes для каждой сделки. Есть же order_id, по которому можно однозначно идентифицировать ордер.
Или я не понял идею?
Мне кажется парень ломится в открытую дверь, создавая специальные magic codes для каждой сделки. Есть же order_id, по которому можно однозначно идентифицировать ордер.
Или я не понял идею?
Да, есть order_id, но, к сожалению, иногда события не приходят в OnTradeTransaction
(лично у меня было несколько раз)
И куда тогда "запихнуть" order_id ?
Добавлено
Вот, сегодня была задержка ответа сервера
2016.12.28 14:04:56.443 (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...
Да, есть order_id, но, к сожалению, иногда события не приходят в OnTradeTransaction
(лично у меня было несколько раз)
И куда тогда "запихнуть" order_id ?
Добавлено
Вот, сегодня была задержка ответа сервера
2016.12.28 14:04:56.443 (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...
У меня ту на днях другая "засада" случилась.
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 была вызвана четыре раза.
Код функции начинается с проверок:
const MqlTradeRequest& request,
const MqlTradeResult& results)
{
if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)
{
if(request.magic == ExpertMagic)
{
То есть внутрь, там где принты стоят может пройти только TRADE_TRANSACTION_REQUIEST со своим штампом эксперта...
Служба поддержки сначала начала убеждать меня, что у меня два одинаковых эксперта стоит (очевидно на одном чарте, судя по логу). А потом сказали: "сам дурак, исправляй ошибки в коде".
Короче, по их словам этого не может быть. Но из лога ясно видно, что событие пришло четыре раза.
Да, есть order_id, но, к сожалению, иногда события не приходят в OnTradeTransaction
(лично у меня было несколько раз)
И куда тогда "запихнуть" order_id ?
Добавлено
Вот, сегодня была задержка ответа сервера
2016.12.28 14:04:56.443 (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...
И все-равно не понятно, а почему ордер нельзя искать по тикеру? Ведь проверить, какой ордер из отправленных не пришел в TradeTransaction проще простого. А дальше просто посмотри статус ордера с этим тикетом в истории.
Хотя, то что я лично пробовал, в истории ордеров были только ордера со статусом FILLED.
И все-равно не понятно, а почему ордер нельзя искать по тикеру? Ведь проверить, какой ордер из отправленных не пришел в TradeTransaction проще простого. А дальше просто посмотри статус ордера с этим тикетом в истории.
Хотя, то что я лично пробовал, в истории ордеров были только ордера со статусом FILLED.
Да потому что ордера может и не быть в истории (отложенный ордер, например и т.д)
Добавлено
И у Вас код не правильный
Да потому что ордера может и не быть в истории (отложенный ордер, например и т.д)
Добавлено
И у Вас код не правильный
Что там неправильно? Сколько ошибок можно сделать в двух строках кода.
Что там неправильно? Сколько ошибок можно сделать в двух строках кода.
Да не в двух, а в одной :)
TRADE_TRANSACTION_REQUEST нужен тогда, когда Вы используете OrderSendAsymc для получения тикета ордера.