StochasticAlertOBOS

Author: Copyright � 2004, MetaQuotes Software Corp.
StochasticAlertOBOS

This script functions as a technical analysis tool designed to help traders identify overbought or oversold conditions in a financial market. It processes historical price data to generate two distinct visual lines on a separate window, providing a simplified view of market momentum.

Core Logic and Data Processing

The tool operates by scanning through recent price history to identify specific price extremes within a user-defined timeframe. Its internal logic follows a multi-step calculation process:

  • Identifying Extremes: The script constantly looks back at the highest and lowest prices achieved over a specific period. It "records" these values to establish the boundaries of recent price movement.
  • Relative Position Calculation: It then determines where the current closing price sits relative to those highs and lows. This is converted into a percentage value between 0 and 100, which forms the primary trend line (often referred to as the %K line).
  • Smoothing the Trend: Because raw price movements can be volatile and "noisy," the script applies a secondary calculation—a moving average—to the primary trend line. This creates a smoother signal line (the %D line) that helps filter out temporary fluctuations and highlights the broader direction of the momentum.

Automated Alert System

Beyond just providing visual data, the script includes an automated monitoring system. It actively watches for "crossovers" between the two lines (the primary trend and the smoothed signal). It is programmed to trigger specific actions based on two main scenarios:

  1. Bullish Signals: If the primary line crosses above the signal line while in a low "oversold" zone, the script identifies this as a potential upward momentum shift.
  2. Bearish Signals: If the primary line crosses below the signal line while in a high "overbought" zone, the script identifies this as a potential downward momentum shift.

When these specific conditions are met, the script provides immediate feedback to the user through both an audible alert sound and an on-screen notification. This allows traders to react quickly to potential trend reversals without having to manually watch the charts at every second.

12 Views
0 Downloads
0 Favorites
StochasticAlertOBOS
//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#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 string Sound1 = "alert.wav";
extern string Sound2 = "alert.wav";
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
extern int OSLevel=30;
extern int OBLevel=70;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| 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
   short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")";
   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);
//----
   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-----------------------------------------------------
{  
  // Calculate values
  double stochk0 = iStochastic(Symbol(), Period(), KPeriod,DPeriod,Slowing, MODE_SMA, 0, MODE_MAIN, 0);
  double stochd0 = iStochastic(Symbol(), Period(), KPeriod,DPeriod,Slowing, MODE_SMA, 0, MODE_SIGNAL, 0);
  double stochk1 = iStochastic(Symbol(), Period(), KPeriod,DPeriod,Slowing, MODE_SMA, 0, MODE_MAIN, 1);
  double stochd1 = iStochastic(Symbol(), Period(), KPeriod,DPeriod,Slowing, MODE_SMA, 0, MODE_SIGNAL, 1);
  
  
  // Output
  static datetime last_cross;
  if (last_cross == Time[0]){
         return(0);
      }
  {
    if (stochk1 <= stochd1 && stochk0 > stochd0 && stochd0<=OSLevel)
    {
      //last_cross = Time[0];
      PlaySound(Sound1);
      Alert(Symbol(),"Stoch crossing up!");
    }else if(stochk1 >= stochd1 && stochk0 < stochd0 && stochd0>=OBLevel){
      PlaySound(Sound2);
      Alert(Symbol(),"Stoch crossing down!");
    }
  }
last_cross = Time[0];
   return(0);
  }
  }
//+------------------------------------------------------------------+

Comments