_2523Heiken_Ashi_Ma 20

Download script
Author: Copyright � 2006, Forex-TSD.com
_2523Heiken_Ashi_Ma 20

This script is designed as a technical analysis tool for MetaTrader, specifically creating a specialized visual representation of price action known as Heiken Ashi candles based on Moving Average data. Unlike standard charts that focus on raw price fluctuations, this tool smooths out market "noise" to provide a clearer picture of the underlying trend.

Core Logic and Methodology

The primary objective of this script is to filter out erratic price movements by calculating values based on averages rather than individual price points. It achieves this through several distinct steps:

1. Data Smoothing via Moving Averages Instead of looking at the simple high, low, open, and close of a standard candle, the script calculates four separate Moving Averages (MA) for each of these price components. The user can customize how many past candles are included in this average (the Period) and the specific mathematical method used to calculate that average.

2. Heiken Ashi Transformation The script then takes these smoothed Moving Average values and applies a specific set of formulas to construct "Heiken Ashi" candles. This involves:

  • Determining a synthetic "Open" price by averaging previous data points.
  • Calculating a synthetic "Close" price by averaging the high, low, open, and close of the current period.
  • Identifying the highest and lowest points within those calculated bounds to define the candle's boundaries.

3. Visual Trend Identification The script automatically distinguishes between bullish (upward) and bearish (downward) momentum:

  • If the calculated "Close" is higher than the "Open," the tool identifies an upward trend.
  • If the "Close" is lower than the "Open," it identifies a downward trend.
  • It then maps these values onto the chart using specific colors (Red and Royal Blue) to help traders visualize whether the market sentiment is shifting or maintaining its current direction.

User Experience

By utilizing this script, a trader sees a modified version of price history that emphasizes the "flow" of the market. Rather than seeing every tiny tick of price movement, the chart displays smoothed bars that make it easier to identify long-term trends and potential trend reversals, providing a cleaner aesthetic and more stable visual environment for analysis.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
4 Views
0 Downloads
0 Favorites
_2523Heiken_Ashi_Ma 20
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                               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_color1 DarkOrange
#property indicator_color2 Turquoise
#property indicator_color3 Red
#property indicator_color4 RoyalBlue
//---- parameters
extern int MaMetod  = 1;
extern int MaPeriod = 20;
//---- 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, Red);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, RoyalBlue);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Red);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, RoyalBlue);
   SetIndexBuffer(3, ExtMapBuffer4);
//----
   SetIndexDrawBegin(0,5);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done

watermark();
   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, 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)
     {
      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;
      haHigh=MathMax(maHigh, MathMax(haOpen, haClose));
      haLow=MathMin(maLow, 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);
  }
//+------------------------------------------------------------------+

void watermark()
  {
   ObjectCreate("fxcruiser", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("fxcruiser", "fxcruiser", 11, "Lucida Handwriting", RoyalBlue);
   ObjectSet("fxcruiser", OBJPROP_CORNER, 2);
   ObjectSet("fxcruiser", OBJPROP_XDISTANCE, 5);
   ObjectSet("fxcruiser", OBJPROP_YDISTANCE, 10);
   return(0);
  }

Comments