Heiken_Ashi_Smoothed_Alert_002

Author: Copyright � 2006, Forex-TSD.com
Heiken_Ashi_Smoothed_Alert_002

This indicator is designed to provide traders with a visual representation of market trends by refining and smoothing standard price action data. It combines elements of "Heiken Ashi" candles—which are known for filtering out market noise—with moving average calculations to highlight the prevailing direction of the price movement.

Core Logic and Functionality

The script operates through three primary stages: Data Calculation, Smoothing, and Signal Generation.

1. Data Calculation (Price Transformation) Instead of looking at raw price bars (which can be volatile), the script first calculates modified price points for every candle. It gathers the opening, closing, high, and low prices and averages them to create a customized "synthetic" candle. By doing this, the indicator creates a more stable environment for analysis, making it easier to see the underlying trend without being distracted by minor price fluctuations.

2. Smoothing Mechanism Once these synthetic price points are established, the script applies a second layer of mathematical smoothing. It takes those calculated values and runs them through a moving average process. This acts as a filter, removing "jitter" from the data and ensuring that the resulting visual lines or bars represent consistent momentum rather than temporary spikes.

3. Trend Identification and Visuals The script interprets the relationship between these smoothed opening and closing prices to determine the current trend:

  • Upward Trend: When the smoothed price closes higher than it opens, the logic identifies a bullish move.
  • Downward Trend: When the smoothed price closes lower than it opens, the logic identifies a bearish move.

These trends are displayed on your chart using a color-coded system (typically Red and Royal Blue), allowing you to see at a glance whether the current momentum is positive or negative.

Alerts and Notifications

The indicator includes a built-in monitoring system to notify you of significant trend shifts:

  • Trend Reversals: The script constantly monitors for "crossovers"—moments where the trend flips from bearish to bullish (or vice versa).
  • Alert Triggers: If the conditions for a reversal are met and the trading volume is active, the indicator can generate an on-screen alert and play a sound file. This helps traders identify potential entry points where the momentum has officially shifted in a new direction.

Summary for the User

Essentially, this tool acts as a "cleaner" for your charts. It takes messy, raw market data, smooths it out to reveal the true direction of the trend, and notifies you specifically when that trend changes, aiming to help you stay aligned with the dominant market flow.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It plays sound alerts
13 Views
0 Downloads
0 Favorites
Heiken_Ashi_Smoothed_Alert_002
//+------------------------------------------------------------------+
//|                                         Heiken Ashi Smoothed.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 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, 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);
   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