Здравствуйте!
Не могли бы найти ошибку в данном коде
Добрый вечер!
В вашем коде две ошибки:
Не поставлены кавычки после первого оператора 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!
Спасибо за быстрый ответ.
По моей задумке должны отображаться две линии параболика, если входные параметры разные, отображается только одна.
Ответьте, если не трудно.Заранее благодарю.
Здравствуйте, 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);
Возьмите за образец любой работающий индикатор, с отображением множества линий, и
проанализируйте на готовом примере.
Здравствуйте, Backspace!
Спасибо за быстрый ответ.
По моей задумке должны отображаться две линии параболика, если входные параметры разные, отображается только одна.
Ответьте, если не трудно.Заранее благодарю.
А вообще, изучите ООП (объектно-ориентированное программирование).
Весь ваш код можно сократить как минимум в 2 раза.
У вас множество повторяющихся строк кода, только с разными входными параметрами.
Вынесите их в отдельный блок.
И код укоротится и визуально будет намного удобнее работать.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Parabolic (Open_Close):
Author: Aleksejs Mihailovs