Sidebar for the article “The V-Trade, Part 5: Technical Analysis—Moving Average Support & Resistance And Volatility Bands” by Sylvain Vervoort, in the July 2018 issue of Technical Analysis of STOCKS & COMMODITIES magazine.
//+------------------------------------------------------------------+ //| SveVolatilityBand.mq4 | //| Copyright © 2018, Sylvain Vervoort | //| https://stocata.org/ | //+------------------------------------------------------------------+ #property copyright "©2018, Sylvain vervoort" #property link "https://stocata.org/" #property description "Smoothed Volatility Band 2018 V1.1" #property strict #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Magenta #property indicator_color2 Magenta #property indicator_color3 Blue #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_style1 STYLE_SOLID #property indicator_style2 STYLE_SOLID #property indicator_style3 STYLE_SOLID //---- input parameters extern bool VolatilityBand = true; // True=Volatility ,false=Bollinger extern int BandsPeriod = 20; // Bands Average Bars extern double BandsDeviation = 2.4; // Bands Volatility Range extern double LowbandAdjust = 0.9; // Low Band Adjust (Vol. Band Only) extern int MiddleLineLwma = 20; // Middle Line LWMA Average //---- buffers double HighChannel []; double LowChannel []; double MedianAverage []; double AtrBuf []; double TempBuf []; //+------------------------------------------------------------------+ //| SveVolatilityBand Indicator Initialisation | //+------------------------------------------------------------------+ int OnInit(void) { //---- indicators IndicatorBuffers(5); SetIndexStyle (0,DRAW_LINE); SetIndexBuffer(0,HighChannel); SetIndexDrawBegin(0,BandsPeriod*2-1); SetIndexStyle (1,DRAW_LINE); SetIndexBuffer(1,LowChannel); SetIndexDrawBegin(1,BandsPeriod*2-1); SetIndexStyle (2,DRAW_LINE); SetIndexBuffer(2,MedianAverage); SetIndexDrawBegin(2,MiddleLineLwma); SetIndexBuffer(3,AtrBuf); SetIndexBuffer(4,TempBuf); string volband = IntegerToString(VolatilityBand); string bandsper = IntegerToString(BandsPeriod); string bandsdev = DoubleToString (BandsDeviation,1); string lowbandadj = DoubleToString (LowbandAdjust,2); string medianlwma = IntegerToString(MiddleLineLwma); IndicatorShortName("SveVolatilityBand("+volband+" "+bandsper+" "+bandsdev+ " "+lowbandadj+" "+medianlwma+")"); //--- check input parameters validity if(BandsPeriod <= 0 || BandsDeviation <= 0 || LowbandAdjust <= 0 || MiddleLineLwma < 1) { Alert("Faulty Input Parameter, Defaults used. Try again!"); BandsPeriod = 20; BandsDeviation = 2.4; LowbandAdjust = 0.9; MiddleLineLwma = 20; } //--- initialization done return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| SveVolatilityBand iteration function | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //Less than minimum required bars int i, limit; if(prev_calculated<0) return(-1); // Return error No bars available else limit = rates_total-1; // -1 addressing counts to 0 if(VolatilityBand) // VolatilityBand == true. Draw volatility bands { // Use a price range i = limit; while(i>=0) { if(i==limit)TempBuf[i]=high[i]-low[i]; else TempBuf[i]=MathMax(high[i],close[i+1])-MathMin(low[i],close[i+1]); i--; } // calculate price deviation for (i = limit; i>=0;i--) AtrBuf[i]=iMAOnArray(TempBuf,0,BandsPeriod*2-1,0,MODE_SMA,i) * BandsDeviation; // Create upper, lower channel and middle line for (i=limit;i>=0;i--) HighChannel[i]=iMA(NULL,0,BandsPeriod,0,MODE_LWMA,PRICE_CLOSE,i) + (iMA(NULL,0,BandsPeriod, 0,MODE_LWMA,PRICE_CLOSE,i)*AtrBuf[i]/close[i]); for (i=limit;i>=0;i--) LowChannel[i]=iMA(NULL, 0,BandsPeriod,0,MODE_LWMA,PRICE_CLOSE,i) - (iMA(NULL,0,BandsPeriod, 0,MODE_LWMA,PRICE_CLOSE,i)*AtrBuf[i]* LowbandAdjust/close[i]); for (i=limit;i>=0;i--) MedianAverage[i]=iMA(NULL,0,MiddleLineLwma,0,MODE_LWMA,PRICE_TYPICAL,i); //---- } else // If volatility Band == false, draw Bollinger bands { for (i=limit;i>=0;i--) HighChannel[i] = iBands(NULL,0,BandsPeriod,BandsDeviation,0,PRICE_CLOSE,MODE_UPPER,i); for (i=limit;i>=0;i--) LowChannel[i] = iBands(NULL,0,BandsPeriod,BandsDeviation,0,PRICE_CLOSE,MODE_LOWER,i); for (i=limit;i>=0;i--) MedianAverage[i] = iMA (NULL,0,MiddleLineLwma,0,MODE_LWMA,PRICE_TYPICAL,i); } return(rates_total); } // +-------------------------------------END OF PROGRAM-------------------------------------------+