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

 
tol64:

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

Нет. Этих условий оказалось недостаточно. Сделал простого эксперта по этим условиям и баг не воспроизводится. Функция HistoryDealsTotal() из функции OnTrade() возвращает правильное значение. Я минимизировал свою программу убрав оттуда всё "лишнее" и провёл ещё раз тест. В функции OnTrade() при этом было только:

//+------------------------------------------------------------------+
//| ТОРГОВЫЕ_СОБЫТИЯ                                                 |
//+------------------------------------------------------------------+
void OnTrade()
  {
   HistorySelect(0,TimeCurrent());
   Print(__FUNCTION__,"(); HistoryDealsTotal(): ",HistoryDealsTotal());
  }

Ошибка воспроизводится точно также: 

 

 

Более того, я попробовал включить режим Произвольная задержка и результат оказался иным, но тоже неправильным. То есть, если на видео я показал ситуацию, когда сделок в истории 3, а HistoryDealsTotal() из функции OnTrade() возвращает значение 2, то на этот раз, при единственном отличии (режим Произвольная задержка), сделок в истории также 3, но HistoryDealsTotal() из функции OnTrade() возвращает значение 1.

---

Попробую ещё более минимизировать и упростить для поиска причины ошибки эксперта и вышлю файл в сервисдеск. 

 
tol64:

Спасибо. Да, я имел ввиду именно отображение. Редактирование со стороны пользователя конечно уже было бы лишним.

Было бы здорово ещё, чтобы заранее сохранённый шаблон для графика отображался на всех открытых в момент тестирования в режиме визуализации графиках. И используемые в тестах индикаторы тоже, чтобы отображались на всех графиках. Сейчас пока только на том, на который был повешен эксперт. И в какой-то теме промелькнула мысль, чтобы отображение тех или иных индикаторов в момент визуализации можно было бы контролировать. Например используется несколько индикаторов, а отобразить нужно только один.

Индикаторы на "чужих" графиках в визуализаторе обязательно будут.

По поводу HideTestIndicators пока нет определённости - думаем.

 
tol64:

---

Попробую ещё более минимизировать и упростить для поиска причины ошибки эксперта и вышлю файл в сервисдеск. 

Проблема локализована. Баг найден. Всего лишь сутки уткнувшись в монитор, что может быть проще. :) Ошибка исправляется в одном месте, но вылазит в другом. И похоже, что, возможно, это единственная причина, из-за которой результаты в разных режимах тестирования могут отличаться, если используется функция HistoryDealsTotal(), мультивалютная система и вероятность совершения сделок одновременно, высокая. То есть, чем чаще совершаются в системе сделки одновременно, чем ниже таймфрейм и соответственно ближе StopLoss, TakeProfit и отложенные ордера, тем больше бардак и несоответствие в результатах тестов в разных режимах. Подробности завтра, уже засыпаю...
 
tol64:

Нет. Этих условий оказалось недостаточно. Сделал простого эксперта по этим условиям и баг не воспроизводится. Функция HistoryDealsTotal() из функции OnTrade() возвращает правильное значение. Я минимизировал свою программу убрав оттуда всё "лишнее" и провёл ещё раз тест. В функции OnTrade() при этом было только:


Попробуйте заменить
HistorySelect(0,TimeCurrent());
на
HistorySelect(0,TimeCurrent()+1);
Будет баг проявляться ?

 

Valmars:

... 

Будет баг проявляться ?

Да, баг проявляется и с этим тоже, при чём в обоих случаях (режимы Обычный/Произвольная задержка). Чуть позже напишу в чём там дело...

///--- 

P.S. ... Хотя нет. Валерий, всё верно, только я не с +1, а с +20 избавился от этого бага. Вообще лучше побольше ставить. А чтобы об этом не помнить постоянно и не мучиться в поисках, то лучше сразу написать вот так:

#define Milliseconds_Ahead 100

//+------------------------------------------------------------------+
//| GOODBYE_BAG                                                      |
//+------------------------------------------------------------------+
datetime TimeCurrentAhead()
  {
   return(TimeCurrent()+Milliseconds_Ahead);
  }

//---

До этого я нашёл, что функция Sleep(), если стоит где-то после торговой операции, вносит головокружение функции HistoryDealsTotal(). В режиме Обычный проблема устраняется, если убрать функцию Sleep(). Но в режиме Произвольная задержка проблема всё равно остаётся.

//---

Разработчикам:

Скорее всего этот момент нужно учесть в функции TimeCurrent(), так как подобные конфликты, как оказалось, довольно сложно потом обнаружить в программе, когда она выросла до нескольких десятков тысяч строк. Ниже прилагаю код простого эксперта написанного для этого случая. Там всего один параметр:

input bool Used_Bag=true;

А также константа:

#define Milliseconds_Ahead 100

Чтобы обнаружить баг, нужно установить нулевое значение.



 

Файлы:
iFind_Bag.mq5  12 kb
 
stringo:

Индикаторы на "чужих" графиках в визуализаторе обязательно будут.

Отлично! И шаблон один на все графики, если можно, а то по умолчанию, очень мрачный. :)

stringo:  

По поводу HideTestIndicators пока нет определённости - думаем.

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

 
stringo:

Индикаторы на "чужих" графиках в визуализаторе обязательно будут.

Слава, на данный момент, если эксперт повешен в тестере, например, на таймфрейм H1, но торгует по таймфрейму M30, то в режиме визуализации открываются два графика: H1 и M30. Шаблон применяется на тот график, на котором висит эксперт, то есть H1, а на графике M30 шаблон не применяется и индикатора нет, хотя и то и другое очень нужны. Под "чужими" графиками Вы имели ввиду, если в этом случае, M30?
 
Только цены открытия

В данном режиме также происходит генерация цен OHLC минутных баров, однако функция эксперта OnTick() запускается только в начале бара (по цене Open), соответствующего выбранному периоду тестирования. Генерация остальных цен необходима для корректной отработки торговых операций. Например, для закрытия позиции по Стоп Лосс или Тейк Профит или для срабатывания отложенных ордеров. Режим генерации всех тиков является наиболее точным, но в то же время и наиболее медленным. Для быстрого, но грубого тестирования/оптимизации следует использовать режим "Только цены открытия".
Если на данный момент в этом режиме генерация цен OHLC минутных баров производится, могу ли я получить время открытия бара любого таймфрейма? Другими словами, могу ли я отследить событие нового бара любого таймфрейма проводя тестирование в режиме Только цены открытия?
 
tol64:
Под "чужими" графиками Вы имели ввиду, если в этом случае, M30?
Да
 
tol64:
Если на данный момент в этом режиме генерация цен OHLC минутных баров производится, могу ли я получить время открытия бара любого таймфрейма? Другими словами, могу ли я отследить событие нового бара любого таймфрейма проводя тестирование в режиме Только цены открытия?

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

--- 

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

 

---

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

stringo:

tol64:
Под "чужими" графиками Вы имели ввиду, если в этом случае, M30?

Да.

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