//+------------------------------------------------------------------+
//|                                         Daily 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  Lime       //Moving Average
#property  indicator_color2  Lime       // Lower band 1
#property  indicator_color3  Lime       // Upper band 1
#property  indicator_color4  Lime       // Lower band 2
#property  indicator_color5  Lime       // Upper band 2
#property  indicator_color6  Lime       // Lower band 3
#property  indicator_color7  Lime       // 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,RAvgd;
   double dlow0=0,dhigh0=0;
   
   double RAvgp=0,RAvgdp=0;
   
   double dR1,dR2,dR3,dR4,dR5,dR6,dR7,dR8,dR9,dR10,dR11,dR12,dR13,dR14,dR15,dR16,dR17,dR18,dR19,dR20;
   
   double dR1h,dR2h,dR3h,dR4h,dR5h,dR6h,dR7h,dR8h,dR9h,dR10h,dR11h,dR12h,dR13h,dR14h,dR15h,dR16h,dR17h,dR18h,dR19h,dR20h;
   double dR1l,dR2l,dR3l,dR4l,dR5l,dR6l,dR7l,dR8l,dR9l,dR10l,dR11l,dR12l,dR13l,dR14l,dR15l,dR16l,dR17l,dR18l,dR19l,dR20l;
   
   int i=0;


   //Daily range data
   dR1  = (iHigh(NULL,PERIOD_D1,1)-iLow(NULL,PERIOD_D1,1));
   dR2  = (iHigh(NULL,PERIOD_D1,2)-iLow(NULL,PERIOD_D1,2));
   dR3  = (iHigh(NULL,PERIOD_D1,3)-iLow(NULL,PERIOD_D1,3));
   dR4  = (iHigh(NULL,PERIOD_D1,4)-iLow(NULL,PERIOD_D1,4));
   dR5  = (iHigh(NULL,PERIOD_D1,5)-iLow(NULL,PERIOD_D1,5));         
   dR6  = (iHigh(NULL,PERIOD_D1,6)-iLow(NULL,PERIOD_D1,6));
   dR7  = (iHigh(NULL,PERIOD_D1,7)-iLow(NULL,PERIOD_D1,7));
   dR8  = (iHigh(NULL,PERIOD_D1,8)-iLow(NULL,PERIOD_D1,8));
   dR9  = (iHigh(NULL,PERIOD_D1,9)-iLow(NULL,PERIOD_D1,9));
   dR10 = (iHigh(NULL,PERIOD_D1,10)-iLow(NULL,PERIOD_D1,10));         
   dR11 = (iHigh(NULL,PERIOD_D1,11)-iLow(NULL,PERIOD_D1,11));
   dR12 = (iHigh(NULL,PERIOD_D1,12)-iLow(NULL,PERIOD_D1,12));
   dR13 = (iHigh(NULL,PERIOD_D1,13)-iLow(NULL,PERIOD_D1,13));
   dR14 = (iHigh(NULL,PERIOD_D1,14)-iLow(NULL,PERIOD_D1,14));
   dR15 = (iHigh(NULL,PERIOD_D1,15)-iLow(NULL,PERIOD_D1,15));         
   dR16 = (iHigh(NULL,PERIOD_D1,16)-iLow(NULL,PERIOD_D1,16));
   dR17 = (iHigh(NULL,PERIOD_D1,17)-iLow(NULL,PERIOD_D1,17));
   dR18 = (iHigh(NULL,PERIOD_D1,18)-iLow(NULL,PERIOD_D1,18));
   dR19 = (iHigh(NULL,PERIOD_D1,19)-iLow(NULL,PERIOD_D1,19));
   dR20 = (iHigh(NULL,PERIOD_D1,20)-iLow(NULL,PERIOD_D1,20));      
   
   RAvgd=(dR1+dR2+dR3+dR4+dR5+dR6+dR7+dR8+dR9+dR10+dR11+dR12+dR13+dR14+dR15+dR16+dR17+dR18+dR19+dR20)/20;
   
   double drangesq=MathPow((dR1-RAvgd),2)+MathPow((dR2-RAvgd),2)+MathPow((dR3-RAvgd),2)+MathPow((dR4-RAvgd),2)+MathPow((dR5-RAvgd),2)+
                   MathPow((dR6-RAvgd),2)+MathPow((dR7-RAvgd),2)+MathPow((dR8-RAvgd),2)+MathPow((dR9-RAvgd),2)+MathPow((dR10-RAvgd),2)+
                   MathPow((dR11-RAvgd),2)+MathPow((dR12-RAvgd),2)+MathPow((dR13-RAvgd),2)+MathPow((dR14-RAvgd),2)+MathPow((dR15-RAvgd),2)+
                   MathPow((dR16-RAvgd),2)+MathPow((dR17-RAvgd),2)+MathPow((dR18-RAvgd),2)+MathPow((dR19-RAvgd),2)+MathPow((dR20-RAvgd),2);
      
   double dSDRangemax=SD_3*MathSqrt(drangesq/20);
   
   double dSDRangemin=SD_1*MathSqrt(drangesq/20);
   
   double dmax = RAvgd+dSDRangemax;
   double dmin = RAvgd-dSDRangemin;
   
   if (dmin<0) dmin=0;
   
      for(i=0; i<limit; i++)
     {
       double SD = dmin;
       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=1440;
            break;
         case 5: 
            Periode=288;
            break;
         case 15: 
            Periode=96;
            break;
         case 30: 
            Periode=48;
            break;
         case 60: 
            Periode=24;
            break;
         case 120: 
            Periode=12;
            break;
         case 240: 
            Periode=6;
            break;
         case 1440: 
            Periode=0;
            break;
         case 10080: 
            Periode=0;
            break;
         case 43200: 
            Periode=0;
            break;
         
      }
 }