Stochastic_Cross_Alert_SigOverlayM_sw

Download script
Author: Copyright � 2006, Robert Hill
Stochastic_Cross_Alert_SigOverlayM_sw

This technical tool is designed for traders using the MetaTrader platform to simplify market analysis by automatically identifying specific momentum shifts. It focuses on the "Stochastic Oscillator," a common technical indicator used to determine whether an asset is overbought or oversold.

Core Functionality

The script monitors two primary components of the Stochastic Oscillator: the "Main" line (the fast-moving average) and the "Signal" line (the slower-moving average). Its primary job is to detect when these lines intersect or cross specific price boundaries, which can indicate potential entry or exit points for trades.

Key Logic Features

The logic is structured to identify three distinct types of market signals:

  • Line Crossings: The script can detect when the fast-moving line crosses over or under the slower signal line. This is a classic momentum indicator used to identify changes in trend direction.
  • Oversold Breakouts: It monitors when the lines move from an "oversold" state (the bottom of the chart) back toward the center, suggesting that a downward price movement might be losing steam and turning upward.
  • Overbought Breakouts: Conversely, it tracks when the lines drop from an "overbought" state (the top of the chart) back toward the center, suggesting that an upward move may be exhausted and could be reversing downward.

Visual and Automated Alerts

To ensure traders do not have to watch the charts constantly, the script includes several automated notification layers:

  1. On-Chart Visuals: When a signal is triggered, the script draws visual arrows on the chart (Green for potential buy signals, Red for potential sell signals) to highlight exactly where the logic was satisfied.
  2. Real-Time Alerts: The tool can trigger an audible sound alert immediately when a condition is met.
  3. Email Notifications: It can send an automated email containing critical trade details, including the current price (Ask/Bid), the specific time of the signal, and the currency pair or asset being traded.

User Customization

The logic is highly adaptable through several settings:

  • Sensitivity: Users can adjust the periods and moving average methods to make the indicator more "fast" (sensitive to small movements) or "slow" (filtering out market noise).
  • Signal Selection: Traders can choose to enable, disable, or combine all three types of logic (Crossings, Oversold, or Overbought) depending on their specific trading strategy.
  • Boundary Thresholds: The levels at which an asset is considered "overbought" or "oversold" can be adjusted to fit different markets.
Price Data Components
Series array that contains open time of each bar
Indicators Used
Stochastic oscillator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emails
15 Views
0 Downloads
0 Favorites
Stochastic_Cross_Alert_SigOverlayM_sw
//compile//
//+------------------------------------------------------------------+
//|                                       Stochastic_Cross_Alert.mq4 |
//|                                    Copyright © 2006, Robert Hill |
//|                                                                  |
//| Written Robert Hill for use with AIME for the stochastic cross   |
//| to draw arrows and popup alert or send email                     |
//| Modified by Linuxser to display in a separate windows            |
//|                                       http://www.linuxser.com.ar |     
//+------------------------------------------------------------------+

#property copyright "Copyright © 2006, Robert Hill"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 LawnGreen
#property indicator_color2 Red
#property indicator_width1  1
#property indicator_width2  1

#property indicator_minimum 0
#property indicator_maximum 100

extern bool SoundON=false;
extern bool EmailON=false;
//---- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
extern int MA_Method = 0; // SMA 0, EMA 1, SMMA 2, LWMA 3
extern int PriceField = 0; // Low/High 0, Close/Close 1
extern int       OverBoughtLevel    =  80;
extern int       OverSoldLevel      =  20;
extern bool show_KD_cross = false;
extern bool show_K_OBOScross = true;
extern bool show_D_OBOScross = false;

extern string   note_Price = "PriceField:  Low/High = 0, Close/Close = 1";
extern string   _MA_Method = "SMA0 EMA1 SMMA2 LWMA3";

double CrossUp[];
double CrossDown[];
int flagval1 = 0;
int flagval2 = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
 
   SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double tmp=0;
   double fastMAnow, slowMAnow, fastMAprevious, slowMAprevious;
   double Range, AvgRange;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
   
   for(i = 1; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,MA_Method, PriceField, MODE_MAIN, i)-iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,MA_Method, PriceField, MODE_MAIN, i+1));
      }
      Range=AvgRange/10;
       
      fastMAnow = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,MA_Method, PriceField, MODE_MAIN, i);
      fastMAprevious = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,MA_Method, PriceField, MODE_MAIN, i+1);

      slowMAnow = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,MA_Method, PriceField, MODE_SIGNAL, i);
      slowMAprevious = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,MA_Method, PriceField, MODE_SIGNAL, i+1);
      
      CrossUp[i] = EMPTY_VALUE;
      CrossDown[i] = EMPTY_VALUE;

      
    if 
    ( ((show_KD_cross)&&(fastMAnow > slowMAnow) && (fastMAprevious < slowMAprevious))||
      ((show_K_OBOScross)&&(fastMAnow > OverSoldLevel) && (fastMAprevious < OverSoldLevel))||
      ((show_D_OBOScross)&&(slowMAnow > OverSoldLevel) && (slowMAprevious < OverSoldLevel)) )

     
      {
         if (i == 1 && flagval1==0)
         {
           flagval1=1;
           flagval2=0;
           if (SoundON) 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 (EmailON) 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());
         }
         CrossUp[i] = fastMAnow - Range;
         CrossDown[i] = EMPTY_VALUE;
      }
    else if 
     
    ( ((show_KD_cross)&&(fastMAnow < slowMAnow) && (fastMAprevious > slowMAprevious))||
      ((show_K_OBOScross)&&(fastMAnow < OverBoughtLevel) && (fastMAprevious > OverBoughtLevel))||
      ((show_D_OBOScross)&&(slowMAnow < OverBoughtLevel) && (slowMAprevious > OverBoughtLevel)) )
      
    {
         if (i == 1 && flagval2==0)
         {
          flagval2=1;
          flagval1=0;
         if (SoundON) Alert("SELL signal at Ask=",Ask,"\n Bid=",Bid,"\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
         if (EmailON) 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());
         }
         CrossDown[i] = fastMAnow + Range;
         CrossUp[i] = EMPTY_VALUE;         
      }
   }

   return(0);
}

Comments