mHeikenAshi_DM

Author: Copyright � 2004, MetaQuotes Software Corp.
mHeikenAshi_DM

This tool is designed to transform standard price charts into Heiken Ashi charts. Unlike traditional candlestick charts, which represent the raw price action of a specific time period, Heiken Ashi charts use a specialized mathematical smoothing technique to filter out "market noise" and provide a clearer picture of the prevailing trend.

How the Logic Works

The script processes historical price data (Highs, Lows, Opens, and Closes) through a unique calculation method to determine four specific values for every bar on your chart:

1. Trend Smoothing (Open and Close Prices) Instead of using the actual market prices, the script calculates a "synthetic" price for each bar:

  • The Synthetic Open: It takes the average of the previous bar's opening and closing values. This creates a continuous link between bars, making the movement look more fluid.
  • The Synthetic Close: It calculates the average of the current period's High, Low, Open, and Close prices.

2. Dynamic Range (Highs and Lows) To determine the "wicks" (the thin lines at the top and bottom of the candles), the script compares the actual market highs and lows against the newly calculated synthetic open and close prices. It ensures that the visual boundaries of the candle always encompass the highest and lowest points reached during that timeframe.

3. Visual Coloring and Direction The logic automatically assigns colors based on the relationship between the synthetic open and close:

  • If the synthetic close is higher than the synthetic open, it signifies upward momentum (displayed in Royal Blue).
  • If the synthetic close is lower than the synthetic open, it signifies downward momentum (displayed in Crimson).

User Experience & Benefits

The primary goal of this logic is to help traders identify the "path of least resistance." By smoothing out minor price fluctuations, the script helps highlight whether the market is in a steady bull trend, a steady bear trend, or moving sideways. It provides a cleaner visual representation that allows for easier identification of trend reversals and sustained movements.

Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
mHeikenAshi_DM
//+------------------------------------------------------------------+
//|                                                HeikenAshi_DM.mq4 |
//|                      Copyright c 2004, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//|                                        revised, Dean Malone      |
//+------------------------------------------------------------------+
//| 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 Crimson
#property indicator_color2 RoyalBlue
#property indicator_color3 Crimson
#property indicator_color4 RoyalBlue
//---- 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, Crimson);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexLabel(0,"HA_0");                           //included "HA_0" Buffer Label for Data Window                        
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, RoyalBlue);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexLabel(1,"HA_1");                           //included "HA_1" Buffer Label for Data Window
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Crimson);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexLabel(2,"HA_Open");                        //included "HA_Open" Buffer Label for Data Window
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, RoyalBlue);
   SetIndexBuffer(3, ExtMapBuffer4);
   SetIndexLabel(3,"HA_Close");                       //included "HA_Close" Buffer Label for Data Window
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);//HA_Open
   SetIndexBuffer(3,ExtMapBuffer4);//HA_Close
//---- 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;
   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--;
     }
   //Priceline = Bid
   //ExtMapBuffer1[0]=High (top of upper wick)
   //ExtMapBuffer2[0]=Low  (bottom of lower wick)
   //ExtMapBuffer3[0]=Top of body
   //ExtMapBuffer4[0]=Bottom of body
   //
   //string tLine="";
   //tLine="Bid="+DoubleToStr(Bid,4)+" Ask="+DoubleToStr(Ask,4)+" B1="+DoubleToStr(ExtMapBuffer1[0],4)+" B2="+DoubleToStr(ExtMapBuffer2[0],4)+" B3="+DoubleToStr(ExtMapBuffer3[0],4)+" B4="+DoubleToStr(ExtMapBuffer4[0],4);
   //Comment(tLine);
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments