//+------------------------------------------------------------------+
//|                                     MovingAverage_MTF-smooth.mq4 |
//|                                                       d_forex_79 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "d_forex_79"
#property link      ""

#include <stderror.mqh>

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_width1 2
#property indicator_color2 Green
#property indicator_width2 2

//---- input parameters
extern string note1 = "Use standard notation, M1, M5, ..., H1, H4, D1, W1, MN.";
extern string note2 = "Or '0' for current time frame.";
extern string timeFrame="D1";
extern string note3 = "Moving average period (for example, 200)";
extern int maPeriod=200;
extern string note4 = "Moving average shift";
extern int maShift=0;
extern string note5 = "Moving average method";
extern string note6 = "0 = SMA, 1 = EMA, 2 = SMMA, 3 = LWMA";
extern int maMethod=0;
extern string note7 = "Moving average applied price";
extern string note8 = "0 = Close, 1 = Open, 2 = High, 3 = Low";
extern string note9 = "4 = Median, 5 = Typical, 6 = Weighted";
extern int maAppliedPrice=5;
//---- buffers

double RedBuffer[];
double GreenBuffer[];

int period_min = 0;

double buffer[];

int newMvgAvgPeriodsInt;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,RedBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,GreenBuffer);
   
   string tf = timeFrame;
   if (tf == "0")
   {
      tf = ConvertMinutesToTimeFrame(Period());
   }
   
   Comment("MTF Moving Average Smooth, " + tf);
   
   period_min = ConvertTimeFrameToMinutes(timeFrame);
   
   double thisPeriod = Period();
   double desiredPeriod = period_min;
   
   double newMvAvgPeriods = maPeriod * (desiredPeriod / thisPeriod);
   newMvgAvgPeriodsInt = StrToInteger(DoubleToStr(MathRound(newMvAvgPeriods),0));
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int max;
//----

   
   max = Bars - counted_bars;
   
   ArrayResize(buffer, max);
   
   for(int i = 0; i < max; i++)
   {
      buffer[i] = iMA(Symbol(), Period(), newMvgAvgPeriodsInt, maShift, maMethod, maAppliedPrice, i); 
   }
   
   //assign to red/green buffers based on increase/decrease
   for( i= (max-1); i >= 0; i--)
   {
      if (buffer[i] >= buffer[i+1])
      {
         GreenBuffer[i] = buffer[i];
         RedBuffer[i] = EMPTY_VALUE;
      }
      else if (buffer[i] < buffer[i+1])
      {
         GreenBuffer[i] = EMPTY_VALUE;
         RedBuffer[i] = buffer[i];
      }
      else 
      {
         GreenBuffer[i] = GreenBuffer[i+1];
         RedBuffer[i] = RedBuffer[i+1];
      }
   }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+


int ConvertTimeFrameToMinutes(string timeFrameStr)
{
   if (timeFrameStr == "M1")   
      return(PERIOD_M1);
   if (timeFrameStr == "M5")   
      return(PERIOD_M5);
   if (timeFrameStr == "M15")  
      return(PERIOD_M15);
   if (timeFrameStr == "M30")  
      return(PERIOD_M30);
   if (timeFrameStr == "H1")   
      return(PERIOD_H1);
   if (timeFrameStr == "H4")   
      return(PERIOD_H4);
   if (timeFrameStr == "D1")   
      return(PERIOD_D1);
   if (timeFrameStr == "W1")   
      return(PERIOD_W1);
   if (timeFrameStr == "MN" || timeFrameStr == "MN1")   
      return(PERIOD_MN1);

  return(0);
}  

string ConvertMinutesToTimeFrame(int minutes)
{
   if (minutes == PERIOD_M1)
      return("M1");
   if (minutes == PERIOD_M5)
      return("M5");
   if (minutes == PERIOD_M15)
      return("M15");
   if (minutes == PERIOD_M30)
      return("M30");
   if (minutes == PERIOD_H1)
      return("H1");
   if (minutes == PERIOD_H4)
      return("H4");
   if (minutes == PERIOD_D1)
      return("D1");
   if (minutes == PERIOD_W1)
      return("W1");
   if (minutes == PERIOD_MN1)
      return("MN");

  return(0);
}  