
The Multi-Indicator Consensus Trading Strategy is a quantitative trading system that combines three distinct technical indicators, using cross-validation between indicators to confirm trading signals. This strategy integrates Liquidity Weighted Supertrend (LWST), Trend Signal System, and Enhanced Wavetrend Oscillator (WT), executing buy or sell operations only when at least two indicators provide signals in the same direction. This consensus mechanism significantly improves signal reliability and reduces losses from false breakouts. Additionally, the strategy incorporates built-in stop-loss and take-profit mechanisms, providing a risk control framework for each trade.
The core principle of the Multi-Indicator Consensus Trading Strategy lies in analyzing market conditions from multiple dimensions to confirm trading direction:
Liquidity Weighted Supertrend (LWST): Combines ATR and volume information to create dynamic support and resistance bands. This indicator merges the traditional Supertrend indicator with volume weighting, making the bandwidth more sensitive in high-volume areas. The calculation process includes:
Trend Signal System: Uses a dual EMA system to detect price trends. By comparing the percentage difference between fast and slow moving averages, it judges market trend strength. When the fast EMA exceeds the slow EMA by the set threshold, a bullish signal is generated; conversely, a bearish signal is produced.
Enhanced Wavetrend Oscillator (WT): Calculates oscillation values based on the deviation of price from its smoothed average to identify overbought and oversold conditions. This indicator generates signals through the following steps:
Consensus Signal Mechanism: The strategy executes trades only when at least two indicators reach consensus. This is achieved by calculating the number of bullish indicators (range from -3 to 3), generating a buy signal when the value is greater than or equal to 2, and a sell signal when less than or equal to -2.
Risk Management: Each trade sets stop-loss (default 2%) and take-profit (default 4%) levels based on entry price, automatically exiting when either condition is met.
Enhanced Signal Filtering: Requiring consensus among multiple indicators before executing trades significantly reduces misleading signals that might be generated by a single indicator, improving trading accuracy.
Adaptation to Different Market Conditions: The three indicators focus on different market attributes (trend, momentum, volatility), enabling the strategy to maintain effectiveness in various market environments.
Liquidity-Sensitive Adjustment: The Liquidity Weighted Supertrend dynamically adjusts sensitivity according to volume, allowing the strategy to capture trend changes more quickly in high-liquidity areas while remaining more conservative in low-liquidity areas.
Built-in Risk Management: Preset stop-loss and take-profit mechanisms provide a clear risk-reward ratio for each trade, keeping single-trade risk within an acceptable range.
Intuitive Visualization Tools: The strategy provides real-time signal tables and graphical markers, helping traders quickly grasp current market conditions and indicator signals.
Integrated Capital Management: By setting position sizes based on account equity, intelligent capital management is achieved, avoiding excessive risk exposure.
Parameter Sensitivity: The strategy uses multiple adjustable parameters; inappropriate parameter settings may lead to over-optimization or insufficient signals. Solution: Conduct comprehensive parameter sensitivity analysis and select parameter combinations that perform stably under multiple market conditions.
Signal Delay: Due to the use of moving averages and multi-indicator confirmation, the strategy may miss part of the initial trend. Solution: Consider setting different parameter combinations for different time periods, or add a more sensitive short-term indicator.
Poor Performance in Ranging Markets: In markets without clear trends, multiple trend indicators may give mixed signals, leading to frequent trading or no trading. Solution: Add a filter specifically designed to identify ranging markets, pausing trading when ranging is detected or switching to a strategy designed for ranging markets.
Fixed Stop-Loss Risk: Using fixed percentage stop-losses may not adapt to the volatility characteristics of different assets. Solution: Dynamically adjust stop-loss distances based on ATR or historical volatility.
Capital Management Risk: Using 100% of account funds by default may lead to excessive risk concentration. Solution: Dynamically adjust position size based on market conditions and signal strength, implementing diversified trading strategies.
Dynamic Parameter Adjustment:
Add Market Environment Filters:
Optimize Take-Profit/Stop-Loss Mechanisms:
Signal Strength Grading:
Time Filters:
The Multi-Indicator Consensus Trading Strategy creates a robust trading system by integrating Liquidity Weighted Supertrend, Trend Signal System, and Enhanced Wavetrend Oscillator. Its core advantage lies in the multi-indicator consensus mechanism, which significantly improves signal reliability, while the liquidity-weighted component adds sensitivity to market depth. The built-in risk management framework ensures each trade has a predefined risk-reward ratio.
Nevertheless, there is room for optimization, particularly in parameter adaptability, market state identification, and dynamic stop-loss/take-profit. By implementing the suggested optimization directions, especially establishing market environment filters and signal strength grading systems, the strategy can further improve its adaptability and stability under various market conditions.
Overall, this is a well-designed quantitative trading system suitable for experienced traders to backtest and optimize parameters before live trading. The modular design also makes it easy to modify and extend according to individual needs.
/*backtest
start: 2024-03-25 00:00:00
end: 2025-03-24 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Multi-Indicator Consensus Strategy", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// =================== Input Parameters ===================
// Liquidity Weighted Supertrend
lwst_period = input.int(10, "LWST Period", minval=1, tooltip="Period for ATR calculation")
lwst_multiplier = input.float(3.0, "LWST Multiplier", minval=0.1, tooltip="Multiplier for ATR bands")
lwst_length = input.int(20, "Volume SMA Length", minval=1, tooltip="Length for volume SMA")
// Trend Signals
trend_length = input.int(14, "Trend Length", minval=1, tooltip="Length for EMA calculation")
trend_threshold = input.float(0.5, "Trend Threshold", minval=0.1, tooltip="Percentage threshold for trend signals")
// Enhanced Wavetrend
wt_channel_length = input.int(9, "WT Channel Length", minval=1, tooltip="Smoothing period for initial calculations")
wt_average_length = input.int(12, "WT Average Length", minval=1, tooltip="Smoothing period for final signal")
wt_ma_length = input.int(3, "WT MA Length", minval=1, tooltip="Moving average length for signal line")
wt_overbought = input.float(53, "WT Overbought", minval=0, tooltip="Level to identify overbought conditions")
wt_oversold = input.float(-53, "WT Oversold", minval=-100, tooltip="Level to identify oversold conditions")
// Risk Management
sl_percent = input.float(2.0, "Stop Loss %", minval=0.1, tooltip="Stop loss percentage from entry")
tp_percent = input.float(4.0, "Take Profit %", minval=0.1, tooltip="Take profit percentage from entry")
// =================== Indicator 1: Liquidity Weighted Supertrend ===================
// Volume-weighted component for dynamic sensitivity
vol_sma = ta.sma(volume, lwst_length)
vol_weight = volume / vol_sma
// ATR-based bands with volume weighting
atr = ta.atr(lwst_period)
upperBand = hl2 + lwst_multiplier * atr * vol_weight
lowerBand = hl2 - lwst_multiplier * atr * vol_weight
// Trend determination based on price action
var float lwst_trend = 0.0
lwst_trend := close > lwst_trend[1] ? 1 : close < lwst_trend[1] ? -1 : lwst_trend[1]
// =================== Indicator 2: Trend Signals ===================
// Dual EMA system for trend detection
fast_ema = ta.ema(close, trend_length)
slow_ema = ta.ema(close, trend_length * 2)
trend_diff = (fast_ema - slow_ema) / slow_ema * 100
trend_signal = trend_diff > trend_threshold ? 1 : trend_diff < -trend_threshold ? -1 : 0
// =================== Indicator 3: Enhanced Wavetrend ===================
// Calculate Wavetrend components
ap = hlc3 // Typical price
esa = ta.ema(ap, wt_channel_length) // Smoothed price
d = ta.ema(math.abs(ap - esa), wt_channel_length) // Average volatility
ci = (ap - esa) / (0.015 * d) // Base oscillator
tci = ta.ema(ci, wt_average_length) // Smoothed oscillator
// Generate main and signal lines
wt1 = tci
wt2 = ta.sma(wt1, wt_ma_length)
// Generate Wavetrend Signal based on overbought/oversold conditions
wt_signal = 0
wt_signal := wt1 > wt_overbought and wt2 > wt_overbought ? -1 :
wt1 < wt_oversold and wt2 < wt_oversold ? 1 :
wt_signal[1]
// =================== Consensus Signal Generation ===================
// Count bullish signals (1 point for each bullish indicator)
var int consensus_count = 0
consensus_count := (lwst_trend == 1 ? 1 : 0) +
(trend_signal == 1 ? 1 : 0) +
(wt_signal == 1 ? 1 : 0)
// Generate trading signals when majority (2+ indicators) agree
bool buy_signal = consensus_count >= 2
bool sell_signal = consensus_count <= -2
// =================== Trade Execution ===================
// Long position entry and exit with risk management
if (buy_signal and strategy.position_size <= 0)
strategy.entry("Long", strategy.long)
strategy.exit("Long TP/SL", "Long",
profit = close * tp_percent / 100,
loss = close * sl_percent / 100)
// Short position entry and exit with risk management
if (sell_signal and strategy.position_size >= 0)
strategy.entry("Short", strategy.short)
strategy.exit("Short TP/SL", "Short",
profit = close * tp_percent / 100,
loss = close * sl_percent / 100)
// =================== Visualization ===================
// Signal markers for entry points
plotshape(buy_signal ? low : na, "Buy Signal", shape.triangleup, location.belowbar, color.green, size=size.small)
plotshape(sell_signal ? high : na, "Sell Signal", shape.triangledown, location.abovebar, color.red, size=size.small)
// Indicator lines
plot(wt1, "Wavetrend 1", color.blue, linewidth=1)
plot(wt2, "Wavetrend 2", color.orange, linewidth=1)
plot(wt_overbought, "Overbought", color.red, linewidth=1)
plot(wt_oversold, "Oversold", color.green, linewidth=1)
plot(fast_ema, "Fast EMA", color.yellow, linewidth=1)
plot(slow_ema, "Slow EMA", color.white, linewidth=1)
plot(lwst_trend == 1 ? upperBand : na, "Upper Band", color.green, linewidth=2)
plot(lwst_trend == -1 ? lowerBand : na, "Lower Band", color.red, linewidth=2)
// =================== Information Table ===================
// Real-time display of indicator signals
var table info = table.new(position.top_right, 2, 4)
table.cell(info, 0, 0, "Indicator", bgcolor=color.gray, text_color=color.white)
table.cell(info, 1, 0, "Signal", bgcolor=color.gray, text_color=color.white)
table.cell(info, 0, 1, "LWST", text_color=color.white)
table.cell(info, 1, 1, str.tostring(lwst_trend), text_color=lwst_trend == 1 ? color.green : color.red)
table.cell(info, 0, 2, "Trend", text_color=color.white)
table.cell(info, 1, 2, str.tostring(trend_signal), text_color=trend_signal == 1 ? color.green : color.red)
table.cell(info, 0, 3, "Wavetrend", text_color=color.white)
table.cell(info, 1, 3, str.tostring(wt_signal), text_color=wt_signal == 1 ? color.green : color.red)