这个名为”多时框动态趋势判断系统”的量化交易策略是一个结合了多种技术指标的综合系统,主要融合指数移动均线(EMA)交叉、相对强弱指数(RSI)、交易量加权平均价(VWAP)以及平均方向指数(ADX)等多元素进行交易决策。该策略通过多时间框架分析,结合趋势确认和动量指标,有效识别市场超买超卖区域并判断机构资金流向,特别适合短期趋势反转交易和波段操作。系统允许交易者灵活选择仅做多、仅做空或双向交易,同时提供ADX过滤选项以减少震荡市场中的假信号,整体设计既注重信号质量又兼顾操作灵活性。
该策略的核心原理建立在多层次市场指标的协同确认基础上。首先,系统计算两条不同周期的指数移动均线(EMA),分别是短周期EMA(9)和长周期EMA(21),用于识别趋势方向和潜在的趋势转变点。其次,系统从15分钟时间框架获取RSI(14)数据,引入跨时间框架分析以确认价格动量状态。第三,系统使用当前时间框架的VWAP作为机构资金参与的参考指标,并设定了VWAP与均线之间的差距阈值(0.1%)来过滤交易信号。
具体来说,做空入场条件需同时满足:短期EMA下穿长期EMA(看跌交叉)、15分钟RSI值大于30(非超卖)、VWAP显著低于两条EMA(至少0.1%),这表明存在机构卖压和看跌情绪。而做多入场条件目前仅要求15分钟RSI低于30(超卖状态),尚未加入EMA和VWAP过滤。
此外,策略还引入了可选的ADX过滤器,通过手动计算ADX值(默认长度14)并设定最小阈值(默认20)来确保仅在明确趋势中交易。用户可以启用或禁用ADX过滤,增加了策略的灵活性。策略还支持通过输入参数选择交易方向(“Long”、”Short”或”Both”),使其更容易适配自动化交易系统如OKX机器人或TradingView警报。
多指标协同确认:结合EMA交叉、RSI动量、VWAP机构资金流向和ADX趋势强度四种指标,形成了多层次的交易信号确认机制,显著提高了信号的可靠性。
多时间框架分析:通过引入15分钟时间框架的RSI数据,策略能够从更宏观的角度评估市场动量,减少了单一时间框架分析可能带来的盲点。
机构资金视角:利用VWAP与EMA之间的差距作为机构资金参与的指标,这种机构视角使策略能够更好地识别真实的市场压力和支撑区域。
灵活的操作模式:通过tradeDirection参数,用户可以根据市场环境或个人偏好选择仅做多、仅做空或双向交易,无需维护多个策略版本。
动态趋势过滤:可选的ADX过滤器帮助策略仅在明确趋势中进行交易,有效减少震荡市场中的假信号,同时保留了禁用此过滤器的灵活性。
风险管理集成:策略内置了止损和止盈机制(固定价格点数),结合RSI超买超卖条件作为退出信号,形成了完整的交易闭环。
代码效率高:策略代码结构清晰,逻辑模块化,计算过程高效,便于维护和进一步优化。
做多入场条件不完善:当前策略的做多逻辑仅基于RSI<30的超卖条件,缺乏EMA交叉和VWAP过滤,可能导致过早入场或在持续下跌趋势中频繁做多,增加亏损风险。
固定止损止盈设置:策略使用固定点数(100点止损,200点止盈)而非百分比或基于波动率的动态止损,在不同波动环境下可能不够灵活,高波动期可能止损过松,低波动期可能止损过紧。
无交易频率控制:缺少strategy.opentrades == 0的判断可能导致信号连续触发时重复入场,形成头寸叠加,无意中增加风险敞口。
ADX计算复杂性:手动计算ADX增加了代码复杂性,虽然功能正确但可维护性较差,若出现计算偏差可能导致错误的趋势判断。
VWAP差距阈值固定:0.1%的固定VWAP差距阈值可能不适用于所有市场条件,高波动市场中可能过于宽松,低波动市场中可能过于严格。
缺乏回测敏感性分析:代码中没有显示参数优化或敏感性分析的结果,无法确定当前参数组合(如EMA 9/21,RSI 14,ADX 14⁄20)是否最优。
可能存在时间延迟:跨时间框架数据请求(request.security)可能在某些情况下引入数据延迟,特别是在快速变动的市场中,影响交易时机精确度。
完善做多入场逻辑:为做多策略添加镜像的VWAP条件和EMA交叉过滤,即要求VWAP显著高于两条EMA(如0.1%)且短期EMA上穿长期EMA,使多空逻辑对称,提高做多信号质量。
添加交易频率控制:在入场条件中加入strategy.opentrades == 0的判断,防止连续信号导致的头寸堆叠,更好地控制风险敞口。
动态止损止盈设置:基于平均真实波幅(ATR)动态调整止损止盈水平,使风险管理更适应当前市场波动状况,取代当前的固定点数设置。
优化ADX计算:考虑使用TradingView内置的ta.adx()函数替代手动计算,简化代码并提高维护性,同时添加ADX方向判断(+DI与-DI关系)进一步细化趋势方向。
动态VWAP差距阈值:将VWAP差距阈值设计为基于市场波动性的动态参数,例如与ATR相关联,使过滤条件能够自适应不同市场环境。
添加交易时间过滤:引入交易时段控制,避开低流动性时段或重大新闻公告时段,减少滑点和意外波动带来的风险。
多时间框架趋势一致性:考虑添加更高时间框架(如1小时或4小时)的趋势方向判断,只在多个时间框架趋势一致时交易,进一步减少假信号。
引入交易量确认:增加交易量指标确认,如要求EMA交叉发生时的交易量显著高于前几个周期平均值,提高趋势转变信号的可靠性。
“多时框动态趋势判断系统”是一个结合了多种技术分析工具的综合量化策略,通过EMA交叉、RSI动量、VWAP机构资金流向和ADX趋势强度多重确认机制,为交易者提供了相对可靠的入场和出场信号。该策略特别注重机构资金行为与零售情绪的结合分析,兼顾了趋势追踪和反转交易的特点。
虽然策略在多指标协同和灵活性方面表现出色,但仍存在做多条件不完善、风险管理固定、可能重复入场等问题。通过完善做多逻辑、实现动态风险管理、添加交易频率控制、优化ADX计算、设计动态VWAP阈值、引入交易时间过滤和多时间框架一致性要求等优化措施,策略的性能和稳定性有望得到显著提升。
总体而言,该策略代表了一种全面且灵活的交易系统设计思路,通过综合考量技术指标、价格结构、市场情绪和机构行为,为交易者提供了一个理论上能够适应多种市场环境的工具。经过建议的优化后,该策略有潜力成为一个更加完善和高效的交易系统。
/*backtest
start: 2024-05-13 00:00:00
end: 2025-05-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("MinhPhan MA Crossover Strategy RSI 15m + ADX Toggle", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.001)
// === Inputs ===
shortLen = input.int(9, title="Short EMA")
longLen = input.int(21, title="Long EMA")
useAdxFilter = input.bool(true, title="Enable ADX Filter?")
adxLen = input.int(14, title="ADX Length")
adxThresh = input.float(20, title="Min ADX to Trade")
// === EMAs ===
shortMA = ta.ema(close, shortLen)
longMA = ta.ema(close, longLen)
// === VWAP ===
vwap = ta.vwap
// === RSI from 15-minute timeframe ===
rsi_15m = request.security(syminfo.tickerid, "15", ta.rsi(close, 14))
// === Manual ADX Calculation ===
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove) or upMove <= downMove or upMove < 0 ? 0 : upMove
minusDM = na(downMove) or downMove <= upMove or downMove < 0 ? 0 : downMove
tr = math.max(math.max(high - low, math.abs(high - close[1])), math.abs(low - close[1]))
smoothedTR = ta.rma(tr, adxLen)
smoothedPlusDM = ta.rma(plusDM, adxLen)
smoothedMinusDM = ta.rma(minusDM, adxLen)
plusDI = 100 * smoothedPlusDM / smoothedTR
minusDI = 100 * smoothedMinusDM / smoothedTR
dx = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adx = ta.rma(dx, adxLen)
isTrending = useAdxFilter ? adx > adxThresh : true // ADX toggle logic
// === VWAP Gap Filter ===
gapThreshold = 0.001
vwapBelowEMAs =
(shortMA - vwap) / shortMA > gapThreshold and
(longMA - vwap) / longMA > gapThreshold
// === Direction Control ===
tradeDirection = input.string(title="Trade Direction", defval="Both", options=["Long", "Short", "Both"])
allowLong = tradeDirection == "Long" or tradeDirection == "Both"
allowShort = tradeDirection == "Short" or tradeDirection == "Both"
// === Entry Conditions ===
if (allowLong and rsi_15m < 30 and isTrending)
strategy.entry("Long", strategy.long)
if (allowShort and rsi_15m > 30 and ta.crossunder(shortMA, longMA) and vwapBelowEMAs and isTrending)
strategy.entry("Short", strategy.short)
// === Exit Conditions ===
if (strategy.position_size > 0 and rsi_15m > 70)
strategy.exit("Exit Long", from_entry="Long", loss=100, profit=200)
if (strategy.position_size < 0 and rsi_15m < 30)
strategy.exit("Exit Short", from_entry="Short", loss=100, profit=200)
// === Plots ===
plot(shortMA, color=color.blue, title="Short EMA")
plot(longMA, color=color.red, title="Long EMA")
plot(vwap, title="VWAP", color=color.purple, linewidth=2)
plot(adx, title="ADX", color=color.orange)
hline(adxThresh, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)