EMA CROSSOVER SIGNAL

Download script
Author: Copyright � 2005, Jason Robinson (jnrtrading)
EMA CROSSOVER SIGNAL

This tool is designed to simplify price action analysis by identifying specific moments when two different moving averages intersect on a trading chart. In technical trading, "moving averages" are used to smooth out price fluctuations to reveal the underlying trend; however, when these averages move very quickly (short periods), they can sometimes become difficult to see clearly because they overlap with the actual price bars or get lost when zooming in or out of a chart.

How the Logic Works

The script functions by tracking two specific moving averages—a "Faster" average and a "Slower" average—and monitoring their relationship relative to each other over time. Here is the step-by-step breakdown of its logic:

1. Establishing the Baseline The tool looks at the current price data and calculates two distinct lines based on settings you choose (the default being 5 periods for the fast line and 6 periods for the slow line). It specifically looks at the "Low Weight Moving Average," which reacts to price changes with a specific mathematical priority.

2. Detecting the Crossover Instead of just showing you where the lines are currently, the script scans the historical data to find the exact moment the two lines crossed paths. To ensure accuracy and avoid "false signals," the logic checks three distinct points in time:

  • The current position of both averages.
  • The previous position (to see if they were moving toward each other).
  • The subsequent position (to confirm the cross actually completed).

3. Visual Signaling When the script identifies these specific crossing points, it places a visual marker directly on your chart so you don't have to hunt for them manually:

  • Upward Cross: If the faster average moves from below the slower average to above it, the script marks this as a potential "buy" signal by placing a green arrow slightly below the price candle.
  • Downward Cross: If the faster average moves from above the slower average to below it, the script marks this as a potential "sell" signal by placing a red arrow slightly above the price candle.

4. Dynamic Positioning To ensure these markers are always easy to see, the script calculates the "Range" of the price (the difference between the high and low points of recent candles). It then uses this math to automatically offset the arrows. This prevents the markers from overlapping with the actual candles, ensuring they remain visible regardless of how volatile the market is at that moment.

Summary for the Trader

Essentially, this script acts as a "highlighter" for momentum shifts. It automates the tedious task of watching two lines move back and forth, pinpointing the exact historical moments where the trend shifted direction and marking them clearly with arrows for your review.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
10 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