Author: Copyright � 2005, Nick Bilak
T3  MA Nick

This tool is a specialized technical analysis indicator designed to create a smooth, highly responsive moving average for market charts. While standard moving averages can sometimes suffer from "lag"—where the line reacts too slowly to sudden price changes—or produce "noise" (jittery movements) that make it hard to see the true trend, this script uses a multi-layered mathematical approach to balance both issues.

How the Logic Works

The core logic functions by layering several different calculations on top of one another. Instead of simply averaging the price once, the script performs a series of sequential smoothing operations:

  1. Successive Smoothing: The script first calculates a standard exponential moving average based on the closing price. It then takes that result and applies another moving average to it, repeating this process multiple times.
  2. Multi-Stage Filtering: By running these averages through several "rounds" of calculation, the tool filters out minor market fluctuations. Each layer helps to flatten out insignificant price spikes while maintaining a connection to the overall price action.
  3. Weighted Synthesis: In the final step, the script uses a specific set of coefficients (mathematical weights) to combine these various layers. These weights are designed to blend the smoothed data points back into a single, unified line.

The Visual Result

The end goal of this logic is to produce a "Triple" Moving Average (T3MA). For a trader or observer, this translates to a line on the chart that:

  • Follows the price more closely than a standard moving average would, allowing for quicker identification of trend changes.
  • Remains visually smooth, reducing the "choppiness" that often leads to false signals in fast-moving markets.

By combining multiple levels of smoothing and then weighing them strategically, the script provides a refined view of market momentum, helping users identify the underlying direction of the price with greater clarity.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
T3 MA Nick
//+------------------------------------------------------------------+
//|                                     T3MA Nick.mq4   |
//|                                     Copyright © 2005, Nick Bilak |
//|                                   http://www.forex-tsd.com/ 
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link      "http://www.forex-tsd.com/"

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1  Yellow
#property indicator_width1 1
extern double a = 0.7;

//---- indicator parameters
extern int Periods=6;
//---- indicator buffers
double e1[];
double e2[];
double e3[];
double e4[];
double e5[];
double e6[];
double e7[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(7);
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0,Periods);
   if(
   	!SetIndexBuffer(0,e7) &&
      !SetIndexBuffer(1,e2) &&
      !SetIndexBuffer(2,e3) &&
      !SetIndexBuffer(3,e4) &&
      !SetIndexBuffer(4,e5) &&
      !SetIndexBuffer(5,e6) &&
   	!SetIndexBuffer(6,e1)
      )
      Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("T3MA("+Periods+")");
//---- initialization done
   return(0);
   
  }
//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int start()
  {
   int i,limit;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

//---- main loop
   for(i=limit; i>=0; i--) {
   	e1[i]=iMA(NULL,0,Periods,0,MODE_EMA,PRICE_CLOSE,i);
   }
   for(i=limit; i>=0; i--) {
   	e2[i]=iMAOnArray(e1,0,Periods,0,MODE_EMA,i);
   }
   for(i=limit; i>=0; i--) {
   	e3[i]=iMAOnArray(e2,0,Periods,0,MODE_EMA,i);
   }
   for(i=limit; i>=0; i--) {
   	e4[i]=iMAOnArray(e3,0,Periods,0,MODE_EMA,i);
   }
   for(i=limit; i>=0; i--) {
   	e5[i]=iMAOnArray(e4,0,Periods,0,MODE_EMA,i);
   }
	//double a=0.8;
	double c1=-a*a*a;
	double c2=3*a*a+3*a*a*a;
	double c3=-6*a*a-3*a-3*a*a*a;
	double c4=1+3*a+a*a*a+3*a*a;
	//T3MA=c1*e6+c2*e5+c3*e4+c4*e3;
   for(i=limit; i>=0; i--) {
   	e6[i]=iMAOnArray(e5,0,Periods,0,MODE_EMA,i);
   	e7[i]=c1*e6[i]+c2*e5[i]+c3*e4[i]+c4*e3[i];
   }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+

Comments