Зависание расчета индикатора

 
Собрал АО и АС по Вильямсу в одно окнои поставил на h1. Вроде ничего сложного.
4 линии и вызов стандартных iAO() b iAC() из библиотеки.
Однако, по неизвестной причине зависают, т.е перестают пересчитываться,самым случайным образом. Все четыре последних значения встают в ноль. График собирается в кучку.
Когда дергаешь его через список индикаторов он восстанавливается. Причину не пойму.
Может быть она аналогична наблюдаемому на м1. Когда приходит сразу несколькр тиков очень быстро, все линии принимают нулевое значение и на экране возникает одна вертикальная белая линия, но на минутке она сама восстанавливается.
С Уважением, Log.
 
код в студию (если кому-нибудь станет интересно)
 
код в студию (если кому-нибудь станет интересно)


Пожалуйста

//+------------------------------------------------------------------+
//| BW Ao Ac.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright
#property link

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Green
#property indicator_color5 Yellow
//---- input parameters
//---- buffers
double AOBuffer[];
double ACBuffer[];
double AOdifBuffer[];
double ACdifBuffer[];
//----
int draw_begin1=0;
int Count_Bars=0;
int draw_begin3=0;
int draw_begin4=0;
double i_AO; double i_AC; double i_AOdif; double ACdif;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
string name1;string name2;string name3;string name4;
//---- 2 additional buffers are used for counting.
IndicatorBuffers(4);
//---- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, AOBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1, ACBuffer);
SetIndexStyle(2,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(2, AOdifBuffer);
SetIndexStyle(3,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(3, ACdifBuffer);
//---- name for DataWindow and indicator subwindow label
short_name="BW_Ao_Ac";
IndicatorShortName(short_name);
SetIndexLabel(0,"AO");
SetIndexLabel(1,"AC");
SetIndexLabel(2,"AOdif");
SetIndexLabel(3,"ACdif");
//----
draw_begin1=34;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin1);
SetIndexDrawBegin(2,draw_begin1);
SetIndexDrawBegin(3,draw_begin1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| BW AO AC |
//+------------------------------------------------------------------+
int start()
{
int i,k;
int counted_bars=IndicatorCounted();
//----
if (Bars<=draw_begin1) return(0);
Count_Bars=Bars-counted_bars-draw_begin1+1;
//---- initial zero
if(counted_bars<2)
{
for(i=1;i<=Count_Bars;i++)
{ AOBuffer[Bars-i] = 0; ACBuffer[Bars-i]=0;
AOdifBuffer[Bars-i]=0; ACdifBuffer[Bars-i]=0;sumBuffer[Bars-i]=0;
}
}
i=Count_Bars;
while(i>=0)
{
AOBuffer[i]=iAO(NULL,0,i)*1000;
AOdifBuffer[i]= (AOBuffer[i]-AOBuffer[i+1])*5;
ACBuffer[i]=iAC(NULL,0,i)*2500;
ACdifBuffer[i]=(ACBuffer[i]-ACBuffer[i+1])*2;
i--;
}
///----
return(0);
}
//+------------------------------------------------------------------+
 
И что это такое?
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Green
#property indicator_color5 Yellow



4 в нашей системе никогда не было равно 5. Дальше смотреть надо?

 
4 в нашей системе никогда не было равно 5. Дальше смотреть надо?


Надо, надо.
Это остатки пятой линии. Они не мешают. Я их уже убрал.
 
Здесь
Count_Bars=Bars-counted_bars-draw_begin1+1; 


у тебя, допустим, всего баров на графике 1000, значит Bars = 999
при первом расчете counted_bars=0 , draw_begin1 всегда равно нулю, чему будет равно это выражение?
Дальше сам думай, неохота в чужой нарушенной логике копаться. Я пас.

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