如何通过条件[3]获取前一次交叉的K线数量?能否使用ta.barssince函数?
问题描述
图片中红色标注部分为问题点。我不清楚如何获取前一次交叉的K线长度,请问是否可以通过ta.barssince函数来获取K线数量?
提供的代码
//@version=5 indicator(title="OHLC", shorttitle="Close",overlay = true, max_bars_back = 100) a = 44967 plot(a, '1', color.white, 3) var int r = 0 var x = 0 var int t = 0 var int p = 0 var int p1 = 0 var int p2 = 0 var float f = 0 var l = 0 var l1 = 0 var l2 = 0 isCond11 = ta.crossover(close, a) isCond21 = ta.crossunder(close, a) isCond1 = ta.cross(a, close) x := isCond11 ? 1 : isCond21[1] ? 0 : nz(x[1]) r := isCond21 ? 1 : 0 l := ta.barssince(isCond11) + 1 l1 := ta.barssince(isCond21) + 1 p := int(math.max(1, l)) p1 := int(math.max(1, l1)) //highp = ta.highest(close, int(math.max(1, nz(p)))) p2 := l1[1] - l[1] if isCond21 label.new(bar_index, close, str.tostring(l[1]), color = color.green) label.new(bar_index, close-7000, str.tostring(p2), color = color.yellow)
解答
ta.barssince可以用来计算从当前K线到最近一次交叉发生时的K线数量,但如果要获取前两次交叉之间的K线长度,仅靠ta.barssince直接计算容易出错——因为它只会追踪最近一次的交叉点。更可靠的方式是在每次交叉发生时记录当前的K线索引,后续通过索引差值来计算区间长度。
修正思路:
- 用变量记录上一次
crossover和crossunder发生的K线索引 - 当新的交叉发生时,用当前索引减去上一次同类型交叉的索引,得到两次交叉之间的K线数量
- 如果要获取前一次反向交叉到当前交叉的长度(比如从上次
crossover到本次crossunder的长度),就用当前索引减去上次反向交叉的索引
修正后的示例代码:
//@version=5 indicator(title="OHLC", shorttitle="Close",overlay = true, max_bars_back = 100) a = 44967 plot(a, '1', color.white, 3) // 记录交叉发生的K线索引 var int last_crossover_bar = na var int last_crossunder_bar = na isCond11 = ta.crossover(close, a) isCond21 = ta.crossunder(close, a) // 更新交叉索引 if isCond11 last_crossover_bar := bar_index if isCond21 last_crossunder_bar := bar_index // 计算前一次交叉到当前的K线长度(以crossunder为例) if isCond21 and not na(last_crossover_bar) bar_length = bar_index - last_crossover_bar + 1 // +1是包含起始K线 label.new(bar_index, close, str.tostring(bar_length), color = color.green)
这样就能准确获取两次交叉之间的K线数量,避免ta.barssince在多次交叉后追踪错误的问题。
内容的提问来源于stack exchange,提问作者Владислав Паршаков
相关产品推荐
相关产品推荐

