ASCTrend_SellBuy Sound
Download scriptThis script is a specialized trading tool designed to analyze price movements and provide visual signals, audio alerts, and email notifications for potential "Buy" and "Sell" opportunities. It functions by monitoring the volatility and momentum of a financial instrument to identify specific trend reversals.
Core Logic and Analysis
1. Volatility and Range Assessment The tool begins by calculating the "Average Range" of price bars over a set period. This allows the script to understand the current market environment—essentially determining whether the price is moving in small, stable increments or experiencing large, volatile swings. It uses this average range as a benchmark to measure the strength of subsequent price movements.
2. Momentum and Trend Tracking The logic employs a percentage-based oscillator (similar to a "Williams Percent Range" calculation) to determine the relative strength of the current trend. It doesn't just look at where the price is now; it analyzes the relationship between the high, low, and closing prices over a rolling window.
3. Signal Identification The script identifies specific conditions to trigger a signal:
- Price Thresholds: It looks for instances where the momentum value crosses specific upper or lower boundaries (determined by user-defined risk parameters).
- Trend Exhaustion: It seeks out moments where the price has moved significantly far from its recent average, suggesting that the current move might be overextended.
- Reversal Confirmation: For a signal to trigger, the script checks if the momentum is "pulling back" into a neutral zone after reaching an extreme. This helps filter out noise and focuses on significant shifts in market direction.
Visual and Notification System
Once the logic confirms a trend reversal, the tool performs several actions simultaneously:
- Visual Markers: It places arrows directly on the chart—Magenta for Sell signals and Aqua for Buy signals—to clearly indicate where a potential trend change has occurred.
- Audio Alerts: The script can trigger specific sound files (like "alert.wav") to notify the trader immediately of a new signal without requiring them to constantly watch the screen.
- Email Notifications: If enabled, the tool will send a detailed email containing the type of signal, the current Ask/Bid prices, the date, time, and the specific currency pair or asset being monitored.
Intelligent Filtering
To prevent the tool from sending repetitive alerts for the same price movement, it includes a "cooldown" logic. It tracks the time of the last notification and ensures that it only sends a new alert if a significant amount of time has passed or if a new, distinct signal type is detected. This ensures the trader is only notified of meaningful market changes rather than every minor price fluctuation.
//+-------------------------------------------------------------------+
//| ASCTrendExpert snd e-mail.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//| Made/Modified by Alejandro Galindo |
//| |
//| You are free to use it |
//| |
//| If you want and if this work/modification is helpful to you |
//| send me a PayPal donation to ag@elcactus.com |
//| any help is apreciated :) |
//| Thanks. |
//+-------------------------------------------------------------------+
//| Original Version ASCTrend1sig_noSound.mq4
//| Ramdass - Conversion only
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 Aqua
//---- input parameters
extern int RISK=3;
extern int CountBars=300;
extern int SoundSellON=1;
extern string NameFileSellSound = "alert.wav";
extern int SoundBuyON=1;
extern string NameFileBuySound = "alert2.wav";
extern int EmailON=0;
//---- buffers
double val1[];
double val2[];
int flagval1 = 0;
int flagval2 = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicator line
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,234);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,233);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
GlobalVariableSet("AlertTime"+Symbol()+Period(),CurTime());
GlobalVariableSet("SignalType"+Symbol()+Period(),OP_SELLSTOP);
//----
return(0);
}
int deinit()
{
GlobalVariableDel("AlertTime"+Symbol()+Period());
GlobalVariableDel("SignalType"+Symbol()+Period());
return(0);
}
//+------------------------------------------------------------------+
//| ASCTrend1sig |
//+------------------------------------------------------------------+
int start()
{
if (CountBars>=1000) CountBars=950;
SetIndexDrawBegin(0,Bars-CountBars+11+1);
SetIndexDrawBegin(1,Bars-CountBars+11+1);
int i,shift,counted_bars=IndicatorCounted();
int Counter,i1,value10,value11;
double value1,x1,x2;
double value2,value3;
double TrueCount,Range,AvgRange,MRO1,MRO2;
double Table_value2[1000];
double tmp=0;
value10=3+RISK*2;
x1=67+RISK;
x2=33-RISK;
value11=value10;
//----
if(Bars<=11+1) return(0);
//---- initial zero
if(counted_bars<11+1)
{
for(i=1;i<=0;i++) val1[CountBars-i]=0.0;
for(i=1;i<=0;i++) val2[CountBars-i]=0.0;
}
//----
shift=CountBars-11-1;
while(shift>=0)
{
Counter=shift;
Range=0.0;
AvgRange=0.0;
for (Counter=shift; Counter<=shift+9; Counter++) AvgRange=AvgRange+MathAbs(High[Counter]-Low[Counter]);
Range=AvgRange/10;
Counter=shift;
TrueCount=0;
while (Counter<shift+9 && TrueCount<1)
{if (MathAbs(Open[Counter]-Close[Counter+1])>=Range*2.0) TrueCount=TrueCount+1;
Counter=Counter+1;
}
if (TrueCount>=1) {MRO1=Counter;} else {MRO1=-1;}
Counter=shift;
TrueCount=0;
while (Counter<shift+6 && TrueCount<1)
{if (MathAbs(Close[Counter+3]-Close[Counter])>=Range*4.6) TrueCount=TrueCount+1;
Counter=Counter+1;
}
if (TrueCount>=1) {MRO2=Counter;} else {MRO2=-1;}
if (MRO1>-1) {value11=3;} else {value11=value10;}
if (MRO2>-1) {value11=4;} else {value11=value10;}
value2=100-MathAbs(iWPR(NULL,0,value11,shift)); // PercentR(value11=9)
Table_value2[shift]=value2;
val1[shift]=0;
val2[shift]=0;
value3=0;
if (value2<x2)
{i1=1;
while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
if (Table_value2[shift+i1]>x1)
{
value3=High[shift]+Range*0.5;
if (shift == 1 && flagval1==0){ flagval1=1; flagval2=0; }
val1[shift]=value3;
}
}
if (value2>x1)
{i1=1;
while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
if (Table_value2[shift+i1]<x2)
{
value3=Low[shift]-Range*0.5;
if (shift == 1 && flagval2==0) { flagval2=1; flagval1=0; }
val2[shift]=value3;
}
}
shift--;
}
if (flagval1==1 && CurTime() > GlobalVariableGet("AlertTime"+Symbol()+Period()) && GlobalVariableGet("SignalType"+Symbol()+Period())!=OP_BUY) {
if (SoundSellON==1) PlaySound(NameFileSellSound);
if (EmailON==1) 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());
tmp = CurTime() + (Period()-MathMod(Minute(),Period()))*60;
GlobalVariableSet("AlertTime"+Symbol()+Period(),tmp);
GlobalVariableSet("SignalType"+Symbol()+Period(),OP_BUY);
}
if (flagval2==1 && CurTime() > GlobalVariableGet("AlertTime"+Symbol()+Period()) && GlobalVariableGet("SignalType"+Symbol()+Period())!=OP_SELL) {
if (SoundBuyON==1) PlaySound(NameFileBuySound);
if (EmailON==1) 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());
tmp = CurTime() + (Period()-MathMod(Minute(),Period()))*60;
GlobalVariableSet("AlertTime"+Symbol()+Period(),tmp);
GlobalVariableSet("SignalType"+Symbol()+Period(),OP_SELL);
}
return(0);
}
//+------------------------------------------------------------------+
Comments