![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ты не понял.
Это сервер не присылал состояние ордера PLASED 20 секунд.
На лицо ОЧЕВИДНАЯ ошибка терминала, в котором "зависает" состояние ордера ORDER_STATE_STARTED
Неужели разобрались, наконец?
А что конкретно про этот ордер говорит биржа? Он был выставлен быстро? Если да, то очевидна ошибка сервера или терминала МТ, который не обновляет статус. И вот с этим уже можно в сервис-деск.
По результата обсуждения проблемы с Михаилом в Сервисдеске:
Видимо нужно объяснить как работает система ордеров и что означает placed.
Итак:
1. Вы отправляете запрос
2. Сервер МТ5 проверяет это запрос (параметры, претрейд и т.д.). Если есть проблемы, то в ответ на запрос вы получите получите соответствующий код ошибки.
После чего заводит у себя новый ордер присваивая ему тикет (#24025010) - у ордера при этом выставляется состояние started. Проставлять тикет ордера нужно для того чтобы в момент выставления ордера на бирже связать идентификатор ордера в МТ5 с ордером на бирже.
Терминалу отправляется транзакция о добавлении нового ордера в состоянии started - это можно отследить в OnTradeTransaction.
3. Далее торговый сервер (через шлюз) отправляет вашу заявку на биржу, если заявка успешно отправилась, то на ваш запрос отправляется ответ placed - это значит
"что заявка отправлена", результаты её работы будут выполняться асинхронно, т.к. заранее не известно через какое время ответит биржа.
Соответственно именно в этот момент вы видите в журнале запись
4. Спустя какое то время, биржа устанавливает ордер в своей системе, присваивает ему свой идентификатор, после чего уведомляет об этом шлюз и сервер МТ5.
Если биржа установила ордера - то в ордер в МТ5 прописывается идентификатор ордера на бирже, и состояние ордера меняется со started => placed.
Если биржа по какой-то причине отказала в выставлении ордера, то ордер снимается.
Это всё можно отследить простым журналирование транзакций приходящих в OnTradeTransaction.
================================================================================
Что происходит:
1. Вы отправляете заявку на ордер - см. пп.1-3.
2. И в момент когда ордер в МТ5 уже есть, а на бирже его ещё нет, вы отправляете заявку на снятие этого ордера.
Вам нужно внести соответствующие проверки-коррекции в логику работы вашего эксперта.Но поскольку этот ордер в начальном состоянии (started) и наличие для него заявки не определено, вы получаете отказ от снятия ордера
поскольку в этом случае поведение не определено.
З.Ы. Другое дело, что в течении секунды
(и тем более 20 секунд) ордер должен бы выставиться, с этим разбираемся, одну из потенциальных проблем нашли - исправляем.По результата обсуждения проблемы с Михаилом в Сервисдеске:
Видимо нужно объяснить как работает система ордеров и что означает placed.
Итак:
1. Вы отправляете запрос
2. Сервер МТ5 проверяет это запрос (параметры, претрейд и т.д.). Если есть проблемы, то в ответ на запрос вы получите получите соответствующий код ошибки.
После чего заводит у себя новый ордер присваивая ему тикет (#24025010) - у ордера при этом выставляется состояние started. Проставлять тикет ордера нужно для того чтобы в момент выставления ордера на бирже связать идентификатор ордера в МТ5 с ордером на бирже.
Терминалу отправляется транзакция о добавлении нового ордера в состоянии started - это можно отследить в OnTradeTransaction.
3. Далее торговый сервер (через шлюз) отправляет вашу заявку на биржу, если заявка успешно отправилась, то на ваш запрос отправляется ответ placed - это значит
"что заявка отправлена", результаты её работы будут выполняться асинхронно, т.к. заранее не известно через какое время ответит биржа.
Соответственно именно в этот момент вы видите в журнале запись
4. Спустя какое то время, биржа устанавливает ордер в своей системе, присваивает ему свой идентификатор, после чего уведомляет об этом шлюз и сервер МТ5.
Если биржа установила ордера - то в ордер в МТ5 прописывается идентификатор ордера на бирже, и состояние ордера меняется со started => placed.
Если биржа по какой-то причине отказала в выставлении ордера, то ордер снимается.
Это всё можно отследить простым журналирование транзакций приходящих в OnTradeTransaction.
================================================================================
Что происходит:
1. Вы отправляете заявку на ордер - см. пп.1-3.
2. И в момент когда ордер в МТ5 уже есть, а на бирже его ещё нет, вы отправляете заявку на снятие этого ордера.
Вам нужно внести соответствующие проверки-коррекции в логику работы вашего эксперта.Но поскольку этот ордер в начальном состоянии (started) и наличие для него заявки не определено, вы получаете отказ от снятия ордера
поскольку в этом случае поведение не определено.
З.Ы. Другое дело, что в течении секунды
(и тем более 20 секунд) ордер должен бы выставиться, с этим разбираемся, одну из потенциальных проблем нашли - исправляем.Осталось непонятным, в какой момент состояние ордера "started" меняется на состояние "placed". Это происходит в соответствии с п.3 Ваших пояснений, в соответствии с п.4 Ваших пояснений или в обоих случаях п.3 и п.4 ?
4. Спустя какое то время, биржа устанавливает ордер в своей системе, присваивает ему свой идентификатор, после чего уведомляет об этом шлюз и сервер МТ5.
Если биржа установила ордера - то в ордер в МТ5 прописывается идентификатор ордера на бирже, и состояние ордера меняется со started => placed.
3. Далее торговый сервер (через шлюз) отправляет вашу заявку на биржу, если заявка успешно отправилась, то на ваш запрос отправляется ответ placed - это значит
"что заявка отправлена", результаты её работы будут выполняться асинхронно, т.к. заранее не известно через какое время ответит биржа.
Соответственно именно в этот момент вы видите в журнале запись
2015.11.26 10:48:23.726 Trades 'xxxxxx': buy limit 5.00 SNGR-3.16 at 35501 placed for execution in 7 ms
4. Спустя какое то время, биржа устанавливает ордер в своей системе, присваивает ему свой идентификатор, после чего уведомляет об этом шлюз и сервер МТ5.
Если биржа установила ордера - то в ордер в МТ5 прописывается идентификатор ордера на бирже, и состояние ордера меняется со started => placed.
Вот еще одна причина путаницы: в журнале написано, что ордер уже placed, а по факту состояние еще не поменялось.
Может, писать что-то типа "отправлен", а не "размещен", по ордер реально не принят биржей?
Получается следующее.
Перед тем ( или после ), как совершить какое-либо действие над ордером,
нужно каждый раз "смотреть" его состояние (поправьте, если что не додумал):
Получается следующее.
Перед тем ( или после ), как совершить какое-либо действие над ордером,
нужно каждый раз "смотреть" его состояние (поправьте, если что не додумал):
Неправильно,
Если смотрим в истории HistoryOrderSelect( ticket ), то нужно применять HistoryOrderGetInteger(), HistoryOrderGetDouble()
Неправильно,
Если смотрим в истории HistoryOrderSelect( ticket ), то нужно применять HistoryOrderGetInteger(), HistoryOrderGetDouble()
Правильно, опечатка :)
спасибо, поправил...