1. Introduction
Fractals are one of the classic tools introduced by legendary trader Bill Williams. These simple yet powerful markers are used to identify local swing highs and lows in price action. When used correctly, Fractals can help traders pinpoint reversal areas or breakout setups.
However, Fractals plotted on lower timeframes are often prone to noise and false signals. This is where the concept of multi-timeframe analysis becomes important.
The Fractals Multi-Timeframe Indicator for MT5 allows traders to overlay fractal signals from a higher timeframe directly onto the current chart. This provides cleaner, more reliable market structure references — without needing to constantly switch timeframes.
The Fractals Multi-Timeframe Indicator for MT5 (Fractals_MTF) Indicator for MetaTrader 5 provides directional signals from all 21 standard timeframes, ranging from M1 to MN1.
For each timeframe, it displays a directional arrow object (`OBJ_ARROW`) using Wingdings character 108:
🟢 Green arrow = upward ADX signal
🔴 Red arrow = downward ADX signal
After gathering these signals, the indicator calculates a consensus summary using a unique logic:
If the number of **up** signals is greater than **down + 1**, the indicator plots a larger **Wingdings 217** upward arrow
* If the number of **down** signals is greater than **up + 1**, it plots a larger **Wingdings 218** downward arrow
This enables traders to view a high-confidence trend direction based on multi-timeframe Fractals indicator analysis directly on the main chart.
2. About This Indicator
The Fractals Multi-Timeframe Indicator for MT5 (Fractals_MTF) utilizes a template and displays a panel on the chart. Its function, operation, and usage are identical to the On Balance Volume Multi-Timeframe Indicator for MT5 (OBV_MTF) as detailed in the previous article. For a comprehensive guide on creating a multi-timeframe indicator, you can refer to the following resources: On Balance Volume Multi-Timeframe Indicator for MT5
3. Visual Example
Here is a sample chart showing the indicator in action:
4. Key Features:
✅ 21-Timeframe Fractals Scanning
✅ Wingdings Arrows Overlay (per timeframe)
✅ Summary Arrow with Up/Down Consensus Calculation
✅ Color Customization for Each Signal
✅ Built-in Alerts (pop-up, email, mobile)
✅ Graphical Interface Panel for Timeframe Switching (via `OnChartEvent`)
Inputs and Parameters
| Input | Description |
| --------------- | ------------------------------------------ |
| `ArrowUp` | Color of up signal arrow |
| `ArrowDn` | Color of down signal arrow |
| `NTArrow` | Color of neutral arrow (default) |
| `f_model` | Font type for arrows (usually "Wingdings") |
| `alerts` | Enable/disable alert popups |
| `UseEmailAlert` | Enable email alerts |
| `UseSendnotify` | Enable push notification alerts |
Why Multi-Timeframe Fractals Matters?
Fractals are powerful in identifying **waves of price movement strength** but lack responsiveness in **trend consistency** across multiple timeframes. This custom Fractals_MTF indicator solved this:
📈 Confirm trading signals across all timeframes
⚠️ Avoid sideways or weak markets using visual confirmation
🚨 Detect strong breakouts supported by multiple timeframe trend directions
Using **all 21 timeframes** (from M1 to MN1) ensures broad trend consistency in your decision-making process.
5. Technical Overview: How the Indicator Works
Timeframe Management
//---
virtual void Fractals_MTF_Config(void)
{
//--
ENUM_TIMEFRAMES TFId[] = {PERIOD_M1, PERIOD_M2, ..., PERIOD_MN1};
tfxar=ArraySize(TFIx); // total 21 timeframes
ArrayResize(TFId,tfxar,tfxar);
ArrayCopy(TFId,TFIx,0,0,WHOLE_ARRAY);
//--
for(int x=0; x<tfxar; x++)
hFRA[x]=iFractals(Symbol(),TFId[x]); // Handle of iFractals Indicator on each timeframe
//--
DeletedFRAObject();
FRAMovementCalculation(25);
PositionCore();
//--
if(display)
DrawFRAObject();
//---
}
//---
/*
Handles for all timeframe-specific Fractals indicators are stored in `hFRA[]` and initialized inside `OnInit()` using `iFractals()` for each timeframe.
*/
Signal Extraction Logic
Each timeframe is scanned using:
//---
int FRADirectionScan(const ENUM_TIMEFRAMES stf,int shift) // Scan iFractals Direction
{
//--
int ret=0;
int rise=1,
down=-1;
//--
int br=fbar;
double res=0.0;
UpdatePrice(stf);
//--
double FRAUp[];
double FRADw[];
ArrayResize(FRAUp,br,br);
ArrayResize(FRADw,br,br);
//--
int xx=TFIndexArray(stf);
CopyBuffer(hFRA[xx],0,0,br,FRAUp);
CopyBuffer(hFRA[xx],1,0,br,FRADw);
//--
ArraySetAsSeries(FRAUp,true);
ArraySetAsSeries(FRADw,true);
//--
int fup=br-1,
fdw=br-1;
//--
for(int x=br-1; x>=0; x--)
{
if(FRAUp[x]!=EMPTY_VALUE) fup=x;
if(FRADw[x]!=EMPTY_VALUE) fdw=x;
}
//--
if(fdw<fup && fdw>shift) ret=rise; //
if(fup<fdw && fup>shift) ret=down; //
//--
return(ret);
//---
} //-end FRADirectionScan()
//---
Consensus Calculation Logic.
//---
void FRAMovementCalculation(int barCnt) // Scan the direction of iFractals on each timeframe
{
//--
ArrayResize(PowerMove,barCnt,barCnt);
ArraySetAsSeries(PowerMove,true);
//--
for(int i=barCnt-1; i>=0; i--)
{
up=0;
dw=0;
//--
for(int x=0; x<tfxar; x++)
{
Arwcolor[x]=NTArrow;
PowerMove[i]=0.0;
int PPM=FRADirectionScan(TFId[x],0);
if(PPM>0)
{
up++;
Arwcolor[x]=ArrowUp;
}
if(PPM<0)
{
dw++;
Arwcolor[x]=ArrowDn;
}
if(x==tfxar-1)
{
if(up>dw+1)
{
PowerMove[i]=1.0;
TColor=ArrowUp;
curAlert=1;
}
if(dw>up+1)
{
PowerMove[i]=-1.0;
TColor=ArrowDn;
curAlert=-1;
}
}
}
}
//--
return;
//---
} //-end FRAMovementCalculation()
//---
/*
This logic ensures that only dominant directional consensus (not slight differences) triggers a clear summary signal.
*/
Dynamic Timeframe Panel (OnChartEvent)
The indicator creates a clickable panel on the chart containing labels for all 21 timeframes. When a label (e.g., "H4") is clicked, the internal reference timeframe for analysis is updated.
This makes it easy for the user to interact with the indicator dynamically.
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
//--- handling CHARTEVENT_CLICK event ("Clicking the chart")
ResetLastError();
//--
if(id==CHARTEVENT_OBJECT_CLICK)
{
//--- if "X" button is click
if(sparam=="X")
{
mi.DeletedFRAObject();
//--- unpress the button
ObjectSetInteger(mi.CI,"X",OBJPROP_STATE,false);
ObjectSetInteger(mi.CI,"X",OBJPROP_ZORDER,0);
//--
mi.display=false;
ObjectDelete(mi.CI,"X");
mi.DisplayPanelButton();
}
//--- if "cstar" button is click
if(sparam==mi.cstar)
{
mi.DeletedFRAObject();
mi.DisplayPanelButton();
//--- unpress the button
ObjectSetInteger(mi.CI,mi.cstar,OBJPROP_STATE,false);
ObjectSetInteger(mi.CI,mi.cstar,OBJPROP_ZORDER,0);
if(!mi.display)
mi.display=true;
if(mi.corpos==mi.posbot) ObjectDelete(mi.CI,mi.arbot);
if(mi.corpos==mi.postop) ObjectDelete(mi.CI,mi.artop);
mi.DrawFRAObject();
//--
ChartRedraw(mi.CI);
}
//--- if "artop" button is click
if(sparam==mi.artop)
{
mi.DeletedFRAObject();
mi.DisplayPanelButton();
//--- unpress the button
ObjectSetInteger(mi.CI,mi.artop,OBJPROP_STATE,false);
ObjectSetInteger(mi.CI,mi.artop,OBJPROP_ZORDER,0);
if(!mi.display)
mi.display=true;
ObjectDelete(mi.CI,mi.artop);
mi.PanelPosChange(mi.postop);
//--
ObjectDelete(mi.CI,"X");
mi.DisplayButtonClick("arbot");
mi.DrawFRAObject();
//--
ChartRedraw(mi.CI);
}
//--- if "arbot" button is click
if(sparam==mi.arbot)
{
mi.DeletedFRAObject();
mi.DisplayPanelButton();
//--- unpress the button
ObjectSetInteger(mi.CI,mi.arbot,OBJPROP_STATE,false);
ObjectSetInteger(mi.CI,mi.arbot,OBJPROP_ZORDER,0);
if(!mi.display)
mi.display=true;
ObjectDelete(mi.CI,mi.arbot);
mi.PanelPosChange(mi.posbot);
//--
ObjectDelete(mi.CI,"X");
mi.DisplayButtonClick("artop");
mi.DrawFRAObject();
//--
ChartRedraw(mi.CI);
}
//--- if TF button is click
//--
if(sparam==mi.TFSc[0])
{
mi.ChangeChartSymbol(mi.TFSc[0],mi.TFId[0]);
}
//--
if(sparam==mi.TFSc[1])
{
mi.ChangeChartSymbol(mi.TFSc[1],mi.TFId[1]);
}
//--
if(sparam==mi.TFSc[2])
{
mi.ChangeChartSymbol(mi.TFSc[2],mi.TFId[2]);
}
//--
if(sparam==mi.TFSc[3])
{
mi.ChangeChartSymbol(mi.TFSc[3],mi.TFId[3]);
}
//--
if(sparam==mi.TFSc[4])
{
mi.ChangeChartSymbol(mi.TFSc[4],mi.TFId[4]);
}
//--
if(sparam==mi.TFSc[5])
{
mi.ChangeChartSymbol(mi.TFSc[5],mi.TFId[5]);
}
//--
if(sparam==mi.TFSc[6])
{
mi.ChangeChartSymbol(mi.TFSc[6],mi.TFId[6]);
}
//--
if(sparam==mi.TFSc[7])
{
mi.ChangeChartSymbol(mi.TFSc[7],mi.TFId[7]);
}
//--
if(sparam==mi.TFSc[8])
{
mi.ChangeChartSymbol(mi.TFSc[8],mi.TFId[8]);
}
//--
if(sparam==mi.TFSc[9])
{
mi.ChangeChartSymbol(mi.TFSc[9],mi.TFId[9]);
}
//--
if(sparam==mi.TFSc[10])
{
mi.ChangeChartSymbol(mi.TFSc[10],mi.TFId[10]);
}
//--
if(sparam==mi.TFSc[11])
{
mi.ChangeChartSymbol(mi.TFSc[11],mi.TFId[11]);
}
//--
if(sparam==mi.TFSc[12])
{
mi.ChangeChartSymbol(mi.TFSc[12],mi.TFId[12]);
}
//--
if(sparam==mi.TFSc[13])
{
mi.ChangeChartSymbol(mi.TFSc[13],mi.TFId[13]);
}
//--
if(sparam==mi.TFSc[14])
{
mi.ChangeChartSymbol(mi.TFSc[14],mi.TFId[14]);
}
//--
if(sparam==mi.TFSc[15])
{
mi.ChangeChartSymbol(mi.TFSc[15],mi.TFId[15]);
}
//--
if(sparam==mi.TFSc[16])
{
mi.ChangeChartSymbol(mi.TFSc[16],mi.TFId[16]);
}
//--
if(sparam==mi.TFSc[17])
{
mi.ChangeChartSymbol(mi.TFSc[17],mi.TFId[17]);
}
//--
if(sparam==mi.TFSc[18])
{
mi.ChangeChartSymbol(mi.TFSc[18],mi.TFId[18]);
}
//--
if(sparam==mi.TFSc[19])
{
mi.ChangeChartSymbol(mi.TFSc[19],mi.TFId[19]);
}
//--
if(sparam==mi.TFSc[20])
{
mi.ChangeChartSymbol(mi.TFSc[20],mi.TFId[20]);
}
//--
}
//---
} //-end OnChartEvent()
//---------//
How to Use
1. **Attach to Any Chart** (e.g., EURUSD H1)
2. **Adjust the Inputs**
3. **Observe Directional Arrows** per timeframe on your chart
4. **Watch Summary Signal Arrow** (center chart)
5. **Click Timeframe Labels** to change timeframe view instantly
6. Advantages and Limitations
✅ Advantages:
- Adds structure to noisy lower timeframes
- Visual confirmation of support/resistance
- Doesn’t repaint once the fractal bar closes
⚠️ Limitations:
- Fractals do **repaint** until the full pattern forms (2 candles after center)
- May lag in fast-moving markets
- This limitation is overcome by using the multi-timeframe Fractal indicator.
7. Final Thoughts
The Fractals Multi-Timeframe Indicator for MT5 brings an edge to traders who rely on market structure. Whether you trade breakouts, reversals, or trends — having higher timeframe swing points in sight makes your chart more informative and actionable.
The Fractals Multi-Timeframe Indicator for MT5 offers a complete solution for traders who want to understand trend strength across all timeframes simultaneously. Using a unique formula that scans and weighs up/down movement across 21 timeframes, it delivers a summary arrow signal that simplifies complex data into an actionable visual and removes the multi-timeframe Fractal indicator limitation.
With features like dynamic chart interaction, visual arrows, alerts, and a lightweight design, this tool is ideal for discretionary and algorithmic traders alike.
Try it in your next trading session — and gain a clearer view of what the big players are watching.
We hope that this article and the Fractals_MTF or Fractals Multi-Timeframe Indicator for MT5 program will be useful for traders in learning and generating new ideas for trading, who can ultimately make money from home by trading forex.
Thanks for reading this article.
Please download the Fractals_MTF indicator: Fractals Multi-Timeframe Indicator for MT5
If you are subscribed to my YouTube Channel, and would like to receive the source program of this article, please send a request via the Contact Us form page, and I will send it to your email, source code: Fractals Multi-Timeframe Indicator for MT5
Don't forget to stop by and subscribe to Forex Home Experts YouTube Channel:
YouTube Channel: @ForexHomeExperts
YouTube Playlist: @ForexHomeExperts YouTube Playlist
0 comments:
Post a Comment