该策略是一个基于波动率的动态择时交易系统,结合了趋势跟踪和风险管理的特点。策略核心是通过波动率通道来识别市场趋势变化,同时引入了基于ATR的动态仓位管理机制,实现了对交易风险的精确控制。该策略特别适合在波动性较大的市场环境下运行,能够自适应市场波动调整持仓。
策略的核心逻辑基于以下几个关键组件: 1. 波动率通道计算:使用ATR(Average True Range)指标来度量市场波动率,并构建动态的波动率通道。通道的宽度由ATR值和倍数因子共同决定,可以根据市场特点灵活调整。 2. 趋势判断机制:通过价格与波动率通道的相对位置判断趋势方向。当价格上穿通道时视为上升趋势确立,下穿通道时视为下降趋势确立。 3. 仓位管理系统:基于初始资金和预设的每笔交易风险比例,结合实时的止损距离动态计算开仓数量,确保每笔交易的风险暴露一致。 4. 风险控制机制:设置了基于波动率通道的动态止损,当价格触及止损位时自动平仓,并在收盘前强制清仓,避免隔夜风险。
这是一个结合了波动率、趋势跟踪和风险管理的完整交易系统。策略通过波动率通道捕捉趋势变化,同时运用科学的资金管理方法控制风险。虽然在震荡市场表现可能欠佳,但通过合理的参数优化和额外的过滤机制,能够在大多数市场环境下稳定运行。策略的核心优势在于其自适应性和风险控制能力,适合作为中长期策略的基础框架进行扩展和优化。
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-10 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("BNF FUT 5 min Volatility Strategy", overlay=true)
// Inputs
length = input.int(20, "Length", minval=2)
src = input.source(close, "Source")
factor = input.float(2.0, "Multiplier", minval=0.25, step=0.25)
initial_capital = input.float(100000, "Initial Capital ($)")
risk_per_trade = input.float(1.0, "Risk per Trade (%)", minval=0.1, maxval=10.0)
// Volatility Stop Function
volStop(src, atrlen, atrfactor) =>
if not na(src)
var max = src
var min = src
var uptrend = true
var float stop = na
atrM = nz(ta.atr(atrlen) * atrfactor, ta.tr)
max := math.max(max, src)
min := math.min(min, src)
stop := nz(uptrend ? math.max(stop, max - atrM) : math.min(stop, min + atrM), src)
uptrend := src - stop >= 0.0
if uptrend != nz(uptrend[1], true)
max := src
min := src
stop := uptrend ? max - atrM : min + atrM
[stop, uptrend]
// Calculate Volatility Stop
[vStop, uptrend] = volStop(src, length, factor)
// Plot Volatility Stop
plot(vStop, "Volatility Stop", style=plot.style_cross, color=uptrend ? #009688 : #F44336)
// Risk Management and Position Sizing
atr = ta.atr(length)
stop_distance = math.abs(close - vStop) // Distance to stop level
position_size = (initial_capital * (risk_per_trade / 100)) / stop_distance // Position size based on risk per trade
position_size := math.max(position_size, 1) // Ensure minimum size of 1
// Strategy Logic
if not na(vStop)
if uptrend and not uptrend[1] // Transition to uptrend
strategy.close("Short")
strategy.entry("Long", strategy.long, qty=position_size)
if not uptrend and uptrend[1] // Transition to downtrend
strategy.close("Long")
strategy.entry("Short", strategy.short, qty=position_size)
// Exit on Stop Hit
if strategy.position_size > 0 and low < vStop // Exit long if stop hit
strategy.close("Long", comment="Stop Hit")
if strategy.position_size < 0 and high > vStop // Exit short if stop hit
strategy.close("Short", comment="Stop Hit")
if (hour == 15 and minute == 15)
strategy.close_all()