TradingView策略优化:深度回测能否解决回测偏差?如何基于最小时间框架执行strategy.exit?
TradingView回测局限性与退出逻辑优化问题
问题背景
我用TradingView高级订阅开发了日线级交易策略,满足条件后在K线收盘下单;下单后通过strategy.exit仅在触发止损/止盈时平仓。但发现TradingView回测有个局限:它会按特定逻辑模拟K线走势——如果K线开盘价更接近最高价,就按开盘→最高→最低→收盘的顺序模拟;若开盘价更接近最低价,则按开盘→最低→最高→收盘模拟。这导致后续K线同时触及止盈和止损时,比如开盘价接近最高价,回测会默认先触发止盈,和实际行情可能不符。
想请教两个问题:
- TradingView的深度回测模式能否缓解这个问题?
- 如果不能,怎么修改现有退出代码,让它基于更小时间框架(比如1分钟/5分钟)检查止损/止盈触发,而非当前日线框架?
现有退出代码:
strategy.exit("TP/SL 1", "Long Entry 1", stop = long_stop_level, limit = long_profit_level) strategy.exit("TP/SL 1", "Short Entry 1", stop = short_stop_level, limit = short_profit_level)
回答
1. 深度回测模式的作用
深度回测模式确实能一定程度缓解这个问题,但没法彻底解决。它会用更精细的tick级数据模拟价格路径,而非仅依赖K线开高低收和固定顺序逻辑。不过要注意:
- 深度回测仅支持部分交易所的历史数据,且只有高级订阅用户能使用;
- 即便用了深度回测,若某根K线内价格确实同时碰了止损和止盈,实际行情的触发顺序仍可能因流动性、滑点等因素和回测有差异,但相比默认回测逻辑,结果会更贴近真实情况。
2. 基于小时间框架优化退出逻辑
如果深度回测满足不了需求,你可以通过引入小时间框架数据,在日线策略里实时检查小周期价格是否触发止损/止盈,手动触发平仓,替代strategy.exit的默认逻辑。具体实现如下:
核心思路
- 用
request.security()函数拉取小时间框架(比如1分钟)的价格数据; - 实时监控小周期内的高低价是否触及止损或止盈水平;
- 一旦触发,调用
strategy.close()手动平仓,并标注触发类型。
修改后的代码示例
// 定义小时间框架,可根据需求改为"5"(5分钟)等 small_tf = "1" // 拉取小周期的高低价数据 small_high = request.security(syminfo.tickerid, small_tf, high) small_low = request.security(syminfo.tickerid, small_tf, low) // 多头仓位:检查止损/止盈触发 if strategy.position_size > 0 // 小周期价格跌破止损价,触发止损 if small_low <= long_stop_level strategy.close("Long Entry 1", comment="Long SL Hit") // 小周期价格突破止盈价,触发止盈 elif small_high >= long_profit_level strategy.close("Long Entry 1", comment="Long TP Hit") // 空头仓位:检查止损/止盈触发 if strategy.position_size < 0 // 小周期价格突破止损价,触发止损 if small_high >= short_stop_level strategy.close("Short Entry 1", comment="Short SL Hit") // 小周期价格跌破止盈价,触发止盈 elif small_low <= short_profit_level strategy.close("Short Entry 1", comment="Short TP Hit")
注意事项
- 拉取小时间框架数据会增加计算量,回测长周期数据时速度可能变慢;
- 要确保你的订阅支持对应小时间框架的历史数据访问;
- 可以根据实际交易规则调整逻辑,比如加入滑点模拟、等待小周期K线收盘确认触发等,让回测更贴近真实场景;
- 手动平仓逻辑要和入场逻辑匹配,避免重复平仓或仓位管理混乱。
内容的提问来源于stack exchange,提问作者jguy
相关产品推荐
相关产品推荐

