//+------------------------------------------------------------------+
//|                                                    Guppy MMA.mq5 |
//|  www.forex-tsd.com/indicators-metatrader-4/138-guppy-multiple-moving-average-5.html
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"
#property version   "1.00"


#property indicator_chart_window
#property indicator_buffers 65
#property indicator_plots   65

//
//
//
//
//

input ENUM_APPLIED_PRICE Price  = PRICE_CLOSE; // Guppy MMAs price
input ENUM_MA_METHOD     Method = MODE_EMA;    // Guppy MMAs method

//
//
//
//
//

double maBuffer01[];
double maBuffer02[];
double maBuffer03[];
double maBuffer04[];
double maBuffer05[];
double maBuffer06[];
double maBuffer07[];
double maBuffer08[];
double maBuffer09[];
double maBuffer10[];
double maBuffer11[];
double maBuffer12[];
double maBuffer13[];
double maBuffer14[];
double maBuffer15[];
double maBuffer16[];
double maBuffer17[];
double maBuffer18[];
double maBuffer19[];
double maBuffer20[];
double maBuffer21[];
double maBuffer22[];
double maBuffer23[];
double maBuffer24[];
double maBuffer25[];
double maBuffer26[];
double maBuffer27[];
double maBuffer28[];
double maBuffer29[];
double maBuffer30[];
double maBuffer31[];
double maBuffer32[];
double maBuffer33[];
double maBuffer34[];
double maBuffer35[];
double maBuffer36[];
double maBuffer37[];
double maBuffer38[];
double maBuffer39[];
double maBuffer40[];
double maBuffer41[];
double maBuffer42[];
double maBuffer43[];
double maBuffer44[];
double maBuffer45[];
double maBuffer46[];
double maBuffer47[];
double maBuffer48[];
double maBuffer49[];
double maBuffer50[];
double maBuffer51[];
double maBuffer52[];
double maBuffer53[];
double maBuffer54[];
double maBuffer55[];
double maBuffer56[];
double maBuffer57[];
double maBuffer58[];
double maBuffer59[];
double maBuffer60[];
double maBuffer61[];
double maBuffer62[];
double maBuffer63[];
double maBuffer64[];
double maBuffer65[];

//
//
//
//
//

int periods[]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,21,23,25,27,29,31,33,35,37,39,41,44,47,50,53,56,59,62,65,68,71,74,78,82,86,90,94,98,102,106,110,114,118,122,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200};
int handles[];
color coulourma[]={Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,Gold,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,DarkOrange,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,MediumBlue,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,ForestGreen,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red,Red};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//

