3MA_Cross_w_Alert_v2GS

Download script
Author: Copyright � 2005, Jason Robinson (jnrtrading)
3MA_Cross_w_Alert_v2GS

Overview

This tool is designed for traders who use Moving Averages (MA) to identify trends and entry points. It simplifies the process of monitoring three different moving averages—typically categorized as Fast, Medium, and Slow—by automatically identifying specific "crossover" moments where the market trend may be shifting.

How the Logic Works

The script calculates three separate moving averages based on settings you choose (such as Simple, Exponential, or other common variations). It then monitors the relationship between these three lines to identify high-probability momentum shifts.

1. Trend Identification (The "Crossover")

Instead of just looking at one line crossing another, this logic requires a more specific confirmation to trigger a signal. It looks for instances where:

  • The Fast Average crosses over the Slowest Average.
  • OR, the Medium Average crosses over the Slowest Average.

2. Confirmation Filters

To reduce "fake" signals (noise), the tool applies an extra layer of logic. It doesn't just check if a line crossed; it ensures that the other moving averages are also positioned in a way that supports the move:

  • For an Upward Signal: It checks that both the Fast and Medium averages are currently trading above the Slowest average.
  • For a Downward Signal: It checks that both the Fast and Medium averages are currently trading below the Slowest average.

3. Visual and Audio Alerts

When these specific conditions are met, the script performs three actions:

  • Visual Arrows: It places an arrow on your chart. Upward signals appear below the price candles, and downward signals appear above them.
  • Dynamic Positioning: The arrows are placed at a distance from the candle based on recent market volatility (the "Range"), ensuring they remain visible regardless of how close or far apart the price bars are.
  • Audible Notifications: If enabled, the script will trigger a sound alert and a pop-up notification on your screen the moment a new crossover is confirmed on a completed bar.

Summary for the User

In simple terms, this tool acts as a "trend filter." It waits until at least one of your faster averages crosses the slowest average, then double-checks that the middle average agrees with that direction before notifying you. This helps ensure that you are trading in the direction of the broader momentum rather than reacting to minor, temporary price fluctuations.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
9 Views
0 Downloads
0 Favorites
3MA_Cross_w_Alert_v2GS
// 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 . |
  +-------------------------------------------------------------------------------+
*/   
//  mod. 2008fxtsd eachMAShift taken off; 1GeneralShift 4 all MAs &Sigs; signals after bar close only// ki

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

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Aquamarine
#property indicator_color2 Magenta
#property indicator_color3 Yellow
#property indicator_color4 Red
#property indicator_color5 RoyalBlue

#property indicator_width1 1
#property indicator_width2 1

extern int FasterMA    =    5;
int FasterShift =    0;

//extern int FasterShift =    0;
extern int FasterMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma

extern int MediumMA    =   13;
int MediumShift =    0;

//extern int MediumShift =    -3;
extern int MediumMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma

extern int SlowerMA    =   21;
int SlowerShift =    0;

//extern int SlowerShift =    -1;
extern int SlowerMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int GeneralShift =   0;

extern bool SoundON  =  true;
extern bool Drawlines =true;

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];

double CrossUp[];
double CrossDown[];
double prevtime;
double Range, AvgRange;
double fasterMAnow, fasterMAprevious, fasterMAafter;
double mediumMAnow, mediumMAprevious, mediumMAafter;
double slowerMAnow, slowerMAprevious, slowerMAafter;
double alertTag;
double control=2147483647;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(0, 233);//221
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);
   SetIndexArrow(1, 234);//222
   SetIndexBuffer(1, CrossDown);

   SetIndexShift(0,GeneralShift);   
   SetIndexShift(1,GeneralShift);   

  
   //---- indicators
   
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer1);
   SetIndexShift(2,GeneralShift);   

   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,ExtMapBuffer2);
   SetIndexShift(3,GeneralShift);

   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,ExtMapBuffer3);
   SetIndexShift(4,GeneralShift);


   SetIndexLabel(0,"3MA("+FasterMA+","+MediumMA+","+SlowerMA+")xUp");      
   SetIndexLabel(1,"3MA("+FasterMA+","+MediumMA+","+SlowerMA+")xDn");      
   SetIndexLabel(2,"3MAxFast("+FasterMA+","+MediumMA+","+SlowerMA+")");      
   SetIndexLabel(3,"3MAxMid("+FasterMA+","+MediumMA+","+SlowerMA+")");      
   SetIndexLabel(4,"3MAxSlow("+FasterMA+","+MediumMA+","+SlowerMA+")");      


//----
   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_OPEN,  i);
      
      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_OPEN,  i);
      
      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_OPEN,  i);
 
      if  ((fasterMAnow     > slowerMAnow       &&
           fasterMAprevious <= slowerMAprevious  &&
           fasterMAafter    > fasterMAprevious     &&   
           mediumMAnow      > slowerMAnow     )            // fast x slow up; med>slow            
           ||
          (fasterMAnow     > slowerMAnow       &&
           mediumMAnow      > slowerMAnow       &&
           mediumMAprevious <= slowerMAprevious  &&
           mediumMAafter    > mediumMAprevious   ))        //    med x sl up; fast >slow   
       {
         CrossUp[i] = Low[i] - Range*0.5;
       }
       
 
      if ((fasterMAnow     < slowerMAnow       &&
          fasterMAprevious >= slowerMAprevious  &&
          fasterMAafter    < fasterMAprevious      &&
          mediumMAnow      < slowerMAnow      )        // fast x slow dn; mid<slow
          ||
          (fasterMAnow     < slowerMAnow       &&
          mediumMAnow      < slowerMAnow       &&
          mediumMAprevious >= slowerMAprevious  &&
          mediumMAafter    < mediumMAprevious    ))        // mid x slow dn; fast<slow
       {
         CrossDown[i] = High[i] + Range*0.5;
       }
      
    
   
      if (SoundON==true && i==1 && CrossUp[i] > CrossDown[i] && alertTag!=Time[0])
        {
       Alert("EMA Cross Trend2ss going Down on ",Symbol()," M",Period(),"  @ ",Bid);
        alertTag = Time[0];
        }
        if (SoundON==true && i==1 && CrossUp[i] < CrossDown[i] && alertTag!=Time[0])
        {
       Alert("EMA Cross Trend2ss going Up on ",Symbol()," M",Period(),"  @ ",Bid);
        alertTag = Time[0];
        } 
   
   //Comment("  CrossUp[0]  ",CrossUp[0]," ,  CrossDown[0]  ",CrossDown[0]," ,  prevtime  ",prevtime);
   //Comment("");
 
      if (Drawlines)
        {
         ExtMapBuffer1[i]= iMA(NULL,0,FasterMA,0,FasterMode,PRICE_CLOSE,i);

         ExtMapBuffer2[i]= iMA(NULL,0,MediumMA,0,MediumMode,PRICE_CLOSE,i);

         ExtMapBuffer3[i]= iMA(NULL,0,SlowerMA,0,SlowerMode,PRICE_CLOSE,i);
        }
 
 
     }
   return(0);
 }

Comments