//+X----------------------------------------------------------------x+ // Edited Nikolay Kositsin 2008.05.20 E-mail: farria@mail.redcom.ru | //+X----------------------------------------------------------------x+ //+X================================================================X+ //| StepMA_Stoch_NK.mq4 | //| Copyright © 2005, TrendLaboratory Ltd. | //| E-mail: igorad2004@list.ru | //+X================================================================X+ #property copyright "Copyright © 2005, TrendLaboratory Ltd." #property link "http://www.forex-instruments.info" //---- îòðèñîâêà èíäèêàòîðà â îòäåëüíîì îêíå #property indicator_separate_window //---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ #property indicator_buffers 2 //---- öâåòà èíäèêàòîðà #property indicator_color1 Gold #property indicator_color2 BlueViolet #property indicator_style1 STYLE_DASHDOTDOT #property indicator_width2 2 //---- îïðåäåëåíèå íèæíåãî è âåðõíåãî //çíà÷åíèÿ îòäåëüíîãî îêíà èíäèêàòîðà #property indicator_minimum 0 #property indicator_maximum 1 //---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ extern int PeriodWATR = 10; extern double Kwatr = 1.0000; extern int HighLow = 0; //---- èíäèêàòîðíûå áóôåðû double LineMinBuffer[]; double LineMidBuffer[]; //+X================================================================X+ //| StepMA_Stoch_NK indicator initialization function | //+X================================================================X+ int init() { //---- óñòàíîâêà ñòèëÿ èçîáðàæåíèÿ èíäèêàòîðà SetIndexStyle(0, DRAW_LINE); SetIndexStyle(1, DRAW_LINE); //---- îïðåäåëåíèå áóôåðîâ äëÿ ïîäñ÷¸òà SetIndexBuffer(0, LineMinBuffer); SetIndexBuffer(1, LineMidBuffer); //---- Óñòàíîâêà ôîðìàòà òî÷íîñòè (êîëè÷åñòâî çíàêîâ ïîñëå //äåñÿòè÷íîé òî÷êè) äëÿ âèçóàëèçàöèè çíà÷åíèé èíäèêàòîðà IndicatorDigits(Digits); //---- name for DataWindow and indicator subwindow label string short_name="StepMA Stoch(" + PeriodWATR + ", " + Kwatr + ", " + HighLow + ")"; IndicatorShortName(short_name); SetIndexLabel(0, "StepMA Stoch 1"); SetIndexLabel(1, "StepMA Stoch 2"); //---- óñòàíîâêà íîìåðà áàðà, //íà÷èíàÿ ñ êîòîðîãî áóäåò îòðèñîâûâàòüñÿ èíäèêàòîð SetIndexDrawBegin(0, PeriodWATR); SetIndexDrawBegin(1, PeriodWATR); //---- çàâåðøåíèå èíèöèàëèçàöèè return(0); } //+X================================================================X+ //| StepMA_Stoch_NK | //+X================================================================X+ int start() { //---- Ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü //äëÿ äàëüíåéøåãî ðàñ÷¸òà if (Bars - 1 < PeriodWATR) return(0); //---- static int TrendMid_, time2; static int TrendMin_, TrendMax_; //---- static double WATRmax_, WATRmin_; static double SminMin1_, SmaxMin1_; static double SminMax1_, SmaxMax1_; static double SminMid1_, SmaxMid1_; //---- int counted_bars, Tnew; int iii, bar, MaxBar, limit; int TrendMin, TrendMax, TrendMid; int StepSizeMin, StepSizeMax, StepSizeMid; //---- double close, high, low; double WATRmax, WATRmin; double SumRange, dK, WATR0; double SizeMin, SizeMax, SizeMid, pKwatr; double SizeMin2, SizeMax2, SizeMid2, point; double SminMin0, SmaxMin0, SminMin1, SmaxMin1; double SminMax0, SmaxMax0, SminMax1, SmaxMax1; double SminMid0, SmaxMid0, SminMid1, SmaxMid1; double Stoch1, Stoch2, bsmin, bsmax; double linemin, linemax, linemid; //----Ïîëó÷åíèå óæå ïîñ÷èòàííûõ áàðîâ counted_bars = IndicatorCounted(); //---- ïðîâåðêà íà âîçìîæíûå îøèáêè if (counted_bars < 0) return(-1); //---- ïîñëåäíèé ïîñ÷èòàííûé áàð äîëæåí áûòü ïåðåñ÷èòàí if (counted_bars > 0) counted_bars--; //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, // íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïåðåñ÷¸ò íîâûõ áàðîâ limit = Bars - counted_bars - 1; //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, // íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïåðåñ÷¸ò âñåõ áàðîâ MaxBar = Bars - 1 - PeriodWATR; //---- if (limit > MaxBar) limit = MaxBar; //+---+ âîññòàíîâëåíèå çíà÷åíèé ïåðåìåííûõ +------------------------+ Tnew = Time[limit + 1]; if (limit < MaxBar) if (Tnew == time2) { WATRmax = WATRmax_; WATRmin = WATRmin_; //---- SminMin1 = SminMin1_; SmaxMin1 = SmaxMin1_; //---- SminMax1 = SminMax1_; SmaxMax1 = SmaxMax1_; //---- SminMid1 = SminMid1_; SmaxMid1 = SmaxMid1_; //---- TrendMin = TrendMin_; TrendMax = TrendMax_; TrendMid = TrendMid_; } else { if (Tnew>time2) Print("Îøèáêà âîññòàíîâëåíèÿ ïåðåìåííûõ!!! Tnew>time2"); else Print("Îøèáêà âîññòàíîâëåíèÿ ïåðåìåííûõ!!! Tnew<time2"); Print("Áóäåò ïðîèçâåä¸í ïåðåñ÷¸ò èíäèêàòîðà íà âñåõ áàðàõ!"); return(-1); } //+---+ +-------------------------------------------------------------+ for(bar = limit; bar >= 0; bar--) { //+---+ Ñîõðàíåíèå çíà÷åíèé ïåðåìåííûõ if (bar == 1) { WATRmax_ = WATRmax; WATRmin_ = WATRmin; //---- SminMin1_ = SminMin1; SmaxMin1_ = SmaxMin1; //---- SminMax1_ = SminMax1; SmaxMax1_ = SmaxMax1; //---- SminMid1_ = SminMid1; SmaxMid1_ = SmaxMid1; //---- TrendMin_ = TrendMin; TrendMax_ = TrendMax; TrendMid_ = TrendMid; //---- time2 = Time[2]; } //+---+ //---- SumRange = 0.0; //---- for (iii = PeriodWATR - 1; iii >= 0; iii--) { dK = 1.0 + 1.0 * (PeriodWATR - iii) / PeriodWATR; SumRange += dK * MathAbs(High[bar + iii] - Low[bar + iii]); } //---- WATR0 = SumRange / PeriodWATR; //---- WATRmax = MathMax(WATR0, WATRmax); if (bar == MaxBar) WATRmin = WATR0; //---- WATRmin = MathMin(WATR0, WATRmin); //---- point = Point; //---- pKwatr = Kwatr / point; StepSizeMin = MathRound(pKwatr * WATRmin); StepSizeMax = MathRound(pKwatr * WATRmax); StepSizeMid = MathRound(pKwatr * 0.5 * (WATRmax + WATRmin)); //---- SizeMin = StepSizeMin * point; SizeMax = StepSizeMax * point; SizeMid = StepSizeMid * point; //---- SizeMin2 = 2 * SizeMin; SizeMax2 = 2 * SizeMax; SizeMid2 = 2 * SizeMid; //---- low = Low[bar]; high = High[bar]; close = Close[bar]; //---- if (HighLow > 0) { SmaxMin0 = low + SizeMin2; SminMin0 = high - SizeMin2; //---- SmaxMax0 = low + SizeMax2; SminMax0 = high - SizeMax2; //---- SmaxMid0 = low + SizeMid2; SminMid0 = high - SizeMid2; //---- if(close > SmaxMin1) TrendMin = 1; if(close < SminMin1) TrendMin = -1; //---- if(close > SmaxMax1) TrendMax = 1; if(close < SminMax1) TrendMax = -1; //---- if(close > SmaxMid1) TrendMid = 1; if(close < SminMid1) TrendMid = -1; } //---- if (HighLow == 0) { SmaxMin0 = close + SizeMin2; SminMin0 = close - SizeMin2; //---- SmaxMax0 = close + SizeMax2; SminMax0 = close - SizeMax2; //---- SmaxMid0 = close + SizeMid2; SminMid0 = close - SizeMid2; //---- if(close > SmaxMin1) TrendMin = 1; if(close < SminMin1) TrendMin = -1; //---- if(close > SmaxMax1) TrendMax = 1; if(close < SminMax1) TrendMax = -1; //---- if(close > SmaxMid1) TrendMid = 1; if(close < SminMid1) TrendMid = -1; } //---- if(TrendMin > 0 && SminMin0 < SminMin1) SminMin0 = SminMin1; if(TrendMin < 0 && SmaxMin0 > SmaxMin1) SmaxMin0 = SmaxMin1; if(TrendMax > 0 && SminMax0 < SminMax1) SminMax0 = SminMax1; if(TrendMax < 0 && SmaxMax0 > SmaxMax1) SmaxMax0 = SmaxMax1; if(TrendMid > 0 && SminMid0 < SminMid1) SminMid0 = SminMid1; if(TrendMid < 0 && SmaxMid0 > SmaxMid1) SmaxMid0 = SmaxMid1; //---- if (TrendMin > 0) linemin = SminMin0 + SizeMin; if (TrendMin < 0) linemin = SmaxMin0 - SizeMin; if (TrendMax > 0) linemax = SminMax0 + SizeMax; if (TrendMax < 0) linemax = SmaxMax0 - SizeMax; if (TrendMid > 0) linemid = SminMid0 + SizeMid; if (TrendMid < 0) linemid = SmaxMid0 - SizeMid; //---- bsmin = linemax - SizeMax; bsmax = linemax + SizeMax; //---- Stoch1 = (linemin - bsmin) / (bsmax - bsmin); Stoch2 = (linemid - bsmin) / (bsmax - bsmin); //---- LineMinBuffer[bar] = Stoch1; LineMidBuffer[bar] = Stoch2; //---- SminMin1 = SminMin0; SmaxMin1 = SmaxMin0; //---- SminMax1 = SminMax0; SmaxMax1 = SmaxMax0; //---- SminMid1 = SminMid0; SmaxMid1 = SmaxMid0; } return(0); } //+---+ +X----------------------------------------------------------X+
Sample
Analysis
Market Information Used:
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 close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: