Heiken Ashi
Download scriptThis script is designed to transform the standard price chart into a specialized visual format known as Heiken Ashi. Unlike traditional candlestick charts, which display raw price action, this tool applies a specific mathematical smoothing technique to help traders identify underlying trends and market momentum more clearly.
Core Logic and Behavior
The primary purpose of this script is to recalculate "Open," "High," "Low," and "Close" values for every bar on your chart. Instead of showing the exact price at which a trade occurred, it calculates new smoothed values based on the following logic:
- Trend-Based Opening Prices: The opening price of each new bar is determined by averaging the previous bar's high and low prices. This centers the starting point of the current bar on the "middle" of the previous price action.
- Average Closing Prices: The closing price for each bar is calculated as a simple average of the current period's High, Low, Open, and Close prices.
- Dynamic Highs and Lows: To ensure the visual representation stays consistent with actual market limits, the script compares the current real-time High and Low against the newly calculated smoothed values. It then selects the highest and lowest points to define the "body" of the bar.
Visual Representation
The script uses four distinct data layers to render these results on your screen:
- Trend Direction: The logic compares the smoothed Open price to the smoothed Close price.
- If the closing price is higher than the opening price, it indicates an upward movement (bullish).
- If the closing price is lower than the opening price, it indicates a downward movement (bearish).
- Visual Styling: The script uses varying line thicknesses and colors (typically Red and White) to represent these movements. By smoothing out the "noise" of individual price spikes, the resulting visual gives a much cleaner view of whether the market is trending up, down, or consolidating.
Summary for the User
By using this script, you are effectively filtering out minor price fluctuations. It translates standard price data into a balanced, averaged format that highlights the strength and direction of a trend, making it easier to see the "flow" of the market at a glance.
//+------------------------------------------------------------------+
//| Heiken Ashi.mq4 |
//| Copyright c 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
//| 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 Red
#property indicator_color2 White
#property indicator_color3 Red
#property indicator_color4 White
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3
//----
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
//---- 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, color1);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, color2);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, color3);
SetIndexBuffer(2, ExtMapBuffer3);
SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, color4);
SetIndexBuffer(3, ExtMapBuffer4);
//----
SetIndexDrawBegin(0,10);
SetIndexDrawBegin(1,10);
SetIndexDrawBegin(2,10);
SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexBuffer(3,ExtMapBuffer4);
//---- 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--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments