ФОРТС. Вопросы по исполнению - страница 62

 

Всем добрый день!

У меня немного другая ситуация. Брокер БКС. Рыночный ордер исполняется далеко не с первого раза.

Отправляю приказ купить по рынку. Функция возвращает "Order placed" и номер ордера, но реально ордер не исполняется!

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

В итоге позиция рано или поздно откроется, но приходится бомбардировать брокера ордерами, что явно неправильно.

Помогите пожалуйста, я не пойму это у меня робот глючит или брокер косячит? К роботу вроде претензий нет, все функции проверки проходят как положено и ответы проверяются.

Звонил брокеры, но "консультант" развёл руками, типа если руками сделка открывается, значит ошибка в роботе, а тут они не при делах.

2015.12.23 11:02:00.053 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 55 ms
2015.12.23 11:02:00.006 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:59.554 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:59.507 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:59.413 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 116 ms
2015.12.23 11:01:59.304 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:59.117 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:59.055 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:58.774 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 54 ms
2015.12.23 11:01:58.711 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:58.680 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:58.633 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:58.259 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 74 ms
2015.12.23 11:01:58.181 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.916 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:57.869 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.775 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:57.729 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.682 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:57.619 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.557 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:57.510 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.385 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:57.323 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.292 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:57.245 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:57.058 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 63 ms
2015.12.23 11:01:56.995 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:56.777 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:56.730 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:56.481 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:56.434 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:56.169 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:56.122 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:56.075 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:56.028 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:55.451 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:55.389 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:55.326 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:55.279 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:55.155 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:55.092 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:55.045 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 54 ms
2015.12.23 11:01:54.983 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:54.983 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:54.921 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:54.843 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:54.796 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:54.655 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:54.609 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:54.546 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:54.484 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:54.453 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 151 ms
2015.12.23 11:01:54.297 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.844 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:53.797 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.751 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:53.688 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.423 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:53.376 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.361 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 60 ms
2015.12.23 11:01:53.298 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.283 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:53.236 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.142 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:53.080 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:53.033 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:52.986 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:52.877 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:52.830 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:52.830 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 69 ms
2015.12.23 11:01:52.752 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:52.643 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:52.596 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:52.487 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:52.440 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:52.425 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:52.378 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:52.081 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 55 ms
2015.12.23 11:01:52.019 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:51.988 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:51.941 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:51.879 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 51 ms
2015.12.23 11:01:51.832 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:51.364 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:51.317 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:51.223 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:51.161 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:51.114 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:51.052 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.989 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:50.943 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.693 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:50.631 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.584 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:50.521 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.475 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:50.412 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.397 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:50.350 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.225 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 53 ms
2015.12.23 11:01:50.178 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.147 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:50.100 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:50.053 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:49.991 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:49.975 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 52 ms
2015.12.23 11:01:49.913 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
2015.12.23 11:01:49.866 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487 placed for execution in 51 ms
2015.12.23 11:01:49.804 Trades  'xxxxxxx': exchange buy 66.00 Si-3.16 at market sl: 72487
 
Сергей:

Всем добрый день!

У меня немного другая ситуация. Брокер БКС. Рыночный ордер исполняется далеко не с первого раза.

Отправляю приказ купить по рынку. Функция возвращает "Order placed" и номер ордера, но реально ордер не исполняется!

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

В итоге позиция рано или поздно откроется, но приходится бомбардировать брокера ордерами, что явно неправильно.

Помогите пожалуйста, я не пойму это у меня робот глючит или брокер косячит? К роботу вроде претензий нет, все функции проверки проходят как положено и ответы проверяются.

Звонил брокеры, но "консультант" развёл руками, типа если руками сделка открывается, значит ошибка в роботе, а тут они не при делах.

Сергей!

Не видя Вашего кода, сказать что-либо крайне затруднительно. 

Но судя по распечатке, Вы не правильно контролируете установку ордера. 

 
Михаил:

Сергей!

Не видя Вашего кода, сказать что-либо крайне затруднительно. 

Но судя по распечатке, Вы не правильно контролируете установку ордера. 


Михаил, это журнал терминала, т.е. он принимает приказ, говорит что он правильно заполнен, возвращает код успеха и номер ордера, т.е. он ставит ордер в очередь исполнения, но не исполняет. И так много-много раз.

Но я кажется разобрался в чём дело.

По алгоритму разрешённый риск позволяет открыть сделку на весь депозит. Объём сделки = доступные средства / ГО, т.е. депозит используется почти до самой последней копейки. (Тут конечно ошибка, так делать нельзя).

Формально денег достаточно для открытия сделки этим объёмом и поэтому ордер проходит проверки терминала и принимается ядром МТ5 (функция OrderSend возвращает true и номер ордера),

но дальше по очереди исполнения (у брокера или в шлюзе с биржой) где-то отвергается и в итоге не исполняется. Вот тут где-то и недоработка МТ5 со стороны Метаквотов.

Проблема в том, что мне как клиенту об этом никак не сообщают. Для робота всё прошло успешно, а фактически ордер отвергнут брокером/шлюзом/биржей (тут я только могу предполагать).


Функция OrderSend должна была отвергнуть ордер и вернуть роботу код ошибки TRADE_RETCODE_NO_MONEY, но почему-то этого не произошло.

Видимо надо подробно отследить ход исполнения транзакции OnTradeTransaction.

 
Сергей:


Михаил, это журнал терминала, т.е. он принимает приказ, говорит что он правильно заполнен, возвращает код успеха и номер ордера, т.е. он ставит ордер в очередь исполнения, но не исполняет. И так много-много раз.

Но я кажется разобрался в чём дело.

По алгоритму разрешённый риск позволяет открыть сделку на весь депозит. Объём сделки = доступные средства / ГО, т.е. депозит используется почти до самой последней копейки. (Тут конечно ошибка, так делать нельзя).

Формально денег достаточно для открытия сделки этим объёмом и поэтому ордер проходит проверки терминала и принимается ядром МТ5 (функция OrderSend возвращает true и номер ордера),

но дальше по очереди исполнения (у брокера или в шлюзе с биржой) где-то отвергается и в итоге не исполняется. Вот тут где-то и недоработка МТ5 со стороны Метаквотов.

Проблема в том, что мне как клиенту об этом никак не сообщают. Для робота всё прошло успешно, а фактически ордер отвергнут брокером/шлюзом/биржей (тут я только могу предполагать).


Функция OrderSend должна была отвергнуть ордер и вернуть роботу код ошибки TRADE_RETCODE_NO_MONEY, но почему-то этого не произошло.

Ещё раз повторяю, что Вы не правильно контролируете установку ордера.

То, что Вы получили БИЛЕТ ордера, совсем не означает, что ордер выставлен на биржу! 

 
Михаил:

Ещё раз повторяю, что Вы не правильно контролируете установку ордера.

То, что Вы получили БИЛЕТ ордера, совсем не означает, что ордер выставлен на биржу! 

Согласен, как оказалось у меня тут пробел в знаниях по этому вопросу.

До этого не сталкивался с подобным поведением, банально отправлял по рынку и всегда либо открывался, либо сразу получал ошибку.

В общем не было необходимости вникать в низкоуровневые нюансы исполнения ордера в очереди. А тут...

 
Сергей:

Согласен, как оказалось у меня тут пробел в знаниях по этому вопросу.

До этого не сталкивался с подобным поведением, банально отправлял по рынку и всегда либо открывался, либо сразу получал ошибку.

В общем не было необходимости вникать в низкоуровневые нюансы исполнения ордера в очереди. А тут...

После получения ордера, воспользуйтесь функцией OrderRealSelect()

https://www.mql5.com/ru/forum/67298/page2#comment_2089220 

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • www.mql5.com
Установка отложенного ордера командой OrderSend(). - Страница 2 - Категория: биржевой трейдинг
 

Приблизительно так нужно делать:

//+------------------------------------------------------------------+
//|                                                   Test_array.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Mikalas"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
#define ERR_ZERO_TICKET -1
//
enum ENUM_ORD_REAL_STATE
{
  ORD_NOT_SPECIFIED         = 0, //Состояние ордера не определено
  ORD_NONE_CANCELED         = 1, //Ордера нет, отменён пользователем
  ORD_NONE_PARTIAL_CANCELED = 2, //Ордера нет, исполнился частично (не был залит вторым объёмом)
  ORD_NONE_PARTIAL          = 3, //Ордера нет, исполнился частично
  ORD_NONE_EXPIRED          = 4, //Ордера нет, удалён по сроку
  ORD_NONE_FILLED           = 5, //Ордера нет, исполнился полностью
  ORD_NONE_REJECTED         = 6, //Ордера нет, отклонён брокером(биржей)
  ORD_BUSY                  = 7, //Ордер находится в переходном состоянии
  ORD_EXIST                 = 8, //Ордер выставлен на биржу, возможны действия над ним
  ORD_EXIST_PARTIAL         = 9  //Ордер выставлен на биржу, частично исполнился, возможны действия над ним
};
enum ENUM_ORD_SELECT
{
  SELECT_ERROR = 0,
  SELECT_FALSE = 1,
  SELECT_TRUE  = 2,
  SELECT_BUSY  = 3
};
//
struct ORDER_DATA
{
  int                     error_code;
  datetime                time_setup;
  ENUM_ORDER_TYPE         type;
  ENUM_ORDER_STATE        state;
  ENUM_ORD_REAL_STATE     real_state;
  datetime                expiration;
  datetime                time_done;
  long                    t_set_msc;
  long                    t_done_msc; 
  ENUM_ORDER_TYPE_FILLING type_filling;
  ENUM_ORDER_TYPE_TIME    type_time;
  long                    magic;
  long                    pos_id;
  double                  vol_init;
  double                  vol_cur;
  double                  price_open;
  double                  sl;
  double                  tp;
  double                  price_cur;
  double                  price_stlim;
  string                  symbol;
  string                  comment;      
};
//
//
ulong order_ticket;
//
//+------------------------------------------------------------------+
// Expert Order Real Select function                                 |
//+------------------------------------------------------------------+
ENUM_ORD_SELECT OrderRealSelect( const ulong ticket, ORDER_DATA &ord_data, const bool get_data )
{
  double init_vol = 0;
  double cur_vol = 0;
  ZeroMemory( ord_data );
  ord_data.real_state = ORD_NOT_SPECIFIED;
  ord_data.error_code = ERR_SUCCESS;
  ResetLastError();
//---  
  if ( ticket > 0 )
  {
    if ( HistoryOrderSelect( ticket ) )
    {
      if ( get_data )
      {
        ord_data.comment = HistoryOrderGetString( ticket, ORDER_COMMENT );
        ord_data.expiration = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_EXPIRATION ) ); 
        ord_data.magic = HistoryOrderGetInteger( ticket, ORDER_MAGIC );
        ord_data.pos_id = HistoryOrderGetInteger( ticket, ORDER_POSITION_ID );
        ord_data.price_cur = HistoryOrderGetDouble( ticket, ORDER_PRICE_CURRENT );
        ord_data.price_open = HistoryOrderGetDouble( ticket, ORDER_PRICE_OPEN );
        ord_data.price_stlim = HistoryOrderGetDouble( ticket, ORDER_PRICE_STOPLIMIT );
        ord_data.sl = HistoryOrderGetDouble( ticket, ORDER_SL );
        ord_data.state = ENUM_ORDER_STATE( HistoryOrderGetInteger( ticket, ORDER_STATE ) );
        ord_data.symbol = HistoryOrderGetString( ticket, ORDER_SYMBOL );
        ord_data.t_done_msc = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_DONE_MSC ) );
        ord_data.t_set_msc = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_SETUP_MSC ) );
        ord_data.time_done = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_DONE ) );
        ord_data.time_setup = datetime( HistoryOrderGetInteger( ticket, ORDER_TIME_SETUP ) );
        ord_data.tp = HistoryOrderGetDouble( ticket, ORDER_TP );
        ord_data.type = ENUM_ORDER_TYPE( HistoryOrderGetInteger( ticket, ORDER_TYPE ) );
        ord_data.type_filling = ENUM_ORDER_TYPE_FILLING( HistoryOrderGetInteger( ticket, ORDER_TYPE_FILLING ) );
        ord_data.type_time = ENUM_ORDER_TYPE_TIME( HistoryOrderGetInteger( ticket, ORDER_TYPE_TIME ) );
        ord_data.vol_cur = HistoryOrderGetDouble( ticket, ORDER_VOLUME_CURRENT );
        ord_data.vol_init = HistoryOrderGetDouble( ticket, ORDER_VOLUME_INITIAL );
      }
      else
      {
        ord_data.state = ENUM_ORDER_STATE( HistoryOrderGetInteger( ticket, ORDER_STATE ) );
        cur_vol = HistoryOrderGetDouble( ticket, ORDER_VOLUME_CURRENT );
        init_vol = HistoryOrderGetDouble( ticket, ORDER_VOLUME_INITIAL );
      }   
