Расчудесное поведение тестера стратегий МТ4

 

За 15 лет программирования на MQL4 вчера впервые столкнулся с подобной ситуацией. Смотрите, Ставлю 2 отложенных ордера -Байстоп и Байлимит. Цена поехала вниз, сработал лимитник. Дело в том, что у него ТейкПрофит находится чётко в точке срабатывания байстопа. То есть, на спред ниже. В тестере стратегий терминала я в выпадающем списке спредов вбрал фиксированный спред = 2 пунктам. Это значит, что как только Аск приедет в точку установки Байстопа, по цене Бид сработает тейк бывшего лимитника.

Далее, я делаю проверку, если счётчик БайСтоп-ордеров = 0, то проверяем в истории наличие байлимит-ордера, закрытого по тейку. Если в истории нет бывшего лимитника, то выполняем 1 набор действий, если есть, то другой.

Результат. Срабатывает лимитник, появляется первый лонг. Он едет в профит. И в момент, когда Аск достигает точки срабатывания БайСтопа, происходит сразу 2 события: 1) байстоп становится рыночным Бай-ордером и 2) бывший БайЛимит закрывается по тейк-профиту.

В этой точке счётчик байстопов показывает ноль, и это нормально, ибо стопового больше нет, а счётчик Бай-ордеров истории тоже, увы, показывает НОЛЬ! И это не нормально, ибо первый лонг на этом тике уехал в историю - закрылся по тейку. В результате советник выполняет не тот набор действий, который нужен.

Хочу подчеркнуть особо, что это САМОЕ НАЧАЛО работы советника в тестере. То есть, ни каких ранее закрытых ордеров не было - история ордеров пуста.

Я довольно долго искал причину, пока до меня ни дошло попробовать пропустить 1 тик впустую. В результате получился такой код:

Если ордеров нет, то ставим байстоп, ставим байлимит, поднимаем флаг пропуска тика. Следующий блок кода: Если Бастопов нет, то если флаг поднят, то флаг сбросить и return(0), иначе, принт счётчика байордеров истории.

Запускаю в тестере и, о чудо, в истории появился мой бывший байлимит. Счётчик бай-ордеров истории вернул 1.

Я подуспокоился и стал тестировать далее. Снова вылезли глюки. Где-то помогает флаг, а где-то нет. В результате вместо флага я воткнул счётчик тиков. Ну, чтоб я мог указать явно, сколько именно нужно пропустить тиков впустую. Завёл счётчик на 2 тика. Этого пока что оказалось достаточно. До 3 ещё поднимать не приходилось. Ребят, это нормальное поведение тестера стратегий? По идее, на реальных торгах такого глюка быть не должно. А отсюда возникает вопрос, наблюдал ли кто-то подобное в реалтайме, а не в тестере?

 

Ага, я ранее, оказывается, задавал похожий вопрос. И Rosh мне уже на него отвечал https://www.mql5.com/ru/forum/130799#comment_3341848. Подзабылось уже. 12 лет с той поры прошло как ни как.  Но всё равно последний вопрос остаётся открытым, в реалтайме с подобным кто-то сталкивался?

К чему я это спрашиваю? Если в реалтайме наблюдается такой же глюк, то при разработке управляющих конструкций программы, если они опираются на наличие ордера в истории, придётся заводить счётчик пустых тиков на некое число. Если не наблюдается, то счётчик всё равно нужно воткнуть в код, ибо тестер стратегий, а на реалтайме просто его обнулить.

Глюк Терминала? Вопрос к разработчикам. Build 225, 229.
Глюк Терминала? Вопрос к разработчикам. Build 225, 229.
  • 2010.12.24
  • www.mql5.com
Столкнулся сегодня с прелюбопытнейшим явлением и так и не понял что это - ошибка у меня в коде, или глюк тестера в терминале. Суть в следующем...
 

Может есть способ сделать проще? Зачем ходить в историю? Вам заведомо известно, что спред фиксированный и что если бай стоп сработал - бывшая лимитка точно закрылась по тейку.

Может достаточно будет открывать лимитку с мэджиком 1, а стоп ордер с мэджиком 2, к примеру.

Дальше если есть рыночная покупка, смотрим на ее мэджик:

1 - это бывший лимитный ордер

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

Не знаю, на сколько у вас там сложная логика. Но если проблему приходится решать костылями, подумайте, есть ли способ с ней не сталкиваться вообще.

 
Vladislav Boyko #:

Может есть способ сделать проще? Зачем ходить в историю? Вам заведомо известно, что спред фиксированный и что если бай стоп сработал - бывшая лимитка точно закрылась по тейку.

Может достаточно будет открывать лимитку с мэджиком 1, а стоп ордер с мэджиком 2, к примеру.

