Heiken+Ashi+v2
Download scriptThis script is designed to transform standard price charts into Heiken Ashi candles. Unlike traditional candlesticks, which represent the raw price action of a specific time period, Heiken Ashi candles use a specific mathematical smoothing technique to filter out "market noise." This makes it easier for traders to identify the overall trend and momentum of the market without getting distracted by minor, erratic price fluctuations.
How the Logic Works
The script processes price data through several layers of calculation to generate the visual bars you see on your chart:
1. Determining the "Average" Price Instead of using the standard opening and closing prices, the script calculates a synthetic Open and Close.
- The Opening price is derived from the average of the previous candle's Open and Close.
- The Closing price is calculated as the arithmetic mean (the average) of the current candle's four main data points: High, Low, Open, and Close.
2. Smoothing the Extremes To ensure the candles reflect a clean trend, the script identifies the highest and lowest points of the movement. It compares the actual market highs and lows against the newly calculated "Average" Open and Close prices. By selecting the absolute maximum and minimum from these values, the script ensures that the candle bodies accurately represent the range of price action relative to the smoothed average.
3. Visual Representation (Color and Body) The final visual appearance of each bar is determined by the relationship between the calculated Open and Close:
- If the closing price is higher than the opening price, it indicates upward momentum.
- If the closing price is lower than the opening price, it indicates downward momentum.
The script then maps these values onto four different visual layers (buffers). These buffers work together to draw the distinct red and blue bars that represent the trend's direction, providing a much cleaner and more readable "flow" of the market compared to standard candlestick charts.
//+------------------------------------------------------------------+
//| Heiken Ashi v2.mq4 |
//| Copyright c 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright =A9 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 Blue
#property indicator_color3 Red
#property indicator_color4 Blue
//---- buffers
double ExtMapBuffer1[], ExtMapBuffer2[], ExtMapBuffer3[], ExtMapBuffer4[];
//=20;
//---- vars
int ExtCountedBars=0;
int init() {
//---- indicators
SetIndexStyle (0, DRAW_HISTOGRAM, 0, 1, Red);
SetIndexBuffer (0, ExtMapBuffer1);
SetIndexLabel (0, "HA Max / Min");
SetIndexStyle (1, DRAW_HISTOGRAM, 0, 1, Blue);
SetIndexBuffer (1, ExtMapBuffer2);
SetIndexLabel (1, "HA Max / Min");
SetIndexStyle (2, DRAW_HISTOGRAM, 0, 3, Red);
SetIndexBuffer (2, ExtMapBuffer3);
SetIndexLabel (2, "HA Open");
SetIndexStyle (3, DRAW_HISTOGRAM, 0, 3, Blue);
SetIndexBuffer (3, ExtMapBuffer4);
SetIndexLabel (3, "HA Close");
//----
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);
IndicatorDigits(Digits);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
double
haOpen,
haHigh,
haLow,
haClose;
int
pos = Bars - ExtCountedBars - 1;
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--;
}
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