Up_Down_v1
Download scriptThis script is a specialized technical analysis tool designed for the MetaTrader 4 platform. Its primary purpose is to identify significant price milestones—specifically "Highs" and "Lows"—based on historical price action and time-based shifts, then display these levels as visual markers on your trading chart.
Core Logic Overview
The script functions by scanning historical data to find the highest and lowest price points within specific windows of time. Rather than using a simple moving average, it looks for "extremes" (peaks and valleys). It then calculates an average of these extremes over a set period to determine a "boundary" level.
Key Features and Functionality
-
Dynamic Timeframe Adaptability: The script contains unique logic for several specific timeframes (e.g., 5-minute, 15-minute, 30-minute, 60-minute, 240-minute, daily, weekly, and monthly charts). It automatically adjusts its scanning behavior depending on which chart you have open.
-
Contextual Recognition: The tool is programmed to recognize significant "breaks" in time, such as:
- New Hours or Days (for shorter timeframes).
- Specific 4-hour intervals (for the 30 and 60-minute charts).
- Weekly transitions (Sunday to Monday).
- Monthly changes.
-
Price Level Calculation: When the script detects a significant time transition, it looks backward to capture a series of high and low points. It calculates the average of these highs and lows while factoring in the "spread" (the difference between the buy and sell price) to ensure the levels are mathematically accurate to real market conditions.
-
Visual Signaling: The script determines the current trend by comparing the recent closing price against these calculated averages:
- If the price closes above a specific high-average threshold, it prepares a "Down" signal.
- If the price closes below a specific low-average threshold, it prepares an "Up" signal.
- These signals are then plotted on your chart as visual arrows (Lime for one direction, Tomato for the other), helping traders quickly identify potential trend shifts or reversal zones.
Summary for the User
Essentially, this script acts as a "Smart Level Detector." It ignores minor market noise and focuses on significant historical peaks and valleys. By calculating averages of these extremes, it provides you with visual cues that highlight where the market is currently interacting with previous high or low boundaries across various time horizons.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| Up&Down.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Tomato
//---- input parameters
extern int HL_period=3;
extern int NumBars=200;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//------
double ur[][2];
int h1[];
int l1[];
int hh=0;
int ll=0;
double spread;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
ArrayResize(ur,NumBars+1);
ArrayResize(h1,HL_period);
ArrayResize(l1,HL_period);
spread = Ask-Bid;
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int n,shift,Nbar,k,mm;
double MaH,MaL;
//----
if( Period() == 5 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeHour(Time[shift + 1]) != TimeHour(Time[shift]) )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 15;
while( n <= shift + HL_period * 12 + 5 )
{
if( n < 0 )
{
n = 1;
Nbar = 0;
}
if( TimeHour(Time[n + 1]) != TimeHour(Time[n]) && Nbar == -1 )
{
Nbar = n;
mm = n;
n++;
continue;
}
if( TimeHour(Time[n + 1]) != TimeHour(Time[n]) && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//-----------------------------
if( Period() == 15 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeHour(Time[shift + 1]) != TimeHour(Time[shift]) )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 5;
while( n <= shift + HL_period * 4 + 2 )
{
if( n < 0 )
{
n = 1;
Nbar = 0;
}
if( TimeHour(Time[n + 1]) != TimeHour(Time[n]) && Nbar == -1 )
{
Nbar = n;
mm = n;
n++;
continue;
}
if( TimeHour(Time[n + 1]) != TimeHour(Time[n]) && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//-------------------------
if( Period() == 30 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeMinute(Time[shift])==0 && (TimeHour(Time[shift])==0 || TimeHour(Time[shift])==4 || TimeHour(Time[shift])==8 || TimeHour(Time[shift])==12 || TimeHour(Time[shift])==16 || TimeHour(Time[shift])==20) )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 10;
while( n <= shift + HL_period * 8 + 5 )
{
if( n < 0 )
{
n = 1;
Nbar = 0;
}
if( TimeMinute(Time[n])==0 && (TimeHour(Time[n])==0 || TimeHour(Time[n])==4 || TimeHour(Time[n])==8 || TimeHour(Time[n])==12 || TimeHour(Time[n])==16 || TimeHour(Time[n])==20) && Nbar == -1 )
{
Nbar = n;
mm = n;
n++;
continue;
}
if( TimeMinute(Time[n])==0 && (TimeHour(Time[n])==0 || TimeHour(Time[n])==4 || TimeHour(Time[n])==8 || TimeHour(Time[n])==12 || TimeHour(Time[n])==16 || TimeHour(Time[n])==20) && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//----
if( Period() == 60 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeMinute(Time[shift])==0 && (TimeHour(Time[shift])==0 || TimeHour(Time[shift])==4 || TimeHour(Time[shift])==8 || TimeHour(Time[shift])==12 || TimeHour(Time[shift])==16 || TimeHour(Time[shift])==20) )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 6;
while( n <= shift + HL_period * 4 + 3 )
{
if( n < 0 )
{
Nbar = 0;
n = 1;
}
if( TimeMinute(Time[n])==0 && (TimeHour(Time[n])==0 || TimeHour(Time[n])==4 || TimeHour(Time[n])==8 || TimeHour(Time[n])==12 || TimeHour(Time[n])==16 || TimeHour(Time[n])==20) && Nbar == -1 )
{
Nbar = n;
mm = n;
n++;
continue;
}
if( TimeMinute(Time[n])==0 && (TimeHour(Time[n])==0 || TimeHour(Time[n])==4 || TimeHour(Time[n])==8 || TimeHour(Time[n])==12 || TimeHour(Time[n])==16 || TimeHour(Time[n])==20) && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//--------------
if( Period() == 240 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeDay(Time[shift + 1]) != TimeDay(Time[shift]) )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 8;
while( n <= shift + HL_period * 8 + 4 )
{
if( n < 0 )
{
Nbar = 0;
n = 1;
}
if( TimeDay(Time[n + 1]) != TimeDay(Time[n]) && Nbar == -1 )
{
Nbar = n;
mm = n;
n++;
continue;
}
if( TimeDay(Time[n + 1]) != TimeDay(Time[n]) && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//----
if( Period() == 1440 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeDayOfWeek(Time[shift + 1]) == 5 && TimeDayOfWeek(Time[shift]) == 1 )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 6;
while( n <= shift + HL_period * 5 + 3 )
{
if( n < 0 )
{
Nbar = 0;
n = 1;
}
if( TimeDayOfWeek(Time[n + 1])==5 && TimeDayOfWeek(Time[n])==1 && Nbar == -1 )
{
Nbar = n;
mm = n;
n++;
continue;
}
if( TimeDayOfWeek(Time[n + 1])==5 && TimeDayOfWeek(Time[n])==1 && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//----
if( Period() == 10080 )
{
ArrayInitialize(ur,0);
ArrayInitialize(h1,0);
ArrayInitialize(l1,0);
for( shift = NumBars; shift>=0; shift-- )
{
if( TimeMonth(Time[shift + 1]+1440*60) != TimeMonth(Time[shift]+1440*60) )
{
Nbar = -1;
k = 0;
mm = 0;
n = shift - 8;
while( n <= shift + HL_period * 8 + 4 )
{
if( n < 0 )
{
Nbar = 0;
n = 1;
}
if( TimeMonth(Time[n + 1]+1440*60) != TimeMonth(Time[n]+1440*60) && Nbar == -1 )
{
Nbar = n;
mm = n;
if( n>NumBars-18 ) Print(TimeToStr(Time[n]));
n++;
continue;
}
if( TimeMonth(Time[n + 1]+1440*60) != TimeMonth(Time[n]+1440*60) && Nbar != -1 )
{
h1[k] = Highest(NULL,0,MODE_HIGH,n - Nbar,n-(n-Nbar)+1);
l1[k] = Lowest(NULL,0,MODE_LOW,n - Nbar,n-(n-Nbar)+1);
k++;
Nbar = n;
}
n++;
}
MaH = 0;
MaL = 0;
for( n = 0; n<HL_period; n++ )
{
MaH = MaH + High[h1[n]]+spread;
MaL = MaL + Low[l1[n]];
}
MaH = MaH / HL_period;
MaL = MaL / HL_period;
ur[shift][0] = MaH;
ur[shift][1] = MaL;
if( Close[mm + 1]+spread/2 >= MaH ) { ll = 1; hh = 0; }
if( Close[mm + 1]+spread/2 <= MaL ) { hh = 1; ll = 0; }
}
if( ur[shift,1] == 0 )
{
ur[shift][0] = ur[shift + 1][0];
ur[shift][1] = ur[shift + 1][1];
}
if( ll == 1 )
{
ExtMapBuffer2[shift]=0;
ExtMapBuffer1[shift]=ur[shift][1];
}
if( hh == 1 )
{
ExtMapBuffer1[shift]=0;
ExtMapBuffer2[shift]=ur[shift][0];
}
}
return(0);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments