#Heiken_Ashi_Ma 20_v1

Download script
Author: Copyright � 2006, Forex-TSD.com
#Heiken_Ashi_Ma 20_v1

This tool is designed to provide traders with a smoothed visual representation of market price action by combining two distinct types of technical analysis: Moving Averages and Heikin Ashi methodology. By blending these techniques, the script aims to filter out "market noise"—the small, erratic price fluctuations that can often lead to false signals—allowing for a clearer view of the underlying trend.

Core Logic and Functionality

1. Data Smoothing via Moving Averages The foundation of this script lies in its use of Moving Averages (MA). Instead of looking at raw, jagged price points, the logic calculates four specific data streams based on a user-defined period and method:

  • Opening prices
  • Closing prices
  • High prices
  • Low prices

By averaging these values over a set timeframe, the script establishes a stabilized baseline of market behavior.

2. Heikin Ashi Integration The script then takes these smoothed moving average values and processes them through a Heikin Ashi calculation. Heikin Ashi is a specialized charting method that represents price as a balance between current movement and past averages. The logic calculates "Synthetic" Open and Close prices:

  • The Opening price is derived from the midpoint of previous data points.
  • The Closing price is an average of the moving average's high, low, open, and close values.

3. Dynamic Visual Representation Once these synthetic values are calculated, the script determines the "direction" of the movement. It compares the synthetic opening price to the synthetic closing price:

  • If the closing price is higher than the opening price, it identifies upward momentum.
  • If the closing price is lower, it identifies downward momentum.

The tool then maps these results onto your chart as a series of histograms. This creates a visual flow where the height and color of the bars represent the strength and direction of the trend, making it easier for a user to identify whether the market is gaining momentum or beginning to reverse.

User Customization

The logic allows for two primary adjustments to suit different trading styles:

  • MaPeriod: Determines how many past candles are factored into the average (longer periods create smoother lines; shorter periods react faster to price changes).
  • MaMethod: Controls the mathematical way the average is calculated, allowing the user to choose between different levels of sensitivity.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
#Heiken_Ashi_Ma 20_v1
//+------------------------------------------------------------------+
//|                                               Heiken Ashi Ma.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 4
#property indicator_color1 DarkOrange
#property indicator_color2 Turquoise
#property indicator_color3 Red
#property indicator_color4 RoyalBlue
//---- parameters
extern int MaMetod =1;
extern int MaPeriod=20;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, Red);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, RoyalBlue);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Red);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, RoyalBlue);
   SetIndexBuffer(3, ExtMapBuffer4);
//----
   SetIndexDrawBegin(0,5);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done
   watermark();
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   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=Bars-ExtCountedBars-1;
   while(pos>=0)
     {
      maOpen=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_OPEN,pos);
      maClose=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_CLOSE,pos);
      maLow=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_LOW,pos);
      maHigh=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_HIGH,pos);
//----
      haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
      haClose=(maOpen+maHigh+maLow+maClose)/4;
      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;
      pos--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
void watermark()
  {
   ObjectCreate("fxcruiser", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("fxcruiser", "fxcruiser", 11, "Lucida Handwriting", RoyalBlue);
   ObjectSet("fxcruiser", OBJPROP_CORNER, 2);
   ObjectSet("fxcruiser", OBJPROP_XDISTANCE, 5);
   ObjectSet("fxcruiser", OBJPROP_YDISTANCE, 10);
   return(0);
  }
//+------------------------------------------------------------------+

Comments