Heiken_Ashi_Ma lines
Download scriptThis script is designed to create a specialized visual overlay for your trading charts, specifically blending two popular technical analysis concepts: Heiken Ashi price action and Moving Averages.
The primary goal of this tool is to smooth out market "noise"—those small, erratic price fluctuations that can often make it difficult to see the true direction of a trend. It achieves this by calculating a modified set of price points rather than showing you the raw, live market prices.
How the Logic Works
The script operates through a three-step calculation process for every candle on your chart:
1. Data Gathering (The Moving Average Component) Instead of looking at just one single price point, the script looks back at a specific number of previous candles (defined by the "Period" setting). It calculates four distinct averages based on the Moving Average method you choose:
- The average Opening price
- The average Closing price
- The average High
- The average Low
2. Price Smoothing (The Heiken Ashi Component) Once it has these averages, the script applies a specific mathematical formula used in Heiken Ashi charting. It determines a new "Average Open" and a new "Average Close."
- The Average Open is derived by taking the midpoint of the previous calculated values.
- The Average Close is calculated by finding the mean of all four averages (Open, High, Low, and Close) gathered in the first step.
3. Visual Output Finally, the script plots these calculated values onto your chart as two distinct lines (colored Yellow and Blue). Because these lines are based on smoothed averages rather than raw price spikes, they provide a much clearer picture of the underlying market momentum.
Key Takeaways for Traders
- Trend Clarity: By using Moving Averages as the foundation for the Heiken Ashi calculation, the indicator is less likely to be "tricked" by sudden, one-time price spikes.
- Customizable Sensitivity: You can adjust how many candles the script looks at (the Period) and how it calculates those averages (the Method) to make the lines react faster or slower to market changes.
- Simplified Analysis: The resulting lines act as a filtered version of price action, helping you identify whether the current trend is bullish, bearish, or consolidating with greater ease.
//+------------------------------------------------------------------+
//| 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_color3 Yellow
#property indicator_color4 Blue
//---- parameters
extern int MaMetod = 1;
extern int MaPeriod = 3;
//---- buffers
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//|------------------------------------------------------------------|
int init()
{
//---- indicators
SetIndexStyle(2,DRAW_LINE, 1, 2, Blue);
SetIndexBuffer(3, ExtMapBuffer3);
SetIndexStyle(2,DRAW_LINE, 1, 2, Yellow);
SetIndexBuffer(3, ExtMapBuffer4);
//----
SetIndexDrawBegin(0,5);
//---- indicator buffers mapping
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done
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, 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;
ExtMapBuffer3[pos]=haOpen;
ExtMapBuffer4[pos]=haClose;
pos--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments