Heiken_Ashi_Smoothed_window

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

This script is designed to provide a smoothed visualization of market trends by combining two sophisticated technical analysis concepts: Heiken Ashi charting and Moving Average smoothing. Instead of showing the raw, often "noisy" price action of a financial market, this tool processes the data to create a cleaner, more readable trend indicator.

Core Logic Overview

The script operates through a multi-stage calculation process to transform standard price data into a refined visual signal:

1. Data Smoothing (Moving Averages) The tool begins by applying Moving Averages to the basic components of a price candle—the Open, High, Low, and Close prices. This initial step filters out minor market fluctuations (noise) and establishes a stable baseline for the movement.

2. Heiken Ashi Conversion Once the prices are smoothed, the script applies "Heiken Ashi" logic. Heiken Ashi is a type of price candle that averages previous data to represent the current momentum more clearly than standard candles.

  • It calculates a new "Open" value by averaging the previous period's data.
  • It calculates a new "Close" value based on the average of the current period's high, low, open, and close prices.
  • It determines the High and Low extremes of these new values.

3. Secondary Smoothing & Final Rendering To ensure the final output is as smooth as possible for the user, the script performs a final round of calculations. It applies a second layer of Moving Averages to all the derived Heiken Ashi values. This results in a polished indicator that highlights the direction of the trend without the erratic jumps often seen in raw price charts.

4. Automated Alerts The logic includes an automated notification system. The script monitors the relationship between the calculated "Open" and "Close" values. Whenever the trend shifts—for example, when the market moves from an upward trajectory to a downward one—the script triggers an alert to notify the user of the change in momentum immediately.

Summary for the User

The primary goal of this script is clarity. By layering two different smoothing techniques on top of Heiken Ashi logic, it identifies the "true" direction of the market. It is designed to help traders see the underlying trend more easily by removing the distraction of minor price spikes.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
11 Views
0 Downloads
0 Favorites
Heiken_Ashi_Smoothed_window
//+------------------------------------------------------------------+
//|                                         Heiken Ashi Smoothed.mq4 |
//+------------------------------------------------------------------+
//|                                                      mod by Raff |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#property  indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 LightSkyBlue
#property indicator_color3 Red
#property indicator_color4 Silver
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
//---- parameters
extern int MaMetod  = 0;//was 0
extern int MaPeriod = 1;//was 1
extern int MaMetod2  = 3;// was 3
extern int MaPeriod2 = 2;//was 2
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
double alertBar;
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   IndicatorBuffers(8);

   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3, ExtMapBuffer4);
//----
   SetIndexDrawBegin(0,5);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexBuffer(5,ExtMapBuffer6);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexBuffer(7,ExtMapBuffer8);
//---- initialization done
   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=(ExtMapBuffer5[pos+1]+ExtMapBuffer6[pos+1])/2;
      haClose=(maOpen+maHigh+maLow+maClose)/6;
      haHigh=MathMax(maHigh, MathMax(haOpen, haClose));
      haLow=MathMin(maLow, MathMin(haOpen, haClose));

      if (haOpen<haClose) 
        {
         ExtMapBuffer7[pos]=haLow;
         ExtMapBuffer8[pos]=haHigh;
        if(Bars>alertBar) {Alert("Heiken_Ashi going Down on ",Symbol()," Period ",Period()," open= ",haOpen," clse= ",haClose," pos= ",pos);alertBar = Bars;}
        } 
      else
        {
         ExtMapBuffer7[pos]=haHigh;
         ExtMapBuffer8[pos]=haLow;
        if(Bars>alertBar) {Alert("Heiken_Ashi going Up on ",Symbol()," Period ",Period()," open= ",haOpen," clse= ",haClose," pos= ",pos);alertBar = Bars;}
        } 
      ExtMapBuffer5[pos]=haOpen;
      ExtMapBuffer6[pos]=haClose;

 	   pos--;
     }

   int i;
   for(i=0; i<Bars; i++) ExtMapBuffer1[i]=iMAOnArray(ExtMapBuffer7,Bars,MaPeriod2,0,MaMetod2,i);
   for(i=0; i<Bars; i++) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer8,Bars,MaPeriod2,0,MaMetod2,i);
   for(i=0; i<Bars; i++) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer5,Bars,MaPeriod2,0,MaMetod2,i);
   for(i=0; i<Bars; i++) ExtMapBuffer4[i]=iMAOnArray(ExtMapBuffer6,Bars,MaPeriod2,0,MaMetod2,i);
        if(Bars>alertBar) {Alert("11  Heiken_Ashi change on ",Symbol()," Period ",Period()," open= ",haOpen," clse= ",haClose," pos= ",pos);alertBar = Bars;}

//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments