本策略是一种基于砖块图(Renko)的单向多头交易系统,结合了时间过滤机制,专为特定交易时段设计。该策略利用ATR(真实波动幅度均值)动态调整砖块大小,通过跟踪价格运动形成的砖块来识别上升趋势,仅在指定的交易时间段内执行多头交易。策略核心在于利用砖块图过滤市场噪音,捕捉持续性价格变动,同时避开市场非活跃时段,提高交易效率和资金安全性。
该策略的运作基于以下核心原理:
砖块图构建机制:系统通过两种方式确定砖块大小 - 固定值或基于ATR动态调整。ATR模式下,砖块大小等于特定周期(默认5)的ATR值乘以倍数(默认1.0),使砖块大小能够根据市场波动性自适应调整。
方向判定逻辑:策略跟踪价格变动,当价格相对于上一个砖块收盘价上涨超过砖块大小时形成上升砖块;下跌超过砖块大小时形成下降砖块;价格变动超过两倍砖块大小时发生趋势反转。
交易信号生成:当砖块方向从未定义或下降转为上升时产生买入信号;当砖块方向从未定义或上升转为下降时产生卖出信号。
时间过滤器:策略仅在指定的交易时段内(默认为4:35至14:30)执行交易,这段时间通常对应主要市场的活跃时段。离开交易时段时,系统会自动平仓以避免隔夜风险。
单向交易模式:策略仅执行多头交易,不进行做空操作,适合看涨趋势明显或禁止做空的市场环境。
基于代码分析,该策略具有以下显著优势:
噪音过滤:砖块图天然具有过滤市场噪音的能力,只有价格变动超过特定阈值才会形成新砖块,有效避免了对小幅价格波动的过度反应。
自适应调节:通过ATR动态调整砖块大小,策略能够适应不同市场环境和波动性条件,在高波动期增大砖块尺寸,低波动期减小砖块尺寸。
时间风险管理:时间过滤器确保交易仅在市场最活跃、流动性最佳的时段进行,避开了夜间和早盘等可能流动性不足或波动异常的时段。
方向明确:策略专注于捕捉上升趋势,逻辑简洁明确,避免了多空交替带来的频繁交易和手续费损耗。
可视化辅助:策略提供了买卖信号标签和砖块高低点可视化选项,便于交易者直观理解市场动态和策略表现。
资金管理:策略采用资金量化交易模式,可根据初始资本自动计算仓位大小,降低了资金管理的复杂性。
尽管该策略设计合理,但仍存在以下潜在风险:
滞后反应:砖块图本质上是滞后指标,新砖块的形成需要价格达到特定移动幅度,可能导致入场和出场时机相对滞后,在快速反转市场中可能错过最佳交易点。
缺乏短线灵活性:策略仅在形成新砖块时才产生信号,可能错过短期内的盈利机会,特别是在震荡市场中表现不佳。
单向限制:仅做多策略在下跌市场中无法获利,甚至可能持续亏损,市场长期处于下跌趋势时策略效果显著降低。
时间过滤风险:固定的交易时段设置可能错过非交易时段内的重要机会,同时在交易时段交界处可能出现不必要的平仓和再入场操作。
参数敏感性:策略性能高度依赖于砖块大小参数的设置,不当的参数选择可能导致过度交易或错失机会。
解决方案: - 增加趋势确认指标,如移动平均线或MACD,提高信号质量 - 引入止损机制,控制单笔交易最大风险 - 考虑增加做空功能,实现双向交易 - 优化时间过滤器,根据不同市场特性调整交易时段 - 使用参数优化测试找出最佳参数组合
根据代码分析,该策略可以从以下几个方面进行优化:
多指标融合:结合其他技术指标如RSI、MACD或移动平均线交叉作为确认信号,提高入场质量。这样可以避免单纯依赖价格形态带来的假信号,特别是在震荡市场中。
动态止损机制:引入追踪止损功能,例如基于ATR的动态止损,在保留上涨空间的同时保护已获利润。这对于捕捉大趋势尤为重要。
双向交易扩展:增加空头交易功能,使策略能够在下跌市场中同样获利,提高策略的全天候适应性。
智能时间过滤:将固定时间过滤升级为基于市场活跃度的动态时间过滤,例如结合成交量分析,在高流动性时段积极交易,低流动性时段保守操作。
多周期分析:引入多时间框架分析,例如使用更高级别时间框架的趋势方向作为交易过滤条件,只在大趋势方向一致时进行交易。
优化参数自适应:开发参数自适应机制,根据市场状态动态调整ATR周期和乘数,使策略更好地适应不同市场环境。
风险暴露控制:增加仓位管理算法,根据市场波动性和信号强度动态调整交易规模,控制风险暴露。
这些优化方向旨在提高策略的稳健性和适应性,减少在不利市场条件下的亏损,同时最大化有利市场条件下的盈利能力。
砖块图时间过滤单向多头交易策略是一种结合价格动量和时间过滤的趋势跟踪系统。通过砖块图的构建机制,该策略能够有效过滤市场噪音,专注于捕捉持续性价格变动;通过时间过滤器,策略避开了市场非活跃时段,降低了隔夜持仓风险。
策略的主要优势在于其简洁明确的交易逻辑、自适应的砖块大小设计以及严格的时间管理,使其特别适合波动较大但整体呈上升趋势的市场。然而,其单向交易特性和滞后反应也是需要注意的局限性。
通过引入多指标确认、动态止损机制、双向交易能力和智能时间过滤等优化措施,该策略有望进一步提升其在不同市场环境下的表现。对于追求稳健交易并愿意牺牲部分灵活性换取更清晰交易信号的投资者而言,这是一个值得考虑的策略框架。 ||
/*backtest
start: 2025-06-01 00:00:00
end: 2025-07-22 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES","balance":10000000}]
args: [["RunMode",1,360008],["ContractType","m2509",360008]]
*/
//@version=5
strategy("Renko Long-Only Strategy with Time Filter", overlay=true, default_qty_value = 10)
// --- 输入参数 ---
atrLength = input.int(5, "ATR Period", minval=1)
atrMult = input.float(1.0, "ATR Multiplier", minval=0.1, step=0.1)
showWicks = input(false, "Show Wick Lines")
showLabels = input(true, "Show Buy/Sell Labels")
startHour = input.int(9, "Start Hour (24h)", minval=0, maxval=23)
startMinute = input.int(10, "Start Minute", minval=0, maxval=59)
endHour = input.int(14, "End Hour (24h)", minval=0, maxval=23)
endMinute = input.int(40, "End Minute", minval=0, maxval=59)
// --- 时间计算 ---
isTradingTime() =>
timeHour = hour(time("1"))
timeMinute = minute(time("1"))
currentTime = timeHour * 60 + timeMinute
sessionStart = startHour * 60 + startMinute
sessionEnd = endHour * 60 + endMinute
currentTime >= sessionStart and currentTime <= sessionEnd
inTradingHours = isTradingTime()
timeToClose = not inTradingHours and inTradingHours[1]
// --- 砖块计算 ---
var float boxSize = na
var float lastClose = na
var int direction = 0
var float wickHigh = na
var float wickLow = na
var bool newBrick = false
var int prevDir = 0
var bool buySignal = false
var bool sellSignal = false
boxSize := ta.atr(atrLength) * atrMult
upMove = not na(lastClose) and (close - lastClose >= boxSize)
downMove = not na(lastClose) and (lastClose - close >= boxSize)
reversal = (direction == 1 and downMove and (lastClose - close >= boxSize * 2)) or
(direction == -1 and upMove and (close - lastClose >= boxSize * 2))
if na(lastClose)
lastClose := close
wickHigh := high
wickLow := low
else if upMove and direction >= 0
lastClose += boxSize
prevDir := direction
direction := 1
wickHigh := high
wickLow := low
newBrick := true
else if downMove and direction <= 0
lastClose -= boxSize
prevDir := direction
direction := -1
wickHigh := high
wickLow := low
newBrick := true
else if reversal
lastClose := direction == 1 ? lastClose - boxSize : lastClose + boxSize
prevDir := direction
direction := direction * -1
wickHigh := high
wickLow := low
newBrick := true
else
wickHigh := math.max(wickHigh, high)
wickLow := math.min(wickLow, low)
newBrick := false
buySignal := direction == 1 and prevDir != 1
sellSignal := direction == -1 and prevDir != -1
// --- 策略逻辑 ---
enterLong = buySignal and newBrick and barstate.isconfirmed and inTradingHours
exitLong = (sellSignal and newBrick and barstate.isconfirmed) or timeToClose
if enterLong
strategy.entry("Long", strategy.long)
if exitLong
strategy.close("Long")
// --- 可视化绘图 ---
color brickColor = direction == 1 ? color.green : direction == -1 ? color.red : color.gray
plot(lastClose, "Renko Close", brickColor, 2, plot.style_linebr)
plot(showWicks ? wickHigh : na, "High", color.new(brickColor, 70), 1, plot.style_circles)
plot(showWicks ? wickLow : na, "Low", color.new(brickColor, 70), 1, plot.style_circles)
bgcolor(inTradingHours ? color.new(color.blue, 90) : na)