#property indicator_chart_window // â îêíå èíñòðóìåíòà #property indicator_buffers 3 #property indicator_color1 Aqua #property indicator_color3 Blue //--âíåøíèå ïåðåìåííûå extern double Step=0.02; // íà÷àëüíîå çíà÷åíèå è øàã extern double Maximum=0.2; // êîíå÷íîå çíà÷åíèå extern bool ExtremumsShift=1; // ïîëîæåíèå ýêñòðåìóìîâ: 0 - ïî âðåìåíè èõ îïðåäåëíèÿ; 1 - ïî èõ ôàêòè÷åñêîìó ïîëîæåíèþ extern int History=0; // êîë-âî áàðîâ ïðåäûñòîðèè; 0 - âñå //-- double Peak[], // áóôåð ZigZag ïî ïèêàì Trough[], // áóôåð ZigZag ïî âïàäèíàì SAR[]; // áóôåð Parabolic //============================================================= int init() { SetIndexBuffer(0,Peak); // ïèêè SetIndexStyle(0,DRAW_ZIGZAG); SetIndexLabel(0,"Peak"); SetIndexEmptyValue(0,0.0); SetIndexBuffer(1,Trough); // êðåñòû, ò.å. âïàäèíû))) SetIndexStyle(1,DRAW_ZIGZAG); SetIndexLabel(1,"Trough"); SetIndexEmptyValue(1,0.0); SetIndexBuffer(2,SAR); // Ïàðàáîëèê SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,159); SetIndexLabel(2,"SAR"); SetIndexEmptyValue(2,0.0); return(0); } //============================================================= int start() { static int BarsPrev; // çíà÷åíèå Bars íà ïðåä.áàðå bool MissBars=Bars-BarsPrev>1; // 1 - åñòü ïðîïóùåííûå áàðû bool NewBar=Bars-BarsPrev==1; // 1 - ïåðâûé òèê íóëåâîãî áàðà if(MissBars && BarsPrev!=0) BarsPrev=reinit(); // ïðîóùåííûå áàðû â ïðîöåññå - ïåðåñ÷åò çàíîâî int limit=Bars-BarsPrev-(BarsPrev==0); BarsPrev=Bars; // êîë-âî ïåðåñ÷åòîâ if(History!=0 && limit>History) limit=History-1; // êîë-âî ïåðåñ÷åòîâ ïî èñòîðèè for(int i=limit; i>=0; i--) // öèêë ïî íåïîñ÷èòàííûì è ïðåäïîñëåäíåìó áàðàì { SAR[i]=iSAR(NULL,0,Step,Maximum, i); // Ïàðàáîëèê double mid[2]; // ñð. öåíà mid[0]=(High[i]+Low[i])/2; // ñð.öåíà íà òåêóùåì áàðå mid[1]=(High[i+1]+Low[i+1])/2; // ñð.öåíà íà ïðåä.áàðå static int j; // ñ÷åò÷èê ñìåùåíèÿ ìåæäó ìîìåíòîì îïðåäåëåíÿ ýêñòðåìóìà è åãî ïîëîæåíèåì âî âðåìåíè static bool dir; // ôëàã íàïðàâëåíèÿ; 0 - âíèç, 1 - ââåðõ static double h,l; // òåêóùèå ýêñòðåìàëüíûå çíà÷åíèÿ int shift; // ñìåùåíèå ìåæäó ìîìåíòîì îïðåäåëåíÿ ýêñòðåìóìà è åãî ïîëîæåíèåì âî âðåìåíè if(i>0) j++; // åñëè áàð çàâåðøåí, òî èíêðåìåíò ñ÷åò÷èêà ñìåùåíèÿ if(dir) // ëîâëÿ ïèêà { if(h<High[i]) {h=High[i]; j=NewBar;} // òåêóùèé ìàêñèìóì; ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ if(SAR[i+1]<=mid[1] && SAR[i]>mid[0]) // ïåðåâîðîò Ïàðàáîëèêà âíèç { shift=i+ExtremumsShift*(j+NewBar); // ñìåùåíèå Peak[shift]=h; // ïèê dir=0; // íàïðàâëåíèå âíèç l=Low[i]; j=0; // òåêóùèé ìàêñèìóì, ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ } } else // ëîâëÿ âïàäèíû { if(l>Low[i]) {l=Low[i]; j=NewBar;} // òåêóùèé ìèíèìóì; ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ if(SAR[i+1]>=mid[1] && SAR[i]<mid[0]) // ïåðåâîðîò Ïàðàáîëèêà ââåðõ { shift=i+ExtremumsShift*(j+NewBar); // ñìåùåíèå Trough[shift]=l; // âïàäèíà dir=1; // íàïðàâëåíèå ââåðõ h=High[i]; j=0; // òåêóùèé ìàêñèìóì, ñáðîñ ñ÷åò÷èêà ñìåùåíèÿ } } } // if(MissBars) Print("limit: ",limit," Bars:",Bars," IndicatorCounted: ",IndicatorCounted()); return(0); } //============================================================= // ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè int reinit() { ArrayInitialize(Peak,0.0); ArrayInitialize(Trough,0.0); ArrayInitialize(SAR,0.0); return(0); }
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_ZIGZAG
Implements a curve of type DRAW_ARROW
Indicators Used:
Parabolic Stop and Reverse system
Custom Indicators Used:
Order Management characteristics:
Other Features: