MQL4 отслеживание закрытия ордера по TP - страница 3

 
fxsaber #:
О! Вышел тиковый "монстр". ;-) Тож код вкуриваю.... кое - что новое.....
Спс.
 
Ihor Herasko #:

Будет воспроизводимый пример, тогда можно и дискутировать. В 5-ке - да, бывают накладки из-за асинхронности процессов, там ставка на скорость, но не в 4-ке, в которой все синхронизировано, но работает медленнее. Кроме того: причем здесь OrdersTotal()?

Опять OrdersTotal(). Не было о ней речи.


Это просто другой путь, который никак не отменяет OrdersHistoryTotal(). К тому же, пока по тестам выходит, что история ордеров выигрывает. 

Как раз эту позицию я и поддерживаю. Все правильно.

Прошу прощения, если надоел, сделаю последнее уточнение.
Необходимо, чтобы советник работал по OnTick() - реализую, потом,
соответственно, я просматриваю OrdersHistoryTotal() каждый тик,
(в споре по OrdersHistoryTotal() я пока на вашей стороне и, хотел бы использовать этот параметр)
и, если количество исторических ордеров сменилось, я просматриваю последний закрытый ордер
и проверяю комментарий для этого ордера на предмет причины закрытия (takeProfit), я правильно понял?
Если да, то какие эффективные и наиболее правильные механизмы уже есть для парсинга комментариев

 
adamsm1th #:

Прошу прощения, если надоел, сделаю последнее уточнение.
Необходимо, чтобы советник работал по OnTick() - реализую, потом,
соответственно, я просматриваю OrdersHistoryTotal() каждый тик,
(в споре по OrdersHistoryTotal() я пока на вашей стороне и, хотел бы использовать этот параметр)
и, если количество исторических ордеров сменилось, я просматриваю последний закрытый ордер
и проверяю комментарий для этого ордера на предмет причины закрытия (takeProfit), я правильно понял?
Если да, то какие эффективные и наиболее правильные механизмы уже есть для парсинга комментариев

С моей точки зрения это не самый правильный вариант.

Вот представьте, вы пополнили счёт или сняли какую-то сумму… В истории появилась запись об этом. Соответственно изменилось количество ордеров в истории. Вы берёте последний ордер по типу и получаете давно забытый ордер, читаете comment и ……………

На мой взгляд лучшее решение этого вопроса:

При запуске советника заполнять массив тикетами.

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

 
Alexey Viktorov #:

С моей точки зрения это не самый правильный вариант.

Вот представьте, вы пополнили счёт или сняли какую-то сумму… В истории появилась запись об этом. Соответственно изменилось количество ордеров в истории. Вы берёте последний ордер по типу и получаете давно забытый ордер, читаете comment и ……………

На мой взгляд лучшее решение этого вопроса:

При запуске советника заполнять массив тикетами.

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


Рис: вот так и хотел, храню массив тикетов для всех ордеров, при очередном усреднении я закрываю previousOrder и открываю currentOrder, при этом запоминаю все закрытые по причине усреднения ордера в массиве тикетов. Массив сбрасываю, когда currentOrder закрывается по TP (то есть сетка закрылась). Таким образом у меня в OrdersTotal почти всегда будет 1. Такая вот проблема.
 
adamsm1th #:

Рис: вот так и хотел, храню массив тикетов для всех ордеров, при очередном усреднении я закрываю previousOrder и открываю currentOrder, при этом запоминаю все закрытые по причине усреднения ордера в массиве тикетов. Массив сбрасываю, когда currentOrder закрывается по TP (то есть сетка закрылась). Таким образом у меня в OrdersTotal почти всегда будет 1. Такая вот проблема.

Почти всегда, за исключением случая когда ордер закрылся по ТП. В этот момент открытых ордеров будет «нету». Ну, а если есть ордера по другим валютам, то это надо обрабатывать соответствующим образом. Главное в любом случае открытых стало меньше чем было…

 
Alexey Viktorov #:

Почти всегда, за исключением случая когда ордер закрылся по ТП. В этот момент открытых ордеров будет «нету». Ну, а если есть ордера по другим валютам, то это надо обрабатывать соответствующим образом. Главное в любом случае открытых стало меньше чем было…

