Page 1 of 2

Multi-Timeframe Confluence Reduces False Signals

Posted: Sat Aug 22, 2026 10:30 am
by Fairman
Using a single timeframe in isolation means you're making decisions with a genuinely incomplete picture of what's happening in the market. A more robust approach uses three timeframes together, each serving a distinct, specific purpose in your decision-making process.

Start with the higher timeframe — the 1-hour or 4-hour chart — to establish your overall directional bias. Is the broader market trending, ranging, near a major support or resistance zone? This sets the context for everything else.

Move to a medium timeframe — commonly the 15-minute chart — to identify the specific zone or level where you're actually looking for an opportunity within that broader context. This is where you narrow down from "the market is generally bullish" to "the market is bullish and approaching this specific support zone."

Finally, drop down to your lower timeframe — the 1-minute or 5-minute chart — purely for entry timing. This is where you look for the precise trigger — the rejection candle, the break of a minor structure point, the momentum confirmation — that tells you now is the moment to actually enter, rather than simply hovering near the zone identified on the medium timeframe.

Trading only when all three timeframes are in genuine agreement filters out a substantial share of the lower-probability setups that a single-timeframe approach would have taken. Yes, this means fewer total trades. That's the point — quality over quantity, consistently.

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Sat Aug 22, 2026 1:16 pm
by PTScalper
Hi traders,

yeah, agree.
Using single timeframe is good for investing, not forex trading/scalping.
You need to get as much information as possible, thats why i check H4 + D1 first and afterwards M5 or M15.
And most offen i execute my trades from M15 charts.

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Sun Aug 23, 2026 11:03 pm
by Fairman
PTScalper wrote: Sat Aug 22, 2026 1:16 pm Hi traders,

yeah, agree.
Using single timeframe is good for investing, not forex trading/scalping.
You need to get as much information as possible, thats why i check H4 + D1 first and afterwards M5 or M15.
And most offen i execute my trades from M15 charts.
That’s a very good way to look at it the matket

Firstly checking matket direction before looking for opportunities

That’s a skill you’ve got

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Mon Aug 24, 2026 8:16 pm
by PTScalper
Fairman wrote: Sun Aug 23, 2026 11:03 pm
PTScalper wrote: Sat Aug 22, 2026 1:16 pm Hi traders,

yeah, agree.
Using single timeframe is good for investing, not forex trading/scalping.
You need to get as much information as possible, thats why i check H4 + D1 first and afterwards M5 or M15.
And most offen i execute my trades from M15 charts.
That’s a very good way to look at it the matket

Firstly checking matket direction before looking for opportunities

That’s a skill you’ve got
Yeah, exactly.
You have to understand where the market is first and act after.
Once i was newbie i checked only M15 charts and it self alone it did not work out.

Take a care.

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Thu Sep 03, 2026 2:53 pm
by FTtrader
Fairman wrote: Sat Aug 22, 2026 10:30 am Using a single timeframe in isolation means you're making decisions with a genuinely incomplete picture of what's happening in the market. A more robust approach uses three timeframes together, each serving a distinct, specific purpose in your decision-making process.

Start with the higher timeframe — the 1-hour or 4-hour chart — to establish your overall directional bias. Is the broader market trending, ranging, near a major support or resistance zone? This sets the context for everything else.

Move to a medium timeframe — commonly the 15-minute chart — to identify the specific zone or level where you're actually looking for an opportunity within that broader context. This is where you narrow down from "the market is generally bullish" to "the market is bullish and approaching this specific support zone."

Finally, drop down to your lower timeframe — the 1-minute or 5-minute chart — purely for entry timing. This is where you look for the precise trigger — the rejection candle, the break of a minor structure point, the momentum confirmation — that tells you now is the moment to actually enter, rather than simply hovering near the zone identified on the medium timeframe.

Trading only when all three timeframes are in genuine agreement filters out a substantial share of the lower-probability setups that a single-timeframe approach would have taken. Yes, this means fewer total trades. That's the point — quality over quantity, consistently.
Hello Fairman,

Spot on. Trying to trade off a single timeframe is like trying to drive a car while looking through a paper towel tube—you might see exactly what’s right in front of you, but you have no idea if you're driving straight into a brick wall.

The three-timeframe approach you described perfectly separates bias, setup, and execution. The biggest mistake newer traders make when jumping into multi-timeframe analysis is expecting all three charts to look exactly the same. If the H4 is bullish, the M15 doesn't always have to be screaming "up"—in fact, a bearish M15 pullback into a support zone is exactly what gives you the discount you need before the M5 trigger finally gets you in.

Accepting that this triple-filter method cuts out 70% of potential trades is a feature, not a bug. Quality over quantity is the only way to survive the variance in this game. Great post.

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Thu Sep 03, 2026 2:55 pm
by FTtrader
I prepared for that EA strategy, so you can try it use it and let me know, if you like this default setup :-)

Triple-Timeframe MT4 Expert Advisor (MQL4)

Here is a structural EA for MetaTrader 4 that translates this exact trading philosophy into code.

To demonstrate the logic, I’ve assigned a simple technical condition to represent each timeframe:
TimeframeRoleCondition Used in EA

Higher (H4)Directional Bias50 EMA is above the 200 EMA (Broad Uptrend)

Medium (M15) Setup / ZoneRSI drops below 30 (Oversold pullback)

Lower (M5) Entry TriggerPrice crosses and closes above the 10 EMA

The MQL4 Code

Code: Select all

//+------------------------------------------------------------------+
//|                                         Triple_Timeframe_EA.mq4  |
//|                             Demonstrating Multi-Timeframe Logic  |
//+------------------------------------------------------------------+
#property strict

// --- Timeframe Inputs ---
input ENUM_TIMEFRAMES HTF = PERIOD_H4;   // Higher Timeframe (Bias)
input ENUM_TIMEFRAMES MTF = PERIOD_M15;  // Medium Timeframe (Setup Zone)
input ENUM_TIMEFRAMES LTF = PERIOD_M5;   // Lower Timeframe (Entry Trigger)

// --- Indicator Inputs ---
input int MA_Fast = 50;                  // HTF Fast EMA
input int MA_Slow = 200;                 // HTF Slow EMA
input int RSI_Period = 14;               // MTF RSI Period
input int LTF_Trigger_MA = 10;           // LTF Trigger EMA

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // 1. TIMING: Only run logic on a new Lower Timeframe (LTF) candle close
    static datetime lastBar = 0;
    datetime currentBar = iTime(Symbol(), LTF, 0);
    
    // If we are still forming the same bar we already processed, exit
    if(currentBar == lastBar) return; 
    
    // Update immediately so we only evaluate once per LTF candle
    lastBar = currentBar; 

    // =========================================================
    // 2. HIGHER TIMEFRAME (Directional Bias)
    // =========================================================
    // Using a 50/200 EMA crossover to determine the broader trend
    double htf_emaFast = iMA(Symbol(), HTF, MA_Fast, 0, MODE_EMA, PRICE_CLOSE, 1);
    double htf_emaSlow = iMA(Symbol(), HTF, MA_Slow, 0, MODE_EMA, PRICE_CLOSE, 1);
    
    bool isBullishBias = (htf_emaFast > htf_emaSlow);
    bool isBearishBias = (htf_emaFast < htf_emaSlow);

    // =========================================================
    // 3. MEDIUM TIMEFRAME (Setup / Zone)
    // =========================================================
    // Using RSI to identify pullbacks (oversold in an uptrend, overbought in a downtrend)
    double mtf_rsi = iRSI(Symbol(), MTF, RSI_Period, PRICE_CLOSE, 1);
    
    bool isOversold   = (mtf_rsi < 30); // Potential support zone found
    bool isOverbought = (mtf_rsi > 70); // Potential resistance zone found

    // =========================================================
    // 4. LOWER TIMEFRAME (Entry Trigger)
    // =========================================================
    // Looking for price action to confirm momentum (e.g., crossing a fast 10 EMA)
    double ltf_ema   = iMA(Symbol(), LTF, LTF_Trigger_MA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double ltf_close = iClose(Symbol(), LTF, 1);
    double ltf_open  = iOpen(Symbol(), LTF, 1);
    
    // Bullish Trigger: Candle opened below the EMA but closed above it
    bool ltf_buyTrigger = (ltf_open < ltf_ema && ltf_close > ltf_ema);
    
    // Bearish Trigger: Candle opened above the EMA but closed below it
    bool ltf_sellTrigger = (ltf_open > ltf_ema && ltf_close < ltf_ema);

    // =========================================================
    // 5. EXECUTION (Triple Alignment)
    // =========================================================
    if(isBullishBias && isOversold && ltf_buyTrigger)
    {
        Print("Triple Alignment BUY: HTF Bullish -> MTF Oversold -> LTF Breakout");
        // Insert OrderSend(Symbol(), OP_BUY, ...) logic here
    }
    else if(isBearishBias && isOverbought && ltf_sellTrigger)
    {
        Print("Triple Alignment SELL: HTF Bearish -> MTF Overbought -> LTF Breakdown");
        // Insert OrderSend(Symbol(), OP_SELL, ...) logic here
    }
}

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Thu Sep 03, 2026 2:55 pm
by FTtrader
How this EA works:

