Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай, как установить MetaTrader на Mac OS
MetaQuotes Software Corp.
Модератор
181095
MetaQuotes Software Corp. 2010.02.11 09:18 

Parabolic (Open_Close):

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

Author: Aleksejs Mihailovs

Aleksejs Mihailovs
167
Aleksejs Mihailovs 2010.02.21 21:16  
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.

MQL4 Comments
16319
MQL4 Comments 2010.02.22 13:59  

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

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

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

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

Aleksejs Mihailovs
167
Aleksejs Mihailovs 2010.02.24 09:30  
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);

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

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

Aleksejs Mihailovs
167
Aleksejs Mihailovs 2010.02.24 09:47  
Dkflbvbh:

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

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

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

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

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

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

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий