// // "00-BbAngle_v100.mq4" -- Bollinger Band with color // // Ver. 1.00 2010/03/26(Fri) initial version // // #property copyright "00mql4@gmail.com" #property link "http://www.mql4.com/" //---- defines //---- indicator settings #property indicator_chart_window #property indicator_buffers 8 #property indicator_color1 YellowGreen #property indicator_color2 YellowGreen #property indicator_color3 YellowGreen #property indicator_color4 Yellow #property indicator_color5 Yellow #property indicator_color6 Yellow #property indicator_color7 DeepPink #property indicator_color8 DeepPink #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 #property indicator_width5 1 #property indicator_width6 1 #property indicator_width7 1 #property indicator_width8 1 #property indicator_style1 STYLE_DOT #property indicator_style2 STYLE_DOT #property indicator_style3 STYLE_DOT #property indicator_style4 STYLE_SOLID #property indicator_style5 STYLE_SOLID #property indicator_style6 STYLE_SOLID #property indicator_style7 STYLE_SOLID #property indicator_style8 STYLE_SOLID //---- indicator parameters extern int timeFrame = 0; // time frame extern int period = 20; // BB period extern double sigma = 1; // sigma extern double angleCenter = 4; // center angle threshold, heat extern double angleBbHeat = 4; // heat, side angle threshold extern double angleBbOver = 6; // overheat, side angle threshold extern int nMaxBars = 20000; // maximum number of bars to calculate, 0: no limit //---- indicator buffers double BufferUpper[]; // 0: upper double BufferCenter[]; // 1: center double BufferLower[]; // 2: lower double BufferUpperHeat[]; // 3: upper, |angle| >= angleBbHeat double BufferCenterHeat[]; // 4: center, |angle| >= angleCenter double BufferLowerHeat[]; // 5: lower, |angle| >= angleBbHeat double BufferUpperOver[]; // 6: upper, |angle| >= angleBbOver double BufferLowerOver[]; // 7: lower, |angle| >= angleBbOver //---- vars string sIndicatorName = ""; string sIndSelf = "00-BbAngle_v100"; double point; //---------------------------------------------------------------------- string TimeFrameToStr(int timeFrame) { switch (timeFrame) { case 1: return("M1"); case 5: return("M5"); case 15: return("M15"); case 30: return("M30"); case 60: return("H1"); case 240: return("H4"); case 1440: return("D1"); case 10080: return("W1"); case 43200: return("MN"); } return("??"); } //---------------------------------------------------------------------- void init() { if (timeFrame == 0) { timeFrame = Period(); } string tf = TimeFrameToStr(timeFrame); sIndicatorName = sIndSelf + "(" + tf + "," + period + ")"; IndicatorShortName(sIndicatorName); SetIndexBuffer(0, BufferUpper); SetIndexBuffer(1, BufferCenter); SetIndexBuffer(2, BufferLower); SetIndexBuffer(3, BufferUpperHeat); SetIndexBuffer(4, BufferCenterHeat); SetIndexBuffer(5, BufferLowerHeat); SetIndexBuffer(6, BufferUpperOver); SetIndexBuffer(7, BufferLowerOver); SetIndexLabel(0, "Upper"); SetIndexLabel(1, "Center"); SetIndexLabel(2, "Lower"); SetIndexLabel(3, "Upper, Heat"); SetIndexLabel(4, "Center, Heat"); SetIndexLabel(5, "Lower, Heat"); SetIndexLabel(6, "Upper, Over Heat"); SetIndexLabel(7, "Lower, Over Heat"); 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); SetIndexDrawBegin(0, period); SetIndexDrawBegin(1, period); SetIndexDrawBegin(2, period); SetIndexDrawBegin(3, period); SetIndexDrawBegin(4, period); SetIndexDrawBegin(5, period); SetIndexDrawBegin(6, period); SetIndexDrawBegin(7, period); SetIndexEmptyValue(0, 0); SetIndexEmptyValue(1, 0); SetIndexEmptyValue(2, 0); SetIndexEmptyValue(3, 0); SetIndexEmptyValue(4, 0); SetIndexEmptyValue(5, 0); SetIndexEmptyValue(6, 0); SetIndexEmptyValue(7, 0); if (StringFind(Symbol(), "JPY") >= 0) { point = 0.01; } else { point = 0.0001; } } //---------------------------------------------------------------------- double self(int mode, int shift) { double v = iCustom(NULL, timeFrame, sIndSelf, 0, period, sigma, angleBbHeat, angleBbOver, angleCenter, nMaxBars, mode, shift); return(v); } //---------------------------------------------------------------------- void start() { int limit; int counted_bars = IndicatorCounted(); if (counted_bars > 0) { counted_bars--; } limit = Bars - counted_bars; int limit0 = limit; if (nMaxBars > 0) { limit = MathMin(limit, nMaxBars); } // clear beyond limits for (int i = limit0 - 1; i >= 0; i--) { BufferUpper[i] = 0; BufferCenter[i] = 0; BufferLower[i] = 0; BufferUpperHeat[i] = 0; BufferCenterHeat[i] = 0; BufferLowerHeat[i] = 0; BufferUpperOver[i] = 0; BufferLowerOver[i] = 0; } if (timeFrame != Period()) { // MTF limit = MathMax(limit, timeFrame / Period()); for (i = limit - 1; i >= 0; i--) { int x = iBarShift(NULL, timeFrame, Time[i]); BufferUpper[i] = self(0, x); BufferCenter[i] = self(1, x); BufferLower[i] = self(2, x); BufferUpperHeat[i] = self(3, x); BufferCenterHeat[i] = self(4, x); BufferLowerHeat[i] = self(5, x); BufferUpperOver[i] = self(6, x); BufferLowerOver[i] = self(7, x); } return; } // timeFrame == Period() double k = 60.0 / Period() / point; for (i = limit - 1; i >= 0; i--) { double ma0 = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, i); double sd = iStdDev(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, i); double upper0 = ma0 + sd * sigma; double lower0 = ma0 - sd * sigma; BufferUpper[i] = upper0; BufferCenter[i] = ma0; BufferLower[i] = lower0; int i1 = i + 1; int i0 = i; double ma1 = BufferCenter[i1]; double da = MathAbs(ma0 - ma1) * k; if (da >= angleCenter) { BufferCenterHeat[i1] = ma1; BufferCenterHeat[i0] = ma0; } double upper1 = BufferUpper[i1]; da = MathAbs(upper0 - upper1) * k; if (da >= angleBbHeat) { BufferUpperHeat[i1] = upper1; BufferUpperHeat[i0] = upper0; } if (da >= angleBbOver) { BufferUpperOver[i1] = upper1; BufferUpperOver[i0] = upper0; } double lower1 = BufferLower[i1]; da = MathAbs(lower0 - lower1) * k; if (da >= angleBbHeat) { BufferLowerHeat[i1] = lower1; BufferLowerHeat[i0] = lower0; } if (da >= angleBbOver) { BufferLowerOver[i1] = lower1; BufferLowerOver[i0] = lower0; } } }