这是一个基于支撑阻力位突破和回测的量化交易策略。策略通过识别关键价格支撑位和阻力位,在价格突破后的回测确认点进行交易。该策略采用左右看回bar数动态定位关键点位,并结合回测容差来过滤假突破,从而提高交易的准确性和稳定性。
策略主要包含以下核心逻辑: 1. 通过左右看回指定数量的K线来识别关键支撑和阻力pivot点位 2. 设置状态变量追踪候选支撑阻力位的突破和回测情况 3. 在出现新的pivot点时更新候选支撑阻力位 4. 当价格突破候选支撑阻力位且回测时进行交易: - 价格跌破支撑后回升至支撑位附近时做多 - 价格突破阻力后回落至阻力位附近时做空 5. 使用容差参数来过滤回测时的价格波动,提高信号质量
该策略通过经典的支撑阻力理论和突破回测逻辑构建,具有较好的理论基础。通过参数优化和风险控制可以获得稳定的交易效果。策略代码结构清晰,易于理解和扩展,具有较强的实用价值。建议在实盘交易中结合市场情况和个人风险偏好进行适当的参数调整。
/*backtest
start: 2024-03-13 09:40:00
end: 2025-02-23 15:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/
//@version=5
strategy("SR突破与回测策略(4小时)", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// ===== 用户输入 =====
leftBars = input.int(3, "左侧支点K线数量", minval=1) // 计算支撑/阻力时,左侧的K线数量
rightBars = input.int(3, "右侧支点K线数量", minval=1) // 计算支撑/阻力时,右侧的K线数量
tolerance = input.float(0.005, "回测容忍度(比例)", step=0.001) // 支撑/阻力回测时的容忍度,设置为价格范围的一个小比例
// ===== 计算支点 =====
pLow = ta.pivotlow(low, leftBars, rightBars) // 计算最低点(支撑点)
pHigh = ta.pivothigh(high, leftBars, rightBars) // 计算最高点(阻力点)
// ===== 用于候选支撑和阻力的状态变量 =====
var float candidateSupport = na // 支撑候选点
var bool supportBroken = false // 支撑是否被突破
var bool supportRetested = false // 支撑是否被回测
var float candidateResistance = na // 阻力候选点
var bool resistanceBroken = false // 阻力是否被突破
var bool resistanceRetested = false // 阻力是否被回测
// ===== 更新候选支撑和阻力 =====
if not na(pLow) // 如果找到了有效的支撑点
candidateSupport := pLow // 设置候选支撑点
supportBroken := false // 重置支撑突破标志
supportRetested := false // 重置支撑回测标志
if not na(pHigh) // 如果找到了有效的阻力点
candidateResistance := pHigh // 设置候选阻力点
resistanceBroken := false // 重置阻力突破标志
resistanceRetested := false // 重置阻力回测标志
// ===== 检查突破和回测 =====
// -- 支撑:价格突破支撑并回测 --
if not na(candidateSupport) // 如果有有效的支撑候选点
if not supportBroken and low < candidateSupport // 如果价格突破支撑
supportBroken := true // 设置支撑已被突破
// 如果支撑被突破并且价格回测支撑
if supportBroken and not supportRetested and close >= candidateSupport and math.abs(low - candidateSupport) <= candidateSupport * tolerance
supportRetested := true // 标记支撑被回测
label.new(bar_index, candidateSupport, "支撑回测",
style=label.style_label_up, color=color.green, textcolor=color.white, size=size.tiny) // 在图表上标记支撑回测
// 示例交易逻辑:在支撑回测时开多单
strategy.entry("Long_Support", strategy.long) // 执行多头开仓
// -- 阻力:价格突破阻力并回测 --
if not na(candidateResistance) // 如果有有效的阻力候选点
if not resistanceBroken and high > candidateResistance // 如果价格突破阻力
resistanceBroken := true // 设置阻力已被突破
// 如果阻力被突破并且价格回测阻力
if resistanceBroken and not resistanceRetested and close <= candidateResistance and math.abs(high - candidateResistance) <= candidateResistance * tolerance
resistanceRetested := true // 标记阻力被回测
label.new(bar_index, candidateResistance, "阻力回测",
style=label.style_label_down, color=color.red, textcolor=color.white, size=size.tiny) // 在图表上标记阻力回测
// 示例交易逻辑:在阻力回测时开空单
strategy.entry("Short_Resistance", strategy.short) // 执行空头开仓
// ===== 绘制支撑和阻力 =====
plot(pLow, title="支撑点", style=plot.style_circles, color=color.green, linewidth=2) // 绘制支撑点,绿色
plot(pHigh, title="阻力点", style=plot.style_circles, color=color.red, linewidth=2) // 绘制阻力点,红色