Elder_Impulse_MTF1

Download script
Author: Copyright � 2007, Hartono Setiono
Elder_Impulse_MTF1

Technical Logic Overview

The eSignal indicator is designed to provide traders with a visual representation of market momentum and trend direction by synthesizing two primary technical analysis tools: the Exponential Moving Average (EMA) and the MACD (Moving Average Convergence Divergence).

Instead of showing these indicators in their raw form, the script processes their data to identify "concurrence"—moments where both the trend and the momentum agree on a specific direction.

Core Components

The logic relies on three distinct data streams:

  1. EMA Trend Tracking: It monitors the Exponential Moving Average to determine the overall direction of price movement over a user-defined period.
  2. MACD Momentum Analysis: It calculates the relationship between fast and slow moving averages to identify the strength of the current price impulse.
  3. Multi-Timeframe Integration: A unique feature of this script is its ability to "look" at different timeframes. It can calculate data from higher periods (like Daily or Weekly) while you are viewing a smaller timeframe, allowing for a broader perspective on market sentiment.

How the Logic Functions

The script performs a real-time comparison between the current state of the EMA and the MACD. It looks for specific "agreement" signals:

  • Bearish Signal: If both the EMA trend is pointing downward and the MACD momentum is decreasing, the script identifies a strong bearish signal.
  • Bullish Signal: If both the EMA trend is pointing upward and the MACD momentum is increasing, the script identifies a strong bullish signal.
  • Neutral/Mixed Signal: If the indicators provide conflicting information (e.g., the price is trending up but momentum is slowing down), the script treats this as a neutral zone.

Visual Output and Customization

The indicator displays these signals in a separate window at the bottom of your chart using colored histograms. The logic allows for three different ways to visualize the "intensity" of these signals:

  1. Standard Bar: Shows a uniform height to simply indicate direction.
  2. MACD Style: Scales the height based on the raw MACD value, showing the magnitude of the trend.
  3. OSMA Style: Scales the height based on the Oscillator value (the difference between the MACD line and its signal), highlighting volatility and momentum shifts more aggressively.

By filtering out "noisy" movements where indicators disagree, this logic aims to highlight high-probability trends where both the long-term trend and short-term momentum are moving in harmony.

Indicators Used
Moving average indicatorMACD Histogram
Miscellaneous
Implements a curve of type %1
15 Views
0 Downloads
0 Favorites
Elder_Impulse_MTF1
//+------------------------------------------------------------------+
//|                                                      eSignal.mq4 |
//|                               Copyright © 2007,  Hartono Setiono |
//|                                          http://www.mitrakom.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007,  Hartono Setiono"
#property link      "http://www.mitrakom.com"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_width1 4
#property indicator_color2 Lime
#property indicator_width2 4
#property indicator_color3 Blue
#property indicator_width3 4

//#property indicator_color4 Silver
//#property indicator_width4 1

//---- input parameters
extern int       TimeFrame=0;
extern int       EMA_Period=13;
extern int       MACD_FastPeriod=12;
extern int       MACD_SlowPeriod=26;
extern int       MACD_SignalPeriod=9;
extern bool      UseMT4MACD=false;
extern int       DisplayType=1;
extern string    N1="DisplayType Setting:";
extern string    N2="1:Bar/Histogram Only";
extern string    N3="2:Bar as MACD Histogram";
extern string    N4="3:Bar as OSMA Histogram";

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];

double MACDLineBuffer[];
double MACDSignalLineBuffer[];
double MACDHistogramBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;

   IndicatorBuffers(6);
   
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   //SetIndexArrow(0,110);
   SetIndexBuffer(0,ExtMapBuffer1);
   
   SetIndexStyle(1,DRAW_HISTOGRAM);
   //SetIndexArrow(1,110);
   SetIndexBuffer(1,ExtMapBuffer2);
   
   SetIndexStyle(2,DRAW_HISTOGRAM);
   //SetIndexArrow(2,110);
   SetIndexBuffer(2,ExtMapBuffer3);

