为何不同时间框架下运行该Pine Script代码结果不一致?
问题:不同时间框架下Pine Script成交量统计结果不一致
我需要在日线时间框架中找到从右侧数起第一根成交量大于前一根K线的日线,编写了如下Pine Script代码,但在日线和4小时时间框架运行时,得到的数值并不相同,请问问题出在哪里?
getLastStrength(simple string period) => volumen = request.security(syminfo.tickerid, period, volume) _count = 1 _found = false while not _found and _count < 10 if (volumen[_count] > volumen[_count+1]) _found := true else _count := _count + 1 _count string texto = "D:"+ str.tostring(getLastStrength("1D")) if barstate.islast label.new(bar_index, high, texto, color= color.red)
核心问题点
索引逻辑完全颠倒
Pine Script中,数组索引[0]对应最新的K线,[1]是前一根,[2]是再前一根,以此类推。你的代码从_count=1开始,对比volumen[_count] > volumen[_count+1],本质是在检查“前一根日线”是否大于“再前一根日线”,完全跳过了对最新日线的检查,逻辑方向错误。未完成K线的干扰
在非日线框架(如4小时)中,request.security默认返回的日线volume包含当前未收盘的实时成交量(还在累加),而日线框架下的volume是已收盘的完整日线成交量。两者对比的基础数据不一致,结果自然不同。时间框架对齐差异
不同主图时间框架下,request.security返回的数据序列是对齐到主图K线的,这会导致volumen数组的索引对应的历史K线位置和日线框架下不一致,循环遍历的逻辑无法统一生效。
修正后的代码
//@version=5 indicator("找成交量大于前一根的日线", overlay=true) getLastStrength() => // 请求已收盘的日线成交量,关闭前瞻避免未来数据 volumen = request.security(syminfo.tickerid, "1D", volume, barmerge.gaps_on, barmerge.lookahead_off) _count = 0 _found = false maxLookBack = 20 // 限制最大回溯次数,防止无限循环 // 从最新的日线开始往前找 while not _found and _count < maxLookBack - 1 // 检查当前日线成交量是否大于前一根 if volumen[_count] > volumen[_count + 1] _found := true else _count += 1 _count + 1 // 返回从右侧数的位置(最新的为第1根) string texto = "D:" + str.tostring(getLastStrength()) if barstate.islast label.new(bar_index, high, texto, color=color.red)
修正说明
- 调整索引逻辑:从
_count=0开始,先检查最新的日线是否满足条件,符合“从右侧数”的需求。 - 关闭前瞻并指定
barmerge.gaps_on:确保只获取已收盘的完整日线成交量,避免未完成K线的干扰。 - 限制最大回溯次数:防止极端情况下循环无法终止。
内容的提问来源于stack exchange,提问作者cybtow
相关产品推荐
相关产品推荐

