EMA_Prediction_2

Download script
Author: Codersguru
EMA_Prediction_2

This tool is a technical analysis indicator designed to identify potential trend reversals and momentum shifts by tracking the relationship between two moving averages. It simplifies complex price action into visual cues, making it easier for traders to spot specific market behaviors.

Core Logic and Functionality

The script functions by monitoring two distinct "Exponential Moving Averages" (EMA). In technical analysis, EMAs are used to smooth out price fluctuations to reveal the underlying trend. This indicator focuses on how a fast-moving average interacts with a slower-moving average to predict changes in market direction.

1. Signal Detection (The Crossovers) The primary logic of the script relies on "crossovers." When the short-term moving average crosses over the long-term moving average, it suggests a shift in momentum:

  • Bearish Signals: When the fast average was above the slow average but drops below it, the script identifies a potential downward move.
  • Bullish Signals: When the fast average was below the slow average but climbs above it, the script identifies a potential upward move.

2. Visual Feedback and Alerts To make these signals actionable on a live chart, the script provides three layers of visual information:

  • Moving Average Lines: It draws the two EMAs directly on your chart, allowing you to see the current trend flow in real-time.
  • Vertical Markers: When a crossover occurs, the script can place vertical lines on the chart. These act as "anchors" in time, highlighting exactly where the mathematical shift happened.
  • Dynamic "Thumbs" (Performance Tracking): The script includes a unique visual feedback system using icons (thumbs). It evaluates whether a price movement following a signal was successful or not:
    • If a signal aligns with the subsequent price movement, it rewards the logic visually.
    • If the price moves against the predicted signal, it marks it accordingly.

3. Performance Monitoring A unique feature of this script is its internal tracking system. It keeps a running tally of "Right" versus "Wrong" predictions based on the signals generated. This allows users to observe the historical accuracy of the moving average logic over a specific period directly within the data output.

Summary for the User

In simple terms, this script acts as a trend-reversal scout. It watches for the moment momentum shifts from one direction to another, marks those moments with clear visual signals, and provides a live scorecard to help you gauge how often those specific mathematical crossovers have been accurate in past market conditions.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
EMA_Prediction_2
//+------------------------------------------------------------------+
//|                                             EMA_Prediction_2.mq4 |
//|                                                       Codersguru |
//|                                         http://www.forex-tsd.com |
//+------------------------------------------------------------------+


#property copyright "Codersguru"
#property link      "http://www.forex-tsd.com"

extern int ShortEma=1;
extern int LongEma=2;
extern bool Draw_Lines = true;
extern bool Vertical_Lines = true;
extern bool Show_Thumbs = true;

#property indicator_buffers 4
#property indicator_chart_window
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];

double Signal1=0,Signal2=0;
int Previous_Bar = 0;


int init()
  {
  
      IndicatorBuffers(4);
      SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2); 
      SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2); 
      SetIndexArrow(0, 234);
      SetIndexArrow(1, 233);
      SetIndexBuffer(0,ExtMapBuffer1);
      SetIndexBuffer(1,ExtMapBuffer2);


      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,ExtMapBuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,ExtMapBuffer4);
      

   return(0);
  }


void DrawVertical( int bar , double value, color clr)
   {
      
      static int cnt = 0;
      cnt++;
      string dv = "Signal" + cnt;

      ObjectCreate(dv, OBJ_VLINE, 0, Time[bar], 0);
      ObjectSet(dv, OBJPROP_COLOR, clr);
      ObjectsRedraw();  
   }

void DrawThumb( int bar , int thumb , double value, color clr)
   {
      
      static int cnt = 0;
      cnt++;
      string dv = "thumb" + cnt;

      ObjectCreate(dv, OBJ_ARROW, 0, Time[bar], value);
      if(thumb == 1)
      {
         ObjectSet(dv, OBJPROP_ARROWCODE, 67);
      }
      
      if(thumb == 2)
      {
         ObjectSet(dv, OBJPROP_ARROWCODE, 68);
      }
      ObjectSet(dv, OBJPROP_COLOR, clr);
      ObjectSet(dv, OBJPROP_STYLE  , STYLE_SOLID);
      ObjectSet(dv, OBJPROP_WIDTH  , 3);
      ObjectsRedraw();  
   }
   
int deinit()
  {
   int I = WindowsTotal();
   for (int count = 0; count < WindowsTotal(); count++)
   {
      int nObjects = ObjectsTotal();
      for (int i=nObjects; i>=0; i--) 
      {
         string objName = ObjectName(i);
         if(StringFind(objName, "Signal", 0) >= 0)
         ObjectDelete(objName);
         if(StringFind(objName, "thumb", 0) >= 0)
         ObjectDelete(objName);
      }
   }
   return(0);
  }
int start()
  {
   
   int    counted_bars=IndicatorCounted();
//---- 
   int pos = Bars - counted_bars - 1;
   
   static int right = 0 ;
   static int wrong = 0 ;
   
   while (pos>=0)
   {
   
   Signal1=0;
	Signal2=0;
	Previous_Bar=0;

	
	double EmaLongPrevious = iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, pos+1);
	double EmaLongCurrent = iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, pos);
	double EmaShortPrevious = iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, pos+1);
	double EmaShortCurrent = iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, pos);
	
  
   if (Open[pos+1] > Close[pos+1]) Previous_Bar = 1;
   if (Open[pos+1] < Close[pos+1]) Previous_Bar = 2;
   
   int confirm = 0;
   
   if(confirm == 1)
   {
      if (EmaShortPrevious>EmaLongPrevious && EmaShortCurrent<EmaLongCurrent && Previous_Bar == 1) Signal1=High[pos-1];   
      if (EmaShortPrevious<EmaLongPrevious && EmaShortCurrent>EmaLongCurrent && Previous_Bar == 2) Signal2=Low[pos-1];
   }
   else
   {
      if (EmaShortPrevious>EmaLongPrevious && EmaShortCurrent<EmaLongCurrent ) Signal1=High[pos-1];   
      if (EmaShortPrevious<EmaLongPrevious && EmaShortCurrent>EmaLongCurrent ) Signal2=Low[pos-1];
   }
   
   ExtMapBuffer1[pos-1]= Signal1+5*Point;
   ExtMapBuffer2[pos-1]= Signal2-5*Point;
   
   if(Vertical_Lines)
   {
      if(Signal1>0) DrawVertical(pos,0,Blue);
      if(Signal2>0) DrawVertical(pos,0,Red);
   }
   
   if (Show_Thumbs)
   {
      if(Signal1>0 && Open[pos-1] > Close[pos-1])
      {
         DrawThumb(pos-1,1,Signal1+20*Point,Gold);
         right=right+1;
      }
      if(Signal1>0 && Open[pos-1] < Close[pos-1])
      {
         DrawThumb(pos-1,2,Signal1+20*Point,Green);
         wrong=wrong+1;
      }
   
      if(Signal2>0 && Open[pos-1] < Close[pos-1])
      {
         DrawThumb(pos-1,1,Signal2-10*Point,Gold);
         right=right+1;
      }
      if(Signal2>0 && Open[pos-1] > Close[pos-1])
      {
         DrawThumb(pos-1,2,Signal2-10*Point,Green);
         wrong=wrong+1;
      }
   }
    
    if(Draw_Lines)
    {
      ExtMapBuffer3[pos]= EmaLongCurrent;
      ExtMapBuffer4[pos]= EmaShortCurrent;
    }
     
    pos--;
   }
   
   Print ("Wrong = " + wrong + ": Right  = " + right);
   
//----
   return(0);
}

Comments