Почему перерисовывается индикатор?

 

Всем привет. Написал индикатор, показывающий ускорение МА(ускорение выше delt - меняется цвет), но он почему-то перерисовывается. Подскажите где ошибка в коде?

extern double delt =3.0;

extern int DiffPeriod =50;

extern int N =1;



#property indicator_buffers 3

#property indicator_chart_window

#property indicator_color1 Magenta

#property indicator_color2 Aqua

#property indicator_color3 Black

double L20[];

double L50[];

double L60[];


int init()

{

IndicatorBuffers(3);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);

SetIndexBuffer(0,L20);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);

SetIndexBuffer(1,L50);

SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,3);

SetIndexBuffer(2,L60);



//---- indicators

//----

return(0);

}


int start()

{

int counted_bars=IndicatorCounted();

//----

int i = Bars - counted_bars - 1;

while (i>=0)

{

double iMaSlowPrevious = iMA(NULL,0,DiffPeriod,0,MODE_SMA, PRICE_CLOSE, i-N);

double iMaSlowCurrent = iMA(NULL,0,DiffPeriod,0,MODE_SMA, PRICE_CLOSE, i);

L20[i]=iMaSlowCurrent;

L50[i]=iMaSlowCurrent;

L60[i]=iMaSlowCurrent;

if (iMaSlowCurrent>iMaSlowPrevious)

if ((iMaSlowCurrent-iMaSlowPrevious)*100000/iMaSlowPrevious>delt) {L50[i]=EMPTY_VALUE; L60[i]=EMPTY_VALUE;}

//else {L60[i]=iMaSlowCurrent;}

if (iMaSlowCurrent<iMaSlowPrevious)

if ((iMaSlowPrevious-iMaSlowCurrent)*100000/iMaSlowPrevious>delt) {L20[i]=EMPTY_VALUE; L60[i]=EMPTY_VALUE;}

//else {L60[i]=iMaSlowCurrent;}

i--;

}


//----

return(0);

}

 

на каких барах перерисовыает ?

ошибка в знаке, должен быть плюс

double iMaSlowPrevious = iMA(NULL,0,DiffPeriod,0,MODE_SMA, PRICE_CLOSE, i+N);

 
keekkenen:

на каких барах перерисовыает ?

ошибка в знаке, должен быть плюс

double iMaSlowPrevious = iMA(NULL,0,DiffPeriod,0,MODE_SMA, PRICE_CLOSE, i+N);


С плюсом вообще не рисуется. Перерисовка при изменении периода. То есть рисуется онлайн индикатор, при переходе на другой период и возврате назад расцветка индикатора меняется.
 
int i = Bars - counted_bars + 1;
 
splxgf:


Спасибо, вроде корректно работает. Понаблюдаю еще.

Еще понаблюдал, все отлично. Спасибо огромное.

 
vmg59:

С плюсом вообще не рисуется. Перерисовка при изменении периода. То есть рисуется онлайн индикатор, при переходе на другой период и возврате назад расцветка индикатора меняется.

Правильно будет так:
int start()
{
// индекс начала пересчета
int counted_bars = IndicatorCounted();
int i = Bars - counted_bars - 1;

// в первый заход counted_bars = 0, i = Bars - 1 (номер самого левого БАРа)
// на следующих тиках counted_bars = Bars - 1, i = 0 (нулевой, он же текущий, БАР)
// на первом тике следующего бара counted_bars = Bars - 2, i = 1 (пересчитаем предыдущий БАР)

if (i > 1) i -= N;
while (i >= 0)
{
double iMaSlowPrevious = iMA(NULL, 0, DiffPeriod, 0, MODE_SMA, PRICE_CLOSE, i+N);
double iMaSlowCurrent = iMA(NULL, 0, DiffPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
 
prorab:

Правильно будет так:


И так тоже не рисуется индикатор. iMaSlowPrevious - это значение N бара. Для N = 1, это предыдущий бар, а он ведь должен быть (i - 1)?
 
Перерисовка может быть действительно при изменении периода или же при выключении терминала фрешевский,но я стараюсь терминал не выключать целую неделю и пусть работают все индюкуи,есть даже очень интересные.выложу сюда некоторые.
 
Profitov:
Перерисовка может быть действительно при изменении периода или же при выключении терминала фрешевский,но я стараюсь терминал не выключать целую неделю и пусть работают все индюкуи,есть даже очень интересные.выложу сюда некоторые.

У меня все корректно написанные индикаторы не перерисовываются. По варианту splxgf нормально рисует.
 
vmg59:

И так тоже не рисуется индикатор. iMaSlowPrevious - это значение N бара. Для N = 1, это предыдущий бар, а он ведь должен быть (i - 1)?

Неправильно, нумерация баров идет справа-налево, значит, если у текущего бара номер = i, то у предыдущего = i+1.

Поэтому перед циклом номер текущего бара сдвигается ВПРАВО на величину N, оператором
if (i > 1) i -= N;
i = Bars - 1;
i -= N = (Bars - 1) - N;
i+N = ((Bars - 1) - N) + N = Bars - 1; // т.е. по-прежнему, номер самого левого бара.

В варианте splxgf, по случайности, две ошибки компенсировали друг-друга. Бывает.

PS. Кстати, сдвигать надо и на величину периода МА, т.е. совсем правильно будет:

if (i > 1) i -= (N + DiffPeriod);

 
prorab:

Неправильно, нумерация баров идет справа-налево, значит, если у текущего бара номер = i, то у предыдущего = i+1.

Поэтому перед циклом номер текущего бара сдвигается ВПРАВО на величину N, оператором
if (i > 1) i -= N;
i = Bars - 1;
i -= N = (Bars - 1) - N;
i+N = ((Bars - 1) - N) + N = Bars - 1; // т.е. по-прежнему, номер самого левого бара.

В варианте splxgf, по случайности, две ошибки компенсировали друг-друга. Бывает.

PS. Кстати, сдвигать надо и на величину периода МА, т.е. совсем правильно будет:

if (i > 1) i -= (N + DiffPeriod);



Что-то я запутался. Зачем сдвигать на величину периода МА? (i+N) - номер бара, который берется при расчете величины приращения, а период зачем сюда включать? И по твоему коду не рисуется индикатор, а там где две ошибки компенсировали друг друга - работает. Как правильно написать чтобы работало так, как работает с ошибками :) ?
Причина обращения: