Page 1 of 2

Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Sun Jul 26, 2026 3:38 pm
by PTScalper
Are you getting chopped up trying to scalp M1 and M5 charts during active London and New York sessions? Combining Volume Weighted Average Price (VWAP) with the MACD gives you a professional two-step filter: institutional trend direction plus momentum timing.

Most retail traders rely on exponential moving averages for trend bias, but MAs lag and ignore volume. VWAP acts as the true intraday value equilibrium. When price trades above daily VWAP, institutional buyers are in control; when below, sellers dominate. By forcing your scalp trades to align with this baseline, you immediately eliminate low-probability counter-trend setups.

The Scalping Strategy Rules:

Timeframes: M1 or M5 during high-liquidity windows (London/NY overlap).

Indicators: Daily Session VWAP + MACD (Fast: 6, Slow: 13, Signal: 5 for hyper-responsive execution, or standard 12, 26, 9).

Long Entry: Price must be above the Daily VWAP. Wait for the MACD line to cross above the Signal line (best when occurring below the zero level after a pullback).

Short Entry: Price must be below the Daily VWAP. Wait for the MACD line to cross below the Signal line.

Risk Management: Place protective stop losses 2 pips beyond the recent swing high/low or use a dynamic 1.5x ATR stop. Target a 1.5R to 2.0R risk-to-reward ratio.

To automate the chart reading, I coded custom overlay indicators for MT4, MT5, and IC Trader (cTrader) that print entry arrows when both conditions align. Grab the source code below!

MT4 (MQL4) Custom Indicator
This indicator calculates the daily session VWAP and monitors MACD crossovers, plotting Buy and Sell arrows directly on the main chart window.

Code: Select all

//+------------------------------------------------------------------+
//|                                             VWAP_MACD_Scalper.mq4|
//|                          VWAP + MACD On-Chart Arrow Scalping Tool|
//+------------------------------------------------------------------+
#property copyright "Free Open Source"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1  clrBlue
#property indicator_color2  clrLime
#property indicator_color3  clrRed
#property indicator_width1  1
#property indicator_width2  2
#property indicator_width3  2

//--- Input Parameters
input int      InpFastEMA   = 6;          // MACD Fast EMA
input int      InpSlowEMA   = 13;         // MACD Slow EMA
input int      InpSignalSMA = 5;          // MACD Signal SMA
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // MACD Applied Price

//--- Indicator Buffers
double         VwapBuffer[];
double         BuyArrowBuffer[];
double         SellArrowBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    SetIndexBuffer(0, VwapBuffer);
    SetIndexStyle(0, DRAW_LINE);
    SetIndexLabel(0, "Daily VWAP");
    
    SetIndexBuffer(1, BuyArrowBuffer);
    SetIndexStyle(1, DRAW_ARROW);
    SetIndexArrow(1, 233); // Up arrow
    SetIndexLabel(1, "Buy Signal");
    SetIndexEmptyValue(1, 0.0);
    
    SetIndexBuffer(2, SellArrowBuffer);
    SetIndexStyle(2, DRAW_ARROW);
    SetIndexArrow(2, 234); // Down arrow
    SetIndexLabel(2, "Sell Signal");
    SetIndexEmptyValue(2, 0.0);
    
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    if(rates_total < InpSlowEMA) return(0);
    
    int limit = rates_total - prev_calculated;
    if(prev_calculated > 0) limit++;
    else limit = rates_total - 1;
    
    double cumVolume = 0;
    double cumTypPriceVol = 0;
    int currentDay = -1;
    
    // Calculate from oldest to newest
    for(int i = limit; i >= 0; i--)
    {
        int barDay = TimeDay(time[i]);
        
        // Reset VWAP at the start of a new daily session
        if(barDay != currentDay)
        {
            cumVolume = 0;
            cumTypPriceVol = 0;
            currentDay = barDay;
        }
        
        double typPrice = (high[i] + low[i] + close[i]) / 3.0;
        double vol = (double)tick_volume[i];
        if(vol == 0) vol = 1; // Prevent division by zero
        
        cumVolume += vol;
        cumTypPriceVol += typPrice * vol;
        
        VwapBuffer[i] = cumTypPriceVol / cumVolume;
        
        // Clear previous signals
        BuyArrowBuffer[i] = 0.0;
        SellArrowBuffer[i] = 0.0;
        
        // Evaluate MACD Crossover on completed bars (avoid intrabar repainting)
        if(i < rates_total - 1)
        {
            double macdCurrent  = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_MAIN, i);
            double sigCurrent   = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_SIGNAL, i);
            double macdPrevious = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_MAIN, i+1);
            double sigPrevious  = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_SIGNAL, i+1);
            
            // Long Condition: Price > VWAP and MACD crosses above Signal
            if(close[i] > VwapBuffer[i] && macdPrevious <= sigPrevious && macdCurrent > sigCurrent)
            {
                BuyArrowBuffer[i] = low[i] - (10 * Point);
            }
            // Short Condition: Price < VWAP and MACD crosses below Signal
            else if(close[i] < VwapBuffer[i] && macdPrevious >= sigPrevious && macdCurrent < sigCurrent)
            {
                SellArrowBuffer[i] = high[i] + (10 * Point);
            }
        }
    }
    
    return(rates_total);
}

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Sun Jul 26, 2026 3:39 pm
by PTScalper
MT5 (MQL5) Custom Indicator
The MQL5 version uses indicator handles for optimized memory execution and handles real exchange volume if provided by your broker.

