Что не так в индикаторе? Нужна помощь.

 

Прошу поправить индикатор, чтобы его можно было прогнать в тестере.

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

0     11:03:01.912     Custom indicator Used\# Once Trend primary AUDCADm,H4: loaded successfully

2     11:03:01.912     # Once Trend primary inputs: Smoothing=5; Window=2000; Price=0;

1     11:03:01.978     # Once Trend primary AUDCADm,H4: zero divide in '# Once Trend primary.mq4' (94,88)

3     11:03:02.683     2019.12.02 01:00:06  # Once Trend primary AUDCADm,H4: initialization failed (-1)

0     11:03:02.683     2019.12.02 01:00:06  AUDCADm,H4: 1 tick events (0 bars, 33302455 bar states) processed in 0:00:00.000 (total time 0:00:00.797)

3     11:03:02.689     2019.12.02 01:00:06  # Once Trend primary AUDCADm,H4: initialization failed (-1)

0     11:03:02.691     2019.12.02 01:00:06  Custom indicator # Once Trend primary AUDCADm,H4: removed

Пробовал сделать проверку на ноль - zero divide ушло, но появились проблемы с массивом. Самому  разобраться не по силам. Но очень хочется прогнать советник в тестере, на демо ждать результата долго ...

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out). В...
Файлы:
 

Проблема в том, что в тестере при старте считается, что истории до старта нет (хотя на экране видны предыдущие бары).

У вас в индикаторе стоит 

Window    = 2000;          // период, баров

т.е. индикатор использует историю в 2000 баров и формирует на них гистограмму. 

Поэтому, чтобы индикатор заработал без ошибок, вам нужно подождать, когда пройдут 2000 баров, а затем наложить на график ваш индюк.

Но, если вам лень ждать 2000 баров, измените эту переменную на 200 и подождите 200 баров и наложите этот индикатор.

Если для вас это не критично. Всё будет ОК.

 
Evgeniy Inkov:

Проблема в том, что в тестере при старте считается, что истории до старта нет (хотя на экране видны предыдущие бары).

Спасибо, почему-то вовремя не пришло оповещение о новом сообщении в форуме, только сейчас прочитал.

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

Где-то у меня был кусок кода, который заставлял тестер некоторый период прогонять в холостую и только потом начинался тест. Я всё не мог понять зачем это. Только бы он не затерялся.

 
Жаль, но код, похоже безвозвратно потерян, а сделать самому мне пока не по зубам.
 
input datetime StartTime=D'1971.00.00';

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
   {
   for(int i=rates_total-1; i>=0; i--)
      {
      if(time[i]<StartTime) return(rates_total);
      
      //ваш код
      }
   return(rates_total);
   }

типа такого

 
Aleksei Stepanenko:

типа такого

Не совсем, там был код именно в советнике. То есть запускается тест советника и в течение некоторого периода советник ничего не делает. И только когда проходит этот период, только тогда он начинает запрашивать данные от индикаторов и работать.
 
Aleksei Stepanenko:

типа такого

За подсказку спасибо, то есть какое-то направление наметилось. Буду ломать голову.

Хотя языком MQL разочарован - некоторые простые вещи можно реализовать только в обход и с танцами.

 

Вставьте в этот же код в советник

input datetime StartTime=D'1971.00.00';

void OnTick()
   {
   if(Time[0]<StartTime) return;
      
   //ваш код
   }
 

Только разобрался с одним индикатором, очередной заартачился - работает на реале на ура, а в тестере:

ошибка

код

Пробовал всё что мог - никак не исправить, чтобы не ждать 500 баров (History=500). Меньше 500 искажаются показания индикатора.

Неужели нет другого способа чтобы без ожидания (500 баров на H4 это 84 дня)?

 
Alexey G. Smolyakov:

Только разобрался с одним индикатором, очередной заартачился - работает на реале на ура, а в тестере:

Пробовал всё что мог - никак не исправить, чтобы не ждать 500 баров (History=500). Меньше 500 искажаются показания индикатора.

Неужели нет другого способа чтобы без ожидания (500 баров на H4 это 84 дня)?

что то наверное с этим у Вас на-мудрёно https://www.mql5.com/ru/docs/indicators/icustom

Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
[in]  Имя пользовательского индикатора. Если перед именем указан обратный слеш '\', то EX5-файл индикатора ищется относительно корневой директории индикаторов MQL5. Таким образом при вызове FirstIndicator"...) индикатор будет загружаться как MQL5\FirstIndicator.ex5. Если по этому пути файла не окажется, то возникнет ошибка 4802...
Причина обращения: