Guppy MMA oscillator mtf





//+------------------------------------------------------------------+
//|                                          Guppy MMA oscilator.mq4 |
//|                                                           mladen |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  Red
#property indicator_color2  Gold
#property indicator_level1  0
#property indicator_levelcolor DarkSlateGray

//
//
//
//
//

extern string _            = "parameters";
extern int    Price        = PRICE_CLOSE;
extern int    SignalPeriod = 13;
extern string TimeFrame    = "Current time frame";

//
//
//
//
//

double buffer1[];
double buffer2[];
double periods[]={3,5,8,10,12,15,30,35,40,45,50,60};
int    persize;
int    timeFrame;
string indicatorFileName;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
{
   SetIndexBuffer(0,buffer1);
   SetIndexBuffer(1,buffer2);
      persize = ArraySize(periods);
      if (_=="calculating") return(0);
         timeFrame         = stringToTimeFrame(TimeFrame);
         indicatorFileName = WindowExpertName();
   return(0);
}
int deinit() { return(0); }

//
//
//
//
//

int start()
{
   double alpha = 2.0/(1.0+SignalPeriod);
   int counted_bars=IndicatorCounted();
   int i,limit;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
         limit = Bars-counted_bars;

   //
   //
   //
   //
   //

   if (_=="calculating")
   {
      for(i=limit; i>=0; i--)
      {
         double sum  = 0;
         for(int j=0; j<persize; j++)
         {
            if (periods[j]<30)
                  sum  += iMA(NULL,0,periods[j],0,MODE_EMA,Price,i);
            else  sum  -= iMA(NULL,0,periods[j],0,MODE_EMA,Price,i);
         }
         buffer1[i] = sum*10.0;
         buffer2[i] = buffer2[i+1]+alpha*(buffer1[i]-buffer2[i+1]);
      }            
      return(0);
   }
   
   //
   //
   //
   //
   //
   
   limit = MathMax(limit,timeFrame/Period());
   for(i=limit; i>=0; i--)
   {
      int y = iBarShift(NULL,timeFrame,Time[i]);
         buffer1[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculating",Price,SignalPeriod,0,y);
         buffer2[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculating",Price,SignalPeriod,1,y);
   }
         
}

//
//
//
//
//

int stringToTimeFrame(string tfs)
{
   for(int l = StringLen(tfs)-1; l >= 0; l--)
   {
      int char = StringGetChar(tfs,l);
          if((char > 96 && char < 123) || (char > 223 && char < 256))
               tfs = StringSetChar(tfs, l, char - 32);
          else 
              if(char > -33 && char < 0)
                  tfs = StringSetChar(tfs, l, char + 224);
   }

   //
   //
   //
   //
   //
   
   int tf=0;
         if (tfs=="M1" || tfs=="1")     tf=PERIOD_M1;
         if (tfs=="M5" || tfs=="5")     tf=PERIOD_M5;
         if (tfs=="M15"|| tfs=="15")    tf=PERIOD_M15;
         if (tfs=="M30"|| tfs=="30")    tf=PERIOD_M30;
         if (tfs=="H1" || tfs=="60")    tf=PERIOD_H1;
         if (tfs=="H4" || tfs=="240")   tf=PERIOD_H4;
         if (tfs=="D1" || tfs=="1440")  tf=PERIOD_D1;
         if (tfs=="W1" || tfs=="10080") tf=PERIOD_W1;
         if (tfs=="MN" || tfs=="43200") tf=PERIOD_MN1;
         if (tf<Period() && tf!=0)      tf=Period();
   return(tf);
}



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:



Indicators Used:

Moving average indicator



Custom Indicators Used:
IndicatorFileName

Order Management characteristics:

Other Features: