//+------------------------------------------------------------------+ //| GANN_rvm_v4.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 8 #property indicator_color1 DeepSkyBlue #property indicator_color2 Black #property indicator_color3 DeepSkyBlue #property indicator_color4 Black #property indicator_color5 Yellow #property indicator_color6 Green #property indicator_color7 Red #property indicator_color8 Red //---- input parameters extern int NextTF=15; extern int BL_Range=5; extern int HLN_Range=3; extern bool HLN_UseFullTF=false; //---- buffers double HLNUp_sl[]; double HLNDn_sl[]; double HLNUp[]; double HLNDn[]; double BLLev[]; double BLStep[]; double ExtMapBuffer7[]; double ExtMapBuffer8[]; //---- int NextTFs; int initfl; int Displacement; int dig; int ArrSize; int ArrIdx; int lb; double MyArr[][10]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetIndexStyle(3,DRAW_LINE); SetIndexStyle(4,DRAW_LINE); SetIndexStyle(5,DRAW_LINE); SetIndexStyle(6,DRAW_LINE); SetIndexStyle(7,DRAW_LINE); SetIndexBuffer(0,HLNUp_sl); SetIndexBuffer(1,HLNDn_sl); SetIndexBuffer(2,HLNUp); SetIndexBuffer(3,HLNDn); SetIndexBuffer(4,BLLev); SetIndexBuffer(5,BLStep); SetIndexBuffer(6,ExtMapBuffer7); SetIndexBuffer(7,ExtMapBuffer8); SetIndexLabel(0,"HLNextUp_sec (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")"); SetIndexLabel(1,"HLNextDn_sec (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")"); SetIndexLabel(2,"HLNextUp (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")"); SetIndexLabel(3,"HLNextDn (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")"); SetIndexLabel(4,"BalansLevel (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")"); SetIndexLabel(5,"BalansStep (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")"); SetIndexLabel(6,"1"); SetIndexLabel(7,"2"); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexEmptyValue(6,0.0); SetIndexEmptyValue(7,0.0); //---- NextTFs=NextTF*60; //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int cb,i,limit,index,ai; //---- if( initfl!=1 ) { myInit(); if( initfl!=1 ) { Alert("Èíäèêàòîð íå èíèöèàëèçèðîâàí!"); return(-1); } } index=Bars-1; if( counted_bars>=0 ) { if( index-counted_bars<=0 ) { limit=0; } else { limit=index-counted_bars; } } else { Alert("Ñáîé! /n counted_bars < 0"); return(-1); } //öèêë ïî áàðàì for( cb=limit;cb>=0;cb-- ) { ai=index-cb; //åñëè ýòî ïåðâûé áàð if( cb==Bars-1 ) { if( FBar(cb)<0 ) { return(-1); } continue; } else { //åñëè ýòî íîâûé áàð if( lb!=ai ) { lb=ai; //åñëè îí íå ÿâëÿåòñÿ íà÷àëîì íîâîãî áàðà íà ñòàðøåì ò-ô if( BBarBegin(cb,NextTF)!=1 ) { if( NewBar(cb)<0 ) { return(-1); } } else { if( NBBar(cb)<0 ) { return(-1); } } //îòðèñîâêà õàé ëîó àêòèâàòîð if( HLN_UseFullTF!=1 ) { if( Close[cb]>MyArr[ArrIdx-1][8] ) { HLNUp[cb]=0; HLNDn[cb]=MyArr[ArrIdx-1][9]; } else { if( Close[cb]<MyArr[ArrIdx-1][9] ) { HLNUp[cb]=MyArr[ArrIdx-1][8]; HLNDn[cb]=0; } else { if( HLNUp[cb+1]>0 ) { HLNUp[cb]=MyArr[ArrIdx-1][8]; HLNDn[cb]=0; } else { HLNUp[cb]=0; HLNDn[cb]=MyArr[ArrIdx-1][9]; } } } } else { if( MyArr[ArrIdx-1][5]>MyArr[ArrIdx-2][8] ) { HLNUp[cb]=0; HLNDn[cb]=MyArr[ArrIdx-1][9]; } else { if( MyArr[ArrIdx-1][5]<MyArr[ArrIdx-2][9] ) { HLNUp[cb]=MyArr[ArrIdx-1][8]; HLNDn[cb]=0; } else { if( HLNUp[cb+1]>0 ) { HLNUp[cb]=MyArr[ArrIdx-1][8]; HLNDn[cb]=0; } else { HLNUp[cb]=0; HLNDn[cb]=MyArr[ArrIdx-1][9]; } } } } } else { if( NewTic(cb)<0 ) { return(-1); } } } } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //+--------------------------------------------------------------------+ //| Ôóíêöèÿ âîçâðàùàåò èñòèíó, åñëè áàð ÿâëÿåòñÿ íà÷àëîì áàðà ñòàðøåãî | //| ò-ô | //+--------------------------------------------------------------------+ bool BBarBegin(int bar, int TF) { //---- bool bbegin=0; if(TF!=10080) { if( MathFloor(Time[bar]/NextTFs)*NextTFs>Time[bar+1] ) { bbegin=1; } } else { if( (MathFloor((Time[bar]+259200)/NextTFs)*NextTFs-259200)>Time[bar+1] ) { bbegin=1; } } //---- return(bbegin); } //+--------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Ôóíêöèÿ íà÷àëüíîé èíèöèàëèçàöèè èíäèêàòîðà | //+------------------------------------------------------------------+ void myInit() { int ArrSize,Displacement,arcount,i,BR; //---- //îïðåäåëÿåì êîëè÷åñòâî áàðîâ ìëàäøåãî ò-ô ñîäåðæàùèõñÿ â áàðå ñòàðøåãî ò-ô if( NextTF<10080) { Displacement=NextTF/Period(); } else { if( NextTF==10080 ) { Displacement=7200/Period(); } else { if( NextTF==43200 ) { Displacement=31680/Period(); } } } //--------- SetIndexShift(0,Displacement); SetIndexShift(1,Displacement); SetIndexShift(4,Displacement); SetIndexShift(5,Displacement); SetIndexDrawBegin(0,Displacement*HLN_Range); SetIndexDrawBegin(1,Displacement*HLN_Range); SetIndexDrawBegin(2,Displacement*HLN_Range); SetIndexDrawBegin(3,Displacement*HLN_Range); SetIndexDrawBegin(4,0); SetIndexDrawBegin(5,Displacement*BL_Range); //--------- //åñëè íåâåðíî óêàçàíû ïàðàìåòðû BL_Range,HLN_Range if( BL_Range<1 || HLN_Range<1 ) { Alert("Íåâåðíî óêàçàíû ïàðàìåòðû èíèêàòîðà!"); return(-1); } BR=MathMax(BL_Range,HLN_Range); //åñëè íà ãðàôèêå íåäîñòàòî÷íî äàííûõ if( Bars<BR*Displacement ) { Alert("Íà ãðàôèêå íåäîñòàòî÷íî äàííûõ"); return(-1); } //åñëè íåâåðíî óêàçàí ïàðàìåòð NextTF if( NextTF<=Period() ) { Alert("Íåâåðíî óêàçàí ïàðàìåòð NextTF !/n Çíà÷åíèå äîëæíî áûòü áîëüøå /n òåêóùåãî ò-ô â ìèíóòàõ"); return(-1); } //êîëè÷åñòâî çíàêîâ äî êîòîðûõ áóäóò îêðóãëÿòüñÿ ðàñ÷åòû dig=Digits; //îïðåäåëÿåì íåîáõîäèìûé ðàçìåð ìàññèâà è åãî ïîñëåäíèé èíäåêñ ArrSize=BR; ArrIdx=BR-1; //100 ïîïûòîê íà èçìåíåíèå ðàçìåðà ìàññèâà for( i=0;i<100;i++) { arcount=ArrayResize(MyArr,ArrSize); if( arcount>0 ) { break; } } //100 ïîïûòîê íà èíèöèàëèçàöèþ ìàññèâà for( i=0;i<100;i++) { arcount=0; arcount=ArrayInitialize(MyArr,0.0); if( arcount>0 ) { break; } } initfl=1; //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Ôóíêöèÿ îòðàáàòûâàþùàÿ íà êàæäûé òèê åñëè ýòî íå íîâûé áàð | //+------------------------------------------------------------------+ int NewTic( int Bar ) { //---- int i; double sH,sL,sBL; if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar]; if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //öèêë ïî ìàññèâó for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- ) { sBL+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- ) { sH+=MyArr[i][3]; sL+=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig); //îòðèñîâûâàåì íà ãðàôèêå for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- ) { BLLev[i]=MyArr[ArrIdx][6]; BLStep[i]=MyArr[ArrIdx][7]; HLNUp_sl[i]=MyArr[ArrIdx][8]; HLNDn_sl[i]=MyArr[ArrIdx][9]; } if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Ñáîé ðàñ÷åòà èíäèêàòîðà íà íîâîì òèêå!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Ôóíêöèÿ îòðàáàòûâàþùàÿ íà ïåðâûé áàð íà ãðàôèêå | //+------------------------------------------------------------------+ int FBar( int Bar ) { //---- //íà÷èíàåì çàïèñûâàòü â ìàññèâ MyArr[ArrIdx][0]=Bars-1-Bar; MyArr[ArrIdx][1]=Bars-1-Bar; MyArr[ArrIdx][2]=Open[Bar]; MyArr[ArrIdx][3]=High[Bar]; MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); BLLev[Bar]=MyArr[ArrIdx][6]; if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Îøèáêà ïðîñ÷åòà 1 áàðà!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Ôóíêöèÿ îòðàáàòûâàþùàÿ ïðè ïîÿâëåíèè íîâîãî áàðà 1 ðàç | //+------------------------------------------------------------------+ int NewBar( int Bar ) { //---- int i; double sH,sL,sBL; MyArr[ArrIdx][1]=Bars-1-Bar; if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar]; if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //öèêë ïî ìàññèâó for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- ) { sBL+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- ) { sH+=MyArr[i][3]; sL+=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig); //îòðèñîâûâàåì íà ãðàôèêå for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- ) { BLLev[i]=MyArr[ArrIdx][6]; BLStep[i]=MyArr[ArrIdx][7]; HLNUp_sl[i]=MyArr[ArrIdx][8]; HLNDn_sl[i]=MyArr[ArrIdx][9]; } if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Îøèáêà ïðîñ÷åòà íîâîãî áàðà!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Ôóíêöèÿ îòðàáàòûâàþùàÿ ïðè ïîÿâëåíèè íîâîãî áàðà ñòàðøåãî ò-ô | //+------------------------------------------------------------------+ int NBBar( int Bar ) { //---- int i; double sH,sL,sBL; //ñäèã ïî ñòåêó â ìàññèâå for( i=0;i<ArrIdx;i++) { MyArr[i][0]=MyArr[i+1][0]; MyArr[i][1]=MyArr[i+1][1]; MyArr[i][2]=MyArr[i+1][2]; MyArr[i][3]=MyArr[i+1][3]; MyArr[i][4]=MyArr[i+1][4]; MyArr[i][5]=MyArr[i+1][5]; MyArr[i][6]=MyArr[i+1][6]; MyArr[i][7]=MyArr[i+1][7]; MyArr[i][8]=MyArr[i+1][8]; MyArr[i][9]=MyArr[i+1][9]; } MyArr[ArrIdx][0]=Bars-1-Bar; MyArr[ArrIdx][1]=Bars-1-Bar; MyArr[ArrIdx][2]=Open[Bar]; MyArr[ArrIdx][3]=High[Bar]; MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //öèêë ïî ìàññèâó for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- ) { sBL+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- ) { sH+=MyArr[i][3]; sL+=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig); //îòðèñîâûâàåì íà ãðàôèêå BLLev[Bar]=MyArr[ArrIdx][6]; BLStep[Bar]=MyArr[ArrIdx][7]; HLNUp_sl[Bar]=MyArr[ArrIdx][8]; HLNDn_sl[Bar]=MyArr[ArrIdx][9]; if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Îøèáêà ïðîñ÷åòà íîâîãî áàðà ñòàðøåãî ò-ô!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen