ВОПРОС: линии индикатора по истории прорисовываются, перерисовываются, когда нужно. В режиме онлайн - тоже рисуются, но не перерисовываются. Почему? подскажите

 

Комрады программеры, подскажите!

При открытии графика, при переключении таймфреймов, по истории баров все линии индикатора корректно просчитываются, прорисовываются, 1 линия правильно перерисовывается на определенных отрезках, по моим условиям. В режиме онлайн, в тиковом режиме, при появлении новых баров,  все линии нормально отрисовываются. Но нет перерисовки (по определенным условиям) линии RSI. Также, заметил: текущий бар, если линия RSI нуждается в перерисовке, нормально перерисуется. Но вот уже следующий бар опять не будет перерисован. 

Сказать, что это проблема логики? Тогда бы и история и активный бар не были бы перерисованы. Потому на оператор switch думаю... Какое-то непосредственное обращение на каждом новом баре нужно добавить. Что подскажете? Еще вариант: по закрытию баров логика работает нормально, тк по истории все хорошо рисуется, перерисовывается. Активный бар - тоже. А вот все другие бары в режиме онлайн теряют значения при новых тиках, очевидно. Хотя странно, я же работаю с циклом i-х баров. Не могу понять, как исправить.

Вариант решения проблемы: часть логики проверять по закрытию баров, часть в тиковом режиме (я переделаю тогда), но как это устроить, не знаю. Кстати, такой вариант предпочтительнее, тк повысит быстродействие, уменьшит нагрузку на терминал.


Использую:

строгий режим проверки ошибок (#property strict)

Тк индюк рассчитан на несколько торговых инструментов и несколько тайм-фреймов, некоторые константы, что ввожу 1 раз в окне индикатора, уточняю через арифметические формулы (там ошибок нет). Беру значения констант из нескольких операторов switch (пример, таймфрейм m5, кусок кода, аналогично по другим тф, коэффициенты другие):

   switch(Period())

   {

      case 5:     ImpCoef=Base_Imp*Coef_m5;     bLongNCh=iLngNCh;             bLongMCh=iLngMCh;             bLongECh=iLngECh; 

                  cCh_midOUT=iCh_midOUT+0.5;    cCh_bigSIGN=iCh_bigSIGN+0.2;  cCh_minSIGN=iCh_minSIGN+0.3;  break;


Использую 1 цикл, обычный:

   int i,counted_bars=IndicatorCounted();

   int limit=Bars-counted_bars-1;

   for(i=limit;i>=0;i--)  {...}


и вот кусочек кода в цикле: (использую только логические операции и опять же конструкцию switch..case.. break). Если бы была ошибка в логических операциях, то, по истории баров, при переключении тф, на активном баре после открытия графика логика бы тоже не работала, а она работает. Суть:  присваиваю значение линии индикатора i-го бара gLongNCh[i] от уже расcчитанного значения RSI (таким образом перерисовываю кусок линии RSI другим цветом), а триггером TrLongNCh=1 запоминаю определенное состояние.

            gLongNCh[i]=gRSISig[i];

            if(gRSISig[i]>=(gVolUp[i]+gVolDn[i])/2) TrLongNCh=1;


Никаких дополнительных условий, поверок: до закрытия бара, по закрытию бара,  появления нового бара в коде не использую.

СПАСИБО  ЗАРАНЕЕ!!!

С уважением,

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Линии индикаторов - Константы индикаторов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5