MetaTrader 5 Strategy Tester! - страница 34

 
tol64:

Ответ: Нет, время любого интересующего меня таймфрейма в режиме Только цены открытия получить невозможно. 

--- 

Допустим, у нас есть две торговые стратегии и работаем мы с ними на одном символе. Условия для первой торговой стратегии формируются на таймфрейме M20. Условия для второй торговой стратегии формируются на таймфрейме M30. Подобные стратегии не получится корректно протестировать в режиме Только цены открытия, так как контролировать событие нового бара любого другого таймфрейма кроме текущего, не получится. С помощью эксперта ниже и индикатора, который предоставил Константин Груздев (Lizar) это можно проверить:

 

---

Предложение:  Может быть решение этой задачи можно решить тем, что в режим генерации цен OHLC минутных баров добавить ещё и время минутных баров? Будет тогда режим OHLCT. Допустим, это организовать можно таким образом, чтобы указывать в настройках тестера, время каких таймфреймов необходимо получать во время теста. То есть, не имеет смысла в целях экономии ресурсов получать время всех таймфреймов, когда нужно только несколько.

 Спасибо. Слава, что Вы думаете по поводу выше написанного предложения? Хотелось бы стратегии подобного рода тестировать максимально быстрым возможным способом в режиме Только цены открытия. Без контроля нового бара в этом режиме результаты получаются некорректными. Чем больше стратегий, тем больше получается каша в полученных результатах. 


 

Нифига не понимаю твой запрос.  Есть TimeCurrent() , TimeLocal(), TimeTradeServer() в конце концов. Всегда можешь запросить текущее время и вычислить своё положение относительно старта бара на любом таймфрейме.  Зачем тебе спецфункции какие-то?  Время в тестере моделируется правильно.
 
MetaDriver:
Нифига не понимаю твой запрос.  Есть TimeCurrent() , TimeLocal(), TimeTradeServer() в конце концов. Всегда можешь запросить текущее время и вычислить своё положение относительно старта бара на любом таймфрейме.  Зачем тебе спецфункции какие-то?  Время в тестере моделируется правильно.

То есть с помощью функций времени считать в OnTimer() интересующие таймфреймы и там же определять момент наступления нового бара? Пока не проверял, попробую. Ну или если есть уже что-то похожее готовое, прошу пример, а то я нашёл новый баг связанный с функцией OnChartEvent(), занимаюсь этим вопросом, готовлю отчёт. :)

P.S. Хотя нет, пробовал. Тему же когда-то даже открывал с результатами тестов в разных режимах. Только почему-то отказался тогда от этого метода. Надо в общем по новому попробовать. С другой стороны, с новым опытом. :)

 

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

Проверить можно в визуальном режиме тестера. В правой части графика отображаются время последнего и предпоследнего бара из функции OnTick(). Тоже самое и для функции OnChartEvent(). Под ними идёт счёт, сколько раз функция OnChartEvent() пропустила событие Новый бар. Выглядит это так, как на рисунке ниже:


Красными прямоугольниками отмечено время открытия текущего бара. Синим прямоугольником отмечен факт пропуска нового бара функцией OnChartEvent(). 

Количество пропусков во всех режимах (Только цены открытия, OHLC минутных баров, Все тики) совпадают. Пропуски всегда на одних и тех же барах. Причина мне не ясна. Это мешает писать нормальный код с условиями для торговых операций. Условия приходиться усложнять, чтобы сигнал не был пропущен.

На видео ниже можно увидеть, что за 10 лет на таймфрейме M20 около 10000 тысяч пропусков события Новый бар:

 

 

Ниже прилагаю код эксперта для ознакомления. Индикатор spy_control_panel_mcm.mq5 двумя постами выше.


 

Файлы:
 
MetaDriver:
Нифига не понимаю твой запрос.  Есть TimeCurrent() , TimeLocal(), TimeTradeServer() в конце концов. Всегда можешь запросить текущее время и вычислить своё положение относительно старта бара на любом таймфрейме.  Зачем тебе спецфункции какие-то?  Время в тестере моделируется правильно.

В общем, пришёл к тому, что буду использовать и OnTick() и OnTimer() и OnChartEvent(). То есть, используя все эти орудия, можно добиться абсолютной идентичности, независимо, на каком таймфрейме повешен эксперт и в каком режиме проводится тест или даже идёт торговля. Так что мои слова можно зачеркнуть:

tol64:

Ответ: Нет, время любого интересующего меня таймфрейма в режиме Только цены открытия получить невозможно. 

А по новому будет так:

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

--- 

Специальное спасибо Владимиру Гомонову за подачу справа, которая повернула мой взгляд в нужную сторону. :)

 
tol64:
...

Специальное спасибо Владимиру Гомонову за подачу справа, которая повернула мой взгляд в нужную сторону. :)

Да на здоровье, если чё обращайся. ;)
 
MetaDriver:
Да на здоровье, если чё обращайся. ;)

OK. :)

//---

На этот раз я с таким вопросом. К разработчикам. 

Обратил внимание на то, что процессор проявляет сильную активность, когда в принципе этого быть не должно. Открываю Диспетчер задач и Монитор ресурсов, чтобы посмотреть, кто это там у нас такой важный. И это оказался metatester64.exe:

 

 

//--- 

В момент снятия скриншотов интернет был отключен и конечно же тестов никаких не было. Был открыт только терминал и эдитор. Загрузка процессора постоянно от ~50% до ~90%. Билд 586 x64. Windows 7

//---

Я приостановил процесс:

 

 

 

Загрузка процессора существенно понизилась: от ~8% до ~50%. Если включить процесс metatester64.exe, то активность снова существенно повысится.

//--- 

Вопрос: Что делает metatester64.exe, когда тестер не используется?

 

tol64:

 ...

Вопрос: Что делает metatester64.exe, когда тестер не используется?

"Убил" процесс metatester64.exe (Завершить процесс) вручную. Процессор разгрузился. Запустил тест. После теста всё в норме. Запустил оптимизацию, прервал не дожидаясь окончания. Всё в норме. Запустил тест в режиме визуализации, отключил, всё в норме. Из этого можно сделать вывод, что бывают моменты, когда тестер после проведения теста/оптимизации остаётся на фоне даже, если его не используют и мотает ресурсы процессора. А так всё нормально. :)
 
Renat:

Приложите код для воспроизведения, пожалуйста.

Можно в сервисдеск или прямо сюда - так любой сможет проверить.

Ренат, Вы воспроизвели у себя изложенную мной проблему с функцией HistoryDealsTotal()? Дело в том, что даже с тем временным решением (TimeCurrent()+n), функция HistoryDealsTotal() во время теста очень часто возвращает даже просто нулевое значение при том, что функция HistorySelect() возвращает true, то есть история выбрана. Этот баг остановил мой проект полностью...
 
tol64:
Ренат, Вы воспроизвели у себя изложенную мной проблему с функцией HistoryDealsTotal()? Дело в том, что даже с тем временным решением (TimeCurrent()+n), функция HistoryDealsTotal() во время теста очень часто возвращает даже просто нулевое значение при том, что функция HistorySelect() возвращает true, то есть история выбрана. Этот баг остановил мой проект полностью...
Вам лучше написать заявку в Сервисдеск, так она точно попадет на контроль. Я сейчас попытался найти ваше сообщение (помню, что видел его), но сходу не получилось.
Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 
Rosh:
Вам лучше написать заявку в Сервисдеск, так она точно попадет на контроль. Я сейчас попытался найти ваше сообщение (помню, что видел его), но сходу не получилось.
Написал заявку в Сервисдеск. Проблему заново так подробно не описывал, а указал ссылки на посты в этой теме.
Причина обращения: