Как правильно использовать iCustom() или iMA() в своем индикаторе?

 

Всем привет! Я разрабатываю индикатор, который будет отмечать стрелками возможные точки входа в рынок, которые, в свою очередь, будут рассчитываться от комбинации значений Moving Average и Parabolic SAR.

У меня возникла следующая проблема. Не важно, использую ли я iMA()iCustom или Trend.mqh, но если в моем индикаторе присутствуют хендлы на сторонние индикаторы, то при частой смене таймфреймов, возникает целая куча нежелательных сигналов.

Создается впечатление, что MT5 просто что-то путает, и в какой то момент, хаотично, запихивает данные из буферов сторонних индикаторов, хэндлы которых я храню, в мои буферы, и получается бред.

Подскажите пожалуйста. Как этого избежать?


 

Вот ещё один пример, теперь вылезли показатели iSAR.

 
В основном индикаторном цикле, перед обсчетом каждого бара надо очищать соответствующий элемент буфера. Если линию рисуете, то не надо очищать, потому, что все равно будет присвоено значение. Если же стрелки (значки), то надо.
 
Dmitry Fedoseev:
В основном индикаторном цикле, перед обсчетом каждого бара надо очищать соответствующий элемент буфера. Если линию рисуете, то не надо очищать, потому, что все равно будет присвоено значение. Если же стрелки (значки), то надо.

Спасибо Вам, добрый человек. Вот такая конструкция мне помогла!

   for (int bar=bars_to_calculate; bar>=0 && !IsStopped(); bar--)
   {
      ext_bullish_buffer[bar] = EMPTY_VALUE;
      ext_bearish_buffer[bar] = EMPTY_VALUE;
        
      if (isBullish(bar))
         ext_bullish_buffer[bar] = low[bar];
      if (isBearish(bar))
         ext_bearish_buffer[bar] = high[bar];
   }
 

можно очищать только один раз, при первом расчете (иницализации)

ArrayInitialize(Buff,0);

//или
ArrayInitialize(Buff,EMPTY_VALUE);
 
Taras Slobodyanik:

можно очищать только один раз, при первом расчете

не прокатит, артефакты могут появляться если пропуск баров был и подкачка началась, корректно все таки 

if (isBullish(bar)) ext_bullish_buffer[bar] = low[bar];   else ext_bullish_buffer[bar] = EMPTY_VALUE;
if (isBearish(bar)) ext_bearish_buffer[bar] = high[bar];  else ext_bullish_buffer[bar] = EMPTY_VALUE;
 
Igor Makanu:

не прокатит, артефакты могут появляться если пропуск баров был и подкачка началась, корректно все таки 

При "подкачке" изменяется количество баров - как только количество изменилось больше чем на 1 = сразу делаем полный перерасчет/инициализацию.

if (prev_calculated==0 || rates_total-prev_calculated>1) 
 
Taras Slobodyanik:

При "подкачке" изменяется количество баров - как только количество изменилось больше чем на 1 = сразу делаем полный перерасчет/инициализацию.

Делали - не катит. Нужно заполнять текущий пустым значением, затем уже рассчитывать индикатор.

 
Artyom Trishkin:

Делали - не катит. Нужно заполнять текущий пустым значением, затем уже рассчитывать индикатор.

Текущий бар - да, нужно перезаписывать при расчете.
Но речь идет про смену периода, когда индикатор не очищает свои буферы, и на графике остается "мусор" предыдущего расчета.

 
Igor Makanu:

не прокатит, артефакты могут появляться если пропуск баров был и подкачка началась, корректно все таки 

ext_bullish_buffer[bar] = EMPTY_VALUE; ext_bearish_buffer[bar] = EMPTY_VALUE;
if (isBullish(bar)) ext_bullish_buffer[bar] = low[bar];
if (isBearish(bar)) ext_bearish_buffer[bar] = high[bar];
 
Unicornis:

те же яйца только вид сбоку, смысл обсуждения, в 3-м сообщении этого топика

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