SMA_ CROSSOVER SIGNAL

SMA_ CROSSOVER SIGNAL

This tool is designed to help traders identify specific moments of trend shifts by highlighting "crossovers" between two different Simple Moving Averages (SMA).

Core Functionality

The script focuses on the relationship between a "Fast" moving average and a "Slow" moving average. While most charts show these as continuous lines, they can sometimes become difficult to read when you zoom out or when the price candles are very crowded. This script solves that problem by identifying the exact point where these two lines intersect and placing a visual marker on the chart instead.

How the Logic Works

The tool continuously scans the price history to look for three specific conditions occurring in sequence:

  • Upward Crossovers: The script looks for a moment where the Fast SMA moves from being below the Slow SMA to being above it. When this happens, the tool places a marker (an arrow) just below the current price candle.
  • Downward Crossovers: Conversely, the script watches for when the Fast SMA drops from being above the Slow SMA to falling below it. In this instance, it places a marker just above the current price candle.

Dynamic Positioning

To ensure the markers are easy to see and do not overlap with the actual price candles, the script calculates the "Range" of the market—which is the average height of the recent bars. It then uses this calculation to offset the markers automatically, placing them at a consistent distance away from the high and low points of the price action.

Key Benefits for Users

  • Clarity: It eliminates the need to squint at overlapping lines, making it easier to see trend changes at a glance.
  • Customizable: You can adjust the periods for both the Fast and Slow moving averages to suit your specific trading strategy.
  • Visual Cleanliness: Because the script identifies the crossover point specifically, you have the option to remove the actual SMA lines from your chart entirely, leaving only the clear visual signals of trend changes.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
7 Views
0 Downloads
0 Favorites
SMA_ CROSSOVER SIGNAL
/*
  +------------------------------------------------------------------+
  | Allows you to enter two 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 SMAs   |
  | from the chart. (SMAs are initially set at 10 and 20)              |
  +------------------------------------------------------------------+
*/   

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

double CrossUp[];
double CrossDown[];
extern int FasterSMA = 10;
extern int SlowerSMA = 20;
//+------------------------------------------------------------------+
//| 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 fasterSMAnow, slowerSMAnow, fasterSMAprevious, slowerSMAprevious, fasterSMAafter, slowerSMAafter;
   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;
       
      fasterSMAnow = iMA(NULL, 0, FasterSMA, 0, MODE_SMA, PRICE_TYPICAL, i);
      fasterSMAprevious = iMA(NULL, 0, FasterSMA, 0, MODE_SMA, PRICE_TYPICAL, i+1);
      fasterSMAafter = iMA(NULL, 0, FasterSMA, 0, MODE_SMA, PRICE_TYPICAL, i-1);

      slowerSMAnow = iMA(NULL, 0, SlowerSMA, 0, MODE_SMA, PRICE_TYPICAL, i);
      slowerSMAprevious = iMA(NULL, 0, SlowerSMA, 0, MODE_SMA, PRICE_TYPICAL, i+1);
      slowerSMAafter = iMA(NULL, 0, SlowerSMA, 0, MODE_SMA, PRICE_TYPICAL, i-1);
      
      if ((fasterSMAnow > slowerSMAnow) && (fasterSMAprevious < slowerSMAprevious) && (fasterSMAafter > slowerSMAafter)) {
         CrossUp[i] = Low[i] - Range*0.5;
      }
      else if ((fasterSMAnow < slowerSMAnow) && (fasterSMAprevious > slowerSMAprevious) && (fasterSMAafter < slowerSMAafter)) {
         CrossDown[i] = High[i] + Range*0.5;
      }
   }
   return(0);
}

Comments