Сделайте пожалуйста в индикаторе Parabolic разный цвет верхних и нижних точек

 

Сделайте пожалуйста в индикаторе Parabolic разный цвет верхних и нижних точек.

Вот сам индикатор:

//+------------------------------------------------------------------+
//| Parabolic.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| https://www.metaquotes.net// |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net//"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Lime
//---- input parameters
extern double Step=0.02;
extern double Maximum=0.2;
//---- buffers
double SarBuffer[];
//----
int save_lastreverse;
bool save_dirlong;
double save_start;
double save_last_high;
double save_last_low;
double save_ep;
double save_sar;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,SarBuffer);
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SaveLastReverse(int last,int dir,double start,double low,double high,double ep,double sar)
{
save_lastreverse=last;
save_dirlong=dir;
save_start=start;
save_last_low=low;
save_last_high=high;
save_ep=ep;
save_sar=sar;
}
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system |
//+------------------------------------------------------------------+
int start()
{
static bool first=true;
bool dirlong;
double start,last_high,last_low;
double ep,sar,price_low,price_high,price;
int i,counted_bars=IndicatorCounted();
//----
if(Bars<3) return(0);
//---- initial settings
i=Bars-2;
if(counted_bars==0 || first)
{
first=false;
dirlong=true;
start=Step;
last_high=-10000000.0;
last_low=10000000.0;
while(i>0)
{
save_lastreverse=i;
price_low=Low[i];
if(last_low>price_low) last_low=price_low;
price_high=High[i];
if(last_high<price_high) last_high=price_high;
if(price_high>High[i+1] && price_low>Low[i+1]) break;
if(price_high<High[i+1] && price_low<Low[i+1]) { dirlong=false; break; }
i--;
}
//---- initial zero
int k=i;
while(k<Bars)
{
SarBuffer[k]=0.0;
k++;
}
//---- check further
if(dirlong) { SarBuffer[i]=Low[i+1]; ep=High[i]; }
else { SarBuffer[i]=High[i+1]; ep=Low[i]; }
i--;
}
else
{
i=save_lastreverse;
start=save_start;
dirlong=save_dirlong;
last_high=save_last_high;
last_low=save_last_low;
ep=save_ep;
sar=save_sar;
}
//----
while(i>=0)
{
price_low=Low[i];
price_high=High[i];
//--- check for reverse
if(dirlong && price_low<SarBuffer[i+1])
{
SaveLastReverse(i,true,start,price_low,last_high,ep,sar);
start=Step; dirlong=false;
ep=price_low; last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(!dirlong && price_high>SarBuffer[i+1])
{
SaveLastReverse(i,false,start,last_low,price_high,ep,sar);
start=Step; dirlong=true;
ep=price_high; last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
//---
price=SarBuffer[i+1];
sar=price+start*(ep-price);
if(dirlong)
{
if(ep<price_high && (start+Step)<=Maximum) start+=Step;
if(price_high<High[i+1] && i==Bars-2) sar=SarBuffer[i+1];

price=Low[i+1];
if(sar>price) sar=price;
price=Low[i+2];
if(sar>price) sar=price;
if(sar>price_low)
{
SaveLastReverse(i,true,start,price_low,last_high,ep,sar);
start=Step; dirlong=false; ep=price_low;
last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(ep<price_high) { last_high=price_high; ep=price_high; }
}
else
{
if(ep>price_low && (start+Step)<=Maximum) start+=Step;
if(price_low<Low[i+1] && i==Bars-2) sar=SarBuffer[i+1];

price=High[i+1];
if(sar<price) sar=price;
price=High[i+2];
if(sar<price) sar=price;
if(sar<price_high)
{
SaveLastReverse(i,false,start,last_low,price_high,ep,sar);
start=Step; dirlong=true; ep=price_high;
last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
if(ep>price_low) { last_low=price_low; ep=price_low; }
}
SarBuffer[i]=sar;
i--;
}
// sar=SarBuffer[0];
// price=iSAR(NULL,0,Step,Maximum,0);
// if(sar!=price) Print("custom=",sar," SAR=",price," counted=",counted_bars);
// if(sar==price) Print("custom=",sar," SAR=",price," counted=",counted_bars);
//----
return(0);
}
//+------------------------------------------------------------------+

 

Через вызов стандартного пойдет? Вот так:


Тогда ловите код:

#property indicator_chart_window // в окне инструмента
#property indicator_buffers 2
#property indicator_color1 Red // сопротивление
#property indicator_color2 Green // поддержка

// входные параметры
extern double Step=0.02; // начальное значение и шаг
extern double Maximum=0.2; // конечное значение

 int History=0; // 0- все бары

// инд.буферы
double   SARup[]; // сопротивление
double   SARdn[]; // поддержка

// общие переменные
bool first=1; // флаг первого запуска

int init()
  {
   first=1;
   // сопротивление
   SetIndexBuffer(0,SARup);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexEmptyValue(0,0.0);
   SetIndexArrow(0,159);
   // поддержка
   SetIndexBuffer(1,SARdn);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexEmptyValue(1,0.0);
   SetIndexArrow(1,159);

   return(0);
  }

int reinit() // ф-я дополнительной инициализации
  {
   ArrayInitialize(SARup,0.0);
   ArrayInitialize(SARdn,0.0);
   return(0);
  }

int start()
  {
   int ic=IndicatorCounted();
   if(!first && Bars-ic-1>1) ic=reinit(); 
   bool ic0=ic==0;
   int limit=Bars-ic-1; // кол-во пересчетов
   if(History!=0 && limit>History) limit=History-1; // кол-во пересчетов по истории

   for(int i=limit; i>=0; i--) { // цикл пересчета по ВСЕМ барам
      bool reset=i==limit && ic==0; // сброс на первой итерации цикла пересчета
      if(reset) {
         static int BarsPrev=0; // кол-во баров на пред. тике
         static bool dir=0; // направление параболика
         static double mid1=0,sar1=0; // значения ср.цены и параболика на пред.баре
        }
      bool NewBar=ic0 || BarsPrev!=Bars; // первый тик нового бара

      double sar0=iSAR(NULL,0,Step,Maximum, i); // параболик
      double mid0=(High[i]+Low[i])/2; // ср.цена 
      // сигналы переключения направления параболика
      bool up=sar1>=mid1 && sar0<mid0; // переворот вверх
      bool dn=sar1<=mid1 && sar0>mid0; // пееворот вниз
      // направление параболика
      if(up) dir=1; // вверх
      if(dn) dir=0; // вниз
      // заполнение буферов
      if(dir) {
         SARdn[i]=sar0;
         SARup[i]=0.0;
        }
      else {
         SARup[i]=sar0;
         SARdn[i]=0.0;
        }
      // синхронизация
      if(NewBar) {BarsPrev=Bars; mid1=mid0; sar1=sar0;}
     }   
   first=0; // сброс флага первого цикла
   return(0);
  }
Файлы:
dualsar_1.mq4  3 kb
 

Благодарю.

А можете еще алерт прикрутить на появление противоположных точек?

 
A1ex >>:

Благодарю.

А можете еще алерт прикрутить на появление противоположных точек?

Имеется ввиду момент переворота? (Нет там противоположных точек.) Какой алерт, звук? Или что?

Да сами можете прикрутить - все сигналы есть и даже подписаны. Лог. переменные up и dn - превороты вверх и вниз. К ним и прикручивайте, чего хотите.

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