Подскажите что не так с циклом в индикаторе - страница 2

 
forex2030 #:

Это мт4 требуется и ветка так же для мт4
Суть не в перевороте расчёта,
а происходит пересчёт буфера на каждом тике
и пока линии не встанут ровно как положено, идёт перерисовка.

Естественно, происходит перерасчёт на каждом тике. Причина - автомасштабирование подвала. Уберите его в настройках МТ и проблемы не станет. Другого способа нет. 

 
Алексей Тарабанов #:

Естественно, происходит перерасчёт на каждом тике. Причина - автомасштабирование подвала. Уберите его в настройках МТ и проблемы не станет. Другого способа нет. 

Вопрос уже решён самостоятельно, всё работает как требовалось.

 

Подскажите как в индикаторе сместить цикл в новую точку для расчёта
Например расчёт по барам начинается с одной даты
и если наступило событие то надо продолжать расчёт с новой даты

extern datetime DateStart = D'2022.01.01 00:00:00';
//+------------------------------------------------------------------+
void start() 
{
   int limit=iBarShift(NULL,0,DateStart);
   for(int i=limit-1; i>=0; i--)
      {       
       Buff[i] = ................;
       if(Buff[i] != EMPTY_VALUE) //то продолжать расчёт с новой даты Time[i]
      }
}

Если я принудительно меняю дату старта, то всё работает не корректно 

if(Buff[i] != EMPTY_VALUE) DateStart = Time[i];
 
forex2030 #:

Подскажите как в индикаторе сместить цикл в новую точку для расчёта
Например расчёт по барам начинается с одной даты
и если наступило событие то надо продолжать расчёт с новой даты

Если я принудительно меняю дату старта, то всё работает не корректно 

Шо за start в коде?)
Щас же так не модно...

void start() 

Посмотрите как устроены индикаторы. Там уже встроенные функции имеют параметры необходимые вам. Например, для индикатора, после прихода тика, запускается следующая функция:

OnCalculate

Функция OnCalculate() вызывается только в пользовательских индикаторах при необходимости произвести расчет значений индикатора по событию Calculate. Обычно это происходит при поступлении нового тика по символу, для которого рассчитывается индикатор. При этом индикатор не обязательно должен быть прикреплен к какому-нибудь ценовому графику данного символа.

Функция OnCalculate() должна иметь тип возвращаемого значения int.

int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
   );

 
Yevhenii Levchenko #:

Шо за start в коде?)
Щас же так не модно...

Классический, работает везде и всегда

 
forex2030 #:

Подскажите как в индикаторе сместить цикл в новую точку для расчёта
Например расчёт по барам начинается с одной даты
и если наступило событие то надо продолжать расчёт с новой даты

Если я принудительно меняю дату старта, то всё работает не корректно 

int limit в глобальные

в init() limit посчитайте 

когда надо пересчитайте limit ,

start() сам наступит на новом тике и произойдет пересчет

if(....)limit=iBarShift(NULL,0,Time[i]);

или гораздо проще

if(....)limit=i;
Причина обращения: