Heiken_Ashi_Ma_T3

Download script
Author: Copyright � 2006, Forex-TSD.com
Heiken_Ashi_Ma_T3

This indicator is designed to provide traders with a smoother, more refined visualization of price action by combining two advanced technical analysis concepts: Heiken Ashi candles and the T3 Moving Average.

Core Functionality

The primary goal of this script is to filter out "market noise"—the small, erratic price fluctuations that can often lead to false signals. It achieves this by transforming standard price data into a specialized hybrid format.

Key Components of the Logic

1. Advanced Smoothing (The T3 Moving Average) Unlike a standard moving average, which might be too laggy or too volatile, this script utilizes the T3 logic. This is a sophisticated mathematical formula designed to provide a very smooth line while remaining highly responsive to actual price trends. It calculates four layers of weighted averages to ensure that the resulting data stays close to the current price without jumping erratically.

2. Price Reconstruction (Heiken Ashi Hybrid) The script takes the smoothed results from the T3 Moving Average and uses them to construct "Heiken Ashi" values. In standard trading, Heiken Ashi candles are used to identify trends by smoothing out individual bar movements. By applying this logic to the already-smoothed T3 data, the script creates a highly stabilized representation of price movement.

3. Trend Visualization The indicator draws on your chart to show these modified values. This allows you to see the "true" direction of the market more clearly. It simplifies the visual experience by highlighting whether the prevailing momentum is moving upward or downward based on the relationship between the smoothed open and close values.

Signal Generation & Alerts

Beyond just providing a visual aid, the script is programmed to identify specific "turning points" in the market:

  • Buy Signals: The script monitors for a specific crossover where the smoothed price trend flips from a downward state to an upward state. When this happens, it can display a visual arrow on the chart and trigger a pop-up alert.
  • Sell Signals: Conversely, it identifies when the trend flips from upward to downward, providing a visual arrow and an alert for potential selling opportunities.

User Experience Features

  • Alert System: To ensure you don't have to watch the screen constantly, the script includes a notification system that informs you of new Buy or Sell signals in real-time.
  • Stability Controls: It includes a "Step" parameter which acts as a buffer, ensuring that the visual lines remain steady and don't move unless a significant price change occurs.

Summary for the Trader

Think of this tool as a "Trend Refiner." Instead of looking at every tiny tick of the market, this script looks at the "big picture" by smoothing out the data through two layers of mathematical filters. It identifies when the momentum has truly shifted, helping you stay on the right side of a trend while ignoring minor price distractions.

Price Data Components
Series array that contains open time of each bar
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
11 Views
0 Downloads
0 Favorites
Heiken_Ashi_Ma_T3
//+------------------------------------------------------------------+
//|                                            Heiken Ashi Ma T3.mq4 |
//+------------------------------------------------------------------+
//|                                                      mod by Raff |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Red
#property indicator_color2 RoyalBlue
#property indicator_color3 Red
#property indicator_color4 RoyalBlue
#property indicator_color5 Yellow
#property indicator_color6 Aqua
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 1
#property indicator_width6 1

//---- parameters
extern int MaPeriod = 10;
extern int MaMetod  = 2;
extern int Step = 10;
extern int CountBars = 1500;
extern bool UseT3 = true;
extern double b = 0.618;
extern bool Alerts = true;

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double UpArrow[];
double DnArrow[];

//----
double e1,e2,e3,e4,e5,e6;
double c1,c2,c3,c4;
double n,w1,w2,b2,b3;
//----
int ExtCountedBars=0;
static bool TurnedUp = false;
static bool TurnedDown = false;  
datetime timeprev=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3, ExtMapBuffer4);
   SetIndexBuffer(4, UpArrow);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,233);
   SetIndexBuffer(5,DnArrow);
   SetIndexStyle(5,DRAW_ARROW);
   SetIndexArrow(5,234);


//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,UpArrow);
   SetIndexBuffer(5,DnArrow);

//---- variable reset
    e1=0; e2=0; e3=0; e4=0; e5=0; e6=0;
    c1=0; c2=0; c3=0; c4=0; 
    n=0; 
    w1=0; w2=0; 
    b2=0; b3=0;

    b2=b*b;
    b3=b2*b;
    c1=-b3;
    c2=(3*(b2+b3));
    c3=-3*(2*b2+b+b3);
    c4=(1+3*b+b3+3*b2);
    n=MaPeriod;

    if (n<1) n=1;
    n = 1 + 0.5*(n-1);
    w1 = 2 / (n + 1);
    w2 = 1 - w1;
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if(timeprev<iTime(NULL,0,0)) {TurnedDown = false; TurnedUp = false;timeprev=iTime(NULL,0,0);}

   if (CountBars>Bars-1) CountBars=Bars-1;
   double maOpen, maClose, maLow, maHigh;
   double haOpen, haHigh, haLow, haClose;
   if(Bars<=10) return(0);
   //ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   //if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   //if (ExtCountedBars>0) ExtCountedBars--;

   int pos=CountBars;//-ExtCountedBars-1;
   while(pos>=0)
     {
    if (UseT3)
    {
      maOpen=CalcT3(Open[pos]);
      maClose=CalcT3(Close[pos]);
      maLow=CalcT3(Low[pos]);
      maHigh=CalcT3(High[pos]);
    }
    else
    if (!UseT3)
    {
      maOpen=iMA(NULL,0,MaPeriod,0,MaMetod,PRICE_OPEN,pos);
      maClose=iMA(NULL,0,MaPeriod,0,MaMetod,PRICE_CLOSE,pos);
      maLow=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_LOW,pos);
      maHigh=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_HIGH,pos);
    }
     
      haClose=(maOpen+maHigh+maLow+maClose)/4;
      //haClose=(maOpen+maClose)/2+(((maClose-maOpen)/(maHigh-maLow))*MathAbs((maClose-maOpen)/2));      
      haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
      haHigh=MathMax(maHigh, MathMax(haOpen, haClose));
      haLow=MathMin(maLow, MathMin(haOpen, haClose));
      
      if (haOpen<haClose) 
        {
         ExtMapBuffer1[pos]=haLow;
         ExtMapBuffer2[pos]=haHigh;
        } 
      else
        {
         ExtMapBuffer1[pos]=haHigh;
         ExtMapBuffer2[pos]=haLow;
        } 
      ExtMapBuffer3[pos]=haOpen;
      ExtMapBuffer4[pos]=haClose;
      if (Step>0) if( MathAbs(ExtMapBuffer1[pos]-ExtMapBuffer1[pos+1]) < Step*Point ) ExtMapBuffer1[pos]=ExtMapBuffer1[pos+1];
      if (Step>0) if( MathAbs(ExtMapBuffer2[pos]-ExtMapBuffer2[pos+1]) < Step*Point ) ExtMapBuffer2[pos]=ExtMapBuffer2[pos+1];
      if (Step>0) if( MathAbs(ExtMapBuffer3[pos]-ExtMapBuffer3[pos+1]) < Step*Point ) ExtMapBuffer3[pos]=ExtMapBuffer3[pos+1];
      if (Step>0) if( MathAbs(ExtMapBuffer4[pos]-ExtMapBuffer4[pos+1]) < Step*Point ) ExtMapBuffer4[pos]=ExtMapBuffer4[pos+1];

    if (Alerts==true)
    {
        UpArrow[pos]=EMPTY_VALUE; DnArrow[pos]=EMPTY_VALUE;

        if (ExtMapBuffer3[pos]<ExtMapBuffer4[pos] && ExtMapBuffer4[pos+1]<ExtMapBuffer3[pos+1])
        { 
           UpArrow[pos]=ExtMapBuffer4[pos+1]-(Ask-Bid);
           if (UpArrow[0]!=EMPTY_VALUE && TurnedUp==false)
           {  
              Alert("HAMa  BUY:  ",Symbol()," - ",Period(),"  at  ", Close[0],"  -  ", TimeToStr(CurTime(),TIME_SECONDS));
              TurnedDown = false;
              TurnedUp = true;
           }
        }
        if (ExtMapBuffer3[pos]>ExtMapBuffer4[pos] && ExtMapBuffer4[pos+1]>ExtMapBuffer3[pos+1])
        { 
           DnArrow[pos]=ExtMapBuffer4[pos+1]+(Ask-Bid);
           if (DnArrow[0]!=EMPTY_VALUE && TurnedDown==false)
           {
              Alert("HAMa SELL:  ",Symbol()," - ",Period(),"  at  ", Close[0],"  -  ", TimeToStr(CurTime(),TIME_SECONDS));
              TurnedUp = false;
              TurnedDown = true;
           }
        }
    }

 	   pos--;
     }
//----
   return(0);
  }

double CalcT3(double CalcPrice)
{
      e1 = w1*CalcPrice+w2*e1;
      e2 = w1*e1 + w2*e2;
      e3 = w1*e2 + w2*e3;
      e4 = w1*e3 + w2*e4;
      e5 = w1*e4 + w2*e5;
      e6 = w1*e5 + w2*e6;
      double T3=c1*e6 + c2*e5 + c3*e4 + c4*e3;
      return(T3);
}
//+------------------------------------------------------------------+

Comments