Спасибо за замечание, если у меня OrdersTotal == 0, я беру последний тикет из массива и делаю OrderSelect по тикету и на основании комментария проверяю, действительно ли ордер был закрыт по TP.
Тогда сразу уточнение, а какие методы парсинга комментария вы используете?
Документация не дает явного ответа, какого вида строку я получу в итоге от OrderComment.

P.S. еще должен быть реализован способ заполнения массива ордеров (которые формально закрыты) после перезапуска советника, пока не знаю, как это правильно реализовать.

 
adamsm1th #:


Тогда сразу уточнение, а какие методы парсинга комментария вы используете?

Для поиска и последующего извлечения нужной подстроки в строке используйте функции StringFind() и StringSubstr(). Если бы стояла задача деления строки на подстроки по разделителю, то функция StringSplit().


Документация не дает явного ответа, какого вида строку я получу в итоге от OrderComment.

Там может быть все, что угодно. Поэтому невозможно заранее сказать, какого вида будет эта строка. В задаче определения причины закрытия ордера достаточно искать подстроки "[sl]" и "[tp]". В продвинутом виде - еще и "s/o" (Stop Out).


P.S. еще должен быть реализован способ заполнения массива ордеров (которые формально закрыты) после перезапуска советника, пока не знаю, как это правильно реализовать.

Для этого нужно знать время выгрузки советника, т. е. где-то запоминать его (глобальные переменные терминала, файл, реестр, сеть). Зная это время легко найти ордера, которые были закрыты после выгрузки советника, т. к. у каждого ордера указывается время закрытия.

 
Ihor Herasko #:

Для этого нужно знать время выгрузки советника, т. е. где-то запоминать его (глобальные переменные терминала, файл, реестр, сеть). Зная это время легко найти ордера, которые были закрыты после выгрузки советника, т. к. у каждого ордера указывается время закрытия.

Если запоминать время именно выгрузки, можно пролететь при аварийном (питание) или долгом (>2 секунд) завершении. Так что запоминать надо время последнего изменения состояния.

Меня это привело к сохранению в файле всего состояния робота, включая внутреннюю статистику, при каждом изменении и плюс - при завершении.

 
adamsm1th #:

P.S. еще должен быть реализован способ заполнения массива ордеров (которые формально закрыты) после перезапуска советника, пока не знаю, как это правильно реализовать.

Представьте, что у вас есть два счета.

  1. Демо-счет, на котором запущен ваш советник. Причем сетевое и электрическое соединения идеальные. Даже торговый сервер не перезагружается брокером.
  2. Реальный счет. На нем случаются сюрпризы: сеть нестабильная, электричество пропадает, брокер свой сервер перезагружает и т.д.

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

Заметьте, что копир ничего не запоминает. Он просто на каждом тике сравнивает один счет с другим. Это, наверное, самое надежное решение в алготрейдинге.


Встает вопрос, как создать такой идеальный демо-счет? Некоторые делают так.

  1. Создают виртуальное окружение - демо-счет внутри советника.
  2. При запуске советника загружают историю тиков, например, за месяц. И пробрасывают ее в виртуальное окружение - на демо-счете советник "проторговал" на этих тиках.
  3. На каждом новом тике берутся все ново-поступившие тики (чтобы не было пропусков) и пробрасываются в виртуальное окружение. В итоге имеем "демо-счет с советником".
  4. Внутри советника есть копир, который копирует с виртуального окружения на реальный счет ордера.

В таком случае у вас только EX5-файл и больше ничего не нужно. Вы можете запустить его на другой машине, и он будет торговать ровно так, как если бы торговал на исходной машине.

Более того, вам не нужно запоминать расположение той же сетки ордеров, продумывать особенности исполнения ордеров брокером и т.д. Потому что у вас есть под рукой всегда идеальный "демо-счет".

 
JRandomTrader #:

Если запоминать время именно выгрузки, можно пролететь при аварийном (питание) или долгом (>2 секунд) завершении. Так что запоминать надо время последнего изменения состояния.

Меня это привело к сохранению в файле всего состояния робота, включая внутреннюю статистику, при каждом изменении и плюс - при завершении.

Это уже следующий шаг, к нему приходят только с практикой ))

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