本策略是一个融合了多重技术指标的智能交易系统,通过对Fair Value Gap(FVG)、趋势信号和价格行为的综合分析来识别市场机会。系统采用双重策略机制,结合趋势跟踪和波段交易特点,通过动态仓位管理和多维度退出机制来优化交易表现。该策略特别注重风险控制,通过波动率过滤和交易量确认来提高信号质量。
策略的核心逻辑基于以下几个维度: 1. FVG缺口识别 - 通过计算价格跳空缺口的大小来寻找潜在的交易机会 2. 趋势确认系统 - 结合200日均线、SuperTrend指标和MACD来确认市场趋势 3. 智能资金确认 - 使用RSI超买超卖、成交量异常和价格行为模式作为交易触发条件 4. 动态持仓管理 - 基于ATR的波动率来调整仓位大小,确保风险敞口的一致性 5. 多层次退出机制 - 采用跟踪止损和目标止盈相结合的方式管理交易退出
该策略通过综合运用多个技术指标和交易技术,构建了一个完整的交易系统。其优势在于能够自适应市场变化,同时保持严格的风险控制。虽然存在一定的优化空间,但整体而言是一个设计合理的量化交易策略。
/*backtest
start: 2025-01-01 00:00:00
end: 2025-02-20 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=6
strategy("Adaptive Trend Signals", overlay=true, margin_long=100, margin_short=100, pyramiding=1, initial_capital=50000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
// 1. Enhanced Inputs with Debugging Options
fvgSize = input.float(0.25, "FVG Size (%)", minval=0.1, step=0.05)
atrPeriod = input.int(14, "ATR Period") // Increased for better stability
rsiPeriod = input.int(7, "RSI Period")
useSuperTrend = input.bool(true, "Use SuperTrend Filter")
useTrendFilter = input.bool(false, "Use 200 EMA Trend Filter") // Disabled by default
volatilityThreshold = input.float(1.0, "Volatility Threshold (ATR%)", step=0.1) // Increased threshold
useVolume = input.bool(true, "Use Volume Confirmation")
riskPercentage = input.float(2.0, "Risk %", minval=0.1, maxval=5)
// 2. Advanced Market Filters with Trend Change Detection
var int marketTrend = 0
var bool trendChanged = false
ema200 = ta.ema(close, 200)
prevMarketTrend = marketTrend
marketTrend := close > ema200 ? 1 : close < ema200 ? -1 : 0
trendChanged := marketTrend != prevMarketTrend
// 3. Enhanced FVG Detection with Adjusted Volume Requirements
bullishFVG = (low[1] > high[2] and (low[1] - high[2])/high[2]*100 >= fvgSize) or
(low > high[1] and (low - high[1])/high[1]*100 >= fvgSize)
bearishFVG = (high[1] < low[2] and (low[2] - high[1])/low[2]*100 >= fvgSize) or
(high < low[1] and (low[1] - high)/low[1]*100 >= fvgSize)
// 4. Smart Money Confirmation System with Signal Debugging
rsi = ta.rsi(close, rsiPeriod)
[macdLine, signalLine, _] = ta.macd(close, 5, 13, 5)
[supertrendLine, supertrendDir] = ta.supertrend(3, 10)
// Script 2 Indicators
[macdLine2, signalLine2, _] = ta.macd(close, 4, 11, 3)
[supertrendLine2, supertrendDir2] = ta.supertrend(3, 7)
vWAP = ta.vwap(close)
ema21 = ta.ema(close, 21)
// 5. Price Action Filters from Script 2
breakoutLong = close > ta.highest(high, 5) and (useVolume ? volume > ta.sma(volume, 10)*1.8 : true)
breakdownShort = close < ta.lowest(low, 5) and (useVolume ? volume > ta.sma(volume, 10)*1.8 : true)
bullishRejection = low < vWAP and close > (high + low)/2 and close > open
bearishRejection = high > vWAP and close < (high + low)/2 and close < open
// 6. Combined Entry Conditions
longBaseCond = (bullishFVG and rsi < 35 and macdLine > signalLine) or
(bullishFVG and rsi < 38 and supertrendDir2 == 1) or
(breakoutLong and macdLine2 > signalLine2) or
(bullishRejection and close > ema21)
shortBaseCond = (bearishFVG and rsi > 65 and macdLine < signalLine) or
(bearishFVG and rsi > 62 and supertrendDir2 == -1) or
(breakdownShort and macdLine2 < signalLine2) or
(bearishRejection and close < ema21)
longSignal = longBaseCond and (not useSuperTrend or supertrendDir == 1) and (not useTrendFilter or marketTrend == 1)
shortSignal = shortBaseCond and (not useSuperTrend or supertrendDir == -1) and (not useTrendFilter or marketTrend == -1)
// 7. Position Sizing with Minimum Quantity
var float longEntryPrice = na
var float shortEntryPrice = na
atr = ta.atr(atrPeriod)
positionSizeScript1 = math.max(strategy.equity * riskPercentage / 100 / (atr * 1.5), 1)
positionSizeScript2 = strategy.equity * riskPercentage / 100 / (atr * 2)
// 8. Dynamic Exit System with Dual Strategies
var float trailPrice = na
if longSignal or trendChanged and marketTrend == 1
trailPrice := close
if shortSignal or trendChanged and marketTrend == -1
trailPrice := close
trailOffset = atr * 0.75
// Script 1 Exit Logic
if strategy.position_size > 0
trailPrice := math.max(trailPrice, close)
strategy.exit("Long Exit", "Long", stop=trailPrice - trailOffset, trail_offset=trailOffset)
if strategy.position_size < 0
trailPrice := math.min(trailPrice, close)
strategy.exit("Short Exit", "Short", stop=trailPrice + trailOffset, trail_offset=trailOffset)
// Script 2 Exit Logic
longStop = close - atr * 1.2
shortStop = close + atr * 1.2
strategy.exit("Long Exit 2", "Long", stop=longStop, limit=na(longEntryPrice) ? na : longEntryPrice + (atr * 4), trail_points=not na(longEntryPrice) and close > longEntryPrice + atr ? atr * 3 : na, trail_offset=atr * 0.8)
strategy.exit("Short Exit 2", "Short", stop=shortStop, limit=na(shortEntryPrice) ? na : shortEntryPrice - (atr * 4), trail_points=not na(shortEntryPrice) and close < shortEntryPrice - atr ? atr * 3 : na, trail_offset=atr * 0.8)
// 9. Trend Change Signals and Visuals
// plot(supertrendLine, "SuperTrend", color=color.new(#2962FF, 0))
// plot(supertrendLine2, "SuperTrend 2", color=color.new(#FF00FF, 0))
// plot(ema200, "200 EMA", color=color.new(#FF6D00, 0))
// plot(ema21, "21 EMA", color=color.new(#00FFFF, 0))
bgcolor(marketTrend == 1 ? color.new(color.green, 90) :
marketTrend == -1 ? color.new(color.red, 90) : na)
plotshape(trendChanged and marketTrend == 1, "Bullish Trend", shape.labelup,
location.belowbar, color=color.green, text="▲ Trend Up")
plotshape(trendChanged and marketTrend == -1, "Bearish Trend", shape.labeldown,
location.abovebar, color=color.red, text="▼ Trend Down")
// 10. Signal Visualization for Both Strategies
// plotshape(longSignal, "Long Entry", shape.triangleup, location.belowbar,
// color=color.new(#00FF00, 0), size=size.small)
// plotshape(shortSignal, "Short Entry", shape.triangledown, location.abovebar,
// color=color.new(#FF0000, 0), size=size.small)
// plotshape(breakoutLong, "Breakout Long", shape.flag, location.belowbar,
// color=color.new(#00FF00, 50), size=size.small)
// plotshape(breakdownShort, "Breakdown Short", shape.flag, location.abovebar,
// color=color.new(#FF0000, 50), size=size.small)
// 11. Order Execution with Dual Entry Systems
if trendChanged and marketTrend == 1
strategy.entry("Long Trend", strategy.long, qty=positionSizeScript1)
longEntryPrice := close
if trendChanged and marketTrend == -1
strategy.entry("Short Trend", strategy.short, qty=positionSizeScript1)
shortEntryPrice := close
if longSignal and strategy.position_size == 0
strategy.entry("Long Signal", strategy.long, qty=positionSizeScript2)
longEntryPrice := close
if shortSignal and strategy.position_size == 0
strategy.entry("Short Signal", strategy.short, qty=positionSizeScript2)
shortEntryPrice := close