MTF_4TF_FXSniperErgodicCCI_Bars
Download scriptThis script is designed as a multi-timeframe analysis tool that synthesizes market data from several different time horizons—specifically Hourly, 4-Hour, Daily, and Weekly periods—into a single visual display. Its primary purpose is to identify and signal trend direction by monitoring a specific external custom indicator across these various scales simultaneously.
Core Logic Overview
The tool operates by "looking through" the current chart to see what is happening on larger timeframes. Instead of requiring you to switch back and forth between different charts (like jumping from a 15-minute chart to a Weekly chart), it pulls that data into one place.
Key functional components include:
- Multi-Timeframe Synchronization: The script identifies four specific timeframes (H1, H4, D1, and W1). It maps the data from these higher periods onto your current active chart, ensuring that the signals you see are aligned with the "big picture" of the market.
- Trend Detection: It interacts with a secondary custom indicator to check for specific conditions (highs vs. lows). It compares these values to determine if the market is moving in an upward or downward direction on each of those four timeframes.
- Visual Signaling: Based on the results of that analysis, the script populates eight different visual buffers. These are represented as arrows or markers on your screen. By observing these markers, a user can quickly see the trend status for all four major timeframes at once.
- Data Smoothing and Persistence: The logic includes a "refresh" mechanism. This ensures that when you are looking at a smaller timeframe (like a 5-minute chart), the signals from larger timeframes (like the Weekly chart) remain visible and consistent across multiple bars, rather than flickering or disappearing prematurely.
How it works for the user
Essentially, this script acts as a high-level summary dashboard. It automatically scans four different layers of market history, checks if the trend is bullish or bearish on each, and then places visual markers on your current screen to tell you exactly what is happening across all those timeframes simultaneously.
//+------------------------------------------------------------------+
//| MTF_Supertrend2_Bars.mq4 |
//| Copyright © 2006, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eli hayun."
#property link "http://www.elihayun.com"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 5
#property indicator_buffers 8
#property indicator_color1 Crimson
#property indicator_color2 Maroon
#property indicator_color3 FireBrick
#property indicator_color4 Maroon
#property indicator_color5 MediumTurquoise
#property indicator_color6 DarkTurquoise
#property indicator_color7 MediumTurquoise
#property indicator_color8 LightSeaGreen
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
extern string CustomIndicator = "FXSnipersErgodic_CCITrigger";
extern int pq =2;
extern int pr = 10;
extern int ps = 5;
extern int trigger =3;
extern int Maxbars = 1000;
//extern int NbPeriods = 10;
//extern int LSMA_Period = 5;
extern int TF4 = PERIOD_H1;
extern int TF3 = PERIOD_H4;
extern int TF2 = PERIOD_D1;
extern int TF1 = PERIOD_W1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,110);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,110);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,110);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexEmptyValue(2,0.0);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(3,110);
SetIndexBuffer(3,ExtMapBuffer4);
SetIndexEmptyValue(3,0.0);
SetIndexStyle(4,DRAW_ARROW);
SetIndexArrow(4,110);
SetIndexBuffer(4,ExtMapBuffer5);
SetIndexEmptyValue(4,0.0);
SetIndexStyle(5,DRAW_ARROW);
SetIndexArrow(5,110);
SetIndexBuffer(5,ExtMapBuffer6);
SetIndexEmptyValue(5,0.0);
SetIndexStyle(6,DRAW_ARROW);
SetIndexArrow(6,110);
SetIndexBuffer(6,ExtMapBuffer7);
SetIndexEmptyValue(6,0.0);
SetIndexStyle(7,DRAW_ARROW);
SetIndexArrow(7,110);
SetIndexBuffer(7,ExtMapBuffer8);
SetIndexEmptyValue(7,0.0);
//----
SetIndexLabel(0,"MTF_SnErgCCI("+TF4+")");
SetIndexLabel(1,"MTF_SnErgCCI("+TF3+")");
SetIndexLabel(2,"MTF_SnErgCCI("+TF2+")");
SetIndexLabel(3,"MTF_SnErgCCI("+TF1+")");
SetIndexLabel(4,"MTF_SnErgCCI("+TF4+")");
SetIndexLabel(5,"MTF_SnErgCCI("+TF3+")");
SetIndexLabel(6,"MTF_SnErgCCI("+TF2+")");
SetIndexLabel(7,"MTF_SnErgCCI("+TF1+")");
//---
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
int limit;
int TF[] = {0,0,0,0};
TF[0] = TF1;
TF[1] = TF2;
TF[2] = TF3;
TF[3] = TF4;
limit = MathMin(counted_bars,Maxbars);
if (limit ==0)
limit = Maxbars;
for (int ii=0; ii<limit; ii++)
{
ExtMapBuffer1[ii] = 0;
ExtMapBuffer2[ii] = 0;
ExtMapBuffer3[ii] = 0;
ExtMapBuffer4[ii] = 0;
ExtMapBuffer5[ii] = 0;
ExtMapBuffer6[ii] = 0;
ExtMapBuffer7[ii] = 0;
ExtMapBuffer8[ii] = 0;
for (int jj=0; jj<4; jj++)
{
int y = iBarShift(NULL, TF[jj], Time[ii]);
SetIndicator(GetCustomBars(TF[jj], y), jj, ii);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
bool GetCustomBars(int TF, int shift)
{
double h = iCustom(Symbol(), TF, CustomIndicator, 2,10,5,3,0, shift);
double l = iCustom(Symbol(), TF, CustomIndicator, 2,10,5,3,1, shift);
return(h<l);
}
void SetIndicator(bool isUP, int ind, int shift)
{
if (isUP)
{
switch (ind)
{
case 3: ExtMapBuffer1[shift] = ind+1; break;
case 2: ExtMapBuffer2[shift] = ind+1; break;
case 1: ExtMapBuffer3[shift] = ind+1; break;
case 0: ExtMapBuffer4[shift] = ind+1; break;
}
} else {
switch (ind)
{
case 3: ExtMapBuffer5[shift] = ind+1; break;
case 2: ExtMapBuffer6[shift] = ind+1; break;
case 1: ExtMapBuffer7[shift] = ind+1; break;
case 0: ExtMapBuffer8[shift] = ind+1; break;
}
}
//---- Refresh buffers ++++++++++++++++++++ upgrade by Raff
int TimeFrame,TimeArray[],i; if (TimeFrame>Period()) {
int PerINT=TimeFrame/Period()+1;
datetime TimeArr[]; ArrayResize(TimeArr,PerINT);
ArrayCopySeries(TimeArr,MODE_TIME,Symbol(),Period());
for(i=0;i<PerINT+1;i++) {if (TimeArr[i]>=TimeArray[0]) {
//----
/********************************************************
Refresh buffers: buffer[i] = buffer[0];
********************************************************/
ExtMapBuffer1[i] = ExtMapBuffer1[0];
ExtMapBuffer2[i] = ExtMapBuffer2[0];
ExtMapBuffer3[i] = ExtMapBuffer3[0];
ExtMapBuffer4[i] = ExtMapBuffer4[0];
ExtMapBuffer5[i] = ExtMapBuffer5[0];
ExtMapBuffer6[i] = ExtMapBuffer6[0];
ExtMapBuffer7[i] = ExtMapBuffer7[0];
ExtMapBuffer8[i] = ExtMapBuffer8[0];
//----
} } }
//+++++++++++++++++++++++++++++++++++++++++++++++ Raff
return(0);
}
Comments