EMA_CROSSOVER_SIGNAL

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

This tool is designed to simplify how you identify specific trend shifts on your trading charts by highlighting "crossovers" between two different moving averages.

How it Works

The script focuses on the relationship between a Faster Moving Average (which reacts quickly to price changes) and a Slower Moving Average (which follows the broader trend). By comparing these two lines, the tool looks for the exact moment they intersect.

Instead of forcing you to squint at overlapping lines or deal with visual clutter when you zoom out, the script automatically detects these intersections and marks them clearly on your screen.

Key Features & Logic:

  • Automatic Signal Identification: The logic constantly monitors the price history. When the Faster Moving Average moves from below to above the Slower Moving Average, the script identifies a potential upward trend. Conversely, when it drops from above to below, it signals a potential downward trend.
  • Visual Markers: Rather than just drawing lines, the script places specific visual icons (arrows) at the precise point of the crossover.
    • Upward Signals: These appear slightly below the recent price action to indicate a "buy" or bullish momentum.
    • Downward Signals: These appear slightly above the price action to indicate a "sell" or bearish momentum.
  • Dynamic Positioning: To ensure the markers are always easy to see, the script calculates the "range" of the recent candles (the distance between highs and lows). It then places the signal arrows at a consistent distance away from the candles so they don't overlap with the price bars.
  • Customizable Sensitivity: You can adjust the timeframes for both the Faster and Slower averages within the settings. This allows you to tailor the tool to different trading styles, whether you are looking for rapid scalping opportunities or longer-term trend changes.

Why Use This?

The primary purpose of this script is clarity. It removes the guesswork of identifying exactly when a crossover occurred in a "noisy" chart. By providing distinct visual markers, it allows you to see high-probability trend shifts at a glance, even when the actual moving average lines are hidden or difficult to distinguish.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
17 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 SpringGreen
#property indicator_color2 Red
//----
double CrossUp[];
double CrossDown[];
extern int FasterEMA=5;
extern int SlowerEMA=6;
//+------------------------------------------------------------------+
//| 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 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_LWMA, PRICE_CLOSE, i);
      fasterEMAprevious=iMA(NULL, 0, FasterEMA, 0, MODE_LWMA, PRICE_CLOSE, i+1);
      fasterEMAafter=iMA(NULL, 0, FasterEMA, 0, MODE_LWMA, PRICE_CLOSE, i-1);
//----
      slowerEMAnow=iMA(NULL, 0, SlowerEMA, 0, MODE_LWMA, PRICE_CLOSE, i);
      slowerEMAprevious=iMA(NULL, 0, SlowerEMA, 0, MODE_LWMA, PRICE_CLOSE, i+1);
      slowerEMAafter=iMA(NULL, 0, SlowerEMA, 0, MODE_LWMA, PRICE_CLOSE, i-1);
//----
        if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) 
        {
         CrossUp[i]=Low[i] - Range*0.5;
        }
        else if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious) && (fasterEMAafter < slowerEMAafter)) 
        {
            CrossDown[i]=High[i] + Range*0.5;
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+

Comments