This tool is designed to transform standard price charts into Heiken Ashi charts. Unlike traditional candlestick charts, which represent the raw price action of a specific time period, Heiken Ashi charts use a specialized mathematical smoothing technique to filter out "market noise" and provide a clearer picture of the prevailing trend.
How the Logic Works
The script processes historical price data (Highs, Lows, Opens, and Closes) through a unique calculation method to determine four specific values for every bar on your chart:
1. Trend Smoothing (Open and Close Prices) Instead of using the actual market prices, the script calculates a "synthetic" price for each bar:
- The Synthetic Open: It takes the average of the previous bar's opening and closing values. This creates a continuous link between bars, making the movement look more fluid.
- The Synthetic Close: It calculates the average of the current period's High, Low, Open, and Close prices.
2. Dynamic Range (Highs and Lows) To determine the "wicks" (the thin lines at the top and bottom of the candles), the script compares the actual market highs and lows against the newly calculated synthetic open and close prices. It ensures that the visual boundaries of the candle always encompass the highest and lowest points reached during that timeframe.
3. Visual Coloring and Direction The logic automatically assigns colors based on the relationship between the synthetic open and close:
- If the synthetic close is higher than the synthetic open, it signifies upward momentum (displayed in Royal Blue).
- If the synthetic close is lower than the synthetic open, it signifies downward momentum (displayed in Crimson).
User Experience & Benefits
The primary goal of this logic is to help traders identify the "path of least resistance." By smoothing out minor price fluctuations, the script helps highlight whether the market is in a steady bull trend, a steady bear trend, or moving sideways. It provides a cleaner visual representation that allows for easier identification of trend reversals and sustained movements.
//+------------------------------------------------------------------+
//| HeikenAshi_DM.mq4 |
//| Copyright c 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//| revised, Dean Malone |
//+------------------------------------------------------------------+
//| For Heiken Ashi we recommend next chart settings ( press F8 or |
//| select on menu 'Charts'->'Properties...'): |
//| - On 'Color' Tab select 'Black' for 'Line Graph' |
//| - On 'Common' Tab disable 'Chart on Foreground' checkbox and |
//| select 'Line Chart' radiobutton |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
#property indicator_color3 Crimson
#property indicator_color4 RoyalBlue
//---- 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, Crimson);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexLabel(0,"HA_0"); //included "HA_0" Buffer Label for Data Window
SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, RoyalBlue);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexLabel(1,"HA_1"); //included "HA_1" Buffer Label for Data Window
SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Crimson);
SetIndexBuffer(2, ExtMapBuffer3);
SetIndexLabel(2,"HA_Open"); //included "HA_Open" Buffer Label for Data Window
SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, RoyalBlue);
SetIndexBuffer(3, ExtMapBuffer4);
SetIndexLabel(3,"HA_Close"); //included "HA_Close" Buffer Label for Data Window
//----
SetIndexDrawBegin(0,10);
SetIndexDrawBegin(1,10);
SetIndexDrawBegin(2,10);
SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexBuffer(2,ExtMapBuffer3);//HA_Open
SetIndexBuffer(3,ExtMapBuffer4);//HA_Close
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
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)
{
haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
haClose=(Open[pos]+High[pos]+Low[pos]+Close[pos])/4;
haHigh=MathMax(High[pos], MathMax(haOpen, haClose));
haLow=MathMin(Low[pos], 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--;
}
//Priceline = Bid
//ExtMapBuffer1[0]=High (top of upper wick)
//ExtMapBuffer2[0]=Low (bottom of lower wick)
//ExtMapBuffer3[0]=Top of body
//ExtMapBuffer4[0]=Bottom of body
//
//string tLine="";
//tLine="Bid="+DoubleToStr(Bid,4)+" Ask="+DoubleToStr(Ask,4)+" B1="+DoubleToStr(ExtMapBuffer1[0],4)+" B2="+DoubleToStr(ExtMapBuffer2[0],4)+" B3="+DoubleToStr(ExtMapBuffer3[0],4)+" B4="+DoubleToStr(ExtMapBuffer4[0],4);
//Comment(tLine);
//----
return(0);
}
//+------------------------------------------------------------------+
Comments