Heiken Ashi V

Download script
Author: Copyright � 2004, MetaQuotes Software Corp.
Heiken Ashi V

This script is designed to transform standard price charts into a specialized visual format known as "Heiken Ashi." While traditional trading charts can often appear erratic with frequent price fluctuations, this tool smooths out the price action to help traders more clearly identify the underlying trend of the market.

How the Logic Works

The core purpose of this script is to recalculate the price data for every bar on your chart using a specialized mathematical approach. Instead of showing you the raw "Open," "High," "Low," and "Close" prices that occurred at a specific moment, it calculates new, synthetic values based on the following logic:

  • Smoothing the Opening Price: The script determines the "Opening" price of a candle by looking backward. It takes the average of the previous candles' high and low points. By doing this over a customizable number of bars, it helps filter out "noise" and provides a more stable starting point for each new period.
  • Adjusting the Closing Price: The script calculates a modified "Closing" price. Depending on the settings you choose, it either takes an average of three specific price points (High, Low, and Close) or four price points (adding the Open as well). This creates a more balanced representation of where the price finished compared to a standard candle.
  • Defining Highs and Lows: Once the smoothed "Opening" and "Closing" prices are established, the script identifies the true high and low for that bar. It ensures that these values represent the highest and lowest points reached during that period, including the new calculated figures.
  • Visual Representation: Finally, the script paints the results as a histogram on your chart. If the smoothed opening price is lower than the smoothed closing price, it indicates an upward trend (usually colored differently); if the opening is higher than the closing, it shows a downward trend.

Summary for the User

In simple terms, this tool acts like a "filter" for your price data. It takes the jagged, often confusing movements of live market prices and redraws them into smoother, more cohesive bars. This allows you to see the momentum and direction of a trend more clearly without getting distracted by minor, temporary price spikes.

Miscellaneous
Implements a curve of type %1
9 Views
0 Downloads
0 Favorites
Heiken Ashi V
//+------------------------------------------------------------------+
//|                                                  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 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2

//----
extern int CountBar=1;  // Êîëè÷åñòâî áàðîâ äëÿ ðàñ÷åòà öåíû îòêðûòèÿ
extern int mode=0;      // âûáîð âàðèàíòà ðàñ÷åòà öåíû çàêðûòèÿ
                        // (mode==0)   haClose=(High[pos]+Low[pos]+Close[pos])/3.0;
                        // (mode==1)   haClose=(High[pos]+Low[pos]+Close[pos]+Open[pos])/4.0;

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 2);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 2);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 2);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 2);
   SetIndexBuffer(3, ExtMapBuffer4);


   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;
   double _Open, _High, _Low, _Close;
   int shift;
   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=0;
      for (int i=1;i<=CountBar;i++) {
         haOpen+=((ExtMapBuffer3[pos+i]+ExtMapBuffer4[pos+i])/2.0);
      }
      haOpen/= (CountBar*1.0);
      if (mode==0) haClose=(High[pos]+Low[pos]+Close[pos])/3.0;
      else haClose=(High[pos]+Low[pos]+Close[pos]+Open[pos])/4.0;
      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