
The VWAP-RSI Momentum-Reversion Hybrid Scalping System is a quantitative trading strategy specifically designed for intraday trading, particularly suitable for prop firm challenges and professional day trading. This strategy ingeniously combines the Relative Strength Index (RSI), Volume-Weighted Average Price (VWAP), Exponential Moving Average (EMA), and Average True Range (ATR)-based risk management to capture high-probability mean reversion and momentum trading opportunities. The core principle lies in identifying market overbought and oversold areas while executing trades during the most liquid trading sessions, all while maintaining strict risk control measures to safeguard capital.
The core logic of this strategy is based on a multi-indicator collaborative filtering mechanism:
RSI Overbought/Oversold Signals: The strategy uses a short-period RSI (default: 3) as the primary entry signal. Long positions are considered when RSI falls below 35 (oversold), and short positions when RSI rises above 70 (overbought). The short-period RSI can capture the strongest intraday reversals or exhaustion patterns.
VWAP Directional Filter: Long positions are only considered when price is above VWAP, and short positions when price is below VWAP. This ensures trade direction aligns with the session’s dominant bias.
EMA Trend Filter: As an additional quality filter, long entries require price to be above the EMA, and short entries require price to be below the EMA, further enhancing signal quality.
Session Control: The strategy only executes trades within user-defined trading hours (default: US cash session, 9 to 16 ET), avoiding overnight and illiquid market conditions.
ATR-Based Dynamic Stop Loss and Profit Targets: Each trade uses 1x ATR for stop loss and 2x ATR for profit target, ensuring a positive risk-reward ratio.
Maximum Daily Trade Limit: Prevents overtrading and controls risk exposure (default: 3 trades per day), effectively avoiding consecutive losses under unfavorable market conditions.
The execution flow begins by checking if the current time is within the trading session, then verifies that the daily trade count hasn’t exceeded the limit. It then analyzes whether RSI is in overbought/oversold territory and confirms entry conditions by checking VWAP and EMA positions. Upon meeting all conditions, the system sets ATR-based stop loss and profit targets, then waits for exit conditions to trigger.
After in-depth code analysis, this strategy demonstrates the following significant advantages:
Multiple Filtering Mechanisms: By combining RSI, VWAP, and EMA triple filtering, the strategy significantly improves trade signal quality and reduces false signals.
Comprehensive Risk Control: Uses ATR to dynamically adjust stop loss and profit targets, allowing the strategy to adapt to different market volatility conditions rather than relying on fixed points.
Positive Risk-Reward Ratio: The default 2:1 risk-reward setting (2x ATR profit target compared to 1x ATR stop loss) means the strategy can remain profitable even with a relatively lower win rate.
Anti-Overtrading Mechanism: Daily trade limits effectively prevent overtrading during unfavorable market conditions, protecting account capital.
High Liquidity Session Trading: Focus on the most active market sessions ensures trades can be executed with minimal slippage, reducing trading costs.
High Adaptability: Highly adjustable parameters allow the strategy to adapt to different markets, volatility environments, and trading sessions.
Clear Visualization: The code includes comprehensive visualization elements, helping traders intuitively understand entry signals and key price levels.
Robust Backtesting Performance: Sample backtests show a profit factor exceeding 1.37, maximum drawdown controlled within 1%, and win rates between 37-48%, which represents a significant edge for a strategy with a risk-reward ratio greater than 1.
Despite its well-designed structure, the strategy faces the following potential risks:
Short-Period RSI Risk: The default 3-period RSI may be overly sensitive, potentially generating too many signals in certain market conditions. The solution is to adjust RSI length or thresholds according to specific markets.
Mean Reversion Risk During Strong Trends: In strongly trending markets, mean reversion strategies may face consecutive stop losses. Consider adding trend strength filters or pausing trading during strong trend markets.
Parameter Optimization Overfitting: Excessive optimization of parameters to historical data may lead to poor future performance. Use robust parameter settings and validate through backtesting across multiple time periods.
Liquidity Risk: Although the strategy sets trading sessions, certain special market events may still cause sudden liquidity droughts. Consider adding additional volume filters.
Technical Failure Risk: Automated trading systems may face technical failures. Implement appropriate monitoring mechanisms and manual intervention procedures.
Market Noise Risk: Market noise on short-period charts may trigger false signals. Consider adding confirmation indicators or delayed entry mechanisms.
Fixed Parameter Risk: When market conditions change, fixed RSI and EMA parameters may no longer be applicable. Consider implementing adaptive parameter mechanisms that adjust based on volatility.
Based on code analysis, the strategy can be optimized in the following directions:
Adaptive Parameter Mechanism: Introduce mechanisms to automatically adjust RSI parameters and thresholds based on market volatility. In high-volatility environments, RSI thresholds can be widened; in low-volatility environments, thresholds can be narrowed. This better adapts to different market environments.
Add Volume Filters: Incorporate volume confirmation mechanisms in entry logic, such as requiring volume to be above a specific period average, ensuring trades occur with sufficient market participation.
Add Time Filters: Avoid high-volatility periods around important economic data releases or market opening and closing times. These periods often experience volatile and unpredictable movements.
Dynamic Risk-Reward Ratio: Dynamically adjust risk-reward ratios based on market volatility. More aggressive profit targets can be used in low-volatility environments, and more conservative stop losses in high-volatility environments.
Add Reverse Exit Logic: When RSI rapidly moves from one extreme to another, consider early position closure rather than waiting for fixed target prices.
Multi-Timeframe Confirmation: Add filtering conditions from higher timeframes to ensure short-term trading direction aligns with larger timeframe trends.
Intelligent Trade Allocation: Instead of simply limiting daily trade count, dynamically adjust based on daily performance. For example, increase position size or trading frequency after consecutive profits, and reduce exposure after consecutive losses.
Market Regime Identification: Add mechanisms to identify whether the market is in a range-bound or trending state, and adjust strategy parameters accordingly. Range-bound markets are more suitable for mean reversion strategies, while trending markets require more conservative settings.
The VWAP-RSI Momentum-Reversion Hybrid Scalping System is a well-designed intraday trading system that provides professional traders with a reliable short-term trading method by integrating multiple technical indicators with strict risk management measures. The core advantage lies in its multi-layer filtering mechanism and dynamic risk control, enabling stable performance across various market conditions. While there are some potential risks, they can be addressed through the suggested optimization directions to further enhance the strategy’s adaptability and robustness.
For intraday traders, prop firm challenge participants, and professionals seeking systematic trading edges, this strategy provides a framework worth considering. However, users should note that any strategy requires thorough testing and adaptation to personal risk preferences and specific market environments to achieve optimal results. With continuous monitoring and appropriate adjustments, this strategy can become a powerful weapon in a trader’s toolbox.
/*backtest
start: 2024-08-08 00:00:00
end: 2025-08-06 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("VWAP-RSI Scalper FINAL v1", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)
// === PARAMETERS ===
rsiLen = input.int(3, "RSI Length")
rsiOS = input.int(35, "RSI Oversold")
rsiOB = input.int(70, "RSI Overbought")
emaLen = input.int(50, "EMA Length")
sessionStart = input.int(9, "Session Start Hour (ET)")
sessionEnd = input.int(16, "Session End Hour (ET)")
maxTrades = input.int(3, "Max Trades Per Day")
atrLen = input.int(14, "ATR Length")
slATR = input.float(1.0, "Stop ATR Mult")
tpATR = input.float(2.0, "Target ATR Mult")
// === INDICATORS ===
rsiVal = ta.rsi(close, rsiLen)
emaVal = ta.ema(close, emaLen)
vwapVal = ta.vwap(hlc3)
atr = ta.atr(atrLen)
// === SESSION CONTROL ===
inSession = timeframe.isintraday ? (hour >= sessionStart and hour < sessionEnd) : true
// === TRADE LIMITER ===
var int tradesToday = 0
if ta.change(time("D")) != 0
tradesToday := 0
// === ENTRY LOGIC ===
// LONG = RSI oversold, above VWAP, above EMA, during session, limit trades/day
canLong = rsiVal < rsiOS and close > vwapVal and close > emaVal and inSession and tradesToday < maxTrades and strategy.position_size == 0
canShort = rsiVal > rsiOB and close < vwapVal and close < emaVal and inSession and tradesToday < maxTrades and strategy.position_size == 0
if canLong
strategy.entry("Long", strategy.long)
tradesToday += 1
if canShort
strategy.entry("Short", strategy.short)
tradesToday += 1
// === EXIT LOGIC ===
if strategy.position_size > 0
strategy.exit("Long Exit", from_entry="Long", stop=strategy.position_avg_price - atr*slATR, limit=strategy.position_avg_price + atr*tpATR)
if strategy.position_size < 0
strategy.exit("Short Exit", from_entry="Short", stop=strategy.position_avg_price + atr*slATR, limit=strategy.position_avg_price - atr*tpATR)
// === DEBUG PLOTS ===
plot(vwapVal, "VWAP", color=color.orange)
plot(emaVal, "EMA", color=color.teal)
hline(rsiOS, "RSI OS", color=color.new(color.green, 75))
hline(rsiOB, "RSI OB", color=color.new(color.red, 75))
plotshape(canLong, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Long Signal")
plotshape(canShort, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Short Signal")