Bar Close Execution: It uses iTime to ensure the logic evaluates only once per new candle on the 5-minute chart. This prevents the EA from making erratic decisions based on mid-candle fluctuations.

Independent Timeframes: By explicitly passing HTF, MTF, and LTF into the iMA() and iRSI() functions, the EA detaches itself from whatever chart you drop it on. You can run this EA on a 1-minute chart, and it will still accurately pull the 4-hour trend data in the background.

Avoids Repainting: By shifting the indicator buffer to 1 (the last argument in the iMA and iRSI functions), it only pulls data from closed candles, meaning your backtests will be highly accurate to live market conditions.

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Thu Sep 03, 2026 3:02 pm
by FTtrader
And i prepared version for MT5 traders as well.

While the core trading logic remains exactly the same, MQL5 architecture is significantly different under the hood. I have written this using modern MQL5 best practices.

The MT5 EA (MQL5)

Code: Select all

//+------------------------------------------------------------------+
//|                                     Triple_Timeframe_EA_MT5.mq5  |
//|                             Demonstrating Multi-Timeframe Logic  |
//+------------------------------------------------------------------+
#property strict

// Use the standard MT5 trade library for simplified execution
#include <Trade\Trade.mqh>
CTrade trade;

// --- Timeframe Inputs ---
input group "--- Timeframes ---"
input ENUM_TIMEFRAMES HTF = PERIOD_H4;   // Higher Timeframe (Bias)
input ENUM_TIMEFRAMES MTF = PERIOD_M15;  // Medium Timeframe (Setup Zone)
input ENUM_TIMEFRAMES LTF = PERIOD_M5;   // Lower Timeframe (Entry Trigger)

// --- Indicator Inputs ---
input group "--- Strategy Parameters ---"
input int MA_Fast = 50;                  // HTF Fast EMA
input int MA_Slow = 200;                 // HTF Slow EMA
input int RSI_Period = 14;               // MTF RSI Period
input int LTF_Trigger_MA = 10;           // LTF Trigger EMA

// --- Trade Settings ---
input group "--- Trade Settings ---"
input double LotSize = 0.1;              // Position Lot Size
input ulong MagicNumber = 123456;        // EA Magic Number

