//+------------------------------------------------------------------+ //| StarcBands.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //| Linuxser 2007 | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Purple #property indicator_color2 Blue #property indicator_color3 Red //---- indicator parameters extern int BandsPeriod = 6; extern int ATR = 15; extern double Multiplier = 2.0; extern int BandsShift = 0; //---- buffers double MovingBuffer[]; double UpperBuffer[]; double LowerBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, MovingBuffer); SetIndexStyle(1, DRAW_LINE); SetIndexBuffer(1, UpperBuffer); SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(2, LowerBuffer); //---- SetIndexDrawBegin(0, BandsPeriod + BandsShift); SetIndexDrawBegin(1, BandsPeriod + BandsShift); SetIndexDrawBegin(2, BandsPeriod + BandsShift); //---- return(0); } //+------------------------------------------------------------------+ //| Bollinger Bands | //+------------------------------------------------------------------+ int start() { int i, k, counted_bars = IndicatorCounted(); double deviation; double sum, oldval, newres; //---- if(Bars <= BandsPeriod) return(0); //---- initial zero if(counted_bars < 1) for(i = 1; i <= BandsPeriod; i++) { MovingBuffer[Bars-i] = EMPTY_VALUE; UpperBuffer[Bars-i] = EMPTY_VALUE; LowerBuffer[Bars-i] = EMPTY_VALUE; } //---- int limit = Bars - counted_bars; if(counted_bars > 0) limit++; for(i = 0; i < limit; i++) MovingBuffer[i] = iMA(NULL, 0, BandsPeriod, BandsShift, MODE_SMA, PRICE_CLOSE, i); //---- i = Bars - BandsPeriod + 1; if(counted_bars > BandsPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { sum = 0.0; k = i + BandsPeriod - 1; oldval = MovingBuffer[i]; while(k >= i) { newres = Close[k] - oldval; sum += newres*newres; k--; } deviation = Multiplier*iATR(NULL, 0, ATR, i); // MathSqrt(sum / BandsPeriod); UpperBuffer[i] = oldval + deviation; LowerBuffer[i] = oldval - deviation; i--; } //---- return(0); } //+------------------------------------------------------------------+