Code: Select all

//+------------------------------------------------------------------+
//|                                             VWAP_MACD_Scalper.mq5|
//|                          VWAP + MACD On-Chart Arrow Scalping Tool|
//+------------------------------------------------------------------+
#property copyright "Free Open Source"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3

//--- Plot 1: VWAP Line
#property indicator_label1  "Daily VWAP"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- Plot 2: Buy Arrow
#property indicator_label2  "Buy Signal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrLime
#property indicator_width2  2

//--- Plot 3: Sell Arrow
#property indicator_label3  "Sell Signal"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrRed
#property indicator_width3  2

//--- Input Parameters
input int      InpFastEMA   = 6;          // MACD Fast EMA
input int      InpSlowEMA   = 13;         // MACD Slow EMA
input int      InpSignalSMA = 5;          // MACD Signal SMA
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // Applied Price

//--- Indicator Buffers
double         VwapBuffer[];
double         BuyArrowBuffer[];
double         SellArrowBuffer[];

//--- Global Variables
int            g_macdHandle;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    SetIndexBuffer(0, VwapBuffer, INDICATOR_DATA);
    SetIndexBuffer(1, BuyArrowBuffer, INDICATOR_DATA);
    SetIndexBuffer(2, SellArrowBuffer, INDICATOR_DATA);
    
    PlotIndexSetInteger(1, PLOT_ARROW, 233);
    PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
    
    PlotIndexSetInteger(2, PLOT_ARROW, 234);
    PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
    
    g_macdHandle = iMACD(_Symbol, _Period, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice);
    if(g_macdHandle == INVALID_HANDLE)
    {
        Print("Failed to create MACD handle.");
        return(INIT_FAILED);
    }
    
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    if(rates_total < InpSlowEMA) return(0);
    
    int start = (prev_calculated > 0) ? prev_calculated - 1 : 0;
    
    double macdMain[], macdSignal[];
    ArraySetAsSeries(macdMain, false);
    ArraySetAsSeries(macdSignal, false);
    
    if(CopyBuffer(g_macdHandle, 0, 0, rates_total, macdMain) <= 0) return(0);
    if(CopyBuffer(g_macdHandle, 1, 0, rates_total, macdSignal) <= 0) return(0);
    
    static double cumVolume = 0;
    static double cumTypPriceVol = 0;
    static int currentDay = -1;
    
    for(int i = start; i < rates_total; i++)
    {
        MqlDateTime dt;
        TimeToStruct(time[i], dt);
        
        if(dt.day != currentDay)
        {
            cumVolume = 0;
            cumTypPriceVol = 0;
            currentDay = dt.day;
        }
        
        double typPrice = (high[i] + low[i] + close[i]) / 3.0;
        double vol = (volume[i] > 0) ? (double)volume[i] : (double)tick_volume[i];
        if(vol == 0) vol = 1.0;
        
        cumVolume += vol;
        cumTypPriceVol += typPrice * vol;
        
        VwapBuffer[i] = cumTypPriceVol / cumVolume;
        
        BuyArrowBuffer[i] = 0.0;
        SellArrowBuffer[i] = 0.0;
        
        if(i > 0)
        {
            double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
            
            // Long Trigger
            if(close[i] > VwapBuffer[i] && macdMain[i-1] <= macdSignal[i-1] && macdMain[i] > macdSignal[i])
            {
                BuyArrowBuffer[i] = low[i] - (10 * point);
            }
            // Short Trigger
            else if(close[i] < VwapBuffer[i] && macdMain[i-1] >= macdSignal[i-1] && macdMain[i] < macdSignal[i])
            {
                SellArrowBuffer[i] = high[i] + (10 * point);
            }
        }
    }
    
    return(rates_total);
}

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Sun Jul 26, 2026 3:39 pm
by PTScalper
IC Trader / cTrader (C# cAlgo) Implementation
For IC Markets traders utilizing cTrader, indicators are developed in C# using the cAlgo.API framework. Below is a complete, structured custom indicator class that renders the session VWAP line and plots entry arrows directly on the chart overlay.

Code: Select all

using System;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class VwapMacdScalper : Indicator
    {
        [Parameter("Fast EMA", DefaultValue = 6, Group = "MACD Settings")]
        public int FastEma { get; set; }

        [Parameter("Slow EMA", DefaultValue = 13, Group = "MACD Settings")]
        public int SlowEma { get; set; }

        [Parameter("Signal SMA", DefaultValue = 5, Group = "MACD Settings")]
        public int SignalSma { get; set; }

        [Output("Daily VWAP", LineColor = "DodgerBlue", Thickness = 1, PlotType = PlotType.Line)]
        public IndicatorDataSeries VwapLine { get; set; }

        [Output("Buy Signal", LineColor = "Lime", PlotType = PlotType.Points, Thickness = 5)]
        public IndicatorDataSeries BuySignals { get; set; }

        [Output("Sell Signal", LineColor = "Red", PlotType = PlotType.Points, Thickness = 5)]
        public IndicatorDataSeries SellSignals { get; set; }

        private MacdCrossOver _macd;
        private double _cumVolume;
        private double _cumTypPriceVol;
        private int _currentDay = -1;

        protected override void OnStart()
        {
            // Initialize the built-in MACD Crossover indicator
            _macd = Indicators.MacdCrossOver(Bars.ClosePrices, FastEma, SlowEma, SignalSma);
        }

        public override void Calculate(int index)
        {
            if (index < SlowEma) return;

            // Check if a new daily session has started (in UTC)
            int barDay = Bars.OpenTimes[index].Day;
            if (barDay != _currentDay)
            {
                _cumVolume = 0;
                _cumTypPriceVol = 0;
                _currentDay = barDay;
            }

            // Calculate Typical Price and Volume
            double typicalPrice = (Bars.HighPrices[index] + Bars.LowPrices[index] + Bars.ClosePrices[index]) / 3.0;
            double volume = Bars.TickVolumes[index];
            if (volume == 0) volume = 1;

            _cumVolume += volume;
            _cumTypPriceVol += typicalPrice * volume;

            // Assign VWAP output
            VwapLine[index] = _cumTypPriceVol / _cumVolume;

            // Ensure we check previous bar crossover to prevent intrabar repainting
            if (index < 1) return;

            bool macdCrossedAbove = _macd.MACD[index] > _macd.Signal[index] && _macd.MACD[index - 1] <= _macd.Signal[index - 1];
            bool macdCrossedBelow = _macd.MACD[index] < _macd.Signal[index] && _macd.MACD[index - 1] >= _macd.Signal[index - 1];

            double pipSize = Symbol.PipSize;

            // Long Condition: Price above VWAP + MACD Bullish Cross
            if (Bars.ClosePrices[index] > VwapLine[index] && macdCrossedAbove)
            {
                BuySignals[index] = Bars.LowPrices[index] - (2 * pipSize);
                Chart.DrawIcon("BuyArrow_" + index, ChartIconType.UpArrow, index, BuySignals[index], Color.Lime);
            }
            // Short Condition: Price below VWAP + MACD Bearish Cross
            else if (Bars.ClosePrices[index] < VwapLine[index] && macdCrossedBelow)
            {
                SellSignals[index] = Bars.HighPrices[index] + (2 * pipSize);
                Chart.DrawIcon("SellArrow_" + index, ChartIconType.DownArrow, index, SellSignals[index], Color.Red);
            }
        }
    }
}

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Sat Sep 12, 2026 9:22 am
by LondonScalper
PTScalper wrote:Combining Volume Weighted Average Price (VWAP) with the MACD gives you a professional two-step filter: institutional trend direction plus momentum timing.
VWAP as a session bias filter is something I actually use; MACD as the trigger is more optional on my desk.

London cash: price holding above session VWAP with a shallow pullback is a cleaner long framework than most EMA stacks for me — especially when volume/tick activity confirms the open. Where people get chopped is treating every MACD cross as mandatory while ignoring that VWAP slope and distance from VWAP matter as much as “above/below.”

Practical caution: broker “volume” on FX is usually tick volume. Fine as a relative activity gauge; do not over-read it as true institutional size. I would rather fewer signals aligned with VWAP + structure than a busy arrow indicator.

Are you taking VWAP mean-reversion fades as well, or only with-trend scalps when MACD agrees?

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Fri Sep 25, 2026 8:29 am
by FTtrader
PTScalper wrote: Sun Jul 26, 2026 3:38 pm Are you getting chopped up trying to scalp M1 and M5 charts during active London and New York sessions? Combining Volume Weighted Average Price (VWAP) with the MACD gives you a professional two-step filter: institutional trend direction plus momentum timing.

Most retail traders rely on exponential moving averages for trend bias, but MAs lag and ignore volume. VWAP acts as the true intraday value equilibrium. When price trades above daily VWAP, institutional buyers are in control; when below, sellers dominate. By forcing your scalp trades to align with this baseline, you immediately eliminate low-probability counter-trend setups.

The Scalping Strategy Rules:

Timeframes: M1 or M5 during high-liquidity windows (London/NY overlap).

