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

 

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

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

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...