MA_Crossover_Signal_v1

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

This script is designed as a visual trading tool for the MetaTrader platform to help traders identify specific trend shifts by pinpointing exactly when two moving averages intersect.

Core Functionality

The primary purpose of this tool is to highlight "crossover" events—moments where a faster-moving average line crosses over a slower-moving average line. Because these crossovers can sometimes be difficult to see on a busy chart (especially when zoomed out or when the price bars are large), the script places clear visual markers (arrows) at the exact point of intersection.

How the Logic Works

The script operates by monitoring two different moving averages simultaneously. You can customize both the "Faster" and "Slower" periods, as well as the calculation method (such as Simple, Exponential, or Smoothed Moving Averages).

  1. Dynamic Calculation: The script continuously calculates the current value of both moving averages, as well as their values from the previous bar and the subsequent bar.
  2. Crossover Detection: It looks for a specific three-point sequence to confirm a valid crossover:
    • Bullish Signal (Upward): It identifies a point where the faster average was below the slower one in the past but has moved above it in the current position, while maintaining that lead in the following period.
    • Bearish Signal (Downward): Conversely, it looks for the moment the faster average drops below the slower one.
  3. Smart Positioning: To ensure the markers don't clutter the actual price bars, the script calculates a "Range" based on recent price volatility (the difference between highs and lows). It then places the arrows slightly above or below the candles by half of that range, ensuring they remain visible and out of the way of the main price action.

Key Benefits for Traders

  • Visual Clarity: By removing the need to manually track two moving average lines, the script provides instant visual alerts on trend changes.
  • Clean Charts: It allows you to hide the moving average lines entirely while still keeping the markers that show where those averages crossed.
  • Precision: It filters out "noise" by verifying the crossover across multiple points rather than just a single instantaneous jump, helping to confirm more reliable signals.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
MA_Crossover_Signal_v1
//+------------------------------------------------------------------+
//|                                         EMA-Crossover_Signal.mq4 |
//|         Copyright © 2005, Jason Robinson (jnrtrading)            |
//|                   http://www.jnrtading.co.uk                     |
//+------------------------------------------------------------------+

/*
  +------------------------------------------------------------------+
  | Allows you to enter two ema periods and it will then show you at |
  | Which point they crossed over. It is more usful on the shorter   |
  | periods that get obscured by the bars / candlesticks and when    |
  | the zoom level is out. Also allows you then to remove the emas   |
  | from the chart. (emas are initially set at 5 and 6)              |
  +------------------------------------------------------------------+
*/   
#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 DodgerBlue
#property indicator_color2 Red

double CrossUp[];
double CrossDown[];
extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA =   13;
extern int SlowerMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA =   25;
//+------------------------------------------------------------------+
//| 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 fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
   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 = 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);
      fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
      fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i-1);

      slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i);
      slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+1);
      slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i-1);
      
      if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
         CrossUp[i] = Low[i] - Range*0.5;
      }
      else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
         CrossDown[i] = High[i] + Range*0.5;
      }
   }
   return(0);
}

Comments