//---
      switch( ord_data.state )
      { 
        case ORDER_STATE_CANCELED: if ( get_data )
                                   {
                                     if ( ord_data.vol_init == ord_data.vol_cur )
                                     {
                                       ord_data.real_state = ORD_NONE_CANCELED;
                                     }
                                     else
                                     {
                                       ord_data.real_state = ORD_NONE_PARTIAL_CANCELED;
                                     }
                                   }
                                   else
                                   {
                                     if ( init_vol == cur_vol )
                                     {
                                       ord_data.real_state = ORD_NONE_CANCELED;
                                     }
                                     else
                                     {
                                       ord_data.real_state = ORD_NONE_PARTIAL_CANCELED;
                                     }
                                   }    
                                   break;
                                        
        case ORDER_STATE_PARTIAL:  ord_data.real_state = ORD_NONE_PARTIAL;
                                   break;
                                         
        case ORDER_STATE_EXPIRED:  ord_data.real_state = ORD_NONE_EXPIRED;
                                   break;
                                                                              
        case ORDER_STATE_FILLED:   ord_data.real_state = ORD_NONE_FILLED;
                                   break;
                                         
        case ORDER_STATE_REJECTED: ord_data.real_state = ORD_NONE_REJECTED;
                                   break;  
      }
    }
    else
    if ( OrderSelect( ticket ) )
    {
      if ( get_data )
      {
        ord_data.comment = OrderGetString( ORDER_COMMENT );
        ord_data.expiration = datetime( OrderGetInteger( ORDER_TIME_EXPIRATION ) ); 
        ord_data.magic = OrderGetInteger( ORDER_MAGIC );
        ord_data.pos_id = OrderGetInteger( ORDER_POSITION_ID );
        ord_data.price_cur = OrderGetDouble( ORDER_PRICE_CURRENT );
        ord_data.price_open = OrderGetDouble( ORDER_PRICE_OPEN );
        ord_data.price_stlim = OrderGetDouble( ORDER_PRICE_STOPLIMIT );
        ord_data.sl = OrderGetDouble( ORDER_SL );
        ord_data.state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) );
        ord_data.symbol = OrderGetString( ORDER_SYMBOL );
        ord_data.t_done_msc = datetime( OrderGetInteger( ORDER_TIME_DONE_MSC ) );
        ord_data.t_set_msc = datetime( OrderGetInteger( ORDER_TIME_SETUP_MSC ) );
        ord_data.time_done = datetime( OrderGetInteger( ORDER_TIME_DONE ) );
        ord_data.time_setup = datetime( OrderGetInteger( ORDER_TIME_SETUP ) );
        ord_data.tp = OrderGetDouble( ORDER_TP );
        ord_data.type = ENUM_ORDER_TYPE( OrderGetInteger( ORDER_TYPE ) );
        ord_data.type_filling = ENUM_ORDER_TYPE_FILLING( OrderGetInteger( ORDER_TYPE_FILLING ) );
        ord_data.type_time = ENUM_ORDER_TYPE_TIME( OrderGetInteger( ORDER_TYPE_TIME ) );
        ord_data.vol_cur = OrderGetDouble( ORDER_VOLUME_CURRENT );
        ord_data.vol_init = OrderGetDouble( ORDER_VOLUME_INITIAL );
      }
      else
      {
        ord_data.state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) );
      }
//--- 
      switch( ord_data.state )
      { 
        case ORDER_STATE_STARTED:
        case ORDER_STATE_REQUEST_ADD:
        case ORDER_STATE_REQUEST_MODIFY:
        case ORDER_STATE_REQUEST_CANCEL: ord_data.real_state = ORD_BUSY;
                                         break; 
 
        case ORDER_STATE_PARTIAL:        ord_data.real_state = ORD_EXIST_PARTIAL;
                                         break;
                                          
        case ORDER_STATE_PLACED:         ord_data.real_state = ORD_EXIST;
                                         break;
      }
    }
    else
    {
      ord_data.error_code = GetLastError();
    }  
//---   
    if ( ( ord_data.error_code != ERR_SUCCESS ) ||
       ( ord_data.real_state == ORD_NOT_SPECIFIED ) )
    {
      return( SELECT_ERROR );
    }
    else
    {
      switch( ord_data.real_state )
      {
        case ORD_BUSY:          return( SELECT_BUSY );
                                break;
                        
        case ORD_EXIST:   
        case ORD_EXIST_PARTIAL: return( SELECT_TRUE );
                                break;
                              
        default:                return( SELECT_FALSE );
                                break;                                             
      }
    }
  } 
  else
  {
    ord_data.error_code = ERR_ZERO_TICKET; 
    return( SELECT_ERROR );
  }
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return( INIT_SUCCEEDED );
}
//
void OnTick()
{
  if ( PositionSelect( _Symbol ) )
  {
    //Позиция открыта, ордер исполнился
  }
  else
  {
    if ( order_ticket > 0 )
    {
      //Проверяем что с ордером
      ORDER_DATA order_data;
      ENUM_ORD_SELECT ord_select = OrderRealSelect( order_ticket, order_data, true );
      switch( ord_select )
      {
        case SELECT_BUSY:  //Ничего не делаем, ордер в переходном состоянии
                           break;
        
        case SELECT_FALSE: //Ордера нет .... Проверяем, что с ним произошло
                           break;
                           
        case SELECT_TRUE: //Ордер есть.... Проверяем почему есть, а не исполнился
                           break; 
                           
        case SELECT_ERROR: //Проверяем что за ошибка
                           break;                                                             
      }
    }
    else
    {
      //Позиции нет, ордера нет. Устанавливаем ордер
    }
  }
}
 
 
Михаил:

Приблизительно так нужно делать:

Михаил, благодарю! Весьма полезная функция.
 
Вот уже год прошел с момента начала этой темы.... :(
 

  Айтуган, может  всё-таки какие-то комментарии будут? :((

 Я понимаю конечно, очень не хочется отвлекать Вас от отдыха на Кипре, но как-то молчание  затянулось до неприличия долго. :(( 

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