EMA_5_10_34_Signal

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

This script is designed as a visual trading tool for MetaTrader platforms, specifically created to identify precise "crossover" moments between different moving average trends. Instead of requiring you to manually squint at overlapping lines on a crowded chart, this tool automatically monitors the price action and places clear visual markers exactly where specific trend shifts occur.

Core Logic and Functionality

1. Multi-Layered Trend Monitoring The script tracks three distinct moving averages simultaneously: a "Fast" period (for immediate momentum), a "Medium" period, and a "Slow" period (for the long-term trend). By analyzing all three at once, the tool ensures that a signal is only generated when there is a meaningful shift in price direction rather than just minor market noise.

2. Dynamic Volatility Adjustment One of the key features of this logic is its awareness of price "Range." The script calculates the average height of recent candlesticks (the difference between the highs and lows) over the last 10 bars. It uses this data to determine exactly where to place its visual arrows so that they appear at a consistent, readable distance from the price action, regardless of how volatile the market is at that moment.

3. Signal Detection (The Crossover) The script looks for specific conditions to trigger two types of signals:

  • Bullish Signals (Upward Trend): The tool identifies a "Cross Up" when both the Fast and Medium moving averages are currently trading above the Slow moving average, but were specifically below it on the previous candle. This confirms that the shorter-term momentum has just broken out above the long-term trend.
  • Bearish Signals (Downward Trend): Conversely, it identifies a "Cross Down" when both the Fast and Medium averages are currently below the Slow moving average, but were above it on the previous candle. This marks a shift where shorter-term momentum has dropped below the long-term trend.

User Experience

From a user's perspective, this script cleans up your workspace. Because it identifies these crossovers automatically, you can choose to remove the actual moving average lines from your chart entirely. The tool will still run in the background, providing you with clear visual arrows (Blue for upward signals and Red for downward signals) to highlight exactly when the market trend has officially shifted.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
16 Views
0 Downloads
0 Favorites
EMA_5_10_34_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 Blue
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2

double CrossUp[];
double CrossDown[];
extern int FasterMA = 5;
extern int FasterMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int MediumMA = 10;
extern int MediumMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SlowerMA = 34;
extern int SlowerMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma

double Range, AvgRange;
double fasterMAnow, fasterMAprevious;
double mediumMAnow, mediumMAprevious;
double slowerMAnow, slowerMAprevious;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY,2);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1, DRAW_ARROW, EMPTY,2);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
   SetIndexEmptyValue(1,0.0);
//----
   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, 0, FasterMode, PRICE_CLOSE, i);
      fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);

      mediumMAnow      = iMA(NULL, 0, MediumMA, 0, MediumMode, PRICE_CLOSE, i);
      mediumMAprevious = iMA(NULL, 0, MediumMA, 0, MediumMode, 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);
      
      CrossUp[i] = 0.0;
      CrossDown[i] = 0.0;
      if ((fasterMAnow > slowerMAnow) && (mediumMAnow > slowerMAnow) && (mediumMAprevious < slowerMAprevious) ) {
         CrossUp[i] = Low[i] - Range*0.5;
      }
      else if ((fasterMAnow < slowerMAnow) && (mediumMAnow < slowerMAnow) && (mediumMAprevious > slowerMAprevious) ) {
         CrossDown[i] = High[i] + Range*0.5;
      }
   }
   return(0);
}

Comments