Author: Bruno Pio
PEMA

This script is designed to generate a specialized technical indicator for the MetaTrader trading platform. Its primary purpose is to create a smooth, high-precision trend line by layering multiple mathematical calculations on top of standard price averages.

Core Concept: Multi-Layered Smoothing

The logic operates by taking a basic Exponential Moving Average (EMA)—a common tool used to track price trends—and then repeating the averaging process several times over itself. In essence, it treats the first average as raw data and calculates a second average of that result, then a third average of that second one, continuing this sequence through seven distinct layers of calculation.

How the Logic Works

  1. Nested Averaging: The script builds a hierarchy of data. By calculating an "average of an average," it filters out minor price fluctuations and "noise," leaving behind a much cleaner representation of the underlying market direction.
  2. Deep Calculation: This specific tool performs these calculations deep enough to ensure that the resulting line is exceptionally stable compared to standard indicators, which can often react too quickly to erratic price spikes.
  3. Weighted Synthesis: Instead of simply showing you the final average, the script uses a sophisticated weighted formula. It combines all seven layers of averages using specific mathematical coefficients (multipliers). This weighting ensures that each layer contributes a specific amount of "weight" to the final line, balancing the sensitivity of the indicator so it remains responsive to major trends while ignoring insignificant market jitters.

Visual Outcome

The final result is a single red line displayed on your trading chart. Because of the multi-layered logic, this line provides a highly refined view of price momentum, offering a clear visual path of the trend that has been mathematically "distilled" from the original price action.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
PEMA
//+------------------------------------------------------------------+
//|                                                         PEMA.mq4 |
//+------------------------------------------------------------------+
#property copyright "Bruno Pio"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
#property  indicator_width1  2
//---- input parameters
extern int       EMA_period=14;
//---- buffers
double PemaBuffer[];
double Ema[];
double EmaOfEma[];
double EmaOfEmaOfEma[];
double EmaOfEmaOfEmaOfEma[];
double EmaOfEmaOfEmaOfEmaOfEma[];
double EmaOfEmaOfEmaOfEmaOfEmaOfEma[];
double Ema7[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,PemaBuffer);
   SetIndexBuffer(1,Ema);
   SetIndexBuffer(2,EmaOfEma);
   SetIndexBuffer(3,EmaOfEmaOfEma);
   SetIndexBuffer(4,EmaOfEmaOfEmaOfEma);
   SetIndexBuffer(5,EmaOfEmaOfEmaOfEmaOfEma);
   SetIndexBuffer(6,EmaOfEmaOfEmaOfEmaOfEmaOfEma);
   SetIndexBuffer(7,Ema7);

   IndicatorShortName("PEMA("+EMA_period+")");
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,limit,limit2,limit3,limit4,limit5,limit6,limit7,limit8,counted_bars=IndicatorCounted();
//----
   if (counted_bars==0)
      {
      limit=Bars-1;
      limit2=limit-EMA_period;
      limit3=limit2-EMA_period;
      limit4=limit3-EMA_period;
      limit5=limit4-EMA_period;
      limit6=limit5-EMA_period;
      limit7=limit6-EMA_period;
      limit8=limit7-EMA_period;
      }
   if (counted_bars>0)
      {
      limit=Bars-counted_bars-1;
      limit2=limit;
      limit3=limit2;
      limit4=limit3;
      limit5=limit4;
      limit6=limit5;
      limit7=limit6;
      limit8=limit7;
      }
   for (i=limit;i>=0;i--) Ema[i]=iMA(NULL,0,EMA_period,0,MODE_EMA,PRICE_CLOSE,i);
   for (i=limit2;i>=0;i--) EmaOfEma[i]=iMAOnArray(Ema,0,EMA_period,0,MODE_EMA,i);
   for (i=limit3;i>=0;i--) EmaOfEmaOfEma[i]=iMAOnArray(EmaOfEma,0,EMA_period,0,MODE_EMA,i);
   for (i=limit4;i>=0;i--) EmaOfEmaOfEmaOfEma[i]=iMAOnArray(EmaOfEmaOfEma,0,EMA_period,0,MODE_EMA,i);
   for (i=limit5;i>=0;i--) EmaOfEmaOfEmaOfEmaOfEma[i]=iMAOnArray(EmaOfEmaOfEmaOfEma,0,EMA_period,0,MODE_EMA,i);
   for (i=limit6;i>=0;i--) EmaOfEmaOfEmaOfEmaOfEmaOfEma[i]=iMAOnArray(EmaOfEmaOfEmaOfEmaOfEma,0,EMA_period,0,MODE_EMA,i);
   for (i=limit7;i>=0;i--) Ema7[i]=iMAOnArray(EmaOfEmaOfEmaOfEmaOfEmaOfEma,0,EMA_period,0,MODE_EMA,i);
   //for (i=limit8;i>=0;i--) EmaOfEmaOfEmaOfEmaOfEmaOfEmaOfEmaOfEma[i]=iMAOnArray(Ema7,0,EMA_period,0,MODE_EMA,i);
   
   for (i=limit8;i>=0;i--) PemaBuffer[i]=8*Ema[i]-28*EmaOfEma[i]+56*EmaOfEmaOfEma[i]-70*EmaOfEmaOfEmaOfEma[i]+56*EmaOfEmaOfEmaOfEmaOfEma[i]-28*EmaOfEmaOfEmaOfEmaOfEmaOfEma[i]+8*Ema7[i]-iMAOnArray(Ema7,0,EMA_period,0,MODE_EMA,i);
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments