Ascbars
Download scriptThis script is designed to transform the standard visual representation of price movement on a trading chart into a specialized format known as Heiken Ashi. Unlike traditional charts that show the raw "open" and "close" prices of every candle, this tool smooths out market noise to provide a clearer picture of the prevailing trend.
How the Logic Works
The script operates by recalculating the price data on your screen using a specific set of mathematical averages. Instead of just looking at where the price started and ended during a time frame, it blends several elements together:
- Smoothing the Price: The script calculates a new "Average Open" and "Average Close." It does this by taking the historical values of previous candles and mixing them with the current high, low, open, and close prices. This prevents sudden, erratic price spikes from distorting the visual trend.
- Dynamic Range Calculation: For every candle displayed, the script determines the highest and lowest points. It compares the actual market highs and lows against the newly calculated "Average" prices to ensure that the resulting bars accurately reflect the true boundaries of the price movement.
- Visual Coloring and Orientation: The logic automatically assigns colors and positions based on the relationship between the new average prices:
- If the average closing price is higher than the average opening price, it indicates upward momentum.
- If the average closing price is lower than the average opening price, it indicates downward momentum.
User Experience
When you apply this script, the chart replaces standard candles with stylized bars. The primary goal of this logic is to filter out "market noise"—those tiny, insignificant fluctuations that can sometimes make a trend look messy or confusing. By using these smoothed averages, the visual output allows traders to identify whether the market is moving in a consistent direction more easily than they could on a standard chart.
To get the most accurate visual experience, the script recommends specific chart settings (such as changing the chart type to a "Line Graph" and adjusting colors), which ensures that the Heiken Ashi bars appear correctly against your background.
//+------------------------------------------------------------------+
//| Heiken Ashi.mq4 |
//| Copyright © 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 Pink
#property indicator_color2 LightCyan
#property indicator_color3 Pink
#property indicator_color4 LightCyan
//---- 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, Pink);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, LightCyan);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Pink);
SetIndexBuffer(2, ExtMapBuffer3);
SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, LightCyan);
SetIndexBuffer(3, ExtMapBuffer4);
//----
SetIndexDrawBegin(0,5);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
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 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