SMMA-Crossover_Signal

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

This tool is designed to help traders identify specific momentum shifts in the market by pinpointing exactly where two different moving averages intersect. In visual trading, "Moving Averages" are lines that smooth out price data to show the general trend; however, when viewing charts at certain zoom levels or on busy timeframes, it can be difficult to see the precise moment these lines cross each other.

How the Logic Works:

The script functions by monitoring two distinct types of moving averages simultaneously: a "Faster" average (which reacts quickly to recent price changes) and a "Slower" average (which tracks the broader, long-term trend).

Instead of requiring you to squint at the lines, the script performs a three-point calculation on every candle:

  1. It looks at the current position of both averages.
  2. It looks back at where they were in the previous candle.
  3. It looks forward at where they are positioned in the following candle.

Signal Detection: The logic triggers a visual signal only when a definitive "crossover" is confirmed.

  • Bullish Signals: If the Faster average moves from below the Slower average to above it, the script places an upward-pointing arrow. This suggests that short-term momentum is gaining strength relative to the long-term trend.
  • Bearish Signals: If the Faster average drops from above the Slower average to below it, the script places a downward-pointing arrow. This suggests that short-term momentum is weakening.

Visual Clarity: To ensure the arrows don't clutter the actual price candles, the script calculates the "Range" (the distance between the high and low prices) of the surrounding candles. It then automatically offsets the arrows so they appear clearly above or below the price action, making it easier for a trader to identify entry or exit points at a glance without removing the primary price data from the screen.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
SMMA-Crossover_Signal
//+------------------------------------------------------------------+
//|                                         SMA-Crossover_Signal.mq4 |
//|         Copyright © 2005, Jason Robinson (jnrtrading)            |
//|                   http://www.jnrtading.co.uk                     |
//+------------------------------------------------------------------+

/*
  +-------------------------------------------------------------------+
  | Allows you to enter two smoothed sma 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. (smas are initially set at 9 and 18)     |
  +-------------------------------------------------------------------+
*/   
#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 FasterSMMA = 9;
extern int SlowerSMMA = 18;
//+------------------------------------------------------------------+
//| 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 fasterSMMAnow, slowerSMMAnow, fasterSMMAprevious, slowerSMMAprevious, fasterSMMAafter, slowerSMMAafter;
   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;
       
      fasterSMMAnow = iMA(NULL, 0, FasterSMMA, 0, MODE_SMMA, PRICE_CLOSE, i);
      fasterSMMAprevious = iMA(NULL, 0, FasterSMMA, 0, MODE_SMMA, PRICE_CLOSE, i+1);
      fasterSMMAafter = iMA(NULL, 0, FasterSMMA, 0, MODE_SMMA, PRICE_CLOSE, i-1);

      slowerSMMAnow = iMA(NULL, 0, SlowerSMMA, 0, MODE_SMMA, PRICE_CLOSE, i);
      slowerSMMAprevious = iMA(NULL, 0, SlowerSMMA, 0, MODE_SMMA, PRICE_CLOSE, i+1);
      slowerSMMAafter = iMA(NULL, 0, SlowerSMMA, 0, MODE_SMMA, PRICE_CLOSE, i-1);
      
      if ((fasterSMMAnow > slowerSMMAnow) && (fasterSMMAprevious < slowerSMMAprevious) && (fasterSMMAafter > slowerSMMAafter)) {
         CrossUp[i] = Low[i] - Range*0.5;
      }
      else if ((fasterSMMAnow < slowerSMMAnow) && (fasterSMMAprevious > slowerSMMAprevious) && (fasterSMMAafter < slowerSMMAafter)) {
         CrossDown[i] = High[i] + Range*0.5;
      }
   }
   return(0);
}

Comments