// --- Global Indicator Handles ---
int htf_fast_ma_handle;
int htf_slow_ma_handle;
int mtf_rsi_handle;
int ltf_ma_handle;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // Apply our magic number to all trades opened by this EA
    trade.SetExpertMagicNumber(MagicNumber);
    
    // 1. CREATE INDICATOR HANDLES
    // In MT5, indicators are initialized once here rather than on every tick
    htf_fast_ma_handle = iMA(_Symbol, HTF, MA_Fast, 0, MODE_EMA, PRICE_CLOSE);
    htf_slow_ma_handle = iMA(_Symbol, HTF, MA_Slow, 0, MODE_EMA, PRICE_CLOSE);
    mtf_rsi_handle     = iRSI(_Symbol, MTF, RSI_Period, PRICE_CLOSE);
    ltf_ma_handle      = iMA(_Symbol, LTF, LTF_Trigger_MA, 0, MODE_EMA, PRICE_CLOSE);
    
    if(htf_fast_ma_handle == INVALID_HANDLE || htf_slow_ma_handle == INVALID_HANDLE ||
       mtf_rsi_handle == INVALID_HANDLE     || ltf_ma_handle == INVALID_HANDLE)
    {
        Print("Error creating indicator handles. Check parameters.");
        return(INIT_FAILED);
    }
    
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // Clean up indicator memory when EA is removed
    IndicatorRelease(htf_fast_ma_handle);
    IndicatorRelease(htf_slow_ma_handle);
    IndicatorRelease(mtf_rsi_handle);
    IndicatorRelease(ltf_ma_handle);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // 2. TIMING: Only run logic on a new Lower Timeframe (LTF) candle close
    static datetime lastBarTime = 0;
    datetime currentBarTime = iTime(_Symbol, LTF, 0);
    
    if(currentBarTime == lastBarTime || currentBarTime == 0) return; 
    lastBarTime = currentBarTime;

    // 3. CHECK EXISTING POSITIONS
    // Prevent the EA from opening multiple stacked trades on the same setup
    bool hasOpenPosition = false;
    for(int i = PositionsTotal() - 1; i >= 0; i--)
    {
        ulong posMagic = PositionGetInteger(POSITION_MAGIC);
        string posSymbol = PositionGetString(POSITION_SYMBOL);
        
        if(posSymbol == _Symbol && posMagic == MagicNumber)
        {
            hasOpenPosition = true;
            break;
        }
    }
    
    if(hasOpenPosition) return; // Wait until current trade closes before searching again

    // 4. COPY INDICATOR DATA
    double fastMA[], slowMA[], rsi[], ltfMA[];
    
    // Set arrays as series so index [0] is the current bar and [1] is the previous closed bar (like MT4)
    ArraySetAsSeries(fastMA, true);
    ArraySetAsSeries(slowMA, true);
    ArraySetAsSeries(rsi, true);
    ArraySetAsSeries(ltfMA, true);
    
    // Copy the last 2 bars of data into our arrays
    if(CopyBuffer(htf_fast_ma_handle, 0, 0, 2, fastMA) <= 0) return;
    if(CopyBuffer(htf_slow_ma_handle, 0, 0, 2, slowMA) <= 0) return;
    if(CopyBuffer(mtf_rsi_handle,     0, 0, 2, rsi)    <= 0) return;
    if(CopyBuffer(ltf_ma_handle,      0, 0, 2, ltfMA)  <= 0) return;
    
    // 5. HIGHER TIMEFRAME (Directional Bias) using Closed Bar [1]
    bool isBullishBias = (fastMA[1] > slowMA[1]);
    bool isBearishBias = (fastMA[1] < slowMA[1]);

    // 6. MEDIUM TIMEFRAME (Setup / Zone) using Closed Bar [1]
    bool isOversold   = (rsi[1] < 30.0);
    bool isOverbought = (rsi[1] > 70.0);

    // 7. LOWER TIMEFRAME (Entry Trigger) using Closed Bar [1]
    double ltf_close = iClose(_Symbol, LTF, 1);
    double ltf_open  = iOpen(_Symbol, LTF, 1);
    
    // Bullish Trigger: Candle opened below the EMA but closed above it
    bool ltf_buyTrigger = (ltf_open < ltfMA[1] && ltf_close > ltfMA[1]);
    
    // Bearish Trigger: Candle opened above the EMA but closed below it
    bool ltf_sellTrigger = (ltf_open > ltfMA[1] && ltf_close < ltfMA[1]);

    // 8. EXECUTION
    if(isBullishBias && isOversold && ltf_buyTrigger)
    {
        Print("Triple Alignment BUY: HTF Bullish -> MTF Oversold -> LTF Breakout");
        trade.Buy(LotSize, _Symbol);
    }
    else if(isBearishBias && isOverbought && ltf_sellTrigger)
    {
        Print("Triple Alignment SELL: HTF Bearish -> MTF Overbought -> LTF Breakdown");
        trade.Sell(LotSize, _Symbol);
    }
}

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Thu Sep 03, 2026 3:03 pm
by FTtrader
Key Differences from the MT4 Version

Indicator Handles (OnInit): In MT4, you can call iMA() right in the middle of your logic on every tick. MT5 is designed for heavier backtesting performance. You must "create" an indicator handle once in OnInit(), and then extract the data arrays from that handle in OnTick() using CopyBuffer().

Simplified Execution (CTrade): Raw execution in MT5 requires filling out a massive MqlTradeRequest structure and sending it to the server. By including <Trade\Trade.mqh>, we get access to the CTrade class, reducing a complex operation down to a simple trade.Buy() or trade.Sell().

