IINWMARROWS_004
Download scriptThis script is designed as a visual trading tool for the MetaTrader platform, intended to identify specific momentum shifts in the market by analyzing moving averages. Instead of just showing you lines on a chart, it translates mathematical crossovers into clear visual signals (arrows) to help traders spot potential trend changes.
How the Logic Works
The core functionality of this script relies on comparing two different types of "moving averages"—mathematical indicators that smooth out price data to show the general direction of the market. One is designated as the "Faster" average and the other as the "Slower" average.
1. Identifying Trend Crossovers The script constantly monitors the relationship between these two averages. It looks for specific moments where the Faster average moves from below the Slower average to above it, or vice versa. These "crosses" are often interpreted by traders as signals that the market momentum is shifting from bearish (downward) to bullish (upward), or the opposite.
2. Verifying the Signal To ensure the signal is accurate and not just a temporary fluctuation, the script performs a three-point check:
- It looks at the current position of both averages.
- It checks where they were in the previous candle.
- It confirms the movement by looking at the preceding historical data point. By verifying the crossover across these points, the script ensures that an arrow only appears when a definitive "crossing" event has occurred.
3. Dynamic Visual Placement To make the signals easy to read on a price chart, the script calculates a "Range" value for each specific area of the chart. It does this by measuring the height of the price candles over a 10-bar period.
- Bullish Signals (Upward): When a crossover indicates an upward shift, the script places an arrow below the current price candle.
- Bearish Signals (Downward): When a crossover indicates a downward shift, it places an arrow above the current price candle.
By using the "Range" calculation, the script ensures that these arrows are placed at a consistent distance from the candles—neither too close to be cluttered nor too far away to be distracting—regardless of how volatile the market is at that moment.
//+------------------------------------------------------------------+
//| IINWMARROWS.mq4 |
//| Based on EMA_CROSS.mq4 |
//| Copyright © 2006, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//| Last little modified by Iin Zulkarnain |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 White
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2
double CrossUp[];
double CrossDown[];
extern int FasterMode = 3; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 3;
extern int SlowerMode = 3; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 3;
//+------------------------------------------------------------------+
//| 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 fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
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;
fasterMAnow = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i);
fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i-1);
slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_OPEN, i);
slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_OPEN, i+1);
slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_OPEN, i-1);
if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
}
else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
CrossDown[i] = High[i] + Range*0.5;
}
}
return(0);
}
Comments