Дальше если есть рыночная покупка, смотрим на ее мэджик:

1 - это бывший лимитный ордер

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

Не знаю, на сколько у вас там сложная логика. Но если проблему приходится решать костылями, подумайте, есть ли способ с ней не сталкиваться вообще.

Лимитник у меня отличается от такого же стопового лотом. По лоту я мог бы отличить 2 лонга истории друг от друга. Но тут вот в чём загвоздка в процессе торгов лимитник может оказаться закрыт по стоплоссу. Закрыться где-то между отложенными ордерами. Мне нужно различать это.  Если по тейку, то 1 набор действий, если по стопу, то другой. Поэтому приходится отлавливать последний ордер истории. Если у него лот, скажем, 0,2, то это бывший стоповый. Мне он не нужен. Если лот 0,1, то это бывший лимитник, и мне нужен его тикет, чтоб посмотреть, а по какой же цене он закрылся. Беда в том, что логика советника принимает решение о дальнейших действиях именно по признаку, закрыт лимитник по стопу или по тейку. Увы. Сам не рад. Да вобщем-то ладно, счётчиком тиков я обошёл это. Нужен ли этот счётчик для реалтайма? Видать придётся выяснять на деле.

 
Vitaly Murlenko #:

Лимитник у меня отличается от такого же стопового лотом. По лоту я мог бы отличить 2 лонга истории друг от друга. Но тут вот в чём загвоздка в процессе торгов лимитник может оказаться закрыт по стоплоссу. Закрыться где-то между отложенными ордерами. Мне нужно различать это.  Если по тейку, то 1 набор действий, если по стопу, то другой. Поэтому приходится отлавливать последний ордер истории. Если у него лот, скажем, 0,2, то это бывший стоповый. Мне он не нужен. Если лот 0,1, то это бывший лимитник, и мне нужен его тикет, чтоб посмотреть, а по какой же цене он закрылся. Беда в том, что логика советника принимает решение о дальнейших действиях именно по признаку, закрыт лимитник по стопу или по тейку. Увы. Сам не рад. Да вобщем-то ладно, счётчиком тиков я обошёл это. Нужен ли этот счётчик для реалтайма? Видать придётся выяснять на деле.

Я на MOEX торгую. На быстром рынке неоднократно сталкивался с ситуацией, когда мои лимитные ордера исполнялись, но информация об активах не менялась. Причём длиться такая ситуация может продолжительное время, до нескольких минут. И это не MT.
 
Vitaly Murlenko:


В этой точке счётчик байстопов показывает ноль, и это нормально, ибо стопового больше нет, а счётчик Бай-ордеров истории тоже, увы, показывает НОЛЬ! И это не нормально, ибо первый лонг на этом тике уехал в историю - закрылся по тейку. В результате советник выполняет не тот набор действий, который нужен.


На тике на котором ордер закрылся по стопам в исторические он не попадает, только на следующем, да и самостоятельное закрытие рыночного ордера / позиции тоже не гарантирует попадание в историю на этом же тике. Вообще логика, если ордера нет, открываем бывает задваивает ордера,  в 5ке 

Проверка на наличие дублей ордеров/позиций в MT5
Проверка на наличие дублей ордеров/позиций в MT5
  • 2021.09.12
  • www.mql5.com
Появление дублей ордеров/позиций в MT5 - архитектурная особенность платформы, с которой многие сталкиваются. Данная неприятность вызывает серьезные перекосы в торговых рисках, ломает логику, усложняет
 
Спасибо за комментарии. Буду встраивать счётчик пустых тиков безусловно. Жесть :(
 

Тестер стратегий продолжает радовать. Похоже, у меня скоро целая коллекция глюков тестера накопится. Итак, начнём.

Вот как после этого тестировать советника, если он показывает такие цифры? И, самое интересное, что совершенно непонятно, откуда они берутся?

Ситуация со второго скрина ввобще удручает. Срабатывает отложка, цена проходит несколько пунктов, SL рыночного ордера устанавливается в безубыток. Цена разворачивается, срабатывает SL установленный в точку открытия ордера, и в результате убыток!!!

 

Едем дальше. Если убыток предыдущего скриншота можно было бы списать на своп, то вот ситуация в конце дня. Время открытия ордеров - примерно 22 часа. На скрине закрылись 3 совершенно одинаковых Селл-ордера. Все три закрыты в безубытке по СтопЛоссу. И что удивляет больше всего, у всех их РАЗНЫЕ убытки при одинаковом лоте = 0,2.


 
Скажет ли мне разработчик что-нибудь по этому поводу?
 
Vitaly Murlenko #:
Скажет ли мне разработчик что-нибудь по этому поводу?
можт просто комиссию за лот начислили - чекните какие у вас торговые условия
Причина обращения: