Tradingview基于首个15分钟K线的做空策略当日时间识别问题求助
Tradingview早盘做空策略时间识别问题修复方案
问题根因
你当前代码的核心问题是timestamp()函数未传入年月日参数,生成的是静态固定时间戳,无法动态匹配每日的9:45-10:30交易时段,因此无法正确按日触发信号。
可行解决建议
- 动态生成每日时段边界:调用
year(time)、month(time)、dayofmonth(time)获取当前K线对应的年月日,传入timestamp()生成当日的首个K线收盘时间、平仓时间戳,适配每日的时间判断需求。 - 优化开仓逻辑限制:新增单日开仓标志位,在每日开盘时重置,仅在首个15分钟K线收盘时判断收红信号,避免同日内其他K线重复触发开仓。
- 拆分平仓逻辑:将平仓判断独立于开仓时段限制,到10:30时间点直接触发平仓,无需绑定开仓时段条件。
- 校验时区配置:确认Tradingview图表的时区设置与交易标的的上市地时区一致,避免时区偏移导致的时间判断错误。
修正后可运行代码
//@version=5 strategy("早盘15分钟做空策略", overlay=true, initial_capital=100000, default_qty_type=strategy.cash, default_qty_value=100000) // 自定义参数 FromMonth = input.int(defval = 1, title = "生效起始月份", minval = 1, maxval = 12) firstBarCloseHour = input.int(defval = 9, title = "首个15分钟K线收盘小时") firstBarCloseMin = input.int(defval = 45, title = "首个15分钟K线收盘分钟") closeAllHour = input.int(defval = 10, title = "平仓时间小时") closeAllMin = input.int(defval = 30, title = "平仓时间分钟") // 动态计算当日时间边界 curYear = year(time) curMonth = month(time) curDay = dayofmonth(time) firstBarEndTime = timestamp(curYear, curMonth, curDay, firstBarCloseHour, firstBarCloseMin) closeTime = timestamp(curYear, curMonth, curDay, closeAllHour, closeAllMin) // 单日开仓标志位,每日开盘重置 var bool hasEnteredToday = false if ta.change(dayofmonth) hasEnteredToday := false // 开仓触发:仅首个15分钟K线收红且当日未开仓时触发 shortSignal = time == firstBarEndTime and close > open and not hasEnteredToday and curMonth >= FromMonth if shortSignal strategy.entry("Short", strategy.short) hasEnteredToday := true // 平仓触发:到点自动平所有空单 if time >= closeTime and strategy.position_size < 0 strategy.close("Short")
注意事项
如果你的交易标的不是A股(早盘9:30开盘),可以自行调整firstBarCloseHour、firstBarCloseMin参数匹配对应市场的首个15分钟K线收盘时间即可。
内容的提问来源于stack exchange,提问作者Matador3
相关产品推荐
相关产品推荐

