Heiken_Ashi_Smoothed_Alert_011

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

This tool is designed to provide traders with a smoothed visual representation of market trends by combining two popular technical analysis concepts: Heiken Ashi charting and Moving Averages.

Core Logic Overview

The primary goal of this script is to filter out "market noise"—the small, erratic price fluctuations that can often mislead traders—and highlight the underlying direction of the market. It achieves this through a multi-step calculation process:

1. Data Smoothing (Moving Averages) Instead of looking at raw price data (which can be jumpy), the script first applies a Moving Average to the market's open, high, low, and close prices. This creates a "pre-smoothed" baseline for the calculations that follow.

2. Heiken Ashi Transformation The script then uses these smoothed values to construct Heiken Ashi candles. Unlike standard candles, Heiken Ashi candles represent an average price over time.

  • It calculates a new "Open" value based on the previous candle's data.
  • It calculates a new "Close" value by averaging the high, low, open, and close of the current period.
  • This results in a much cleaner visual flow where trends appear as consistent blocks of color rather than erratic spikes.

3. Trend Detection and Final Smoothing Once the Heiken Ashi values are generated, the script performs a final layer of smoothing. It tracks whether the market is moving upward or downward and applies a secondary Moving Average to these results. This produces the final visual output:

  • Red Histograms: Indicate a bearish (downward) trend.
  • Blue Histograms: Indicate a bullish (upward) trend.

Alert System and Signals

The logic includes an automated notification system to alert the user when a trend reversal occurs. The script monitors the transition between these trends:

  • Buy Signal: Triggered when the market momentum shifts from a downward trend to an upward trend, provided there is active trading volume.
  • Sell Signal: Triggered when the market momentum shifts from an upward trend to a downward trend, provided there is active trading volume.

If the user enables the alert settings, the script will provide both visual alerts on the chart and audible notifications (pop-ups/sounds) to signal these specific turning points in real-time.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It plays sound alerts
17 Views
0 Downloads
0 Favorites
Heiken_Ashi_Smoothed_Alert_011
//+------------------------------------------------------------------+
//|                                         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 RoyalBlue
#property indicator_color3 Red
#property indicator_color4 RoyalBlue
//---- parameters
extern int MaMetod  = 0;
extern int MaPeriod = 1;
extern int MaMetod2  = 3;
extern int MaPeriod2 = 2;
extern int SoundAlertMode = 0;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
double trend[];
//----
int ExtCountedBars=0;
bool UpTrendAlert=false, DownTrendAlert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   IndicatorBuffers(8);

   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, Red);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, Blue);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Red);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, Blue);
   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)/4;
      haHigh=MathMax(maHigh, MathMax(haOpen, haClose));
      haLow=MathMin(maLow, MathMin(haOpen, haClose));

      if (haOpen<haClose) 
        {
         trend[pos]=1;
         ExtMapBuffer7[pos]=haLow;
         ExtMapBuffer8[pos]=haHigh;
         if (SoundAlertMode>0 && pos==0 && trend[1]<0) PlaySound("alert2.wav");
        } 
      else
        {
         trend[pos]=-1;
         ExtMapBuffer7[pos]=haHigh;
         ExtMapBuffer8[pos]=haLow;
         if (SoundAlertMode>0 && pos==0 && trend[1]>0) PlaySound("alert2.wav");
        } 
      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);

//----------   
   string Message;
   
   if ( trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert)
	  {
	  Message = " "+Symbol()+" M"+Period()+": Signal for BUY";
	  if ( SoundAlertMode>0 ) Alert (Message); 
	  UpTrendAlert=true; DownTrendAlert=false;
	  } 
	 	  
	  if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
	  {
	  Message = " "+Symbol()+" M"+Period()+": Signal for SELL";
	  if ( SoundAlertMode>0 ) Alert (Message); 
	  DownTrendAlert=true; UpTrendAlert=false;
	  } 	         

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

Comments