EMA-Crossover_Signal

Download script
Author: Copyright � 2005, Jason Robinson (jnrtrading)
EMA-Crossover_Signal

This tool is designed for traders who use Exponential Moving Averages (EMAs) to identify trends in the financial markets. Because short-term moving averages can sometimes be difficult to see clearly on a chart—especially when they are obscured by price bars or when you zoom out—this script acts as a visual "alert" system that highlights the exact moments these two lines cross paths.

How it works

The logic focuses on the relationship between two different moving averages: a "Faster" EMA and a "Slower" EMA. While the default settings are set to very short periods (5 and 6), you have the flexibility to customize these values based on your specific trading strategy.

The script continuously monitors the price action to detect three specific conditions for both upward and downward crossovers:

  • Upward Crossovers: The script looks for a moment where the Faster EMA moves from being below the Slower EMA to being above it. When this happens, it places a green arrow on your chart.
  • Downward Crossovers: Conversely, the script monitors when the Faster EMA drops from above the Slower EMA to below it. When this occurs, it places a red arrow on your chart.

Key Features

  • Precision Placement: To ensure the signals are easy to see, the script calculates the average range of recent price candles. It then positions the arrows slightly away from the actual price (above or below the candle) so they don't overlap with the bars themselves.
  • Visual Clarity: By using specific colored arrows, the tool allows you to quickly identify trend shifts at a glance without needing to constantly trace the lines of the moving averages manually.
  • Customizable Inputs: You can easily adjust the periods of the EMAs in the settings, allowing the tool to adapt to different timeframes and trading styles.

In short, this script removes the guesswork of identifying "crosses" by automatically marking them on your chart with clear visual indicators, making it easier to spot potential entry or exit points in a fast-moving market.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
15 Views
0 Downloads
0 Favorites
EMA-Crossover_Signal
//+------------------------------------------------------------------+
//|                                         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 Green
#property indicator_color2 Red

double CrossUp[];
double CrossDown[];
double TestLine[];
extern int FasterEMA = 5;
extern int SlowerEMA = 6;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0, DRAW_ARROW, 0, 2); //EMPTY);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, 0, 2); //EMPTY);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
   SetIndexBuffer(2, TestLine);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
   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;
       
      fasterEMAnow = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i);
      fasterEMAprevious = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i+1);
      fasterEMAafter = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);

      slowerEMAnow = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i);
      slowerEMAprevious = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i+1);
      slowerEMAafter = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);
      
      if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) {
         CrossUp[i] = Low[i] - Range*1.5;
      }
      else if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious) && (fasterEMAafter < slowerEMAafter)) {
         CrossDown[i] = High[i] + Range*1.5;
      }
   }
   return(0);
}

Comments