ta.change与request.security无法同步至固定K线的技术咨询
ta.change与request.security同步问题解析
问题概述
- 基于
ta.change(time("90"))的绿点(newPeriod)和基于periodHigh != periodHigh[1]的红点(periodCheck)存在1根K线的延迟 request.security返回的K线结束时间不固定(如6月19日为8:25,6月26日变为8:30),导致红绿点偶尔出现在同一根K线- 同一时刻检测到的周期变化,后续查看结果可能随机变化
差异原因分析
索引逻辑差异
ta.change(time("90"))直接在当前图表周期上检测90分钟周期的时间戳变化,90分钟周期切换时,当前图表K线会立即触发信号(绿点)。request.security(syminfo.tickerid, "90", high[barstate.isrealtime? 1 : 0])在实时行情下取的是上一根90分钟K线的高点,只有当当前图表K线走完、新的90分钟高点数据更新后,periodHigh != periodHigh[1]才会触发(红点),直接导致1根K线的延迟。
时间戳非固定的本质
部分交易所K线并非严格按固定时间对齐(如考虑集合竞价、节假日调整等),90分钟K线的结束时间会出现波动。time("90")基于交易所实际周期时间戳,request.security返回实际生成的K线数据,两者都遵循交易所实际周期,但periodHigh的变化依赖数据更新时机,因此会出现偶尔同步的情况。随机性的来源
实时行情下,barstate.isrealtime的判断随当前K线状态变化,加上数据推送延迟,可能导致periodHigh更新时间不稳定;历史回测时数据批量加载,与实时行情逻辑存在细微差异,最终造成结果随机性。
同步解决方案
要让两者始终同步,建议直接基于time("90")的变化触发信号,同时在周期切换时获取对应90分钟K线的高低价,避免依赖periodHigh的变化判断。优化后的代码如下:
//@version=5 indicator("ta.change与request.security同步优化", overlay=true) // 定义90分钟周期的时间戳 periodTime = time("90") // 检测90分钟周期切换 newPeriod = ta.change(periodTime) // 获取90分钟周期的高低价,关闭未来函数风险 [periodHigh, periodLow] = request.security(syminfo.tickerid, "90", [high, low], gaps=barmerge.gaps_on, lookahead=barmerge.lookahead_off) // 仅在周期切换时记录上一周期的高低价 var float prevPeriodHigh = na var float prevPeriodLow = na if newPeriod prevPeriodHigh := periodHigh[1] prevPeriodLow := periodLow[1] // 绘制上一周期高低价 plot(prevPeriodHigh, color=color.green, title="上一周期高点") plot(prevPeriodLow, color=color.green, title="上一周期低点") // 绘制完全同步的信号点 plotshape(newPeriod, color=color.green, location=location.abovebar, style=shape.circle) plotshape(newPeriod, color=color.red, location=location.belowbar, style=shape.circle)
关键调整点:
- 使用
lookahead=barmerge.lookahead_off避免未来函数风险 - 基于
newPeriod触发时机记录上一周期高低价,确保信号与数据完全同步 - 开启
gaps=barmerge.gaps_on,严格遵循实际周期数据
订单触发的建议
优先使用newPeriod = ta.change(time("90"))触发订单:
ta.change(time("90"))基于时间戳变化,逻辑稳定可预测,不受数据推送延迟影响periodHigh != periodHigh[1]依赖request.security的数据更新,实时行情下存在延迟且不稳定,易导致订单触发时机偏差
若担心周期时间戳非固定问题,可额外添加ta.barssince(newPeriod)验证周期间隔,确保每次触发都是标准90分钟周期。
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

