#Heiken_Ashi_Ma 20
Download scriptThis tool is designed to provide a smoother, more filtered view of market price action by combining two popular charting concepts: Moving Averages (MA) and Heiken Ashi logic. Instead of showing you the raw, often "noisy" price fluctuations of every single tick, this script calculates a modified price movement to help identify clearer trends.
How the Logic Works
The script functions by taking standard price data and processing it through several layers of calculation:
1. Foundation: The Moving Average The script begins by looking at a specific period of historical data (which you can customize, such as a 20-period window). It calculates four key technical values based on the Moving Average: the average Open, Close, High, and Low prices. By using Moving Averages as the foundation, the tool effectively "muffles" out sudden, insignificant price spikes that might otherwise trigger false signals.
2. Synthesis: The Heiken Ashi Conversion Once it has the smoothed data from the Moving Averages, the script applies Heiken Ashi logic to these values. This is a specialized calculation used by traders to see the "average" momentum of a candle.
- It determines a new "Open" and "Close" price based on the previous averages.
- It then identifies the highest and lowest points reached during that period.
3. Visual Representation: The Histogram Finally, the script translates these calculations into a visual histogram on your chart.
- Directional Color Coding: Depending on whether the calculated "Close" is higher or lower than the "Open," the script assigns specific colors (Red and Royal Blue). This allows you to see at a glance whether the smoothed momentum is bullish (moving up) or bearish (moving down).
- Trend Clarity: Because it uses both the Moving Average's smoothing and the Heiken Ashi's trend-following properties, the resulting visual helps traders see the underlying "flow" of the market more clearly than a standard price chart might show.
Summary for the User
Essentially, this script acts as a filter. It takes the chaotic movement of the market, smooths it out using Moving Averages, and then reorganizes that data into a trend-based visual (Heiken Ashi). This allows you to see the "true" direction of the price movement without being distracted by minor, temporary fluctuations.
//+------------------------------------------------------------------+
//| 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