OnTrade() Вопросы - страница 2

 
Valmars:

Есть ещё рыночные ордера, принятые, но ещё не исполненные, находящиеся в обработке.

ОК. Упустил это обстоятельство из виду, так  как пока работаю только с отложенными ордерами. Поэтому уточняю вопрос:

Как известно, отложенные ордера в терминале делятся на две категории: (1) действующие отложенные ордера и (2) исполненные отложенные ордера в истории. Как я понимаю, для работы с первой категорией ордеров предназначена функция OrderSelect(), для работы со второй - функция HistoryOrderSelect(). При этом существует описание следующей ошибки:

ERR_TRADE_ORDER_NOT_FOUND  4754 Ордер не найден

Вопрос 4. Правильно ли я понимаю, что появление ошибки 4754 при попытке обращения функции OrderSelect() к отложенному ордеру будет означать отсутствие запрашиваемого отложенного ордера в списке действующих отложенных ордеров (ордеров из первой категории), а появление этой же ошибки при попытке обращения функции HistoryOrderSelect() к отложенному ордеру будет означать отсутствие запрашиваемого отложенного ордера в истории (т.е. среди ордеров из второй категории)?

Иными словами, правильно ли я понимаю, что если сам по себе отложенный ордер существует и находится во второй категории ордеров, то при обращении к этому ордеру с помошью функции OrderSelect() будет в обязательном порядке получена ошибка 4754 (при прочих равных условиях)?  И наоборот, при обращении к ордеру из первой категории с помошью функции HistoryOrderSelect() также будет в обязательном порядке получена ошибка 4754 (при прочих равных условиях)? 

 
Yedelkin:

ОК. Упустил это обстоятельство из виду, так  как пока работаю только с отложенными ордерами. Поэтому уточняю вопрос:

Как известно, отложенные ордера в терминале делятся на две категории: (1) действующие отложенные ордера и (2) исполненные отложенные ордера в истории. Как я понимаю, для работы с первой категорией ордеров предназначена функция OrderSelect(), для работы со второй - функция HistoryOrderSelect(). При этом существует описание следующей ошибки:

Вопрос 4. Правильно ли я понимаю, что появление ошибки 4754 при попытке обращения функции OrderSelect() к отложенному ордеру будет означать отсутствие запрашиваемого отложенного ордера в списке действующих отложенных ордеров (ордеров из первой категории), а появление этой же ошибки при попытке обращения функции HistoryOrderSelect() к отложенному ордеру будет означать отсутствие запрашиваемого отложенного ордера в истории (т.е. среди ордеров из второй категории)?

Иными словами, правильно ли я понимаю, что если сам по себе отложенный ордер существует и находится во второй категории ордеров, то при обращении к этому ордеру с помошью функции OrderSelect() будет в обязательном порядке получена ошибка 4754 (при прочих равных условиях)?  И наоборот, при обращении к ордеру из первой категории с помошью функции HistoryOrderSelect() также будет в обязательном порядке получена ошибка 4754 (при прочих равных условиях)? 

Ну, по логике вещей, так и будет. А тиккет-то Вы откуда берёте ?  Всё это можно проверить, хотя бы в тестере.

А в связи с чем данный вопрос, что-то не сходится ?


 
Valmars:

А в связи с чем данный вопрос, что-то не сходится ?

Вопрос - "из глубины веков", как говорится. https://www.mql5.com/ru/forum/385/page3/#comment_7941 Вкратце его можно сформулировать так: как избежать выставления дублирующих отложенных ордеров. В том обсуждении советовали поработать с функцией Ontrade(), но тогда у меня всё время было занято другими текущими задачами.

Первые же результаты работы посланного на Ч-2010 советника заставили вернуться к этой теме. https://www.mql5.com/ru/forum/2248 

Одновременно arnautov выдвинул версию, что винована не функция OrderSend(), а функция OrdersTotal()  https://www.mql5.com/ru/forum/2236/page13/#comment_27472  Пришлось переосмыслить проблему, заодно приступив к изучению функции OnTrade(). Так как справочных материалов по функции OnTrade() практически нет, то после прочтения статьи https://www.mql5.com/ru/articles/40 и возникли перечисленные выше вопросы. Вопросы познавательного характера.

Valmars:

Ну, по логике вещей, так и будет. А тиккет-то Вы откуда берёте ?  Всё это можно проверить, хотя бы в тестере.

Спасибо за ответ. Тикет берётся у отложенного ордера, обработка которого функцией OrderSend() завершилась удачно.

А вот как проверить, насколько результаты  функций OrderSelect() и HistoryOrderSelect() соответствуют нахождению отложенного ордера в первой или второй категории, - не знаю. Поэтому и в тестере проверить не могу.

Простой торговый робот
Простой торговый робот
  • www.mql5.com
0,BID,0,0,3,ORDER_TYPE_BUY,ORDER_FILLING_AON; } return(0); }Я же просил Вас оформлять код правильно!
 

Подскажите пожалуйста...

Если у меня открыта позиция в 1 лот buy, и я ее переворачиваю 2 лота sell, при работе ф-ии OnTrade возможна ли ситуация когда старая позиция закрылась, произошло событие OnTrade, а новая еще не открылась?

void OnTrade()
  {
   if(PositionSelect(_Symbol)) 
     {
      // условие 1
     }
   else
     {
      // условие 2
     }
   return;
  }
 
OniNePriletyat:

Подскажите пожалуйста...

Если у меня открыта позиция в 1 лот buy, и я ее переворачиваю 2 лота sell, при работе ф-ии OnTrade возможна ли ситуация когда старая позиция закрылась, произошло событие OnTrade, а новая еще не открылась?

Посмотрите статью Роша на эту тему, она так и называется: "Торговые события в МТ5". Может, найдёте точный ответ.
 
Yedelkin:
Посмотрите статью Роша на эту тему, она так и называется: "Торговые события в МТ5". Может, найдёте точный ответ.
Спасибо, посмотрю.
Причина обращения: