Heiken_Ashi_Smoothed_Alert_001
Download scriptThis script is designed as a visual trading tool that helps identify market trends by refining and smoothing "Heiken Ashi" price data. It aims to reduce the "noise" of standard price movements, making it easier for traders to see the underlying direction of the market.
Core Logic Overview
1. Price Smoothing and Transformation Instead of looking at raw, jagged price candles, the script first calculates a series of Moving Averages based on different price points (the high, low, open, and close). It then uses these averages to reconstruct "Heiken Ashi" values. These are synthetic candles that represent the average price action over a specific period, which helps filter out minor fluctuations.
2. Trend Identification The script analyzes the relationship between the newly calculated opening and closing values:
- Bullish Trend: If the synthetic closing value is higher than the opening value, the logic identifies an upward trend.
- Bearish Trend: If the synthetic closing value is lower than the opening value, it identifies a downward trend.
To ensure the data is stable, the script applies a second layer of smoothing (a secondary moving average) to these trends. This results in the visual histogram seen on your chart, which provides a cleaner representation of momentum than standard indicators.
3. Automated Signal Alerts The logic includes a built-in "watcher" that monitors for specific trend reversals:
- Buy Signals: The script triggers an alert when the trend flips from negative (downward) to positive (upward).
- Sell Signals: The script triggers an alert when the trend flips from positive (upward) to negative (downward).
Notification System
To keep the trader informed without needing to watch the screen constantly, the script is equipped with three notification layers:
- Visual Alerts: A pop-up message box appears on your trading platform.
- Audio Alerts: A sound file plays to notify you of a trend change instantly.
- Email Notifications: If enabled, the script can send an automated email containing the specific price, time, and symbol details when a signal occurs.
In summary, this tool transforms complex price data into a smoothed visual trend, identifies when that trend changes direction, and pushes those alerts to you through multiple channels.
//+------------------------------------------------------------------+
//| Heiken Ashi Smoothed.mq4 |
//+------------------------------------------------------------------+
//| mod by Raff |
//+------------------------------------------------------------------+
//alert & mail function add by sygg320
#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 bool Alerts =true;
extern bool Mail = false;
//---- 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 (pos==0 && trend[1]<0) PlaySound("alert2.wav");
}
else
{
trend[pos]=-1;
ExtMapBuffer7[pos]=haHigh;
ExtMapBuffer8[pos]=haLow;
if (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)
{
UpTrendAlert=true; DownTrendAlert=false;
if(pos==0 && trend[1]<0)
{
if(Alerts)Alert("BUY Signal at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
if(Mail)SendMail("BUY Signal Alert","BUY Signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
}
}
if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
{
DownTrendAlert=true; UpTrendAlert=false;
if(pos==0 && trend[1]>0)
{
if (Alerts) Alert("SELL Signal at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
if (Mail) SendMail("SELL Signal Alert","SELL Signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments