Как узнать, что отложенный ордер перешёл в состояние позиции?

 

Вопрос в названии темы. Мысли мои по этому поводу просты: можно узнать что количество позиций в истории, и, если количество позиций увеличилось, то появился новая позиция. Это как-бы очевидно. Но откуда мне знать, это позиция открыта по рынку или отложенный ордер перешёл в состояние позиции т.е. открытого ордера?

Если бы была отдельно история сделок и ордеров, можно было бы тикет последней сделки запомнить, и посмотреть, есть ли ордер с таким тикетом в истории тикетов. А этак что-то не особо понятно как это реализовать..

 
Viktar Dzemikhau:
Вопрос в названии темы. Мысли мои по этому поводу просты: можно узнать что количество позиций в истории, и, если количество позиций увеличилось, то появился новая позиция. Это как-бы очевидно. Но откуда мне знать, это позиция открыта по рынку или отложенный ордер перешёл в состояние позиции т.е. открытого ордера?

При размещении отложенного ордера запомнить его тикет, или тикеты в массив, а затем на каждом тике проверять тип ордера.

 
Alexey Viktorov:

При размещении отложенного ордера запомнить его тикет, или тикеты в массив, а затем на каждом тике проверять тип ордера.

Я думал как-то красивее можно))

В общем, навскидку я думаю сделать структуру типа такой:

struct LotProperties {
  ulong  ticket;        // Тикет
  int    orderType;     // Тип позиции
};

Если у ордера с тикетом соответствующем изменился тип на рыночные, тогда событие произошло. Т.е. проще даже проверять по циклу, если у какого-то ордера тип рыночного ордера, значит событие произошло. Иначе не получится как я понимаю. Так?

 

Функции обработки событий
OnTrade

OnTradeTransaction
Ловите событие, а там уже по предложенным вам вариантам.

 
Konstantin Nikitin:

Функции обработки событий
OnTrade

OnTradeTransaction
Ловите событие, а там уже по предложенным вам вариантам.

С помощью OnTradeTransaction() у меня уже всё это реализовано. Но я почитал форум, и понял, что это не надёжно. Гарантий нет, что данные о транзакции будут доставлены. Стоит на несколько секунд потерять связь или ещё какой-нить момент и данные пропарены т.к. их никто не кнтролирует. И что тогда делать? Ведь закрыться позиция может в любой момент. А если бот на разных графиках, то это ещё усугубляет положение. Ненадёжно это всё. Вот я и решил перенести всё из функции OnTradeTransaction() как-нить.

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

Вообще, интересно, как это делали в 4-ке без применения OnTradeTransaction().
 
Viktar Dzemikhau:

С помощью OnTradeTransaction() у меня уже всё это реализовано. Но я почитал форум, и понял, что это не надёжно. Гарантий нет, что данные о транзакции будут доставлены. Стоит на несколько секунд потерять связь или ещё какой-нить момент и данные пропарены т.к. их никто не кнтролирует. И что тогда делать? Ведь закрыться позиция может в любой момент. А если бот на разных графиках, то это ещё усугубляет положение. Ненадёжно это всё. Вот я и решил перенести всё из функции OnTradeTransaction() как-нить.

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

Вообще, интересно, как это делали в 4-ке без применения OnTradeTransaction().

Так вопрос-то задан в разделе по mql4 ... Соответственно я говорил о mql4, а в mql5 ничего лучше OnTradeTransaction() не придумаешь. И все разговоры о прерывании интернета пустое... Надо выбирать соответствующего провайдера. Ну, а если пропадает связь с сервером со стороны ДЦ, что наблюдалось неоднократно... сами знаете что делать.

 
Alexey Viktorov:

Так вопрос-то задан в разделе по mql4 ... Соответственно я говорил о mql4, а в mql5 ничего лучше OnTradeTransaction() не придумаешь. И все разговоры о прерывании интернета пустое... Надо выбирать соответствующего провайдера. Ну, а если пропадает связь с сервером со стороны ДЦ, что наблюдалось неоднократно... сами знаете что делать.

Дело не в провайдере. У меня обычно всё стабильно. Но вот свет может отрубиться. Это как-бы уже сопутствующий риск. Хотя.. нужно проверять. Может и не будет косяка.

По поводу самого стабильного и единственного варианта для 4 я думаю так:

1. При выставлении отложенного ордера всегда записывать их тикет в массив с типом ордера.

2. На каждом тике сверяем, все ли присутствующие отложенные ордер и открытые позиции присутствуют в рынке. Если какого-то нет.. значит он удалён. Удаляем этот тике из массива.

3. На каждом тике проверяем тип соответствующий каждому тикету. Если у какого-то ордера (смотрим по его тикету в массиве) тип изменился с отложеного на рыночный, значит ордер стал отложенным. Значит сработало событие.

Это же самый стабильный способ. Верно? Но вот не самый удобный. Вот это как-бы мне не нравится. Мне нравится красивый чёткий и краткий код, без лишних строк. А здесь вместо несколько строк, получается их пачка... ((

 

Можно не сохранять тип ордера, просто собирать массив отложек и его перебирать.
Так же и с удаленной отложкой - если она удалена, то уже не станет позицией.

А пропадание коннекта обязательно нужно проверять. И приостанавливать советник на 10-15 сек после появления связи, чтобы терминал успел найти ближайший сервер, и обновил данные (позиций/котировок). Иначе могут быть "двойные" открытия.

 
Alexey Viktorov:

И все разговоры о прерывании интернета пустое... Надо выбирать соответствующего провайдера. Ну, а если пропадает связь с сервером со стороны ДЦ, что наблюдалось неоднократно... сами знаете что делать.

Очень аргументированно... особенно с учётом того что это исходит от Продавца в Маркете, а не того кто забирает деньги с рынка
 
Viktar Dzemikhau:

Я думал как-то красивее можно))

...

Можно и красивее, и надежней, и удобней, и проще.

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

 
A100:
Очень аргументированно... особенно с учётом того что это исходит от Продавца в Маркете, а не того кто забирает деньги с рынка

Конечно аргументировано... особенно с учётом того, что в маркете я как-бы попутно. Ничего не подал ещё и не переживаю об этом. Как говорится: "Нежили богато, нехрен начинать." Да и бесплатных продуктов, у меня в маркете, больше чем платных.

А вот ваших аргументов ЗА ваш способ решения проблемы никто так и не увидел. Одни только минусы варианта который для вас неприемлем. Решение как в mql4 вроде-бы надёжней, на случай прерывания связи с сервером. Но если ордеров и позиций будет много, то тормоз будет приличный. В некоторых моментах возможен и пропуск тика. Так-что этот диалог равносилен диалогу о вкусах фломастеров, на цвет разные, а на вкус все одинаковые.

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