помогите разобраться

 

Всем привет!

В советнике создаю функцию. В теле функции пишу вот что:

for (k=10000; k>=10; k--)
  {
  Print("k1="+k,"");
  Print("iTime="+TimeToString(iTime(NULL,PERIOD_H1,k)),"");

 }

то есть, он должен перебрать 9990 баров назад и записать  их время.

вот что я вижу в журнале тестера:

На 1003 итерации iTime начинает равняться "1970.01.01 00:00" и так до конца цикла.


ПОЧЕМУ?


0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1009
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1008
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1007
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1006
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1005
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1004
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1003
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=1970.01.01 00:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1002
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=2011.09.14 07:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1001
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=2011.09.14 08:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=1000
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=2011.09.14 09:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=999
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: iTime=2011.09.14 10:00
0    11:40:57    2011.11.11 02:00  temp EURUSD,H1: k1=998

 
pippen81:

Всем привет!

В советнике создаю функцию. В теле функции пишу вот что:

for (k=10000; k>=10; k--)
  {
  Print("k1="+k,"");
  Print("iTime="+TimeToString(iTime(NULL,PERIOD_H1,k)),"");

 }

то есть, он должен перебрать 9990 баров назад и записать  их время.

вот что я вижу в журнале тестера:

На 1003 итерации iTime начинает равняться "1970.01.01 00:00" и так до конца цикла.


ПОЧЕМУ?



При первоначальном запуске в тестере доступно максимум 1000 баров
 
Vinin:
При первоначальном запуске в тестере доступно максимум 1000 баров

Спасибо за ответ!


Как-то можно увеличить этот параметр?Мне нужно перебирать 100 тыс баров примерно

 
что интересно, если этот же цикл вписать в скрипт, то скрипт отрабатывает корректно. А вот в советнике он берет только 1000 баров
 
pippen81:

Спасибо за ответ!


Как-то можно увеличить этот параметр?Мне нужно перебирать 100 тыс баров примерно

Дождаться в тестере нужного количества баров и обработать их
 
Vinin:
Дождаться в тестере нужного количества баров и обработать их

Прошу прощения, не понял, что значит дождаться?

Суть: Перед совершением сделки тестер должен прогнать на 100 тыс баров назад и посмотреть выоплняется ли определенное условие на этих 100 тыс баров. А он видит только 1000 баров. В истории котировок данные есть, более того, если этот же цикл запустить в теле скрипта, то все нормально. Косячит только при использовании в советнике. Если я правильно понял, это особенность тестера и ее ен обойти?

 
pippen81:

Прошу прощения, не понял, что значит дождаться?

Суть: Перед совершением сделки тестер должен прогнать на 100 тыс баров назад и посмотреть выоплняется ли определенное условие на этих 100 тыс баров. А он видит только 1000 баров. В истории котировок данные есть, более того, если этот же цикл запустить в теле скрипта, то все нормально. Косячит только при использовании в советнике. Если я правильно понял, это особенность тестера и ее ен обойти?

Эксперт должен проверять количество доступных баров для анализа. Пока количество недостаточно - ничего не делать.

Если количество баров устраивает - провести анализ, выдать результат 

 
Vinin:

Эксперт должен проверять количество доступных баров для анализа. Пока количество недостаточно - ничего не делать.

Если количество баров устраивает - провести анализ, выдать результат 

Я не совсем понимаю, когда я нажимаю кнопку "старт" в тестере происходит загрузка баров в память? И я должен дождаться, пока он загрузит условные 100 тыс баров?

Не сочтите за хамство, можете привести пример кода на MQL? И в какую процедуру его вставить?

 
pippen81:

Я не совсем понимаю, когда я нажимаю кнопку "старт" в тестере происходит загрузка баров в память? И я должен дождаться, пока он загрузит условные 100 тыс баров?

Не сочтите за хамство, можете привести пример кода на MQL? И в какую процедуру его вставить?

в тестере указывается дата старта, в момент старта советника от этой даты тестер в глубь истории может "показать" только 1000 баров (вроде так), поэтому чтобы получить Х баров начиная с заданной даты, тебе нужно в тестере дату старта выставить ранее на столько сколько по времени составляют твои X баров, а в советнике поставить счетчик, что пока не пройдет Х баров ничего не делать, чтобы просто промоталось X баров и чтобы это число баров стало доступным для необходимого анализа..

extern int countBar = 100000;

void OnTick(){
  static int count = 0;
  
  if (count < countBar)
  {
    count++;
    return;
  }

  //прочий код

}
 
keekkenen:

в тестере указывается дата старта, в момент старта советника от этой даты тестер в глубь истории может "показать" только 1000 баров (вроде так), поэтому чтобы получить Х баров начиная с заданной даты, тебе нужно в тестере дату старта выставить ранее на столько сколько по времени составляют твои X баров, а в советнике поставить счетчик, что пока не пройдет Х баров ничего не делать, чтобы просто промоталось X баров и чтобы это число баров стало доступным для необходимого анализа..

extern int countBar = 100000;

void OnTick(){
  static int count = 0;
  
  if (count < countBar)
  {
    count++;
    return;
  }

  //прочий код

}

Так тики считать будет.

if(countBar>Bars) return;

вот как надо, наверное.

 

Решение, и довольно хорошее Вам подсказали. Дело за Вами.

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