Indicators: Daily Session VWAP + MACD (Fast: 6, Slow: 13, Signal: 5 for hyper-responsive execution, or standard 12, 26, 9).

Long Entry: Price must be above the Daily VWAP. Wait for the MACD line to cross above the Signal line (best when occurring below the zero level after a pullback).

Short Entry: Price must be below the Daily VWAP. Wait for the MACD line to cross below the Signal line.

Risk Management: Place protective stop losses 2 pips beyond the recent swing high/low or use a dynamic 1.5x ATR stop. Target a 1.5R to 2.0R risk-to-reward ratio.

To automate the chart reading, I coded custom overlay indicators for MT4, MT5, and IC Trader (cTrader) that print entry arrows when both conditions align. Grab the source code below!

MT4 (MQL4) Custom Indicator
This indicator calculates the daily session VWAP and monitors MACD crossovers, plotting Buy and Sell arrows directly on the main chart window.

Code: Select all

//+------------------------------------------------------------------+
//|                                             VWAP_MACD_Scalper.mq4|
//|                          VWAP + MACD On-Chart Arrow Scalping Tool|
//+------------------------------------------------------------------+
#property copyright "Free Open Source"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1  clrBlue
#property indicator_color2  clrLime
#property indicator_color3  clrRed
#property indicator_width1  1
#property indicator_width2  2
#property indicator_width3  2

//--- Input Parameters
input int      InpFastEMA   = 6;          // MACD Fast EMA
input int      InpSlowEMA   = 13;         // MACD Slow EMA
input int      InpSignalSMA = 5;          // MACD Signal SMA
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // MACD Applied Price

//--- Indicator Buffers
double         VwapBuffer[];
double         BuyArrowBuffer[];
double         SellArrowBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    SetIndexBuffer(0, VwapBuffer);
    SetIndexStyle(0, DRAW_LINE);
    SetIndexLabel(0, "Daily VWAP");
    
    SetIndexBuffer(1, BuyArrowBuffer);
    SetIndexStyle(1, DRAW_ARROW);
    SetIndexArrow(1, 233); // Up arrow
    SetIndexLabel(1, "Buy Signal");
    SetIndexEmptyValue(1, 0.0);
    
    SetIndexBuffer(2, SellArrowBuffer);
    SetIndexStyle(2, DRAW_ARROW);
    SetIndexArrow(2, 234); // Down arrow
    SetIndexLabel(2, "Sell Signal");
    SetIndexEmptyValue(2, 0.0);
    
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    if(rates_total < InpSlowEMA) return(0);
    
    int limit = rates_total - prev_calculated;
    if(prev_calculated > 0) limit++;
    else limit = rates_total - 1;
    
    double cumVolume = 0;
    double cumTypPriceVol = 0;
    int currentDay = -1;
    
    // Calculate from oldest to newest
    for(int i = limit; i >= 0; i--)
    {
        int barDay = TimeDay(time[i]);
        
        // Reset VWAP at the start of a new daily session
        if(barDay != currentDay)
        {
            cumVolume = 0;
            cumTypPriceVol = 0;
            currentDay = barDay;
        }
        
        double typPrice = (high[i] + low[i] + close[i]) / 3.0;
        double vol = (double)tick_volume[i];
        if(vol == 0) vol = 1; // Prevent division by zero
        
        cumVolume += vol;
        cumTypPriceVol += typPrice * vol;
        
        VwapBuffer[i] = cumTypPriceVol / cumVolume;
        
        // Clear previous signals
        BuyArrowBuffer[i] = 0.0;
        SellArrowBuffer[i] = 0.0;
        
        // Evaluate MACD Crossover on completed bars (avoid intrabar repainting)
        if(i < rates_total - 1)
        {
            double macdCurrent  = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_MAIN, i);
            double sigCurrent   = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_SIGNAL, i);
            double macdPrevious = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_MAIN, i+1);
            double sigPrevious  = iMACD(NULL, 0, InpFastEMA, InpSlowEMA, InpSignalSMA, InpPrice, MODE_SIGNAL, i+1);
            
            // Long Condition: Price > VWAP and MACD crosses above Signal
            if(close[i] > VwapBuffer[i] && macdPrevious <= sigPrevious && macdCurrent > sigCurrent)
            {
                BuyArrowBuffer[i] = low[i] - (10 * Point);
            }
            // Short Condition: Price < VWAP and MACD crosses below Signal
            else if(close[i] < VwapBuffer[i] && macdPrevious >= sigPrevious && macdCurrent < sigCurrent)
            {
                SellArrowBuffer[i] = high[i] + (10 * Point);
            }
        }
    }
    
    return(rates_total);
}
Hello PTscalper,

