Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 12
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Было бы здорово обойти этот момент на уровне MT4Orders..
Сейчас случаются задвоения ордеров, к сожалению. Скорее всего, из-за этого.
https://www.mql5.com/ru/forum/93352/page40#comment_13943845 оно?
https://www.mql5.com/ru/forum/93352/page40#comment_13943845 оно?
К сожалению, задвоения и с этим костылем происходят.
Я уже не знаю, в какую сторону дебажить.
К сожалению, задвоения и с этим костылем происходят.
Я уже не знаю, в какую сторону дебажить.
Вот причина (не факт, что других нет).
П.6. самый неприятный. Как обходить этот баг MT5 - не придумал.
Вот причина (не факт, что других нет).
П.6. самый неприятный. Как обходить этот баг MT5 - не придумал.
Тут бы сработала проверка на "пропавший" ордер. А она не срабатывает.
Видимо, что-то у себя намудрил.
Тут бы сработала проверка на "пропавший" ордер. А она не срабатывает.
Видимо, что-то у себя намудрил.
В п.7. "пропавший" найдется, но позиции так и нет.
В п.7. "пропавший" найдется, но позиции так и нет.
Значит ли это, что цикл по MT4Orders::OrdersTotal() не увидит ни ордер, ни позицию?
Я думал, этот момент как раз решен: либо в списке есть ордер/позиция, либо ордер "пропал". Как может случиться что-то третье?
Значит ли это, что цикл по MT4Orders::OrdersTotal() не увидит ни ордер, ни позицию?
Во всех пунктах, кроме п.6 и п.7, показано, что видна одна позиция.
Я думал, этот момент как раз решен: либо в списке есть ордер/позиция, либо ордер "пропал". Как может случиться что-то третье?
Представьте, что Ваш советник попадает на п.6, при этом ничего не знает про то, что был какой-то ордер. В таком случае нет никакой возможности ему узнать, что ситуация соответствует пропавшему ордеру.
Представьте, что Ваш советник попадает на п.6, при этом ничего не знает про то, что был какой-то ордер. В таком случае нет никакой возможности ему узнать, что ситуация соответствует пропавшему ордеру.
Не могу представить себе такую ситуацию, если используются лимитки на некотором расстоянии от цены (не в спреде).
Он всегда успеет увидеть установленный ордер в списке. И в последствии ордер станет либо "пропавшим", либо превратится в позицию.
Допускаю, что такая ситуация возможна, если другой советник вбросил ордер в текущую цену, и он тут же начал заливаться (п.6).
Но это все равно не объясняет, почему первый советник перестает видеть свой ордер (со своим магиком) в списке MT4Orders::OrdersTotal().
Удивительно легко воспроизвел ситуацию на боевом советнике — в момент исполнения одного из ордеров советник потерял из виду и второй.
Но при попытке собрать простой пример для воспроизведения, все работает четко. Похоже, действительно где-то в дебрях своего кода внес баг.
Вот из документации:
"очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других." https://www.mql5.com/ru/docs/event_handlers/ontradetransaction
И по опыту, транзакции TRADE_TRANSACTION_ORDER_DELETE, TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_HISTORY_ADD могут приходить в любом порядке.
Отсюда и возникают ситуации, когда сделки и ордера в истории ещё нет, а ордера уже нет. Или наоборот, ордер ещё есть, а сделка уже есть. Вот только ситуация, когда ордер одновременно есть и в действующих, и в истории, едва ли возможна.
Собственно, именно поэтому отказался от использования класса CTrade - он на все эти грабли наступает.
Способ борьбы - каждый советник ведёт список своих ордеров и отслеживает их состояние. В т.ч. "нестандартные" состояния - "ордер отправлен, но в действующих ещё не появился" (вот тут они могут задваиваться), "ордер удалён, но не появился в истории". Заодно это помогает одновременной работе на одном символе при неттинге.