int OnInit()
{
   SetIndexBuffer( 0,maBuffer01,INDICATOR_DATA);
   SetIndexBuffer( 1,maBuffer02,INDICATOR_DATA);
   SetIndexBuffer( 2,maBuffer03,INDICATOR_DATA);
   SetIndexBuffer( 3,maBuffer04,INDICATOR_DATA);
   SetIndexBuffer( 4,maBuffer05,INDICATOR_DATA);
   SetIndexBuffer( 5,maBuffer06,INDICATOR_DATA);
   SetIndexBuffer( 6,maBuffer07,INDICATOR_DATA);
   SetIndexBuffer( 7,maBuffer08,INDICATOR_DATA);
   SetIndexBuffer( 8,maBuffer09,INDICATOR_DATA);
   SetIndexBuffer( 9,maBuffer10,INDICATOR_DATA);
   SetIndexBuffer(10,maBuffer11,INDICATOR_DATA);
   SetIndexBuffer(11,maBuffer12,INDICATOR_DATA);
   SetIndexBuffer(12,maBuffer13,INDICATOR_DATA);
   SetIndexBuffer(13,maBuffer14,INDICATOR_DATA);
   SetIndexBuffer(14,maBuffer15,INDICATOR_DATA);
   SetIndexBuffer(15,maBuffer16,INDICATOR_DATA);
   SetIndexBuffer(16,maBuffer17,INDICATOR_DATA);
   SetIndexBuffer(17,maBuffer18,INDICATOR_DATA);
   SetIndexBuffer(18,maBuffer19,INDICATOR_DATA);
   SetIndexBuffer(19,maBuffer20,INDICATOR_DATA);
   SetIndexBuffer(20,maBuffer21,INDICATOR_DATA);
   SetIndexBuffer(21,maBuffer22,INDICATOR_DATA);
   SetIndexBuffer(22,maBuffer23,INDICATOR_DATA);
   SetIndexBuffer(23,maBuffer24,INDICATOR_DATA);
   SetIndexBuffer(24,maBuffer25,INDICATOR_DATA);
   SetIndexBuffer(25,maBuffer26,INDICATOR_DATA);
   SetIndexBuffer(26,maBuffer27,INDICATOR_DATA);
   SetIndexBuffer(27,maBuffer28,INDICATOR_DATA);
   SetIndexBuffer(28,maBuffer29,INDICATOR_DATA);
   SetIndexBuffer(29,maBuffer30,INDICATOR_DATA);
   SetIndexBuffer(30,maBuffer31,INDICATOR_DATA);
   SetIndexBuffer(31,maBuffer32,INDICATOR_DATA);
   SetIndexBuffer(32,maBuffer33,INDICATOR_DATA);
   SetIndexBuffer(33,maBuffer34,INDICATOR_DATA);
   SetIndexBuffer(34,maBuffer35,INDICATOR_DATA);
   SetIndexBuffer(35,maBuffer36,INDICATOR_DATA);
   SetIndexBuffer(36,maBuffer37,INDICATOR_DATA);
   SetIndexBuffer(37,maBuffer38,INDICATOR_DATA);
   SetIndexBuffer(38,maBuffer39,INDICATOR_DATA);
   SetIndexBuffer(39,maBuffer40,INDICATOR_DATA);
   SetIndexBuffer(40,maBuffer41,INDICATOR_DATA);
   SetIndexBuffer(41,maBuffer42,INDICATOR_DATA);
   SetIndexBuffer(42,maBuffer43,INDICATOR_DATA);
   SetIndexBuffer(43,maBuffer44,INDICATOR_DATA);
   SetIndexBuffer(44,maBuffer45,INDICATOR_DATA);
   SetIndexBuffer(45,maBuffer46,INDICATOR_DATA);
   SetIndexBuffer(46,maBuffer47,INDICATOR_DATA);
   SetIndexBuffer(47,maBuffer48,INDICATOR_DATA);
   SetIndexBuffer(48,maBuffer49,INDICATOR_DATA);
   SetIndexBuffer(49,maBuffer50,INDICATOR_DATA);
   SetIndexBuffer(50,maBuffer51,INDICATOR_DATA);
   SetIndexBuffer(51,maBuffer52,INDICATOR_DATA);
   SetIndexBuffer(52,maBuffer53,INDICATOR_DATA);
   SetIndexBuffer(53,maBuffer54,INDICATOR_DATA);
   SetIndexBuffer(54,maBuffer55,INDICATOR_DATA);
   SetIndexBuffer(55,maBuffer56,INDICATOR_DATA);
   SetIndexBuffer(56,maBuffer57,INDICATOR_DATA);
   SetIndexBuffer(57,maBuffer58,INDICATOR_DATA);
   SetIndexBuffer(58,maBuffer59,INDICATOR_DATA);
   SetIndexBuffer(59,maBuffer60,INDICATOR_DATA);
   SetIndexBuffer(60,maBuffer61,INDICATOR_DATA);
   SetIndexBuffer(61,maBuffer62,INDICATOR_DATA);
   SetIndexBuffer(62,maBuffer63,INDICATOR_DATA);
   SetIndexBuffer(63,maBuffer64,INDICATOR_DATA);
   SetIndexBuffer(64,maBuffer65,INDICATOR_DATA);
   
   //
   //
   //
   //
   //

   ArrayResize(handles,ArraySize(periods));   
      
      for (int i=0;i<ArraySize(periods); i++)
      {
         handles[i] = iMA(NULL,0,periods[i],0,Method,Price);
            PlotIndexSetInteger(i,PLOT_DRAW_TYPE ,DRAW_LINE);
            PlotIndexSetInteger(i,PLOT_LINE_COLOR,coulourma[i]);
      }            

   //
   //
   //
   //
   //
   
   IndicatorSetString(INDICATOR_SHORTNAME,"Guppy MMA");
   return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
   int limit = rates_total-prev_calculated; if (prev_calculated > 0) limit++;
         for (int i=0; i<ArraySize(periods); i++)
               if (!checkCalculated(handles[i],rates_total,"MA"+(string)periods[i])) return(0);   
         
         if (!doCopy(handles[ 0],maBuffer01,0,limit,"MA buffer 1"))  return(0);
         if (!doCopy(handles[ 1],maBuffer02,0,limit,"MA buffer 2"))  return(0);
         if (!doCopy(handles[ 2],maBuffer03,0,limit,"MA buffer 3"))  return(0);
         if (!doCopy(handles[ 3],maBuffer04,0,limit,"MA buffer 4"))  return(0);
         if (!doCopy(handles[ 4],maBuffer05,0,limit,"MA buffer 5"))  return(0);
         if (!doCopy(handles[ 5],maBuffer06,0,limit,"MA buffer 6"))  return(0);
         if (!doCopy(handles[ 6],maBuffer07,0,limit,"MA buffer 7"))  return(0);
         if (!doCopy(handles[ 7],maBuffer08,0,limit,"MA buffer 8"))  return(0);
         if (!doCopy(handles[ 8],maBuffer09,0,limit,"MA buffer 9"))  return(0);
         if (!doCopy(handles[ 9],maBuffer10,0,limit,"MA buffer 10")) return(0);
         if (!doCopy(handles[10],maBuffer11,0,limit,"MA buffer 11")) return(0);
         if (!doCopy(handles[11],maBuffer12,0,limit,"MA buffer 12")) return(0);
         if (!doCopy(handles[12],maBuffer13,0,limit,"MA buffer 13")) return(0);
         if (!doCopy(handles[13],maBuffer14,0,limit,"MA buffer 14")) return(0);
         if (!doCopy(handles[14],maBuffer15,0,limit,"MA buffer 15")) return(0);
         if (!doCopy(handles[15],maBuffer16,0,limit,"MA buffer 16")) return(0);
         if (!doCopy(handles[16],maBuffer17,0,limit,"MA buffer 17")) return(0);
         if (!doCopy(handles[17],maBuffer18,0,limit,"MA buffer 18")) return(0);
         if (!doCopy(handles[18],maBuffer19,0,limit,"MA buffer 19")) return(0);
         if (!doCopy(handles[19],maBuffer20,0,limit,"MA buffer 20")) return(0);
         if (!doCopy(handles[20],maBuffer21,0,limit,"MA buffer 21")) return(0);
         if (!doCopy(handles[21],maBuffer22,0,limit,"MA buffer 22")) return(0);
         if (!doCopy(handles[22],maBuffer23,0,limit,"MA buffer 23")) return(0);
         if (!doCopy(handles[23],maBuffer24,0,limit,"MA buffer 24")) return(0);
         if (!doCopy(handles[24],maBuffer25,0,limit,"MA buffer 25")) return(0);
         if (!doCopy(handles[25],maBuffer26,0,limit,"MA buffer 26")) return(0);
         if (!doCopy(handles[26],maBuffer27,0,limit,"MA buffer 27")) return(0);
         if (!doCopy(handles[27],maBuffer28,0,limit,"MA buffer 28")) return(0);
         if (!doCopy(handles[28],maBuffer29,0,limit,"MA buffer 29")) return(0);
         if (!doCopy(handles[29],maBuffer30,0,limit,"MA buffer 30")) return(0);
         if (!doCopy(handles[30],maBuffer31,0,limit,"MA buffer 31")) return(0);
         if (!doCopy(handles[31],maBuffer32,0,limit,"MA buffer 32")) return(0);
         if (!doCopy(handles[32],maBuffer33,0,limit,"MA buffer 33")) return(0);
         if (!doCopy(handles[33],maBuffer34,0,limit,"MA buffer 34")) return(0);
         if (!doCopy(handles[34],maBuffer35,0,limit,"MA buffer 35")) return(0);
         if (!doCopy(handles[35],maBuffer36,0,limit,"MA buffer 36")) return(0);
         if (!doCopy(handles[36],maBuffer37,0,limit,"MA buffer 37")) return(0);
         if (!doCopy(handles[37],maBuffer38,0,limit,"MA buffer 38")) return(0);
         if (!doCopy(handles[38],maBuffer39,0,limit,"MA buffer 39")) return(0);
         if (!doCopy(handles[39],maBuffer40,0,limit,"MA buffer 40")) return(0);
         if (!doCopy(handles[40],maBuffer41,0,limit,"MA buffer 41")) return(0);
         if (!doCopy(handles[41],maBuffer42,0,limit,"MA buffer 42")) return(0);
         if (!doCopy(handles[42],maBuffer43,0,limit,"MA buffer 43")) return(0);
         if (!doCopy(handles[43],maBuffer44,0,limit,"MA buffer 44")) return(0);
         if (!doCopy(handles[44],maBuffer45,0,limit,"MA buffer 45")) return(0);
         if (!doCopy(handles[45],maBuffer46,0,limit,"MA buffer 46")) return(0);
         if (!doCopy(handles[46],maBuffer47,0,limit,"MA buffer 47")) return(0);
         if (!doCopy(handles[47],maBuffer48,0,limit,"MA buffer 48")) return(0);
         if (!doCopy(handles[48],maBuffer49,0,limit,"MA buffer 49")) return(0);
         if (!doCopy(handles[49],maBuffer50,0,limit,"MA buffer 50")) return(0);
         if (!doCopy(handles[50],maBuffer51,0,limit,"MA buffer 51")) return(0);
         if (!doCopy(handles[51],maBuffer52,0,limit,"MA buffer 52")) return(0);
         if (!doCopy(handles[52],maBuffer53,0,limit,"MA buffer 53")) return(0);
         if (!doCopy(handles[53],maBuffer54,0,limit,"MA buffer 54")) return(0);
         if (!doCopy(handles[54],maBuffer55,0,limit,"MA buffer 55")) return(0);
         if (!doCopy(handles[55],maBuffer56,0,limit,"MA buffer 56")) return(0);
         if (!doCopy(handles[56],maBuffer57,0,limit,"MA buffer 57")) return(0);
         if (!doCopy(handles[57],maBuffer58,0,limit,"MA buffer 58")) return(0);
         if (!doCopy(handles[58],maBuffer59,0,limit,"MA buffer 59")) return(0);
         if (!doCopy(handles[59],maBuffer60,0,limit,"MA buffer 60")) return(0);
         if (!doCopy(handles[60],maBuffer61,0,limit,"MA buffer 61")) return(0);
         if (!doCopy(handles[61],maBuffer62,0,limit,"MA buffer 62")) return(0);
         if (!doCopy(handles[62],maBuffer63,0,limit,"MA buffer 63")) return(0);
         if (!doCopy(handles[63],maBuffer64,0,limit,"MA buffer 64")) return(0);
         if (!doCopy(handles[64],maBuffer65,0,limit,"MA buffer 65")) return(0);

   return(rates_total);
}



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//

bool checkCalculated(int bufferHandle, int total, string checkDescription)
{
   int calculated=BarsCalculated(bufferHandle);
   if (calculated<total)
   {
      Print("Not all data of "+checkDescription+" calculated (",(string)(total-calculated)," un-calculated bars )");
      return(false);
   }
   return(true);
}

//
//
//
//
//

bool doCopy(const int bufferHandle, double& buffer[], const int buffNum, const int copyCount, string copyDescription)
{
   if(CopyBuffer(bufferHandle,buffNum,0,copyCount,buffer)<=0)
   {
      Print("Getting "+copyDescription+" failed! Error",GetLastError());
      return(false);
   }
   return(true);
}