/*
   if(DisplayType==2)
   {
     SetIndexStyle(3,DRAW_LINE);
     SetIndexBuffer(3,MACDSignalLineBuffer);
   }
*/

   SetIndexEmptyValue(3,0.0);
   SetIndexBuffer(3,MACDSignalLineBuffer);
   SetIndexEmptyValue(4,0.0);
   SetIndexBuffer(4,MACDLineBuffer);
   SetIndexEmptyValue(5,0.0);
   SetIndexBuffer(5,MACDHistogramBuffer);
   
   switch(TimeFrame)
   {
      case 1 : short_name="Period_M1"; break;
      case 5 : short_name="Period_M5"; break;
      case 15 : short_name="Period_M15"; break;
      case 30 : short_name="Period_M30"; break;
      case 60 : short_name="Period_H1"; break;
      case 240 : short_name="Period_H4"; break;
      case 1440 : short_name="Period_D1"; break;
      case 10080 : short_name="Period_W1"; break;
      case 43200 : short_name="Period_MN1"; break;
      default : {short_name="Current Timeframe"; TimeFrame=0;}
   }
   short_name="Impulse Indicator("+short_name+", "+EMA_Period+":"+MACD_FastPeriod+","+MACD_SlowPeriod+","+MACD_SignalPeriod+")";

   IndicatorShortName(short_name);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
   SetIndexLabel(3,NULL);
   //SetIndexLabel(4,NULL);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i,limit,y=0,counted_bars=IndicatorCounted();
   double ema1, main1, signal1, ema0, main0, signal0, macd1, macd0, main;
   double alpha = 2.0 / (MACD_SignalPeriod + 1.0);
   double alpha_1 = 1.0 - alpha;
   double BarValue;   
 
   limit=Bars-counted_bars;
   for(i=limit-1; i >= 0; i--)
   {
      y = iBarShift(NULL,TimeFrame,Time[i]); 
      ema0=iMA(NULL,TimeFrame,EMA_Period,0,MODE_EMA,PRICE_CLOSE,y); 
      ema1=iMA(NULL,TimeFrame,EMA_Period,0,MODE_EMA,PRICE_CLOSE,y+1); 

      if(UseMT4MACD)
      {
        main0=iMACD(NULL, TimeFrame, MACD_FastPeriod, MACD_SlowPeriod, MACD_SignalPeriod, PRICE_CLOSE,0,y); 
        main1=iMACD(NULL, TimeFrame, MACD_FastPeriod, MACD_SlowPeriod, MACD_SignalPeriod, PRICE_CLOSE,0,y+1); 

        signal0=iMACD(NULL, TimeFrame, MACD_FastPeriod, MACD_SlowPeriod, MACD_SignalPeriod, PRICE_CLOSE,1,y); 
        signal1=iMACD(NULL, TimeFrame, MACD_FastPeriod, MACD_SlowPeriod, MACD_SignalPeriod, PRICE_CLOSE,1,y+1); 
        
        main=main0; 
        macd0=main0-signal0;
        macd1=main1-signal1;
      } else
      {
        MACDLineBuffer[y] = iMA(NULL,TimeFrame,MACD_FastPeriod,0,MODE_EMA,PRICE_CLOSE,y)- 
                            iMA(NULL,TimeFrame,MACD_SlowPeriod,0,MODE_EMA,PRICE_CLOSE,y);
        MACDSignalLineBuffer[y]=(alpha*MACDLineBuffer[y]) + (alpha_1*MACDSignalLineBuffer[y+1]);
        MACDHistogramBuffer[y]=MACDLineBuffer[y]-MACDSignalLineBuffer[y];
        
        main=MACDLineBuffer[y]; 
        macd0=MACDHistogramBuffer[y];
        macd1=MACDHistogramBuffer[y+1];
      }
        
      switch(DisplayType)
      {
        case 1:BarValue=1; break;
        case 2:BarValue=main; break;
        case 3:BarValue=macd0; break;
      }
      
      if(ema0<ema1 && macd0<macd1) //both down
      {
        ExtMapBuffer1[i]=BarValue;
        ExtMapBuffer2[i]=0;
        ExtMapBuffer3[i]=0;
      } else
      if(ema0>ema1 && macd0>macd1) //both up
      {
        ExtMapBuffer1[i]=0;
        ExtMapBuffer2[i]=BarValue;
        ExtMapBuffer3[i]=0;
      } else  //otherwise
      {
        ExtMapBuffer1[i]=0;
        ExtMapBuffer2[i]=0;
        ExtMapBuffer3[i]=BarValue;
      }
   }
   return(0);
  }
//+------------------------------------------------------------------+

Comments