This is a highly logical, classically structured intraday scalping framework. Pairing a volume-weighted baseline (VWAP) with a momentum oscillator (MACD) effectively solves the "right direction, wrong time" problem that plagues most M1/M5 traders.

Here is a breakdown of why this specific logic works, where it breaks down, and how to optimize it.

Why This Strategy Makes Sense

True Intraday Bias: Unlike EMAs which only calculate closing prices over time, VWAP anchors to actual capital flow. Institutions execute large orders algorithmically around VWAP to get average pricing. Trading in the direction of VWAP means you are trading with the session's dominant liquidity.

Hyper-Responsive MACD: The 6, 13, 5 settings are roughly half the standard 12, 26, 9 settings. On an M1 or M5 chart, standard settings lag too heavily, often generating a signal only after the micro-trend has exhausted. The faster settings catch the momentum shift at the exact pivot point of the pullback.

Session Constraint: Confining this to the London/New York overlap (roughly 8:00 AM to 11:30 AM EST) is critical. VWAP is meaningless in low-volume Asian sessions because it requires active volume to represent true value.

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Fri Sep 25, 2026 8:30 am
by FTtrader
The Hidden Pitfalls (Where Traders Still Get Chopped)

Even with this filter, retail traders face a few structural hurdles:

The VWAP Magnet Effect: In a ranging market, price will tightly ping-pong back and forth across the VWAP. If the MACD crosses happen exactly on the VWAP line, it often results in immediate whipsaws. The best setups occur when price pulls back toward the VWAP, but doesn't aggressively cross it.

Spread and Commission Drag: Targeting 1.5R on an M1 chart often means a take-profit of just 4 to 6 pips. If your broker charges a 1-pip spread plus a $7/lot commission (roughly 0.7 pips), you are giving up nearly 30% of your profit margin to the broker on every winning trade.

Zero-Line Gravity: You noted that long entries are best when the MACD crosses below the zero line (oversold pullback in an uptrend). If the MACD is already heavily extended above the zero line and crosses higher, the move is likely exhausted.

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Fri Sep 25, 2026 8:31 am
by FTtrader
LondonScalper wrote: Sat Sep 12, 2026 9:22 am
PTScalper wrote:Combining Volume Weighted Average Price (VWAP) with the MACD gives you a professional two-step filter: institutional trend direction plus momentum timing.
VWAP as a session bias filter is something I actually use; MACD as the trigger is more optional on my desk.

London cash: price holding above session VWAP with a shallow pullback is a cleaner long framework than most EMA stacks for me — especially when volume/tick activity confirms the open. Where people get chopped is treating every MACD cross as mandatory while ignoring that VWAP slope and distance from VWAP matter as much as “above/below.”

Practical caution: broker “volume” on FX is usually tick volume. Fine as a relative activity gauge; do not over-read it as true institutional size. I would rather fewer signals aligned with VWAP + structure than a busy arrow indicator.

Are you taking VWAP mean-reversion fades as well, or only with-trend scalps when MACD agrees?
Hello LondonScalper,

