//+------------------------------------------------------------------+
//|                                       Monthly MA Range Level.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property copyright "Copyright © 2008, KG Range Calculator Formula"

#property indicator_chart_window
#property  indicator_buffers 7
#property  indicator_color1  Aqua       //Moving Average
#property  indicator_color2  Aqua       // Lower band 1
#property  indicator_color3  Aqua       // Upper band 1
#property  indicator_color4  Aqua       // Lower band 2
#property  indicator_color5  Aqua       // Upper band 2
#property  indicator_color6  Aqua       // Lower band 3
#property  indicator_color7  Aqua       // Upper band 3

//---- input parameters
double MA_Buffer0[];
double MA_Buffer1[];
double MA_Buffer2[];
double MA_Buffer3[];
double MA_Buffer4[];
double MA_Buffer5[];
double MA_Buffer6[];

double SD_3=3;
double SD_2=2;
double SD_1=1;
double Periode=48;
extern int MODE_MA=0;
extern int PRICE_TYPE=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   string mat;
   SetIndexStyle(0, DRAW_LINE, 0, 2);
   SetIndexBuffer(0, MA_Buffer0);
   SetIndexStyle(1, DRAW_LINE, STYLE_DASHDOTDOT);
   SetIndexBuffer(1, MA_Buffer1);
   SetIndexStyle(2, DRAW_LINE, STYLE_DASHDOTDOT);
   SetIndexBuffer(2, MA_Buffer2);
   SetIndexStyle(3, DRAW_LINE, STYLE_DASHDOTDOT);
   SetIndexBuffer(3, MA_Buffer3);
   SetIndexStyle(4, DRAW_LINE, STYLE_DASHDOTDOT);
   SetIndexBuffer(4, MA_Buffer4);
   SetIndexStyle(5, DRAW_LINE, STYLE_DASHDOTDOT);
   SetIndexBuffer(5, MA_Buffer5);
   SetIndexStyle(6, DRAW_LINE, STYLE_DASHDOTDOT);
   SetIndexBuffer(6, MA_Buffer6);
//----
   getPeriod();

   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  // Comment(""); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
     int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   //----
   double RAvg,RAvgm;
   double mlow0=0,mhigh0=0;
   
   double RAvgp=0,RAvgmp=0;
   
   double mR1,mR2,mR3,mR4,mR5,mR6,mR7,mR8,mR9,mR10,mR11,mR12;
   
   int i=0;


   //Monthly range data
   mR1  = (iHigh(NULL,PERIOD_MN1,1)-iLow(NULL,PERIOD_MN1,1));
   mR2  = (iHigh(NULL,PERIOD_MN1,2)-iLow(NULL,PERIOD_MN1,2));
   mR3  = (iHigh(NULL,PERIOD_MN1,3)-iLow(NULL,PERIOD_MN1,3));
   mR4  = (iHigh(NULL,PERIOD_MN1,4)-iLow(NULL,PERIOD_MN1,4));
   mR5  = (iHigh(NULL,PERIOD_MN1,5)-iLow(NULL,PERIOD_MN1,5));         
   mR6  = (iHigh(NULL,PERIOD_MN1,6)-iLow(NULL,PERIOD_MN1,6));
   mR7  = (iHigh(NULL,PERIOD_MN1,7)-iLow(NULL,PERIOD_MN1,7));
   mR8  = (iHigh(NULL,PERIOD_MN1,8)-iLow(NULL,PERIOD_MN1,8));
   mR9  = (iHigh(NULL,PERIOD_MN1,9)-iLow(NULL,PERIOD_MN1,9));
   mR10 = (iHigh(NULL,PERIOD_MN1,10)-iLow(NULL,PERIOD_MN1,10));         
   mR11 = (iHigh(NULL,PERIOD_MN1,11)-iLow(NULL,PERIOD_MN1,11));
   mR12 = (iHigh(NULL,PERIOD_MN1,12)-iLow(NULL,PERIOD_MN1,12));
   
   RAvgm=(mR1+mR2+mR3+mR4+mR5+mR6+mR7+mR8+mR9+mR10+mR11+mR12)/12;
   
   double mrangesq=MathPow(mR1-RAvgm,2)+MathPow(mR2-RAvgm,2)+MathPow(mR3-RAvgm,2)+MathPow(mR4-RAvgm,2)+MathPow(mR5-RAvgm,2)+
                   MathPow(mR6-RAvgm,2)+MathPow(mR7-RAvgm,2)+MathPow(mR8-RAvgm,2)+MathPow(mR9-RAvgm,2)+MathPow(mR10-RAvgm,2)+
                   MathPow(mR11-RAvgm,2)+MathPow(mR12-RAvgm,2);
      
   double mSDRangemax=SD_3*MathSqrt(mrangesq/12);
   
   double mSDRangemin=SD_1*MathSqrt(mrangesq/12);
   
   double mmax = RAvgm+mSDRangemax;
   double mmin = RAvgm-mSDRangemin;
   
   if (mmin<0) mmin=0;
   
      for(i=0; i<limit; i++)
     {
       double SD = mmin;
       double ma = iMA(NULL, 0, Periode, 0, MODE_MA, PRICE_TYPE, i);
       MA_Buffer0[i] = ma;
       MA_Buffer1[i] = ma + SD*SD_1;
       MA_Buffer2[i] = ma - SD*SD_1;
       
       MA_Buffer3[i] = ma + SD*SD_2;
       MA_Buffer4[i] = ma - SD*SD_2;
       
       MA_Buffer5[i] = ma + SD*SD_3;
       MA_Buffer6[i] = ma - SD*SD_3;
     }  

   
        

   return(0);
  }
//+------------------------------------------------------------------+

void getPeriod()
{
   switch(Period()) 
      {
         case 1: 
            Periode=0;
            break;
         case 5: 
            Periode=0;
            break;
         case 15: 
            Periode=1920;
            break;
         case 30: 
            Periode=960;
            break;
         case 60: 
            Periode=480;
            break;
         case 240: 
            Periode=120;
            break;
         case 1440: 
            Periode=20;
            break;
         case 10080: 
            Periode=0;
            break;
         case 43200: 
            Periode=0;
            break;
         
      }
  }