Индикаторы: Parabolic (Open_Close)

 

Parabolic (Open_Close):

Обычный параболик, только построенные по ценам Open - Close.

Author: Aleksejs Mihailovs

 
Dkflbvbh:

Здравствуйте!

Не могли бы найти ошибку в данном коде


Добрый вечер!

В вашем коде две ошибки:

Не поставлены кавычки после первого оператора while, и в конце кода перед && затесалась цифра 1.

Вот правильный код:

#property indicator_chart_window


#property indicator_color1 Orchid


//---- input parameters


extern double Step=0.02;


extern double Maximum=0.2;


extern double Step1=0.02;


extern double Maximum1=0.2;


//---- buffers


double SarBuffer[];


double SarBuffer1[];


//----
static bool first=false,first1=false;
double start,last_high,last_low;
double ep,sar,price_low,price_high;
bool dirlong;

double start1,last_high1,last_low1;
double ep1,sar1,price_low1,price_high1;
bool dirlong1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorDigits(Digits);
string SS=DoubleToStr(Step,4);
string MM=DoubleToStr(Maximum,4);
SetIndexLabel(0,"Step= "+SS+", Max= "+MM);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,SarBuffer);
SetIndexDrawBegin(0, 4/Step);

string SS1=DoubleToStr(Step1,4);
string MM1=DoubleToStr(Maximum1,4);
SetIndexLabel(0,"Step= "+SS1+", Max= "+MM1);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,SarBuffer1);
SetIndexDrawBegin(0, 4/Step1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system |
//+------------------------------------------------------------------+
int start()
{
if(Bars<5) return(0);
dirlong=true;
start=Step;
//--------------------------------------------+
int i=Bars-4;
while(i>=0)
{
price_low=Close[i];
price_high=Close[i];
//sar равен цена предыдущего бара плюс шаг умножить на
//(старая цена минус значение SarBuffer предыдущего бара)
sar=SarBuffer[i+1]+start*(ep-SarBuffer[i+1]);
//----
if(dirlong)//цепочка вверх
{
if(ep<price_high && (start+Step)<=Maximum) start+=Step;
if(sar>=price_low)//если условия для переключения наступили
{
start=Step;
dirlong=false;
ep=price_low;//устанавливаем последнюю цену = минимум
last_low=price_low;
if(Close[i]<last_high) SarBuffer[i]=last_high;
else SarBuffer[i]=Close[i];
i--;
continue;
}
else
{
if(ep<price_low && (start+Step)<=Maximum) start+=Step;
//и пересчитываем last_high и ep для расчета следующей точки максимума
if(ep<price_high) { last_high=price_high; ep=price_high; }
}
}
//----
else//цепочка вниз
{
if(ep>price_low && (start+Step)<=Maximum) start+=Step;
if(sar<=price_high)//если наступили условия переключения
{
start=Step;
dirlong=true;
ep=price_high;//устанавливаем последнюю цену = максимум
last_high=price_high;
if(Close[i]>last_low) SarBuffer[i]=last_low;
else SarBuffer[i]=Close[i];
i--;
continue;
}
else
{
if(ep>price_high && (start+Step)<=Maximum) start+=Step;
//если условия для переключения не наступили
//то пересчитываем last_low и ep для расчета следующей точки минимума
if(ep>price_low){last_low=price_low;ep=price_low;}
}
}
SarBuffer[i]=sar;
i--;
}
//----
if(Bars<5) return(0);
dirlong1=true;
start1=Step1;
//--------------------------------------------+
int j=Bars-4;
while(j>=0)
{
price_low1=Close[j];
price_high1=Close[j];
//sar равен цена предыдущего бара плюс шаг умножить на
//(старая цена минус значение SarBuffer предыдущего бара)
sar1=SarBuffer1[j+1]+start1*(ep1-SarBuffer1[j+1]);
//----
if(dirlong1)//цепочка вверх
{
if(ep1<price_high1 && (start1+Step1)<=Maximum1) start1+=Step1;
if(sar1>=price_low1)//если условия для переключения наступили
{
start1=Step1;
dirlong1=false;
ep1=price_low1;//устанавливаем последнюю цену = минимум
last_low1=price_low1;
if(Close[j]<last_high1) SarBuffer1[j]=last_high1;
else SarBuffer1[j]=Close[j];
j--;
continue;
}
else
{
if(ep1<price_low1 && (start1+Step1)<=Maximum1) start1+=Step1;
//и пересчитываем last_high и ep для расчета следующей точки максимума
if(ep1<price_high1) { last_high1=price_high1; ep1=price_high1; }
}
}
//----
else//цепочка вниз
{
if(ep1>price_low1 && (start1+Step1)<=Maximum1) start1+=Step1;
if(sar1<=price_high1)//если наступили условия переключения
{
start1=Step1;
dirlong1=true;
ep1=price_high1;//устанавливаем последнюю цену = максимум
last_high1=price_high1;
if(Close[j]>last_low1) SarBuffer1[j]=last_low1;
else SarBuffer1[j]=Close[j];
j--;
continue;
}
else
{
if(ep1>price_high1 && (start1+Step1)<=Maximum1) start1+=Step1;
//если условия для переключения не наступили
//то пересчитываем last_low и ep для расчета следующей точки минимума
if(ep1>price_low1) {last_low1=price_low1;ep1=price_low1;}
}
}
SarBuffer1[j]=sar1;
j--;
}
//----
return(0);
}


С уважением,

Backspace.

 

Здравствуйте, Backspace!

Спасибо за быстрый ответ.

По моей задумке должны отображаться две линии параболика, если входные параметры разные, отображается только одна.

Ответьте, если не трудно.Заранее благодарю.

 
Dkflbvbh:

Здравствуйте, Backspace!

Спасибо за быстрый ответ.

По моей задумке должны отображаться две линии параболика, если входные параметры разные, отображается только одна.

Ответьте, если не трудно.Заранее благодарю.

Доброе утро!

Параметры у вас может и разные, но в коде прописано отображение только одного индикатора.

Вот в этой строке, в самом верху кода:

#property indicator_color1 Orchid

Задайте тогда цвет и для второго индикатора.

Это первое, что бросается в глаза.

Остальное я не просматривал - может и в коде ниже чего-то не хватает.

С уважением,

Backspace.

P.S.

Немного посмотрел ваш код дальше...

В строках инициализации, вы задаёте одинаковые номера буферов для разных линий индикатора.

Номера тоже должны быть разные.

Это здесь:

string SS=DoubleToStr(Step,4);


string MM=DoubleToStr(Maximum,4);


SetIndexLabel(0,"Step= "+SS+", Max= "+MM);


SetIndexStyle(0,DRAW_ARROW);


SetIndexArrow(0,159);


SetIndexBuffer(0,SarBuffer);


SetIndexDrawBegin(0, 4/Step);



string SS1=DoubleToStr(Step1,4);


string MM1=DoubleToStr(Maximum1,4);


SetIndexLabel(1,"Step= "+SS1+", Max= "+MM1);


SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexBuffer(1,SarBuffer1);

SetIndexDrawBegin(1, 4/Step1);

Возьмите за образец любой работающий индикатор, с отображением множества линий, и

проанализируйте на готовом примере.

 
Dkflbvbh:

Здравствуйте, Backspace!

Спасибо за быстрый ответ.

По моей задумке должны отображаться две линии параболика, если входные параметры разные, отображается только одна.

Ответьте, если не трудно.Заранее благодарю.

А вообще, изучите ООП (объектно-ориентированное программирование).

Весь ваш код можно сократить как минимум в 2 раза.

У вас множество повторяющихся строк кода, только с разными входными параметрами.

Вынесите их в отдельный блок.

И код укоротится и визуально будет намного удобнее работать.

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