HeikenAshi_DM

Download script
Author: Copyright � 2004, MetaQuotes Software Corp.
HeikenAshi_DM

This script is designed to transform standard price data into a specialized visual format known as Heiken Ashi candles. Unlike traditional charts that simply show the raw open, high, low, and close prices of an asset, this tool applies a specific mathematical smoothing logic to provide a clearer picture of market trends and momentum.

Core Functionality

The primary objective of this script is to filter out "market noise"—the small, erratic price fluctuations that can often make it difficult for traders to identify the underlying direction of the market. By recalculating each price point based on historical averages, it produces a visual representation that emphasizes whether the current trend is bullish (upward) or bearish (downward).

How the Logic Works

The script processes the price data using several distinct calculation steps:

  • Smoothing the "Open" and "Close": Instead of using the raw price at which a candle opened or closed, the script calculates a new "Heiken Ashi Open" by averaging the previous candle's results. It derives the "Heiken Ashi Close" by taking the average of the current candle's four main price points (Open, High, Low, and Close).
  • Dynamic Extremes: To ensure the visual candles accurately reflect the price range while maintaining a smooth appearance, the script determines the "High" and "Low" values by comparing the actual market highs and lows against the newly calculated smoothed averages.
  • Visual Coloring Logic: The script automatically assigns colors based on the relationship between the calculated open and close prices:
    • If the calculated closing price is higher than the opening price, it signals upward momentum (represented in Royal Blue).
    • If the calculated closing price is lower than the opening price, it signals downward momentum (represented in Crimson).

User Experience and Visual Integration

For the best visual experience, the script is designed to overlay directly onto your chart window. It uses a histogram-style drawing method, which allows for a clean transition between different price movements. Because the logic relies on previous data points to calculate current values, it provides a more continuous and fluid view of market movement compared to standard Japanese Candlestick charts.

By using this tool, you are essentially viewing a "filtered" version of the market, where the focus is shifted away from individual price spikes and toward the overall flow of the trend.

Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
HeikenAshi_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--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments