Просьба найти причину ошибки!!!

 

Здравствуйте уважаемые !

Недавно написал один простенький индикатор зиг-заг, аналог того, что
есть в Румусе с задаваемым параметром разворота в пипсах. Но вот
незадача на некоторых барах он развороты рисует корректно, а на
некоторых нет. Не могу найти закономерность при которой он ошибается.
Чтобы Вам было легче понять суть вопроса прилагаю скриншот и текст
индикатора.

//+------------------------------------------------------------------+
//| ZigZag Simple. mq4 |
//| "Copyright © 2007, Rustem Bigeev" |
//| http://www.parch.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Rustem Bigeev"
#property link "http://www.parch.ru/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Goldenrod

//---- indicator parameters
extern double Reverse=0.0025;

//---- indicator buffers
double ExtMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(1);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer,true);
//---- indicator short name
IndicatorShortName("ZigZag Simple("+Reverse+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift, ShiftPoint, Exit, Loop;
double val, PointLock, PointLine, HighDot, LowDot;
PointLock=1;
PointLine=Close[Bars-1];
Exit=0;
Loop=0;
ExtMapBuffer[Bars]=PointLine;
//Comment(PointLine);

for(shift=Bars-2; Exit==0; shift--) //Цикл определения первой опорной точки
{
LowDot=Low[shift];
HighDot=High[shift];
if (LowDot<PointLine-Reverse) {PointLock=1; Exit = shift; PointLine=LowDot;}
if (HighDot>PointLine+Reverse) {PointLock=-1; Exit = shift; PointLine=HighDot;}
}

for(shift=Exit; shift>=0; shift--) //Цикл определения остальных опорных точек
{
Loop=-1;
if (PointLock>0) // Если мы зафиксировали верхнюю точку - возможны два дальнейших сценария
{
val=Low[shift];
// 1 - Цена обновляет нижнюю точку, тогда запоминаем ее и ее координаты
if (PointLine > val)
{
PointLine=val;
ShiftPoint=shift;
Loop=1;
}
// 2 - Цена разворачивается вверх и фиксирует нижнюю точку
if (High[shift] > PointLine+Reverse && Loop<0)
{
ExtMapBuffer[ShiftPoint]=PointLine;
PointLock=-1; // Зафиксирована нижняя точка
}
}
if (PointLock<0) // Если мы зафиксировали нижнюю точку - возможны два дальнейших сценария
{
// 1 - Цена обновляет верхнюю точку, тогда запоминаем ее и ее координаты
val=High[shift];
if (PointLine < val)
{
PointLine=val;
ShiftPoint=shift;
Loop=1;
}
// 2 - Цена разворачивается вниз и фиксирует верхнюю точку
if (Low[shift] < PointLine-Reverse && Loop<0)
{
ExtMapBuffer[ShiftPoint]=PointLine;
PointLock=1; // Зафиксирована верхняя точка
}
}
}
ExtMapBuffer[ShiftPoint]=PointLine;
ExtMapBuffer[0]=Close[0];
}

 

Проблема в том, что используется дорисовка до нулевого бара. Вариант 1 - попробовать ее убрать. Вариант 2 - при появлении нового бара убирать точку оставшуюся от дорисовки, но тут нужно различать точку оставшуюся от дорисовки и новую вершину (вдруг они могут совпасть). И третий вариант, самый простой и наглый - в самом начало функции старт встаить строку: ArrayInitialize(ExtMapBuffer,EMPTY_VALUE);

 

Поробовал третий вариант - не помогает. :-(

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

 
Странно, у меня почему-то третий вариант работает, а у вас нет. Разумеется , что второй вариант предпочтительней, но как говорится - "ваша корова вы ее и доите".  
 

Уважаемый Integer!

Не подскажите в какое именно место программного кода Вы поместили ArrayInitialize(ExtMapBuffer,EMPTY_VALUE);

и все заработало. У меня почему все равно остаются "хвосты".

 
BigeR:

Уважаемый Integer!

Не подскажите в какое именно место программного кода Вы поместили ArrayInitialize(ExtMapBuffer,EMPTY_VALUE);

и все заработало. У меня почему все равно остаются "хвосты".

Прочитайте еще раз мое первое сообщение, в нем об этом написано. Еще не помешает прочитать справку по функции и поймете сами куда ее надо ставить.

 

Добил я его на конец :-)

