EmaCrosswithRSI3

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

This tool is designed to help traders identify specific momentum shifts in the market by monitoring the relationship between different moving averages and price oscillators. Its primary goal is to highlight "crossover" events—moments where one trend line breaks through another—which can serve as visual signals for potential buying or selling opportunities.

Core Functionality

The script operates by tracking two main types of technical indicators simultaneously:

1. Exponential Moving Average (EMA) Crossovers The logic focuses on two moving averages: a "Faster" one and a "Slower" one. Because moving averages can sometimes be difficult to see clearly when zoomed out or cluttered by price bars, this script specifically identifies the exact point where the faster line crosses over the slower line.

  • Bullish Signal (Cross Up): When the Faster EMA moves from below to above the Slower EMA, the script places a visual marker on the chart. This suggests upward momentum.
  • Bearish Signal (Cross Down): When the Faster EMA moves from above to below the Slower EMA, the script places a visual marker. This suggests downward momentum.

2. Relative Strength Index (RSI) Breaches In addition to moving averages, the script monitors the RSI, which measures the speed and change of price movements. It looks for specific "mid-point" breaks:

  • When the RSI climbs above the 50 level, it triggers a signal indicating positive momentum.
  • When the RSI drops below the 50 level, it triggers a signal indicating negative momentum.

Visual and Notification Features

To ensure these signals are easy to interpret, the script includes several user-friendly features:

  • Automated Plotting: Instead of making you squint at lines on a busy chart, the script places distinct visual markers (arrows) directly above or below the candles where the crossovers occur.
  • Dynamic Spacing: The script automatically calculates the "range" (volatility) of recent price bars to ensure that these markers are placed at a consistent, readable distance from the candles, regardless of how much you zoom in or out.
  • Real-Time Alerts: The logic includes an optional notification system. If enabled, the script will trigger a pop-up alert on your screen the moment a crossover occurs in real-time, ensuring you don't miss a signal while away from the screen.

Summary for the User

Essentially, this tool acts as a "scout." It constantly scans the history and current price action to find two specific types of confirmation: when trend lines cross each other and when momentum shifts across the 50-point mark. By translating these mathematical calculations into clear visual markers and alerts, it helps traders simplify their analysis and focus on key entry and exit points.

Indicators Used
Moving average indicatorRelative strength index
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
EmaCrosswithRSI3
//+------------------------------------------------------------------+
//|                                         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 4
#property indicator_color1 Yellow
#property indicator_color2 Aqua
#property indicator_color3 Blue
#property indicator_color4 Red

#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1

double CrossUp[];
double CrossDown[];
double RSIUp[];
double RSIDown[];

extern int FasterEMA = 5;
extern int SlowerEMA = 12;
extern bool Alerts = false;

int upalert=false,downalert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 241);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 242);
   SetIndexBuffer(1, CrossDown);
   SetIndexStyle(2, DRAW_ARROW, EMPTY);
   SetIndexArrow(2, 167);
   SetIndexBuffer(2, RSIUp);
   SetIndexStyle(3, DRAW_ARROW, EMPTY);
   SetIndexArrow(3, 167);
   SetIndexBuffer(3, RSIDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double RSI, RSIp,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);
      
      RSI=iRSI(NULL,0,21,PRICE_CLOSE,i);
      RSIp=iRSI(NULL,0,21,PRICE_CLOSE,i+1);
      
      
      if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) {
         CrossUp[i] = Low[i] - Range*1.6;
         if(i<=2 && Alerts && !upalert)
           {
            Alert (Symbol()," ",Period(),"M  EMACross UP ");
            //SendMail("EMA Cross Up on "+Symbol(),"");
            upalert=true;
            downalert=false;
            }
      }
      if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious) && (fasterEMAafter < slowerEMAafter)) {
         CrossDown[i] = High[i] + Range*1.2;
         if(i<=2 && Alerts && !downalert)
           {
            Alert (Symbol()," ",Period(),"M  EMACross DOWN ");
            //SendMail("EMA Cross Down on "+Symbol(),"");
            downalert=true;
            upalert=false;
            }
      }
      
      if( RSI > 50 && RSIp<=50) RSIUp[i] = Low[i] - Range*1;
       if( RSI < 50 && RSIp >=50) RSIDown[i] = High[i] + Range*1.2;
      
   }
   return(0);
}

Comments