SilverTrend_Signal With Alert v3(28JUL05)
Download scriptThis tool is designed to identify trend reversals in financial markets by analyzing price action patterns over a specific number of previous candles. It functions by establishing "breakout" zones based on historical volatility and price extremes, providing visual signals and automated alerts when the price moves outside of these boundaries.
Core Logic and Mechanics
Volatility Analysis The tool first calculates the average size of recent price movements (the range between the highest and lowest points) over a set look-back period. By understanding this average range, the script can determine what constitutes a "significant" move versus normal market noise.
Dynamic Boundary Detection To identify potential trend changes, the script scans the most recent data to find the highest price reached (the peak) and the lowest price reached (the floor). It then creates two dynamic boundaries based on these extremes:
- Upper Boundary: A level slightly below the recent peak.
- Lower Boundary: A level slightly above the recent floor.
The "sensitivity" of these boundaries is controlled by a user-defined risk parameter, which determines how much space is left between the extreme price points and the signals.
Signal Generation The script monitors the current closing price against these dynamic boundaries:
- Buy Signal: Triggered when the price closes above the Upper Boundary. This suggests a transition into an upward momentum. When this shift occurs, a visual marker appears on the chart below the candle.
- Sell Signal: Triggered when the price closes below the Lower Boundary. This suggests a transition into downward momentum. When this shift occurs, a visual marker appears on the chart above the candle.
Alert System and Filtering To ensure the user is notified effectively without being overwhelmed by repetitive notifications, the script includes an intelligent alert filter. It recognizes whether a trend has already shifted and will only issue a "Buy" or "Sell" notification at the exact moment the trend flips. Furthermore, it incorporates a time delay to prevent multiple alerts from firing during the same period, ensuring that signals are distinct and actionable.
//+------------------------------------------------------------------+
//| SilverTrend_Signal.mq4
//| Ramdass - Conversion only
//+------------------------------------------------------------------+
#property copyright "SilverTrend rewritten by CrazyChart"
#property link "http://viac.ru/"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Magenta
//---- input parameters
extern int RISK=3;
extern int CountBars=350;
extern int Alert_Delay_In_Seconds=60;
int SSP=9;
int PrevAlertTime=0;
//---- buffers
double val1[];
double val2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,233);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| SilverTrend_Signal |
//+------------------------------------------------------------------+
int start()
{
if (CountBars>=Bars) CountBars=Bars;
SetIndexDrawBegin(0,Bars-CountBars+SSP);
SetIndexDrawBegin(1,Bars-CountBars+SSP);
int i,shift,counted_bars=IndicatorCounted();
int i1,i2,K;
double Range,AvgRange,smin,smax,SsMax,SsMin,price;
bool uptrend,old;
//----
if(Bars<=SSP+1) return(0);
//---- initial zero
if(counted_bars<SSP+1)
{
for(i=1;i<=SSP;i++) val1[CountBars-i]=0.0;
for(i=1;i<=SSP;i++) val2[CountBars-i]=0.0;
}
//----
K=33-RISK;
for (shift = CountBars-SSP; shift>=0; shift--)
{
Range=0;
AvgRange=0;
for (i1=shift; i1<=shift+SSP; i1++)
{AvgRange=AvgRange+MathAbs(High[i1]-Low[i1]);
}
Range=AvgRange/(SSP+1);
SsMax=High[shift]; SsMin=Low[shift];
for (i2=shift;i2<=shift+SSP-1;i2++)
{
price=High[i2];
if(SsMax<price) SsMax=price;
price=Low[i2];
if(SsMin>=price) SsMin=price;
}
smin = SsMin+(SsMax-SsMin)*K/100;
smax = SsMax-(SsMax-SsMin)*K/100;
val1[shift]=0;
val2[shift]=0;
if (Close[shift]<smin)
{
uptrend = false;
}
if (Close[shift]>smax)
{
uptrend = true;
}
if (uptrend!=old && uptrend==true)
{
val1[shift]=Low[shift]-Range*0.5;
if (shift==0 && (CurTime() - PrevAlertTime > Period()*Alert_Delay_In_Seconds))
{
Alert("Silver Trend ",Period()," ",Symbol()," BUY");
PrevAlertTime = CurTime();
}
}
if (uptrend!=old && uptrend==false)
{
val2[shift]=High[shift]+Range*0.5;
if (shift==0 && (CurTime() - PrevAlertTime > Period()*Alert_Delay_In_Seconds))
{
Alert("Silver Trend ",Period()," ",Symbol()," SELL");
PrevAlertTime = CurTime();
}
}
Comment(shift);
old=uptrend;
}
return(0);
}
//+------------------------------------------------------------------+
Comments