Cleon Heiken Ashi_v1
Download scriptThis script is designed to transform standard price chart data into Heiken Ashi candles. Unlike traditional Japanese candlesticks, which represent the raw price action of a specific time period (the actual high, low, open, and close), Heiken Ashi bars are calculated using a mathematical averaging technique.
The primary goal of this logic is to smooth out "market noise," making it easier for traders to identify the underlying trend of the market without being distracted by minor price fluctuations.
How the Logic Works:
1. Price Smoothing and Averaging Instead of simply showing you the price at which a candle opened or closed, the script calculates these values based on the surrounding data:
- The "Close" Price: It takes the average of the current period's High, Low, Open, and Close prices.
- The "Open" Price: It takes the average of the previous candle's Open and Close prices.
By using these averages as the foundation for the new candles, the script creates a more continuous flow of visual information.
2. Dynamic Highs and Lows To ensure the candles accurately reflect the extremes of the market while maintaining the smoothed look, the script compares the actual High and Low of the current price period against the newly calculated "Open" and "Close" averages. It then selects the highest and lowest values among those four points to define the boundaries of the candle.
3. Visual Differentiation The logic uses these calculations to determine the color and structure of the candles:
- If the calculated average Close is higher than the Open, it indicates upward momentum (typically shown in Blue).
- If the calculated average Close is lower than the Open, it indicates downward momentum (typically shown in Red).
Summary for Traders
By applying this logic, your chart shifts from showing "raw" price movements to a "filtered" view of the market. This helps in identifying whether the current trend is strengthening or weakening, as the Heiken Ashi bars provide a cleaner visual representation of the price movement over time.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| Heiken Ashi.mq4 |
//| Copyright c 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#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 Blue
#property indicator_color3 Red
#property indicator_color4 Blue
//---- buffers
double
ExtMapBuffer1[],
ExtMapBuffer2[],
ExtMapBuffer3[],
ExtMapBuffer4[];
//---- 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