Странное поведение переменной Bars в тестере.

 

При запуске тестера стратегий значения переменной Bars упорно принимают странные значения, как то :

1001, иногда 1002, а порой и 101, что не имеет ничего общего с действительностью.

Вот код эксперта :

//+------------------------------------------------------------------+
//|                                                     TestBars.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Print("Bars=" + Bars);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Вот результаты прогона :

И, наконец, логфайл :

2007.12.28 10:40:23 2000.01.03 00:00 TestBars EURUSD,H1: Bars= 1002
2007.12.28 10:40:23 TestBars started for testing
2007.12.28 10:40:21 TestBars EURUSD,H1: loaded successfully

Как видим в отчете тестера показано 44696 баров, а значение переменной Bars в данном прогоне равно 1002. Cкрипт, запущеный на соответствующем графике, дает значение Bars = 55975.

Данная "особенность" наблюдается на двух компьютерах. Это баг, фича или faq ?

 
Тестер не может начинать работу, имея ноль баров за спиной. Иначе показания большинства индикаторов не смогут быть правильно расчитаны. При инициализации (в init()) Bars как раз и показывает сколько баров в запасе имеется на начало тестирования (на вашем рисунке это 1002 часовых бара на 01 января 2000 года) . Почитайте статьи из раздела Тестер, это в любом случае будет полезно.
 
Rosh:
Тестер не может начинать работу, имея ноль баров за спиной. Иначе показания большинства индикаторов не смогут быть правильно расчитаны. При инициализации (в init()) Bars как раз и показывает сколько баров в запасе имеется на начало тестирования (на вашем рисунке это 1002 часовых бара на 01 января 2000 года) . Почитайте статьи из раздела Тестер, это в любом случае будет полезно.


А почему именно 1002 бара в запасе на начало 2000 года ? Их должно быть больше. История доступна с 01 января 1999 года. А это больше чем 1002 часовых бара.

Только что запустил с 01 января 2004 года. Получил Bars=1001. Вы считаете это нормально ?

 
Я считаю нормальным сначала изучить предмет, а потом задавать вопросы по существу. Изменения в MT4 публикуются в разделе Новости:
16 Октября 2007mql4-библиотек.профит-фактору.

Выпущены новый клиентский терминал MetaTrader 4 build 211 и MetaTrader 4 MultiTerminal build 210.

Список изменений клиентского терминала MetaTrader 4 build 211:
1. MQL4: Исправлена работа функции FileWriteString(). Теперь она работает в точном соответствии с документацией: «Если записываемая строка короче, чем указанное значение длины строки, то строка будет добавлена двоичными 0 до указанной длины.»
2. MQL4: Исправлена ошибка передачи строковых параметров в импортируемые функции
3. MQL4: Исправлена ошибка освобождения историй чужих инструментов или таймфреймов после выгрузки эксперта. Теперь терминал освобождает использованную память через минуту после выгрузки эксперта.
4. MQL4: Исправлена функция MarketInfo() с параметром MODE_TICKVALUE. Теперь возвращаемое значение не нормализуется.
5. MQL4: Исправлена ошибка формирования переменной last_error при обращении к существующей глобальной переменной при помощи функции GlobalVariableSetOnCondition().
6. Tester: Исправлена ошибка пересчёта при оптимизации при переходе на данные другого торгового сервера. Теперь при изменении источника данных данные будут пересчитаны.
7. Tester: Исправлено отображение графика оптимизации по профит-фактору.
8. Tester: Изменён алгоритм предоставления данных, предшествующих дате начала тестирования. Теперь добавляются 1000 баров при запросе любых исторических данных.
9. Tester: Улучшен алгоритм моделирования данных. Более точное моделирование тиков для баров с объемом 4–6. Исправлена ошибка появления неверного тика в начале генерирующей последовательности при использовании ограничивающих дат.

В новом мультитерминале MetaTrader 4 MultiTerminal build 210 исправлена ошибка отсутствия символов в списке при выставлении сигналов.


 
Rosh:
Я считаю нормальным сначала изучить предмет, а потом задавать вопросы по существу. Изменения в MT4 публикуются в разделе Новости:
16 Октября 2007mql4-библиотек.профит-фактору.

Выпущены новый клиентский терминал MetaTrader 4 build 211 и MetaTrader 4 MultiTerminal build 210.


8. Tester: Изменён алгоритм предоставления данных, предшествующих дате начала тестирования. Теперь добавляются 1000 баров при запросе любых исторических данных.




Таким образом, в свежих версиях MetaTrader, я никак не могу получить доступ к истории в тестере более чем 1000 баров на момент начала тестирования ?

 
plt:

Таким образом, в свежих версиях MetaTrader, я никак не могу получить доступ к истории в тестере более чем 1000 баров на момент начала тестирования ?

Какие проблемы? Тестируйте на всем доступной истории (не ставя ограничений тестеру), но интервал, на котором советник может совершать торговые операции, ограничивайтете самостоятельно. Это к вопросу можно/нельзя.
А вот касаемо необхоимости получать значения индикатора в глубь на более чем 1000 баров интересно было бы послушать. Не всегда встретишь такого практика, все больше теоретики попадаются :)
 
Rosh:
plt:

Таким образом, в свежих версиях MetaTrader, я никак не могу получить доступ к истории в тестере более чем 1000 баров на момент начала тестирования ?

Какие проблемы? Тестируйте на всем доступной истории (не ставя ограничений тестеру), но интервал, на котором советник может совершать торговые операции, ограничивайтете самостоятельно. Это к вопросу можно/нельзя.
А вот касаемо необхоимости получать значения индикатора в глубь на более чем 1000 баров интересно было бы послушать. Не всегда встретишь такого практика, все больше теоретики попадаются :)


По тестеру : Это решение половинчатое. Двигаясь по этому пути надо писать свой тестер.

Интересно - победитель прошлого чемпионата практик или теоретик ? Он использовал MACD c периодом 5000 ...

По Вашей классификации выходит теоретик. Практики в 3 бара истории укладываются.

 
Не забудьте в deinit поставить вывод количество баров.
 
Renat:
Не забудьте в deinit поставить вывод количество баров.

А в вашей программе и с этим проблемы ?
 
plt:
Renat:
Не забудьте в deinit поставить вывод количество баров.

А в вашей программе и с этим проблемы ?
Уважаемый plt,

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

Рашид Вам явно и точно указал на решение проблемы:
  1. прочитать статьи в разделе "тестер"
  2. читать новости (1000 баров добавляются к началу указанного периода)
  3. не ставить ограничения по периодам, если хотите тестироваться на всей истории

Для общего развития - тестирование начинается с начала графика (100 бар, если с начала истории или с указанного времени с наличием предыдущих 1000 баров). А это означает, что переменная Bars принимает увеличивающиеся значения в виде:
Bars = начало_истории;
Инициализация_эксперта(Bars);  // тут или Bars = ~100 или Bars = ~1000
 
while( Bars < конец_истории )
  {
 
   for(....)   // моделирование развития бара
     {
      ...
      Запуск_функции_start_эксперта(Bars);
     }
   //--- переходим к следующему бару
   Bars++;
  }
 
Деинициализация_эксперта(Bars);

По Вашему коду явно видно, что Вы замеряете количество баров на инициализации эксперта и закономерно получаете величину в 1002 бара. Все абсолютно точно и ошибок никаких нет.