Array Directions: By default, MQL5 array indexes move forward in time (0 is the oldest bar in history). Calling ArraySetAsSeries(..., true) flips this so it behaves exactly like MT4, where [0] is the current forming bar and [1] is the last closed bar.

Position vs. Order Checking: MT5 natively distinguishes between pending "Orders" and active "Positions." I added a PositionsTotal() loop that searches for open trades assigned to this EA's magic number, preventing the script from spamming dozens of positions during a valid setup window.

Re: Multi-Timeframe Confluence Reduces False Signals

Posted: Thu Sep 03, 2026 3:05 pm
by FTtrader
Plus i prepared version for Trading View traders as well.

Because TradingView evaluates scripts on every historical chart candle, the biggest challenge with multi-timeframe Pine Scripts is repainting (where a higher timeframe indicator changes its past values because its candle hadn't closed yet). To make this behave exactly like the MT4/MT5 versions—where it only pulls data from closed higher timeframe bars—I have implemented a specific non-repainting request.security function.

The Pine Script (v5)

Code: Select all

//@version=5
strategy("Triple Timeframe Alignment", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// =========================================================================
// 1. INPUTS
// =========================================================================
grp_tf = "--- Timeframes ---"
htf = input.timeframe("240", "Higher Timeframe (Bias)", group=grp_tf)
mtf = input.timeframe("15", "Medium Timeframe (Setup)", group=grp_tf)

grp_strat = "--- Strategy Parameters ---"
ma_fast_len = input.int(50, "HTF Fast EMA", group=grp_strat)
ma_slow_len = input.int(200, "HTF Slow EMA", group=grp_strat)
rsi_len     = input.int(14, "MTF RSI Length", group=grp_strat)
ltf_ema_len = input.int(10, "LTF Trigger EMA", group=grp_strat)

// =========================================================================
// 2. NON-REPAINTING SECURITY FUNCTION
// =========================================================================
// This ensures we only pull the value from the last *closed* higher timeframe bar.
// This matches the [1] buffer shift in MT4/MT5 and prevents backtest illusion.
f_secure_htf(_tf, _src) =>
    request.security(syminfo.tickerid, _tf, _src[1], lookahead = barmerge.lookahead_on)

// =========================================================================
// 3. HIGHER TIMEFRAME (Directional Bias)
// =========================================================================
htf_fast_ema = f_secure_htf(htf, ta.ema(close, ma_fast_len))
htf_slow_ema = f_secure_htf(htf, ta.ema(close, ma_slow_len))

htf_bullish = (htf_fast_ema > htf_slow_ema)
htf_bearish = (htf_fast_ema < htf_slow_ema)

// =========================================================================
// 4. MEDIUM TIMEFRAME (Setup / Zone)
// =========================================================================
mtf_rsi = f_secure_htf(mtf, ta.rsi(close, rsi_len))

mtf_oversold   = (mtf_rsi < 30)
mtf_overbought = (mtf_rsi > 70)

// =========================================================================
// 5. LOWER TIMEFRAME (Entry Trigger)
// =========================================================================
// This calculates natively on the chart you apply the script to (e.g., 5-minute)
ltf_ema = ta.ema(close, ltf_ema_len)

// Bullish Trigger: Opened below the EMA, closed above it
ltf_buy_trigger  = (open < ltf_ema and close > ltf_ema)

// Bearish Trigger: Opened above the EMA, closed below it
ltf_sell_trigger = (open > ltf_ema and close < ltf_ema)

// =========================================================================
// 6. EXECUTION
// =========================================================================
longCondition = htf_bullish and mtf_oversold and ltf_buy_trigger
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = htf_bearish and mtf_overbought and ltf_sell_trigger
if (shortCondition)
    strategy.entry("Short", strategy.short)

// =========================================================================
// 7. VISUALIZATION (Optional)
// =========================================================================
// Plot the LTF Trigger EMA on the chart
plot(ltf_ema, color=color.yellow, title="LTF Trigger EMA")

// Highlight the background when the triple alignment hits
bgcolor(longCondition ? color.new(color.green, 85) : na, title="Buy Signal")
bgcolor(shortCondition ? color.new(color.red, 85) : na, title="Sell Signal")