Вопрос в названии темы. Мысли мои по этому поводу просты: можно узнать что количество позиций в истории, и, если количество позиций увеличилось, то появился новая позиция. Это как-бы очевидно. Но откуда мне знать, это позиция открыта по рынку или отложенный ордер перешёл в состояние позиции т.е. открытого ордера?
При размещении отложенного ордера запомнить его тикет, или тикеты в массив, а затем на каждом тике проверять тип ордера.
При размещении отложенного ордера запомнить его тикет, или тикеты в массив, а затем на каждом тике проверять тип ордера.
Я думал как-то красивее можно))
В общем, навскидку я думаю сделать структуру типа такой:
struct LotProperties { ulong ticket; // Тикет int orderType; // Тип позиции };
Если у ордера с тикетом соответствующем изменился тип на рыночные, тогда событие произошло. Т.е. проще даже проверять по циклу, если у какого-то ордера тип рыночного ордера, значит событие произошло. Иначе не получится как я понимаю. Так?
Функции обработки событий
OnTrade
OnTradeTransaction
Ловите событие, а там уже по предложенным вам вариантам.
Функции обработки событий
OnTrade
OnTradeTransaction
Ловите событие, а там уже по предложенным вам вариантам.
С помощью OnTradeTransaction() у меня уже всё это реализовано. Но я почитал форум, и понял, что это не надёжно. Гарантий нет, что данные о транзакции будут доставлены. Стоит на несколько секунд потерять связь или ещё какой-нить момент и данные пропарены т.к. их никто не кнтролирует. И что тогда делать? Ведь закрыться позиция может в любой момент. А если бот на разных графиках, то это ещё усугубляет положение. Ненадёжно это всё. Вот я и решил перенести всё из функции OnTradeTransaction() как-нить.
Только тоже не всё гладко. Придётся во-первых, на каждом тике шерстить массив, а ещё, в придачу ко всему, нужно контролировать не только сыбытие закрытия по тейку или стопу или ещё что-то, а ещё что ордер может быть удалён, и, соответственно, удалять его из массива. И это нужно как-то по уму реализовать, потому что наскоком просто все тикеты в тот же массив запихнуть не вариант т.к. данные можно пропарить..
С помощью OnTradeTransaction() у меня уже всё это реализовано. Но я почитал форум, и понял, что это не надёжно. Гарантий нет, что данные о транзакции будут доставлены. Стоит на несколько секунд потерять связь или ещё какой-нить момент и данные пропарены т.к. их никто не кнтролирует. И что тогда делать? Ведь закрыться позиция может в любой момент. А если бот на разных графиках, то это ещё усугубляет положение. Ненадёжно это всё. Вот я и решил перенести всё из функции OnTradeTransaction() как-нить.
Только тоже не всё гладко. Придётся во-первых, на каждом тике шерстить массив, а ещё, в придачу ко всему, нужно контролировать не только сыбытие закрытия по тейку или стопу или ещё что-то, а ещё что ордер может быть удалён, и, соответственно, удалять его из массива. И это нужно как-то по уму реализовать, потому что наскоком просто все тикеты в тот же массив запихнуть не вариант т.к. данные можно пропарить..
Так вопрос-то задан в разделе по mql4 ... Соответственно я говорил о mql4, а в mql5 ничего лучше OnTradeTransaction() не придумаешь. И все разговоры о прерывании интернета пустое... Надо выбирать соответствующего провайдера. Ну, а если пропадает связь с сервером со стороны ДЦ, что наблюдалось неоднократно... сами знаете что делать.
Так вопрос-то задан в разделе по mql4 ... Соответственно я говорил о mql4, а в mql5 ничего лучше OnTradeTransaction() не придумаешь. И все разговоры о прерывании интернета пустое... Надо выбирать соответствующего провайдера. Ну, а если пропадает связь с сервером со стороны ДЦ, что наблюдалось неоднократно... сами знаете что делать.
Дело не в провайдере. У меня обычно всё стабильно. Но вот свет может отрубиться. Это как-бы уже сопутствующий риск. Хотя.. нужно проверять. Может и не будет косяка.
По поводу самого стабильного и единственного варианта для 4 я думаю так:
1. При выставлении отложенного ордера всегда записывать их тикет в массив с типом ордера.
2. На каждом тике сверяем, все ли присутствующие отложенные ордер и открытые позиции присутствуют в рынке. Если какого-то нет.. значит он удалён. Удаляем этот тике из массива.
3. На каждом тике проверяем тип соответствующий каждому тикету. Если у какого-то ордера (смотрим по его тикету в массиве) тип изменился с отложеного на рыночный, значит ордер стал отложенным. Значит сработало событие.
Это же самый стабильный способ. Верно? Но вот не самый удобный. Вот это как-бы мне не нравится. Мне нравится красивый чёткий и краткий код, без лишних строк. А здесь вместо несколько строк, получается их пачка... ((
Можно не сохранять тип ордера, просто собирать массив отложек и его перебирать.
Так же и с удаленной отложкой - если она удалена, то уже не станет позицией.
А пропадание коннекта обязательно нужно проверять. И приостанавливать советник на 10-15 сек после появления связи, чтобы терминал успел найти ближайший сервер, и обновил данные (позиций/котировок). Иначе могут быть "двойные" открытия.
И все разговоры о прерывании интернета пустое... Надо выбирать соответствующего провайдера. Ну, а если пропадает связь с сервером со стороны ДЦ, что наблюдалось неоднократно... сами знаете что делать.
Я думал как-то красивее можно))
...
Можно и красивее, и надежней, и удобней, и проще.
После установки ордера создаем глобальную переменную, в имя которой входит тикет ордера. Регулярно перебирая рыночные ордера,проверяем эту глобальную переменную, если она есть, значит, только что произошло срабатывание, делаем что надо с ордером и удаляем переменную.
Очень аргументированно... особенно с учётом того что это исходит от Продавца в Маркете, а не того кто забирает деньги с рынка
Конечно аргументировано... особенно с учётом того, что в маркете я как-бы попутно. Ничего не подал ещё и не переживаю об этом. Как говорится: "Нежили богато, нехрен начинать." Да и бесплатных продуктов, у меня в маркете, больше чем платных.
А вот ваших аргументов ЗА ваш способ решения проблемы никто так и не увидел. Одни только минусы варианта который для вас неприемлем. Решение как в mql4 вроде-бы надёжней, на случай прерывания связи с сервером. Но если ордеров и позиций будет много, то тормоз будет приличный. В некоторых моментах возможен и пропуск тика. Так-что этот диалог равносилен диалогу о вкусах фломастеров, на цвет разные, а на вкус все одинаковые.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вопрос в названии темы. Мысли мои по этому поводу просты: можно узнать что количество позиций в истории, и, если количество позиций увеличилось, то появился новая позиция. Это как-бы очевидно. Но откуда мне знать, это позиция открыта по рынку или отложенный ордер перешёл в состояние позиции т.е. открытого ордера?
Если бы была отдельно история сделок и ордеров, можно было бы тикет последней сделки запомнить, и посмотреть, есть ли ордер с таким тикетом в истории тикетов. А этак что-то не особо понятно как это реализовать..