our distinction between true volume and FX tick volume is spot on. Tick volume measures transaction frequency, not transaction size, making it a reliable proxy for session volatility but useless for true order flow analysis. Relying on market structure and the actual slope of the VWAP over mechanical indicator crosses is exactly how professional desks operate—a flat VWAP is a neon sign for chop, regardless of whether price is above or below it.

Regarding the setup mechanics: the framework I originally outlined was strictly for with-trend continuation scalps. It assumes a trending session where the VWAP acts as a dynamic support/resistance floor for shallow pullbacks.

Taking mean-reversion fades back to the VWAP is a highly viable, and often more lucrative playbook, but the MACD is the wrong tool for that job. Trading the rubber-band snapback requires different filters:

Standard Deviation Bands: Instead of just a single VWAP line, mean-reversion requires plotting the 2nd and 3rd standard deviations of the VWAP. Fades are triggered when price stretches to these extreme bands where the probability of a snapback spikes.

Structural Exhaustion: Rather than waiting for a momentum cross, fades rely on price action exhaustion at those bands—climax wicks, structural deceleration, or volume anomalies.

Built-in Targets: The take-profit is explicitly the return to the core VWAP line, which offers a naturally high risk-to-reward ratio the further out you initiate the fade.

A busy chart of MACD arrows will absolutely get chewed up in a tight, flat-VWAP range. Filtering for fewer, structure-backed entries in the direction of a clearly sloping VWAP is always the superior approach.

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Fri Sep 25, 2026 8:32 am
by FTtrader
Trading the rubber-band snapback away from the mean relies entirely on raw price action and recognizing liquidity sweeps, making it highly effective when you strip away lagging indicators. When price gets overextended, institutions scale in to fade the retail breakout traders, pulling the market back to fair value.

Here is the structural framework for executing a VWAP mean-reversion fade.

1. The Core Parameters

Anchor: Daily Session (reset at the New York close, 5:00 PM EST, or at the London Open for strict European session focus).

Standard Deviation (SD) Bands:

± 1.0 SD: Ignored for entries. This is the "fair value area."

± 2.0 to 2.5 SD: The primary strike zone. ~95% of all volume occurs inside this boundary. Price action here is statistically overextended.

± 3.0 SD: The capitulation zone. Reaching this indicates a macro-driven trend day or a severe news event.

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Fri Sep 25, 2026 8:33 am
by FTtrader
2. The Structural Entry Rules

Do not fade simply because price touches the 2.0 SD band. A strong trend will pin the band and walk it higher. You are looking for structural exhaustion, specifically on a 15-minute chart, aligning intraday extremes with higher-timeframe resistance.

The Setup: Price must stretch into the 2.0 or 2.5 SD band.

The Trigger (The Liquidity Sweep): Wait for a clear sweep of a structural high or low. Price pokes above a previous swing high (trapping breakout traders), hits the 2.5 SD band, and immediately rejects.

The Confirmation: You need a 15-minute candlestick structure confirming the rejection—a long climax wick, an engulfing candle, or a failure to close beyond the sweep level.

The Entry: Enter market on the close of the confirming 15-minute candle, or drop to a lower timeframe to enter on the first break of micro-structure back toward the VWAP.

3. Trade Management¨

Stop Loss: Placed strictly above the wick of the liquidity sweep. If the market forms a higher high and closes above that wick, the mean-reversion thesis is instantly voided.

Take Profit 1 (Scale Out): The 1.0 SD band. This secures profit if the trend is merely pausing rather than fully reversing.

Take Profit 2 (Final Target): The core VWAP line.

The "Avoid" Filter

The highest probability of failure occurs when price hits the 2.0 or 2.5 SD band and begins to base tightly at the band. Consolidation at an extreme standard deviation signals that the market is accepting the new valuation, building a new liquidity node, and is preparing for a continuation breakout. If you don't get a sharp, immediate rejection wick, kill the trade idea.

Re: Free Tool: VWAP + MACD Momentum Scalping Strategy & Custom Indicators (MT4 / MT5 / cTrader)

Posted: Fri Sep 25, 2026 8:33 am
by FTtrader
Because you are plotting this on M1 and M5 charts where tick volume updates constantly, calculating the standard deviation by looping back to the session open on every single tick will heavily degrade terminal performance.

To solve this, the code below uses Welford’s online algorithm for weighted variance. It calculates the VWAP and Standard Deviation in a single forward pass, holding the running totals in memory and updating them at $O(1)$ time complexity per tick rather than $O(N)$. The variables automatically reset at the start of each new daily session.