XprofuterDD

XprofuterDD

This indicator is designed to provide traders with a visual representation of price momentum and trends by analyzing the relationship between opening and closing prices over a specific timeframe. Instead of looking at raw price action, it focuses on the "distance" traveled by the price during each candle.

Core Logic and Functionality

Price Movement Accumulation The primary logic of the script involves calculating the difference between the opening price and the closing price for a set number of consecutive candles (defined by the user). By summing these differences, the indicator creates a "Signal" line. This helps to smooth out minor price fluctuations and highlight the underlying direction of the market over a specific period.

Forward Shifting A unique characteristic of this tool is its ability to "shift" the visual data forward. This means the signals are projected ahead on the chart, allowing traders to see the current momentum aligned with a specific visual offset rather than just pinned to the most recent closed candle.

Trend Smoothing (Optional Moving Average) The script includes an optional secondary layer where it can calculate a Moving Average based specifically on the Signal line itself. Rather than calculating a moving average of the price, it calculates an average of the momentum. This helps traders identify when the current momentum is accelerating or decelerating relative to its recent history.

Comparative Analysis (Signal 2) The script also features an optional secondary signal. While the main signal aggregates data over multiple candles, this second option allows for a direct comparison by displaying the difference between the open and close of a single candle shifted forward. This provides a way to compare immediate price action against the broader accumulated momentum.

Summary of Visual Outputs

  • Primary Signal: A line representing the cumulative sum of price movements over a chosen period.
  • Moving Average (Optional): A smoothed trend line that tracks the Primary Signal to help identify major turns in momentum.
  • Secondary Signal (Optional): A dotted line showing individual candle movement for a more granular comparison against the main signal.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
XprofuterDD
//+------------------------------------------------------------------+
//|                                                                  |
//|                 Filename:    XprofuterDD.mq4                     |
//|                                                                  |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 3
//----
#property indicator_color1  Red
#property indicator_color2  Green
#property indicator_color3  DodgerBlue
//----
extern int per       =14;  // Period for signal
extern int drawShift =14;  // Forward shift
extern int useMA     =0;   // 1 = use MA
extern int maPeriod  =34;  // Moving average period
extern int useSignal2=0;   // Show current close - open shifted forward
// Buffers for signals
double ExtMapBuffer[];
double maBuffer[];
double closeBuffer[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int init() 
  {
   string title="XProfuter(" + per + ")";
   // Signal and MA are normal lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, ExtMapBuffer);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexBuffer(1, maBuffer);
   // Signal2 is a dotted line
   SetIndexStyle(2, DRAW_LINE, 2, 1);
   SetIndexBuffer(2, closeBuffer);
   // Shift everything forward
   SetIndexShift(0, drawShift);
   SetIndexShift(1, drawShift);
   SetIndexShift(2, drawShift);
   // Titles for each line
   SetIndexLabel(0, "Signal(" + per + ")");
   SetIndexLabel(1, "MA(" + maPeriod + ")");
   SetIndexLabel(2, "Signal2(" + per + ")");
//----
     if(useMA==1) 
     {
      title=title + " MA(" + maPeriod + ")";
     }
   IndicatorShortName(title);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int start() 
  {
   int    counted_bars=IndicatorCounted();
   int    shift, i, imp, limit, lim;
   // This is to make sure we go back and update bars that have already been drawn.
   // This was missing in the original release. If it's not done the live signal line
   // will be the same as Signal2.
     if(counted_bars > per) 
     {
      limit=Bars - counted_bars + per;
      }
       else 
      {
      limit=Bars - 1;
     }
   // Loop through and calculate the signals. Everytime this runs we recalculate the
   // current and all future signals. The future is not set :)
     for(shift=limit; shift>=0; shift--) 
     {
      imp=0;
      // This isn't really needed but makes sure we don't look for future,
      // non-existant open and close points. It's just proper coding. You never know
      // how a program will handle variables that don't exist. MT4 currently sets them
      // to zero but you don't know if that will change.
        if(shift - per < 0) 
        {
         lim=0;
         }
          else 
         {
         lim=shift - per;
        }
      // Calculate the signal
        for(i=shift; i>=lim; i--) 
        {
         imp=imp + (Close[i] - Open[i])/Point;
        }
      ExtMapBuffer[shift]=imp;
      // If Signal2 is being used set it.
        if(useSignal2==1) 
        {
         closeBuffer[i]=(Close[i] - Open[i])/Point;
        }
     }
   // If we're using the MA calculate it.
     if(useMA==1) 
     {
        for(shift=Bars - counted_bars - 1; shift>=0; shift--) 
        {
           if(shift < Bars - maPeriod && shift < Bars - per) 
           {
            maBuffer[shift]=iMAOnArray(ExtMapBuffer, 0, maPeriod, 0, MODE_SMA, shift);
           }
        }
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments