PGO TM smoothed Indicator For MT5

PGO TM smoothed Indicator For MT5

The PGO TM smoothed Indicator For MT5 is a trend direction and strength detection tool. This version of the Pretty Good Oscillator (PGO) provides traders with the additional option to apply Timm Morris Moving Average for smoothing the PGO values. This can help to filter out some of the false signals. Basic trading signals generated by the PGO TM smoothed Indicator For MT5 are explained below: 1. Zero Line Crossover - When the PGO indicator line crosses above zero on the daily time frame, the long term trend can be considered to have turned bullish. Conversely, when the PGO indicator crosses below the zero mark on the daily time frame, the long term trend can be deemed to have changed to bearish. Traders can tinker with the time frame to adjust the indicator to their trading style and strategy. 2. Change in Slope - Changes in the indicator slope depict changes in the short term trend direction. If the PGO TM smoothed Indicator For MT5 is above the zero line, traders can initiate long positions when the indicator slope switches from down to up. Contrarily, when the PGO Indicator is below the zero line, traders can enter short as and when the indicator slope shifts from up to down.

FREE PGO TM smoothed Indicator

Download the FREE PGO TM smoothed Indicator for MT5.

To receive my email 100% sure: 
Put my email on your whitelist!

 

Partially Automated Trading Besides Your Day Job

Alerts In Real-Time When Divergences Occur

My Recommended MT4/MT5 Broker

 

Installing the PGO TM smoothed Indicator For MT5

After you downloaded the indicator via the form above you need to unzip the zip-file. Then you need to copy the file PGO TM smoothed.mq5 into the folder MQL5\Indicators of your MT5 installation. After that please restart MT5 and then you will be able to see the indicator in the list of indicators.

Parameters of the PGO TM smoothed Indicator For MT5

The PGO TM smoothed Indicator For MT5 has 5 parameters to configure.

input int                 inpPgoPeriod   = 89;          // PGO period
input ENUM_APPLIED_PRICE  inpPrice       = PRICE_CLOSE; // Price
input double              inpTmSmoothing =  5;          // TM smoothing
input double              inpTmDamping   =  5;          // TM damping
input double              inpTmNoise     =  2;          // TM noise

Buffers of the PGO TM smoothed Indicator For MT5

The PGO TM smoothed Indicator For MT5 provides 2 buffers.

SetIndexBuffer(0,val,INDICATOR_DATA);
SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX);

Main Parts Of The Code

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{                
   if (Bars(_Symbol,_Period) lt rates_total) return(-1);
   if (ArraySize(work)!=rates_total) ArrayResize(work,rates_total);
   
   //
   //---
   //

   double alphaAtr = 2.0/(1.0+inpPgoPeriod);   
   for (int i=(int)MathMax(prev_calculated-1,0); i lt rates_total && !_StopFlag; i++)
   {
      double _price = getPrice(inpPrice,open,close,high,low,i,rates_total);
      work[i] = (i gt 0) ? work[i-1] + alphaAtr*(MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1])-work[i-1]) : high[i]-low[i];
      val[i]  = iTmSmooth((_price-iSma(_price,inpPgoPeriod,i,rates_total))/work[i],inpTmDamping,inpTmNoise,inpTmSmoothing,i,rates_total);
      valc[i] = (i gt 0) ? (val[i] lt val[i-1]) : 0 ;
   }          
   return(rates_total);
}

//+------------------------------------------------------------------
//| Custom functions
//+------------------------------------------------------------------
double workSma[][1];
//
//---
//
double iSma(double price,int period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workSma,0)!=_bars) ArrayResize(workSma,_bars);

   workSma[r][instanceNo]=price;
   double avg=price; int k=1; for(; k lt period && (r-k) gt =0; k++) avg+=workSma[r-k][instanceNo];
   return(avg/(double)k);
  }
//
//---
//
double wrkTm[][3];
#define _price 0
#define _y1    1
#define _y2    2
//
//---
//
double iTmSmooth(double price, double damping, double noise, double length, int i, int bars)
{
   if (ArrayRange(wrkTm,0) != bars) ArrayResize(wrkTm,bars);
   if (length lt =1) return(price);

   //
   //
   //
   //
   //

      wrkTm[i][_price] = price;

         double y1 = i gt 0 ? wrkTm[i-1][_y1] : 0;
         double y2 = i gt 0 ? wrkTm[i-1][_y2] : 0;
         
         double err = (wrkTm[i][_price]-2.0*y1+y2)/noise; 
         double drv = MathMax(MathMin((1.0/length)*err*err+(1.0/length)*MathAbs(err),0.5),0.0);
         double dmp = MathMax(MathMin((1.0/length)*MathAbs(y1-y2)/noise + damping/100.0,1.0),0.0);
         
         //
         //
         //
         //
         //
         
      double tmAvg  = y1 + noise*err*drv + (y1-y2)*(1.0-dmp);
      wrkTm[i][_y1] = tmAvg;
      wrkTm[i][_y2] = y1;
      return(tmAvg);
      #undef _price
      #undef _y1
      #undef _y2
} 
//
//---
//
double getPrice(ENUM_APPLIED_PRICE tprice,const double &open[],const double &close[],const double &high[],const double &low[],int i,int _bars)
  {
   if(i gt =0)
      switch(tprice)
        {
         case PRICE_CLOSE:     return(close[i]);
         case PRICE_OPEN:      return(open[i]);
         case PRICE_HIGH:      return(high[i]);
         case PRICE_LOW:       return(low[i]);
         case PRICE_MEDIAN:    return((high[i]+low[i])/2.0);
         case PRICE_TYPICAL:   return((high[i]+low[i]+close[i])/3.0);
         case PRICE_WEIGHTED:  return((high[i]+low[i]+close[i]+close[i])/4.0);
        }
   return(0);
  }
//+------------------------------------------------------------------+

 

About Me

I'm Mike Semlitsch the owner of PerfectTrendSystem.com. My trading career started in 2007. Since 2013 I have helped thousands of traders to take their trading to the next level. Many of them are now constantly profitable traders. 

The following performance was achieved by me while trading live in front of hundreds of my clients:

Connect With Me:  

Results From 5 Months!
This service starts soon! Be the first who get's notified when it begins!

This FREE Indicator Can Transform
Your Trading!

FREE Indicator + Telegram Group


Request the Ultimate Double Top/Bottom Indicator which is used by 10,000+ traders.