Выкладываю текст корректно работающего индикатора. Его преимущество перед известными зигзагами в том, что у него параметр разворота в пипсах и при смене таймфрейма, скажем на более мелкий, сохраняются все основные импульсы с прошлого фрейма. Может кому-то он пригодится.

//+------------------------------------------------------------------+
//| ZigZag Simple. mq4 |
//| "Copyright © 2007, Rustem Bigeev" |
//| http://www.parch.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Rustem Bigeev"
#property link "http://www.parch.ru/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Goldenrod

//---- indicator parameters
extern int Reverse =25;

//---- indicator buffers
double ExtMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(1);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer,true);
//---- indicator short name
IndicatorShortName("ZigZag Simple("+Reverse+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift, ShiftPoint, Exit, Loop;
double val, PointLock, PointLevel, HighDot, LowDot;
//ArrayInitialize(ExtMapBuffer,EMPTY_VALUE);
PointLock=1;
PointLevel=Close[Bars-1];
Exit=0;
Loop=0;
ExtMapBuffer[Bars]=PointLevel;
//Comment(PointLevel);

for(shift=Bars-2; Exit==0; shift--) //Цикл определения первой опорной точки
{
LowDot=Low[shift];
HighDot=High[shift];
if (LowDot<PointLevel-(Reverse*Point)) {PointLock=1; Exit = shift; PointLevel=LowDot;} //Первая точка нижняя
if (HighDot>PointLevel+(Reverse*Point)) {PointLock=-1; Exit = shift; PointLevel=HighDot;}//Первая точка верхняя
}
ExtMapBuffer[Exit]=PointLevel;

for(shift=Exit; shift>0; shift--) //Цикл определения остальных опорных точек
{
Loop=-1;
LowDot=Low[shift+1];
HighDot=High[shift+1];
if (PointLock>0 && Loop<0) // Верхняя точка зафиксирована (есть коррекция на параметр разворота)
// Возможны два дальнейших сценария:
{
// 1- Цена двигается вниз
// Цена обновляет нижнюю точку, тогда запоминаем ее и ее координату
val=MathMin(Low[shift],Low[shift+1]);
//val=Low[shift];
if (val < PointLevel) //(High[shift]<PointLevel)
{
ShiftPoint=shift;
if (Low[shift]>Low[shift+1]) ShiftPoint=shift+1; //Координата нижней точки
PointLevel=val; //Уровень нижней точки
Loop=1;
}
// 2 - Цена разворачивается вверх на параметр разворота
// Цена фиксирует нижнюю точку.
if (High[shift] > PointLevel+(Reverse*Point) && Loop<0)
{
ExtMapBuffer[ShiftPoint]=PointLevel;
PointLock=-1; // Зафиксирована нижняя точка, начинаем определять верхнюю.
Loop=1;
}
}
if (PointLock<0 && Loop<0) // Зафиксирована нижняя точка (есть коррекция на параметр разворота)
// Возможны два дальнейших сценария
{
// 1- Цена двигается вверх
// Цена обновляет верхнюю точку, тогда запоминаем ее и ее координаты
val=MathMax(High[shift],High[shift+1]);
//val=High[shift];
if (PointLevel < val && Loop<0)
{
ShiftPoint=shift;
if (High[shift]<High[shift+1]) ShiftPoint=shift+1; //Координата верхней точки
PointLevel=val; //Уровень верхней точки
Loop=1;
}
// 2 - Цена разворачивается вниз на параметр разворота
// Цена фиксирует верхнюю точку.
if (Low[shift] < PointLevel-(Reverse*Point) && Loop<0)
{
ExtMapBuffer[ShiftPoint]=PointLevel;
PointLock=1; // Зафиксирована верхняя точка, начинаем определять нижнюю
Loop=1;
}
}
}
ExtMapBuffer[ShiftPoint]=PointLevel;
ExtMapBuffer[0]=Close[0];
}

 
На правильном месте у вас стоит.
 
Integer:
На правильном месте у вас стоит.

Спасибо, я в принципе и сам знал, что стоит на правильном :-)
 
А в чем же тогда проблема была, вам было лень прогнать индикатор в тестере 8-)
Причина обращения: