如何在PineScript中按45分钟周期绘制连续分段箱体?
解决PineScript绘制连续45分钟箱体的问题
核心思路
原代码依赖固定锚点仅生成单个箱体,要实现连续分段,需自动计算每个45分钟区间的起止时间,实时跟踪区间内高低点,并在区间结束时绘制箱体,同时兼容历史K线回测。
方案一:自然对齐45分钟区间
该方案自动将时间对齐到最近的45分钟节点(如00:00、00:45、01:30等),生成连续箱体:
indicator("连续45分钟箱体", overlay=true) // 定义45分钟区间时长(毫秒) intervalLength = 45 * 60 * 1000 // 计算当前K线所属区间的起始时间 currentIntervalStart = timestamp(year, month, dayofmonth, hour, minute - minute % 45, 0) // 跟踪当前区间的最高/最低价(用var变量保持跨K线状态) var float currentHigh = na var float currentLow = na // 进入新区间时重置高低点,否则更新极值 if currentIntervalStart != currentIntervalStart[1] currentHigh := high currentLow := low else currentHigh := math.max(currentHigh, high) currentLow := math.min(currentLow, low) // 判断当前K线是否为区间最后一根 intervalEndBar = bar_index == ta.barssince(currentIntervalStart != currentIntervalStart[1]) + 1 // 区间结束时绘制箱体 if intervalEndBar intervalStartBar = bar_index - ta.barssince(currentIntervalStart != currentIntervalStart[1]) - 1 box.new(intervalStartBar, currentHigh, bar_index, currentLow, border_color=color.red, bgcolor=color.new(color.silver, 60)) // 可选:标记区间起始时间 var label intervalStartLabel = na if currentIntervalStart != currentIntervalStart[1] intervalStartLabel := label.new(bar_index, high, str.tostring(currentIntervalStart, "HH:mm"), color=color.blue, textcolor=color.white, style=label.style_label_down)
方案二:指定锚点起始的连续区间
若需要从自定义锚点时间开始生成连续45分钟区间(非自然时间对齐),可使用以下代码:
indicator("锚点起始连续45分钟箱体", overlay=true) // 输入自定义锚点起始时间 anchorTime = input.time(timestamp("23 Aug 2023 13:30"), "锚点起始时间") intervalLength = 45 * 60 * 1000 // 计算当前K线所属的区间起始时间 currentIntervalStart = anchorTime + math.floor((time - anchorTime) / intervalLength) * intervalLength // 跟踪当前区间高低点 var float currentHigh = na var float currentLow = na if currentIntervalStart != currentIntervalStart[1] currentHigh := high currentLow := low else currentHigh := math.max(currentHigh, high) currentLow := math.min(currentLow, low) // 新区间开始时,绘制上一个区间的箱体 if currentIntervalStart != currentIntervalStart[1] and not na(currentIntervalStart[1]) prevIntervalEndBar = bar_index - 1 prevIntervalStartBar = ta.valuewhen(currentIntervalStart[1] != currentIntervalStart[2], bar_index, 0) box.new(prevIntervalStartBar, currentHigh[1], prevIntervalEndBar, currentLow[1], border_color=color.red, bgcolor=color.new(color.silver, 60))
关键代码解释
- 区间时间计算:通过取整或锚点偏移的方式,自动确定每个K线所属的45分钟区间起始点,无需手动设置多个锚点。
- 高低点跟踪:
var类型变量会保持跨K线的状态,确保每个区间内的高低点被正确记录更新。 - 箱体绘制时机:在区间切换时触发绘制逻辑,确保每个区间的箱体都能完整覆盖对应的K线范围。
内容的提问来源于stack exchange,提问作者mohaddese abbasi
相关产品推荐
相关产品推荐

