на каких барах перерисовыает ?
ошибка в знаке, должен быть плюс
double iMaSlowPrevious = iMA(NULL,0,DiffPeriod,0,MODE_SMA, PRICE_CLOSE, i+N);
на каких барах перерисовыает ?
ошибка в знаке, должен быть плюс
double iMaSlowPrevious = iMA(NULL,0,DiffPeriod,0,MODE_SMA, PRICE_CLOSE, i+N);
С плюсом вообще не рисуется. Перерисовка при изменении периода. То есть рисуется онлайн индикатор, при переходе на другой период и возврате назад расцветка индикатора меняется.
int i = Bars - counted_bars + 1;
Спасибо, вроде корректно работает. Понаблюдаю еще.
Еще понаблюдал, все отлично. Спасибо огромное.
С плюсом вообще не рисуется. Перерисовка при изменении периода. То есть рисуется онлайн индикатор, при переходе на другой период и возврате назад расцветка индикатора меняется.
Правильно будет так:
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);
Правильно будет так:
И так тоже не рисуется индикатор. iMaSlowPrevious - это значение N бара. Для N = 1, это предыдущий бар, а он ведь должен быть (i - 1)?
Перерисовка может быть действительно при изменении периода или же при выключении терминала фрешевский,но я стараюсь терминал не выключать целую неделю и пусть работают все индюкуи,есть даже очень интересные.выложу сюда некоторые.
У меня все корректно написанные индикаторы не перерисовываются. По варианту splxgf нормально рисует.
И так тоже не рисуется индикатор. 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);
Неправильно, нумерация баров идет справа-налево, значит, если у текущего бара номер = 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) - номер бара, который берется при расчете величины приращения, а период зачем сюда включать? И по твоему коду не рисуется индикатор, а там где две ошибки компенсировали друг друга - работает. Как правильно написать чтобы работало так, как работает с ошибками :) ?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет. Написал индикатор, показывающий ускорение МА(ускорение выше 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);
}