Stoch_Sound_Email
Download scriptThis script is designed as a technical analysis tool for the MetaTrader trading platform. Its primary purpose is to track and visualize price momentum using a "Stochastic Oscillator" while providing automated notifications for traders when specific price movements occur.
Core Functionality
1. Momentum Tracking (The Stochastic Oscillator) The tool calculates two main visual lines on a separate window below your main price chart:
- The Main Line (%K): This represents the current position of the price relative to its high and low range over a specific period. It helps traders see if the asset is currently "overbought" (trading too high) or "oversold" (trading too low).
- The Signal Line: This is a smoothed average of the Main Line. By following this line, the tool filters out minor "noise" in the price movement to reveal the broader trend.
2. Visual Indicators The script automatically plots these two lines on your screen. It also establishes visual boundaries (levels) at specific points:
- An upper boundary (typically 80) to identify high-pressure zones.
- A lower boundary (typically 20) to identify low-pressure zones.
Automated Alert System
The main utility of this script for many users is its ability to "watch" the market and broadcast notifications without requiring constant manual supervision. It monitors the relationship between the Main Line and the Signal Line:
- Buy Signals: When the Main Line crosses above the Signal Line, the script identifies an upward momentum shift.
- Sell Signals: When the Main Line crosses below the Signal Line, the script identifies a downward momentum shift.
Notification Options
Depending on how you configure the settings, the script can communicate these signals to you in three different ways:
- On-Screen Visuals: You can see the lines moving and interacting in real-time.
- Audio Alerts: If enabled, the script will play a specific sound file (e.g., "alert2.wav") the moment a crossover occurs, providing an immediate audible cue to check your trades.
- Email Notifications: The script can automatically send an email to your registered account. These emails include the specific details of the alert, such as:
- The type of signal (Buy or Sell).
- The current price of the asset.
- The exact time and date the signal was triggered.
Summary of User Experience
For a non-programmer, this tool acts like a 24/7 automated assistant. It calculates complex mathematical averages of recent highs and lows to determine if the market is gaining or losing steam. When it detects a significant shift in that momentum (a "crossover"), it proactively notifies you via sound or email so you can make informed trading decisions quickly.
//+------------------------------------------------------------------+
//| Stoch_Sound_Email.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property link " Alerts added by cja"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
//---- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
extern bool SoundAlert_ON = false;
extern string SoundFile ="alert2.wav";
extern bool SendEmail = false;
extern int StochLEVEL_UP = 80;
extern int StochLEVEL_DN = 20;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
#define SIGNAL_BAR 1
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- 2 additional buffers are used for counting.
IndicatorBuffers(4);
SetIndexBuffer(2, HighesBuffer);
SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, MainBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
string ALRT1="",ALRT2="";
if(SoundAlert_ON==true)ALRT1="ON";
if(SoundAlert_ON==false)ALRT1="OFF";
if(SendEmail==true)ALRT2="ON";
if(SendEmail==false)ALRT2="OFF";
short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+") [ Sound Alert "+ALRT1+" ] [ Email Alert "+ALRT2+" ]";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
//----
draw_begin1=KPeriod+Slowing;
draw_begin2=draw_begin1+DPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
SetLevelValue(0,StochLEVEL_UP);
SetLevelValue(1,StochLEVEL_DN);
SetLevelStyle(2,0,DarkSlateGray);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Stochastic oscillator |
//+------------------------------------------------------------------+
int start()
{
int i,k;
int counted_bars=IndicatorCounted();
double price;
//----
if(Bars<=draw_begin2) return(0);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
}
//---- minimums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double min=1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=Low[k];
if(min>price) min=price;
k--;
}
LowesBuffer[i]=min;
i--;
}
//---- maximums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double max=-1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=High[k];
if(max<price) max=price;
k--;
}
HighesBuffer[i]=max;
i--;
}
//---- %K line
i=Bars-draw_begin1;
if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
while(i>=0)
{
double sumlow=0.0;
double sumhigh=0.0;
for(k=(i+Slowing-1);k>=i;k--)
{
sumlow+=Close[k]-LowesBuffer[k];
sumhigh+=HighesBuffer[k]-LowesBuffer[k];
}
if(sumhigh==0.0) MainBuffer[i]=100.0;
else MainBuffer[i]=sumlow/sumhigh*100;
i--;
}
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars;
//---- signal line is simple movimg average
for(i=0; i<limit; i++)
SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i);
// Alert code
static int PrevSignal = 0, PrevTime = 0;
if(SIGNAL_BAR > 0 && Time[0] <= PrevTime)
return(0);
PrevTime = Time[0];
if(PrevSignal <= 0)
{
if(MainBuffer[SIGNAL_BAR]>SignalBuffer[SIGNAL_BAR])
if (SendEmail==true)SendMail("Stochastic "+Symbol()+" M"+Period()+"","Stochastic Xrossed UP"+"\n"+Symbol()+" M"+Period()+", BUY @ "+DoubleToStr(Bid,Digits)+"\n"
+"Time = "+TimeToStr(TimeLocal(),TIME_SECONDS)+"\n"+"Date = "+TimeToStr(TimeLocal(),TIME_DATE)+"");
{
PrevSignal = 1;
if(SoundAlert_ON==true)PlaySound(SoundFile);
}
}
if(PrevSignal >= 0)
{
if( MainBuffer[SIGNAL_BAR] < SignalBuffer[SIGNAL_BAR])
if (SendEmail==true)SendMail("Stochastic "+Symbol()+" M"+Period()+"","Stochastic Xrossed DOWN"+"\n "+Symbol()+" M"+Period()+", SELL @ "+DoubleToStr(Bid,Digits)+"\n"
+"Time = "+TimeToStr(TimeLocal(),TIME_SECONDS)+"\n"+"Date = "+TimeToStr(TimeLocal(),TIME_DATE)+"");
{
PrevSignal = -1;
if(SoundAlert_ON==true)PlaySound(SoundFile);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments