_3 MA Cross w_Alert v2

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

Overview

This script is a specialized technical analysis tool designed for the MetaTrader platform. Its primary purpose is to identify specific momentum shifts in the market by monitoring the interaction between three different Moving Averages (MAs). By analyzing these averages simultaneously, the tool helps traders spot potential trend reversals or continuations with greater precision than using a single indicator alone.

How the Logic Works

The script operates based on three distinct "Moving Averages"—which can be thought of as smoothed versions of price history—categorized by their speed:

  1. Fast Moving Average: Reacts very quickly to recent price changes.
  2. Medium Moving Average: Provides a balanced view of the current trend.
  3. Slow Moving Average: Represents the broader, long-term market direction.

1. Signal Detection (The "Cross")

The core logic triggers a signal when both the Fast and Medium moving averages align in relation to the Slow moving average. Instead of just looking for a simple crossover, the script validates the movement using a specific multi-point check:

  • Buy/Upward Signal: A signal is generated if the Fast and Medium averages are both positioned above the Slow average, and the script detects that they have recently moved from a position below or equal to it.
  • Sell/Downward Signal: Conversely, a signal is generated if the Fast and Medium averages are both positioned below the Slow average, confirming that they have recently crossed from above or equal to it.

2. Dynamic Visual Positioning

To ensure the indicators do not clutter the price candles on your chart, the script calculates the "Average Range" of the market (the typical distance between highs and lows over a set period). When a signal is identified:

  • Upward signals are placed slightly below the candle's low.
  • Downward signals are placed slightly above the candle's high.

This ensures that the visual markers remain clearly visible regardless of how volatile the market is at that moment.

3. Real-Time Alerts

The script includes an automated notification system. When a valid "Cross Up" or "Cross Down" occurs, it can trigger an audible alert and a pop-up notification on your screen. It also provides the specific time (hour and minute) of the event, allowing you to stay informed even when you are not actively watching the charts.

Summary for the User

Essentially, this tool acts as a "confirmation filter." It waits for the fast-moving price data to agree with the medium-term trend before confirming that they have moved past the long-term average. When this agreement happens, it marks the chart with an arrow and sends you an alert, highlighting potential entry or exit points based on moving average momentum.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
6 Views
0 Downloads
0 Favorites
_3 MA Cross w_Alert v2
// This is Not Tested , Use At Your Own Risk !

//+--------------------------------------------------------------------------+
//| 3 MA Cross w_Alert v2.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 Range, AvgRange;
double fasterMAnow, fasterMAprevious, fasterMAafter;
double mediumMAnow, mediumMAprevious, mediumMAafter;
double slowerMAnow, slowerMAprevious, slowerMAafter;

extern int FasterMA    =    3;
extern int FasterShift =    0;
extern int FasterMode  =    3; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int FasterApply =    1; //0=close, 1=open, dll

extern int MediumMA    =    6;
extern int MediumShift =    0;
extern int MediumMode  =    3; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int MediumApply =    1; //0=close, 1=open, dll

extern int SlowerMA    =   12;
extern int SlowerShift =    0;
extern int SlowerMode  =    3; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SlowerApply =    1; //0=close, 1=open, dll

extern int SoundAlert =    0; // 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, FasterShift, FasterMode, PRICE_CLOSE, i+1);
      fasterMAprevious = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+2);
      fasterMAafter    = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i-1);
      
      mediumMAnow      = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i+1);
      mediumMAprevious = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i+2);
      mediumMAafter    = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i-1);
      
      slowerMAnow      = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i+1);
      slowerMAprevious = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i+2);
      slowerMAafter    = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i-1);
      
      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(), " ", Period()," 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(), " ", Period(), " 3 MA Cross Down @  Hour ",Hour(),"  Minute ",Minute());
       }
   
   //Comment("  CrossUp[0]  ",CrossUp[0]," ,  CrossDown[0]  ",CrossDown[0]," ,  prevtime  ",prevtime);
   //Comment("");
   
   return(0);
 }

Comments