DayImpulse2DD_v1
Download scriptThis tool is designed to help traders visualize market momentum by analyzing the relationship between opening and closing prices over a specific timeframe. Instead of looking at complex price action alone, it focuses on the "impulse"—the net movement that occurs within individual candles—to provide a clearer picture of market direction.
Core Logic and Functionality
The script operates based on three primary visual components:
1. The Main Signal (Market Momentum) The primary line represents the cumulative "strength" of the market over a user-defined period of time. It calculates the difference between every candle's closing price and its opening price within that period. By summing these differences, the tool creates a momentum reading. This value is then shifted forward on the chart, allowing traders to see the historical weight of the movement in a way that helps identify the prevailing trend.
2. Signal 2 (Live Pulse) When enabled, this provides a more immediate view of market activity. It takes the price difference of the most recent candle and projects it forward into the future space of the chart. Because it does not update as time moves forward in the same way as the main signal, it serves as a visual marker for the "current" pulse of the market without being constantly rewritten by the latest price fluctuations.
3. Moving Average (Trend Smoothing) For traders who prefer to filter out minor market "noise," there is an optional Moving Average feature. This applies a smoothing layer over the Main Signal. It helps identify the broader trend of the momentum itself, making it easier to see whether the overall strength of the market is accelerating, decelerating, or staying consistent.
Key Characteristics for the User
- Forward Projection: A unique feature of this script is its "shift" logic. It visually pushes the signals forward on the chart. This is intended to create a visual distinction between historical data and current momentum, though it is important to remember that the "future" space is merely a projection based on current calculations.
- Dynamic Updating: The tool is designed to constantly recalculate every bar. This means that while looking at past bars provides context, the most accurate information is always found in the live, current signal.
- Customizable Sensitivity: Users can adjust how many candles are included in the momentum calculation (the "Period") and how far forward the signals are drawn, allowing for a personalized visual experience based on different trading styles.
/*
* Filename: DayImpulse2DD.mq4
* Author: DriverDan, based on the original by Tartan at the link below
* Date: Nov 3, 2005
*
* Description: Sums the close - open for the past "per" bars and shifts it forward
* "drawShift" bars. Works very well at predicting movement.
*
* Signal2 is just the current bar's close - open shifted "drawShift"
* periods forward. This is what you see as the main signal draws. It
* isn't updated as time moves forward so that you have something to look
* back on.
*
* WARNING: Looking at past bars will be deceiving. It may look like it
* predicts perfectly on some pairs but remember that it is constantly
* updated. The most accurate live bar is the current one.
*
* The future is not set.
*
* Version: 2DD
* Released by DriverDan
* Almost all of the code has been changed or rewritten.
* Added Signal2.
*
* 1.1
* Released by DriverDan
* Fix horrible style, removed extra buffer, changed to draw from the
* beginning, added MA, and fixed gaps in signal.
*
* 1.0
* Initial release
* http://www.arkworldmarket.ru/forum/showthread.php?t=966&page=2&pp=10
*/
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Gold
#property indicator_color2 White
#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 = "DayImplus(" + 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