ФОРТС Установка, удаление и модификация ордера - страница 3

 
Fry:

Ну как это работает? Запустил Ваш код.

Множество раз сообщает подобный бред:

Кроме того... Хотите удивлю Вас?

1) То что OrderSelect() выделяет ордер, вовсе не означает, что ордер действующий =). Часто ордер ещё ~ секунду после исполнения выделяется, а уже потом переходит в список истории.

2) А может быть и так, что ордер 100% существует (даже действующий, или выполняется сейчас, или ещё что-то с ним). При этом он вообще ничем не выделяется! Ни OrderSelect(), ни HistoryOrderSelect()! И это происходит довольно часто!

3) Правильно обрабатывать возврат из OrderSelect() надо так как я показал внутри PrintOrderState().

Вот такая вот фигня =(

Это ------======!!! Сервер сообщил (Неправильный запрос) !!!======------

не бред, так настроен сервер в БКС.

Главное - ордер удалён, а с какой попытки - это не важно (На реале всё будет работать нормально).

Вы для себя должны понять, что ордер имеет "промежуточные" состояния, которые для

команды OrderSend() не имеют никакого значения, потому что на Ваш запрос (OrderSend) приходит ответ (result),

при этом программа приостанавливается, для получения ответа от сервера. 

 
Михаил:

Это ------======!!! Сервер сообщил (Неправильный запрос) !!!======------

не бред, так настроен сервер в БКС.

Главное - ордер удалён, а с какой попытки - это не важно.

На реале всё будет работать нормально.

Вы для себя должны понять, что ордер имеет "промежуточные" состояния, которые для

команды OrderSend() не имеют никакого значения. 

В Открывашке.

В том-то и дело, что от промежуточных состояний зависит результат OrderSend().

Хорошо. Спасибо. В ходе разговора я понял, что ответ от сервера 10013 вовсе не "Неправильный запрос", как написано в документации, а норма жизни.

Это не значит, что в коде эксперта есть ошибка при формировании запроса. Этот ответ надо обрабатывать как повторную попытку.

Хорошо, допустим... Хотя пока не понятно, как отличить "нормальный повтор" от ситуации, когда у меня действительно ошибки в запросах(случайно накосячил с кодом)?

Допустим, я это переварю.

Но зачем на сервер отправлять лишние запросы? Ведь я на 100% знаю, что когда у меня промежуточный статус ордера, то сервер ВСЕГДА возвращает 10013.

Или это нормально? Так и надо серверу, если он дурак? Пусть будет лишний запрос на удаление, а если уже сервер вернул 10013, дальше будем разбираться почему.

Так?

 
Fry:

В Открывашке.

В том-то и дело, что от промежуточных состояний зависит результат OrderSend().

Хорошо. Спасибо. В ходе разговора я понял, что ответ от сервера 10013 вовсе не "Неправильный запрос", как написано в документации, а норма жизни.

Это не значит, что в коде эксперта есть ошибка при формировании запроса. Этот ответ надо обрабатывать как повторную попытку.

Хорошо, допустим... Хотя пока не понятно, как отличить "нормальный повтор" от ситуации, когда у меня действительно ошибки в запросах(случайно накосячил с кодом)?

Допустим, я это переварю.

Но зачем на сервер отправлять лишние запросы? Ведь я на 100% знаю, что когда у меня промежуточный статус ордера, то сервер ВСЕГДА возвращает 10013.

Или это нормально? Так и надо серверу, если он дурак? Пусть будет лишний запрос на удаление, а если уже сервер вернул 10013, дальше будем разбираться почему.

Так?

Дело в том, что разработчики считают демо "песочницей" в которой многое может и не работать :)

Об этом неоднократно говорил руководитель MQ Ренат.

А как отлаживать написанное нами, не сказал.... 

Я уже много раз обращал внимание разработчиков на эту проблему (на реале эта ошибка тоже есть),

но пока нет реакции

https://www.mql5.com/ru/forum/38456/page47#comment_1903980 

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,. - Страница 47 - Категория: автоматические торговые системы
 
Михаил:

Дело в том, что разработчики считают демо "песочницей" в которой многое может и не работать :)

Об этом неоднократно говорил руководитель MQ Ренат.

А как отлаживать написанное нами, не сказал.... 

=) Это да. Спасибо.

На днях закину десятку и буду отлаживать дальше на фсбере... Хотя надо бы ещё и на RTSе...

 
Михаил:

Дело в том, что разработчики считают демо "песочницей" в которой многое может и не работать :)

Об этом неоднократно говорил руководитель MQ Ренат.

А как отлаживать написанное нами, не сказал.... 

Я уже много раз обращал внимание разработчиков на эту проблему (на реале эта ошибка тоже есть),

но пока нет реакции

https://www.mql5.com/ru/forum/38456/page47#comment_1903980 

Интересно. Может быть, есть смысл и мне составить новую заявку в сервисдеск? Или однофигственно?


На данный момент придумал "условно надёжный вариант" только так - выделяю ордер, узнаю статус, если статус не промежуточный, то пытаюсь удалить ордер. Если статус промежуточный, то пропускаю целый тик.

Работает хорошо. Но!...

Спасибо Вам, теперь понял, что сервер вполне может возвращать 10013 не только в этой ситуации. Значит для меня TRADE_RETCODE_INVALID - это код для повторной попытки. 

В целом мой движок устроен так:

Весь учёт ордеров идёт только в обработчике OnTrade(), потому что приходится напрягать сервер OrderSelect() и PositionSelect() (убийственно делать такое на тиках =).

А все торговые запросы, наоборот, только на тиках. Предполагаю, что когда тиков нет - рынок закрыт. Редкие тики на закрытом рынке - не проблема.

Но в моих целях не критична потеря ~секунды.

А вот совсем не удалённый ордер или неверно составленный запрос - это полный фэйл.

 
Fry:

Интересно. Может быть, есть смысл и мне составить новую заявку в сервисдеск? Или однофигственно?


На данный момент придумал "условно надёжный вариант" только так - выделяю ордер, узнаю статус, если статус не промежуточный, то пытаюсь удалить ордер. Если статус промежуточный, то пропускаю целый тик.

Работает хорошо. Но!...

Спасибо Вам, теперь понял, что сервер вполне может возвращать 10013 не только в этой ситуации. Значит для меня TRADE_RETCODE_INVALID - это код для повторной попытки. 

В целом мой движок устроен так:

Весь учёт ордеров идёт только в обработчике OnTrade(), потому что приходится напрягать сервер OrderSelect() и PositionSelect() (убийственно делать такое на тиках =).

А все торговые запросы, наоборот, только на тиках. Предполагаю, что когда тиков нет - рынок закрыт. Редкие тики на закрытом рынке - не проблема.

Но в моих целях не критична потеря ~секунды.

А вот совсем не удалённый ордер или неверно составленный запрос - это полный фэйл.

Кляузы в Сервисдеск нужно писать ОБЯЗАТЕЛьНО!

И сошлитесь на меня, что эта же ошибка проявляется и на РЕАЛЕ. 

 
Fry_Антон:

Весь учёт ордеров идёт только в обработчике OnTrade(), потому что приходится напрягать сервер OrderSelect() и PositionSelect() (убийственно делать такое на тиках =).

Извините что встреваю в разговор. Считаю нужным уточнить, что функции MQL OrderSelect() и PositionSelect() работают исключительно с собственными базами терминала, т.е. нагрузка на сервер при их использовании отсутствует даже теоретически.
 
Anton:
Извините что встреваю в разговор. Считаю нужным уточнить, что функции MQL OrderSelect() и PositionSelect() работают исключительно с собственными базами терминала, т.е. нагрузка на сервер при их использовании отсутствует даже теоретически.

Спасибо! Мне это очень важно знать!

Фраза из документации "Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними."

+ личные эксперименты с трафиком ввели меня в заблуждение. Значит "зло" где-то в другом месте.


По сабжу топика:

1) Почему существующий ордер не удаляется в промежуточных состояниях?

2) Почему вообще есть эти промежуточные состояния, когда заявка выставляется не асинхронно, а через OpderSend()?

3) Почему в таком случае приходит реткод именно 10013(неправильный запрос)?

(написал заявку в сервисдеск: Открыта, Начата: 2015.10.15 02:06, #1329399)

Буду признателен за любой ответ на любой из этих вопросов.
 
Fry_Антон:

Спасибо! Мне это очень важно знать!

Фраза из документации "Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними."

+ личные эксперименты с трафиком ввели меня в заблуждение. Значит "зло" где-то в другом месте.


По сабжу топика:

1) Почему существующий ордер не удаляется в промежуточных состояниях?

2) Почему вообще есть эти промежуточные состояния, когда заявка выставляется не асинхронно, а через OpderSend()?

3) Почему в таком случае приходит реткод именно 10013(неправильный запрос)?

(написал заявку в сервисдеск: Открыта, Начата: 2015.10.15 02:06, #1329399)

Буду признателен за любой ответ на любой из этих вопросов.

Добрый день!

1. Потому что происходят операции в которые нельзя "вклиниться". 

2. Потому что (скорее всего) механизм единый и для OrderSend() и OrderSendAsync(), только OrderSendAsync() не ждет результата.

3. Потому что это БАГ MQ (правда, на реальном счёте, достаточно редкий. Не знаю с чем это связано)

 

ФОРТС на бирже "упал", а терминал говорит следуюшее:

2015.10.15 18:12:37.626 Forts_trader (CY-12.15,H1)      Remove: Ордер не отослан! Причина:  Неправильный запрос Билет = 21967677
2015.10.15 18:12:47.625 Forts_trader (CY-12.15,H1)      Remove: Ордер не отослан! Причина:  Неправильный запрос Билет = 21967677
2015.10.15 18:12:47.635 Forts_trader (CY-12.15,H1)      Remove: Ордер не отослан! Причина:  Неправильный запрос Билет = 21967677
2015.10.15 18:12:57.645 Forts_trader (CY-12.15,H1)      Remove: Ордер не отослан! Причина:  Неправильный запрос Билет = 21967677
2015.10.15 18:12:57.645 Forts_trader (CY-12.15,H1)      Remove: Ордер не отослан! Причина:  Неправильный запрос Билет = 21967677
2015.10.15 18:12:59.982 Forts_trader (CY-12.15,H1)      Remove: Ордер не отослан! Причина:  Неправильный запрос Билет = 21967677

 Запрос-то правильный, сообщение терминала не правильное!

Причина обращения: