0
Views
0
Downloads
0
Favorites
GannZIGZAG_Channel
ÿþ//+------------------------------------------------------------------+
//| GannZIGZAG_Channel.mq5 |
//| Copyright © 2005, Profi_R |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
//---- 02B>@AB2> 8=48:0B>@0
#property copyright "Copyright © 2005, Profi_R"
//---- AAK;:0 =0 A09B 02B>@0
#property link "http://www.metaquotes.net"
#property description ""
//---- =><5@ 25@A88 8=48:0B>@0
#property version "1.00"
//---- >B@8A>2:0 8=48:0B>@0 2 3;02=>< >:=5
#property indicator_chart_window
//---- 4;O @0AGQB0 8 >B@8A>2:8 8=48:0B>@0 8A?>;L7>20=> 420 1CD5@0
#property indicator_buffers 2
//---- 8A?>;L7>20=> 2A53> >4=> 3@0D8G5A:>5 ?>AB@>5=85
#property indicator_plots 1
//+----------------------------------------------+
//| 0@0<5B@K >B@8A>2:8 8=48:0B>@0 GannZIGZAG |
//+----------------------------------------------+
//---- 2 :0G5AB25 8=48:0B>@0 8A?>;L7>20= ZIGZAG
#property indicator_type1 DRAW_ZIGZAG
//---- 2 :0G5AB25 F25B0 ;8=88 8=48:0B>@0 8A?>;L7>20= A8=5-D8>;5B>2K9 F25B
#property indicator_color1 clrBlueViolet
//---- ;8=8O 8=48:0B>@0 - 4;8==K9 ?C=:B8@
#property indicator_style1 STYLE_SOLID
//---- B>;I8=0 ;8=88 8=48:0B>@0 @02=0 2
#property indicator_width1 2
//---- >B>1@065=85 <5B:8 8=48:0B>@0
#property indicator_label1 "GannZIGZAG"
//+----------------------------------------------+
//| >1JO2;5=85 ?5@5G8A;5=89 |
//+----------------------------------------------+
enum ENUM_WIDTH //"8? :>=AB0=BK
{
w_1 = 1, //1
w_2, //2
w_3, //3
w_4, //4
w_5 //5
};
//+----------------------------------------------+
//| E>4=K5 ?0@0<5B@K 8=48:0B>@0 |
//+----------------------------------------------+
input uint GSv_range=2;
input int Shift=0; // A4283 8=48:0B>@0 ?> 3>@87>=B0;8 2 10@0E
//+----------------------------------------------+
//| E>4=K5 ?0@0<5B@K ?>AB@>5=8O :0=0;0 |
//+----------------------------------------------+
input string SirName="GannZIGZAG_Channel_"; //5@20O G0ABL 8<5=8 3@0D8G5A:8E >1J5:B>2
input int FirstExtrNumb=1; //=><5@ ?5@2>9 25@H8=K (0,1,2,3...)
input color Upper_color=clrLimeGreen; //F25B 25@E0 :0=0;0
input ENUM_LINE_STYLE Upper_style=STYLE_SOLID;//AB8;L 25@E0 :0=0;0
input ENUM_WIDTH Upper_width=w_3;//B>;I8=0 ;8=88 25@E0 :0=0;0
input color Middle_color=clrGray; //F25B A@54=59 ;8=88
input ENUM_LINE_STYLE Middle_style=STYLE_SOLID;//AB8;L A@54=59 ;8=88
input ENUM_WIDTH Middle_width=w_2;//B>;I8=0 A@54=59 ;8=88
input color Lower_color=clrMagenta; //F25B =870 :0=0;0
input ENUM_LINE_STYLE Lower_style=STYLE_SOLID;//AB8;L =870 :0=0;0
input ENUM_WIDTH Lower_width=w_3;//B>;I8=0 =870 :0=0;0
//+----------------------------------------------+
//---- >1JO2;5=85 48=0<8G5A:8E <0AA82>2, :>B>@K5 1C4CB 2 40;L=59H5< 8A?>;L7>20=K 2 :0G5AB25 8=48:0B>@=KE 1CD5@>2
double HighestBuffer[];
double LowestBuffer[];
//---- 1JO2;5=85 F5;KE ?5@5<5==KE =0G0;0 >BAGQB0 40==KE
int min_rates_total;
//----
double h,l;
bool cur_h,cur_l;
bool draw_up,draw_dn,initfl;
int fPoint_i,sPoint_i,s_up,s_dn,drawf,lb;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//---- =8F80;870F8O ?5@5<5==KE =0G0;0 >BAGQB0 40==KE
min_rates_total=2;
//---- ?@52@0I5=85 48=0<8G5A:8E <0AA82>2 2 8=48:0B>@=K5 1CD5@K
SetIndexBuffer(0,LowestBuffer,INDICATOR_DATA);
SetIndexBuffer(1,HighestBuffer,INDICATOR_DATA);
//---- 70?@5B =0 >B@8A>2:C 8=48:0B>@>< ?CABKE 7=0G5=89
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,NULL);
//---- CAB0=>2:0 ?>78F88, A :>B>@>9 =0G8=05BAO >B@8A>2:0 C@>2=59 >;;8=465@0
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- >ACI5AB2;5=85 A42830 8=48:0B>@0 ?> 3>@87>=B0;8 =0 Shift
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- 8=45:A0F8O M;5<5=B>2 2 1CD5@0E :0: 2 B09<A5@8OE
ArraySetAsSeries(LowestBuffer,true);
ArraySetAsSeries(HighestBuffer,true);
//--- A>740=85 8<5=8 4;O >B>1@065=8O 2 >B45;L=>< ?>4>:=5 8 2> 2A?;K20NI59 ?>4A:07:5
IndicatorSetString(INDICATOR_SHORTNAME,"GannZIGZAG_Channel");
//--- >?@545;5=85 B>G=>AB8 >B>1@065=8O 7=0G5=89 8=48:0B>@0
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//----
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//----
ObjectDelete(0,SirName+"Upper Line");
ObjectDelete(0,SirName+"Middle Line");
ObjectDelete(0,SirName+"Lower Line");
//----
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(
const int rates_total, // :>;8G5AB2> 8AB>@88 2 10@0E =0 B5:CI5< B8:5
const int prev_calculated,// :>;8G5AB2> 8AB>@88 2 10@0E =0 ?@54K4CI5< B8:5
const datetime &time[],
const double &open[],
const double& high[], // F5=>2>9 <0AA82 <0:A8<C<>2 F5=K 4;O @0AGQB0 8=48:0B>@0
const double& low[], // F5=>2>9 <0AA82 <8=8<C<>2 F5=K 4;O @0AGQB0 8=48:0B>@0
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]
)
{
//---- ?@>25@:0 :>;8G5AB20 10@>2 =0 4>AB0B>G=>ABL 4;O @0AGQB0
if(rates_total<min_rates_total) return(0);
//---- 8=45:A0F8O M;5<5=B>2 2 <0AA820E :0: 2 B09<A5@8OE
ArraySetAsSeries(open,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
ArraySetAsSeries(time,true);
//---- 1JO2;5=85 F5;KE ?5@5<5==KE
int i,bar,limit,count;
//---- >1JO2;5=8O ;>:0;L=KE ?5@5<5==KE 4;O ?>AB@>5=8O :0=0;0 8 $81>
int bar1=0,bar2,bar3,bar4,sign;
double price1=0.0,price2,price3,price4,dprice;
//---- @0AGQBK AB0@B>2>3> =><5@0 limit 4;O F8:;0 ?5@5AGQB0 10@>2
if(prev_calculated>rates_total || prev_calculated<=0)// ?@>25@:0 =0 ?5@2K9 AB0@B @0AGQB0 8=48:0B>@0
{
limit=rates_total-min_rates_total; // AB0@B>2K9 =><5@ 4;O @0AGQB0 2A5E 10@>2
initfl=0;
draw_up=0;
draw_dn=0;
cur_h=0;
cur_l=0;
}
else
{
limit=rates_total-prev_calculated; // AB0@B>2K9 =><5@ 4;O @0AGQB0 =>2KE 10@>2
}
//---- ?5@2>=0G0;L=0O 8=8F80;870F8O
if(initfl!=1) myInit(rates_total,open,high,low,close);
int bars2=rates_total-2;
int bars1=rates_total-1;
//---- >A=>2=>9 F8:; @0AGQB0 8=48:0B>@0
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
bar1=bar+1;
count=bars1-bar;
HighestBuffer[bar]=NULL;
LowestBuffer[bar]=NULL;
//---- 5A;8 =0 ?@54K4CI5< 10@5 1K; >B@8A>20= M:AB@5<C<
if((HighestBuffer[bar1]>0 || LowestBuffer[bar1]>0)&& lb!=count)
{
if(draw_up) s_dn=0;
else if(draw_dn) s_up=0;
}
if(lb!=count)
{
cur_h=0;
cur_l=0;
}
if(bar>bars2-drawf || (high[bar]<=high[bar1] && low[bar]>=low[bar1])) continue;
if(draw_up)
{
//---- 5A;8 ;8=8O =0?@02;5=0 225@E
if(high[bar]>h)
{
//---- 5A;8 4>AB83=CB =>2K9 <0:A8<C<
h=high[bar];
cur_h=1;
}
if(low[bar]<l)
{
//---- 5A;8 4>AB83=CB =>2K9 <8=8<C<
l=low[bar];
//---- 5A;8 MB> =5 B>B 65 A0<K9 10@
if(lb!=count || cur_l!=1)s_dn++;
cur_l=1;
}
//---- 5A;8 AG5BG8:8 @02=K
if(s_up==s_dn)
{
//---- 5A;8 ?>A;54=89 10@ >4=>2@5<5==> =>2K9 <0:A8<C< 8 <8=8<C<
if(cur_h==cur_l && cur_l==1)
{
//---- 5A;8 A25G0 <54256LO
if(close[bar]<=open[bar])
{
draw_up=0;
draw_dn=1;
fPoint_i=sPoint_i;
sPoint_i=count;
LowestBuffer[bar]=l;
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
else
{
//---- 5A;8 A25G0 1KGLO
sPoint_i=count;
HighestBuffer[bar]=h;
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
}
else
{
//---- 5A;8 ?>A;54=89 10@ B>;L:> =>2K9 <0:A8<C<
if(cur_h==1)
{
sPoint_i=count;
HighestBuffer[bar]=h;
l=low[bar];
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
else
{
if(cur_l==1)
{
//---- 5A;8 ?>A;54=89 10@ B>;L:> =>2K9 <8=8<C<
draw_up=0;
draw_dn=1;
fPoint_i=sPoint_i;
sPoint_i=count;
LowestBuffer[bar]=l;
h=high[bar];
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
}
}
}
else
{
//---- 8=0G5 5A;8 A<5=K =0?@02;5=8O =5B O2=> (AG5BG8: Dn A25G59 =5 @025= GSv_range)
//---- 5A;8 4>AB83=CB =>2K9 <0:A8<C<
if(cur_h==1)
{
sPoint_i=count;
HighestBuffer[bar]=h;
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
l=low[bar];
}
}
}
else
{
//---- 5A;8 ;8=8O =0?@02;5=0 2=87
if(high[bar]>h)
{
//---- 5A;8 4>AB83=CB =>2K9 <0:A8<C<
h=high[bar];
if(lb!=count || cur_h!=1) s_up++;
cur_h=1;
//---- 5A;8 MB> =5 B>B 65 A0<K9 10@
}
if(low[bar]<l)
{
//---- 5A;8 4>AB83=CB =>2K9 <8=8<C<
l=low[bar];
cur_l=1;
}
//---- 5A;8 AG5BG8:8 @02=K
if(s_up==s_dn)
{
//---- 5A;8 ?>A;54=89 10@ >4=>2@5<5==> =>2K9 <0:A8<C< 8 <8=8<C<
if(cur_h==cur_l && cur_l==1)
{
//---- 5A;8 A25G0 <54256LO
if(close[bar]<=open[bar])
{
sPoint_i=count;
LowestBuffer[bar]=l;
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
else
{
//---- 5A;8 A25G0 1KGLO
draw_up=1;
draw_dn=0;
fPoint_i=sPoint_i;
sPoint_i=count;
HighestBuffer[bar]=h;
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
}
else
{
//---- 5A;8 ?>A;54=89 10@ B>;L:> =>2K9 <0:A8<C<
if(cur_h==1)
{
draw_up=1;
draw_dn=0;
fPoint_i=sPoint_i;
sPoint_i=count;
HighestBuffer[bar]=h;
l=low[bar];
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
else
{
if(cur_l==1)
{
//---- 5A;8 ?>A;54=89 10@ B>;L:> =>2K9 <8=8<C<
sPoint_i=count;
LowestBuffer[bar]=l;
h=high[bar];
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
}
}
}
}
else
{
//---- 8=0G5 5A;8 A<5=K =0?@02;5=8O =5B O2=> (AG5BG8: Up A25G59 =5 @025= GSv_range)
//---- 5A;8 4>AB83=CB =>2K9 <8=8<C<
if(cur_l==1)
{
sPoint_i=count;
LowestBuffer[bar]=l;
for(i=bars2-fPoint_i; i>bar; i--)
{
HighestBuffer[i]=NULL;
LowestBuffer[i]=NULL;
}
h=high[bar];
}
}
}
if(lb!=count) lb=count;
}
//---- >AB@>5=85 :0=0;0
bar1=FindFirstExtremum(0,rates_total,HighestBuffer,LowestBuffer,sign,price1);
for(int numb=1; numb<=FirstExtrNumb && bar1>-1; numb++)
bar1=FindSecondExtremum(sign,bar1,rates_total,HighestBuffer,LowestBuffer,sign,price1);
if(bar1==-1)
{
ObjectDelete(0,SirName+"Upper Line");
ObjectDelete(0,SirName+"Middle Line");
ObjectDelete(0,SirName+"Lower Line");
return(rates_total);
}
bar2=FindSecondExtremum(sign,bar1,rates_total,HighestBuffer,LowestBuffer,sign,price2);
bar3=FindSecondExtremum(sign,bar2,rates_total,HighestBuffer,LowestBuffer,sign,price3);
bar4=bar2+bar3-bar1;
price4=price2+price3-price1;
if(sign==+1)
{
SetTline(0,SirName+"Upper Line",0,time[bar3],price3,time[bar1],price1,Upper_color,Upper_style,Upper_width,"Upper Line");
SetTline(0,SirName+"Lower Line",0,time[bar4],price4,time[bar2],price2,Lower_color,Lower_style,Lower_width,"Lower Line");
}
if(sign==-1)
{
SetTline(0,SirName+"Upper Line",0,time[bar4],price4,time[bar2],price2,Upper_color,Upper_style,Upper_width,"Upper Line");
SetTline(0,SirName+"Lower Line",0,time[bar3],price3,time[bar1],price1,Lower_color,Lower_style,Lower_width,"Lower Line");
}
dprice=-(price3-price1)/(bar3-bar1);
dprice=(price3-price4-dprice*(bar4-bar3))/2.0;
price4+=dprice;
price2+=dprice;
SetTline(0,SirName+"Middle Line",0,time[bar4],price4,time[bar2],price2,Middle_color,Middle_style,Middle_width,"Middle Line");
//----
ChartRedraw(0);
return(rates_total);
}
//+------------------------------------------------------------------+
// $C=:F8O =0G0;L=>9 8=8F80;870F88 8=48:0B>@0 |
//+------------------------------------------------------------------+
void myInit(
const int bars,
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[])
{
//----
int index,index1;
int bars1=bars-1;
fPoint_i=0;
h=High[bars1];
l=Low[bars1];
for(index=bars-2; index>=0; index--)
{
index1=index+1;
if(High[index]>High[index1] || Low[index]<Low[index1])
{
if(High[index]>h && High[index]>High[index1]) s_up++;
if(Low[index]<l && Low[index]<Low[index1]) s_dn++;
}
else continue;
if(s_up==s_dn && s_up==GSv_range)
{
h=High[index];
l=Low[index];
sPoint_i=bars1-index;
if(Close[index]>=Open[index])
{
s_dn=0;
LowestBuffer[bars1]=Low[bars1];
HighestBuffer[index]=High[index];
draw_up=1;
break;
}
else
{
s_up=0;
HighestBuffer[bars1]=High[bars1];
LowestBuffer[index]=Low[index];
draw_dn=1;
break;
}
}
else
{
h=High[index];
l=Low[index];
sPoint_i=bars1-index;
if(s_up==GSv_range)
{
s_dn=0;
LowestBuffer[bars1]=Low[bars1];
HighestBuffer[index]=High[index];
draw_up=1;
break;
}
else
{
if(s_dn==GSv_range)
{
s_up=0;
HighestBuffer[bars1]=High[bars1];
LowestBuffer[index]=Low[index];
draw_dn=1;
break;
}
}
}
}
initfl=1;
drawf=sPoint_i;
//----
}
//+------------------------------------------------------------------+
//| !>740=85 B@5=4>2>9 ;8=88 |
//+------------------------------------------------------------------+
void CreateChannel
(
long chart_id, // 845=B8D8:0B>@ 3@0D8:0
string name, // 8<O >1J5:B0
int nwin, // 8=45:A >:=0
datetime time1, // 2@5<O 1 F5=>2>3> C@>2=O
double price1, // 1 F5=>2>9 C@>25=L
datetime time2, // 2@5<O 2 F5=>2>3> C@>2=O
double price2, // 2 F5=>2>9 C@>25=L
datetime time3, // 2@5<O 3 F5=>2>3> C@>2=O
double price3, // 3 F5=>2>9 C@>25=L
color Color, // F25B ;8=88
int style, // AB8;L ;8=88
int width, // B>;I8=0 ;8=88
string text // B5:AB
)
//----
{
//----
ObjectCreate(chart_id,name,OBJ_CHANNEL,nwin,time1,price1,time2,price2,time3,price3);
ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
ObjectSetInteger(chart_id,name,OBJPROP_BACK,false);
ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
//----
}
//+------------------------------------------------------------------+
//| 5@5CAB0=>2:0 @02=>C40;Q==>3> :0=0;0 |
//+------------------------------------------------------------------+
void SetChannel
(
long chart_id, // 845=B8D8:0B>@ 3@0D8:0
string name, // 8<O >1J5:B0
int nwin, // 8=45:A >:=0
datetime time1, // 2@5<O 1 F5=>2>3> C@>2=O
double price1, // 1 F5=>2>9 C@>25=L
datetime time2, // 2@5<O 2 F5=>2>3> C@>2=O
double price2, // 2 F5=>2>9 C@>25=L
datetime time3, // 2@5<O 3 F5=>2>3> C@>2=O
double price3, // 3 F5=>2>9 C@>25=L
color Color, // F25B ;8=88
int style, // AB8;L ;8=88
int width, // B>;I8=0 ;8=88
string text // B5:AB
)
//----
{
//----
if(ObjectFind(chart_id,name)==-1) CreateChannel(chart_id,name,nwin,time1,price1,time2,price2,time3,price3,Color,style,width,text);
else
{
ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
ObjectMove(chart_id,name,0,time1,price1);
ObjectMove(chart_id,name,1,time2,price2);
ObjectMove(chart_id,name,2,time3,price3);
}
//----
}
//+------------------------------------------------------------------+
//| !>740=85 B@5=4>2>9 ;8=88 |
//+------------------------------------------------------------------+
void CreateTline
(
long chart_id, // 845=B8D8:0B>@ 3@0D8:0
string name, // 8<O >1J5:B0
int nwin, // 8=45:A >:=0
datetime time1, // 2@5<O 1 F5=>2>3> C@>2=O
double price1, // 1 F5=>2>9 C@>25=L
datetime time2, // 2@5<O 2 F5=>2>3> C@>2=O
double price2, // 2 F5=>2>9 C@>25=L
color Color, // F25B ;8=88
int style, // AB8;L ;8=88
int width, // B>;I8=0 ;8=88
string text // B5:AB
)
//----
{
//----
ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2);
ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
ObjectSetInteger(chart_id,name,OBJPROP_BACK,false);
ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
//----
}
//+------------------------------------------------------------------+
//| 5@5CAB0=>2:0 B@5=4>2>9 ;8=88 |
//+------------------------------------------------------------------+
void SetTline
(
long chart_id, // 845=B8D8:0B>@ 3@0D8:0
string name, // 8<O >1J5:B0
int nwin, // 8=45:A >:=0
datetime time1, // 2@5<O 1 F5=>2>3> C@>2=O
double price1, // 1 F5=>2>9 C@>25=L
datetime time2, // 2@5<O 2 F5=>2>3> C@>2=O
double price2, // 2 F5=>2>9 C@>25=L
color Color, // F25B ;8=88
int style, // AB8;L ;8=88
int width, // B>;I8=0 ;8=88
string text // B5:AB
)
//----
{
//----
if(ObjectFind(chart_id,name)==-1) CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text);
else
{
ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
ObjectMove(chart_id,name,0,time1,price1);
ObjectMove(chart_id,name,1,time2,price2);
}
//----
}
//+------------------------------------------------------------------+
//| >8A: A0<>9 ?5@2>9 25@H8=K 837030 2 1CD5@0E B09<A5@8OE |
//+------------------------------------------------------------------+
int FindFirstExtremum(int StartPos,int Rates_total,double &UpArray[],double &DnArray[],int &Sign,double &Extremum)
{
//----
if(StartPos>=Rates_total)StartPos=Rates_total-1;
for(int bar=StartPos; bar<Rates_total; bar++)
{
if(UpArray[bar]!=0.0 && UpArray[bar]!=EMPTY_VALUE)
{
Sign=+1;
Extremum=UpArray[bar];
return(bar);
break;
}
if(DnArray[bar]!=0.0 && DnArray[bar]!=EMPTY_VALUE)
{
Sign=-1;
Extremum=DnArray[bar];
return(bar);
break;
}
}
//----
return(-1);
}
//+------------------------------------------------------------------+
//| >8A: 2B>@>9 25@H8=K 837030 2 1CD5@0E B09<A5@8OE |
//+------------------------------------------------------------------+
int FindSecondExtremum(int Direct,int StartPos,int Rates_total,double &UpArray[],double &DnArray[],int &Sign,double &Extremum)
{
//----
if(StartPos>=Rates_total)StartPos=Rates_total-1;
if(Direct==-1)
for(int bar=StartPos; bar<Rates_total; bar++)
{
if(UpArray[bar]!=0.0 && UpArray[bar]!=EMPTY_VALUE)
{
Sign=+1;
Extremum=UpArray[bar];
return(bar);
break;
}
}
if(Direct==+1)
for(int bar=StartPos; bar<Rates_total; bar++)
{
if(DnArray[bar]!=0.0 && DnArray[bar]!=EMPTY_VALUE)
{
Sign=-1;
Extremum=DnArray[bar];
return(bar);
break;
}
}
//----
return(-1);
}
//+------------------------------------------------------------------+
Comments