PineScript技术问询:如何将FVG箱体延伸至当前K线
解决多时间框架FVG箱体延伸至当前K线的PineScript方案
核心逻辑
多时间框架下FVG箱体无法自动延伸的本质是:FVG生成于非当前图表的时间框架,其box对象的右边界默认停留在生成它的K线末端。要实现延伸,需在当前图表的每一根K线周期内,动态更新所有未被填充的FVG箱体的右边界至当前K线位置。
具体实现步骤
1. 存储活跃FVG箱体实例
用数组记录两个时间框架下的未填充FVG箱体,避免实例丢失或重复创建:
// 初始化数组分别存储两个时间框架的FVG箱体 var box[] fvgBoxes_TF1 = array.new_box() var box[] fvgBoxes_TF2 = array.new_box()
2. 动态更新箱体右边界
在当前图表每根K线的最后状态下,遍历所有活跃箱体,调用box.set_right()将右边界同步到当前K线索引:
// 更新第一个时间框架的FVG箱体至当前K线 if barstate.islast for i = 0 to array.size(fvgBoxes_TF1) - 1 currentBox = array.get(fvgBoxes_TF1, i) box.set_right(currentBox, bar_index) // 更新第二个时间框架的FVG箱体至当前K线 if barstate.islast for i = 0 to array.size(fvgBoxes_TF2) - 1 currentBox = array.get(fvgBoxes_TF2, i) box.set_right(currentBox, bar_index)
3. 清理已填充的FVG箱体
当价格填充FVG后,从数组中移除对应箱体并销毁,避免无效更新:
// 清理第一个时间框架已填充的FVG for i = array.size(fvgBoxes_TF1) - 1 to 0 by -1 currentBox = array.get(fvgBoxes_TF1, i) fvgHigh = box.get_top(currentBox) fvgLow = box.get_bottom(currentBox) if close > fvgHigh or close < fvgLow box.delete(currentBox) array.remove(fvgBoxes_TF1, i) // 清理第二个时间框架已填充的FVG for i = array.size(fvgBoxes_TF2) - 1 to 0 by -1 currentBox = array.get(fvgBoxes_TF2, i) fvgHigh = box.get_top(currentBox) fvgLow = box.get_bottom(currentBox) if close > fvgHigh or close < fvgLow box.delete(currentBox) array.remove(fvgBoxes_TF2, i)
4. 多时间框架FVG生成的正确姿势
用request.security()获取对应时间框架的K线数据,确保FVG的位置映射准确:
// 示例:获取第一个时间框架(日线)的OHLC数据 tf1_ohlc = request.security(syminfo.tickerid, "D", [open, high, low, close]) // 判断并生成TF1的FVG tf1_fvgExists = tf1_ohlc[1].high < tf1_ohlc[2].low if tf1_fvgExists newBox = box.new(left=bar_index[2], top=tf1_ohlc[2].low, right=bar_index[1], bottom=tf1_ohlc[1].high, color=color.new(color.blue, 80)) array.push(fvgBoxes_TF1, newBox) // 第二个时间框架的FVG生成逻辑同理,替换时间周期参数即可
关键细节提示
- 用
barstate.islast仅在最后一根K线执行更新,减少冗余计算,提升脚本性能。 - 遍历数组时从后往前(
to 0 by -1),避免移除元素导致的索引错乱。 - 若需要延伸时的动态样式(如靠近当前K线时变色),可在更新边界时同步调用
box.set_color()等方法。
内容的提问来源于stack exchange,提问作者th3r1singking
相关产品推荐
相关产品推荐

