3 MA Cross w_Alert

Download script
Author: Copyright � 2005, Jason Robinson (jnrtrading)
3 MA Cross w_Alert

Overview of the 3 MA Cross Indicator

This script is designed to assist traders in identifying potential momentum shifts by monitoring the relationship between three different Moving Averages (MA) on a price chart. By analyzing how these averages interact with one another, the tool highlights specific moments where trend reversals or continuations may be occurring.

Core Logic and Functionality

The indicator operates based on the following logic:

1. Multi-Layered Average Analysis The script tracks three distinct Moving Averages simultaneously:

  • Fast: Reacts quickly to recent price changes.
  • Medium: Provides a balanced view of intermediate trends.
  • Slow: Represents the broader, long-term trend.

Users can customize the calculation type for each (such as Simple, Exponential, Smoothed, or Linear Weighted) and define their respective time periods.

2. Trend Identification Signals The tool looks for specific "crossover" conditions where the faster averages move past the slowest average. Rather than simply alerting on a single cross, the logic requires a more robust confirmation:

  • Bullish Signal (Cross Up): The script identifies an upward opportunity when the Fast MA crosses above the Slow MA, provided that the Medium MA is also positioned above the Slow MA. It looks for these conditions to stabilize across multiple price points to ensure the signal is not just a temporary "hiccup" in the data.
  • Bearish Signal (Cross Down): Conversely, a downward opportunity is identified when the Fast MA crosses below the Slow MA while the Medium MA also remains below the Slow MA.

3. Visual and Audible Alerts To ensure traders don't miss these movements, the script provides two primary types of notifications:

  • On-Chart Markers: When a crossover condition is met, the indicator places a visual arrow on the chart (Aqua for upward moves, Coral for downward moves). The placement of these arrows is dynamically adjusted based on the current price range to ensure they remain clearly visible.
  • Real-Time Notifications: If enabled, the script will trigger an audible alert and a pop-up notification the exact moment a new crossover occurs. It includes a built-in "memory" to ensure that it only alerts you once per candle, preventing repetitive notifications during a single price movement.

Summary of Use

Essentially, this script filters out market "noise" by requiring agreement between at least two moving averages (Fast and Medium) before confirming a trend change against the Slow average. It serves as a technical filter to help traders spot confirmed transitions from bearish to bullish sentiment (or vice versa) in real-time.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
10 Views
0 Downloads
0 Favorites
3 MA Cross w_Alert
//+--------------------------------------------------------------------------+
//| 3 MA Cross w_Alert.mq4                                                   |
//| Copyright © 2005, Jason Robinson (jnrtrading)                            |
//| http://www.jnrtading.co.uk                                               |
//| 3 ma conversion and Alert , David Honeywell , transport.david@gmail.com  |
//| http://finance.groups.yahoo.com/group/MetaTrader_Experts_and_Indicators/ |
//+--------------------------------------------------------------------------+

/*
  +-------------------------------------------------------------------------------+
  | Allows you to enter 3 ma periods and it will then show you and alert you at   |
  | which point the 2 faster ma's "OPEN" are both above or below the Slowest ma . |
  +-------------------------------------------------------------------------------+
*/   

#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)"
#property link      "http://www.jnrtrading.co.uk"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Coral

double CrossUp[];
double CrossDown[];
double prevtime;
double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
double Range, AvgRange, mediumMAnow, mediumMAprevious, mediumMAafter;
extern int FasterMode =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int FasterMA   =    5;
extern int MediumMode =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int MediumMA   =   20;
extern int SlowerMode =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SlowerMA   =   34;

extern int SoundAlert =    1; // 0 = disabled

//+------------------------------------------------------------------+
//| 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;
   
   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 = 0; i <= limit; i++)
    {
      
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
       {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
       }
      Range=AvgRange/10;
       
      fasterMAnow      = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
      fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+2);
      fasterMAafter    = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i);
      
      mediumMAnow      = iMA(NULL, 0, MediumMA, 0, MediumMode, PRICE_CLOSE, i+1);
      mediumMAprevious = iMA(NULL, 0, MediumMA, 0, MediumMode, PRICE_CLOSE, i+2);
      mediumMAafter    = iMA(NULL, 0, MediumMA, 0, MediumMode, PRICE_CLOSE, i);
      
      slowerMAnow      = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+1);
      slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+2);
      slowerMAafter    = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i);
      
      if ((fasterMAnow     > slowerMAnow       &&
          fasterMAprevious <= slowerMAprevious  &&
          fasterMAafter    > slowerMAafter     &&
          mediumMAnow      > slowerMAnow     )
          ||
          (fasterMAnow     > slowerMAnow       &&
          mediumMAnow      > slowerMAnow       &&
          mediumMAprevious <= slowerMAprevious  &&
          mediumMAafter    > slowerMAafter   ))
       {
         CrossUp[i] = Low[i] - Range*0.5;
       }
       
      if ((fasterMAnow     < slowerMAnow       &&
          fasterMAprevious >= slowerMAprevious  &&
          fasterMAafter    < slowerMAafter     &&
          mediumMAnow      < slowerMAnow     )
          ||
          (fasterMAnow     < slowerMAnow       &&
          mediumMAnow      < slowerMAnow       &&
          mediumMAprevious >= slowerMAprevious  &&
          mediumMAafter    < slowerMAafter   ))
       {
         CrossDown[i] = High[i] + Range*0.5;
       }
      
    }
   
      if ((CrossUp[0] > 2000) && (CrossDown[0] > 2000)) { prevtime = 0; }
      
      if ((CrossUp[0] == Low[0] - Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
       {
         prevtime = Time[0];
         Alert(Symbol()," 3 MA Cross Up @  Hour ",Hour(),"  Minute ",Minute());
       }
      
      if ((CrossDown[0] == High[0] + Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
       {
         prevtime = Time[0];
         Alert(Symbol()," 3 MA Cross Down @  Hour ",Hour(),"  Minute ",Minute());
       }
   
   //Comment("  CrossUp[0]  ",CrossUp[0]," ,  CrossDown[0]  ",CrossDown[0]," ,  prevtime  ",prevtime);
   //Comment("");
   
   return(0);
 }

Comments