当前蜡烛事件前置状态检查及Pine Script plotchar无显示问题修复请求
问题排查与修复方案
需求说明
- 需求1:检查某事件发生前当前蜡烛的状态
- 需求2:排查Pine Script代码中
plotchar组件未按预期显示箭头的问题并修复
代码问题分析
原代码存在以下核心问题导致箭头无法显示:
- 静态变量初始化错误:
var last_crossover_index_valid = last_crossover_index >= 0使用var声明,只会在脚本启动时初始化一次,后续last_crossover_index更新时该变量不会同步更新,导致交叉有效性判断始终用初始值。 - 变量赋值逻辑矛盾:
- 第一次
an2上穿an3时,last_an2_crossover_index被设为0,后续当新的an2上穿an3发生时,last_an2_crossover_index < an2_crossover_index(0 < 0)不成立,无法触发last_an1_crossover_index的赋值。 condition的逻辑中,can_display_arrow要求当前K线是an2上穿an3的K线(an2_crossover_index == 0),但last_valid_candle_index == bar_index仅在赋值last_an1_crossover_index的K线成立,而该K线并非an2上穿an3的K线,两者矛盾导致condition永远为false。
- 第一次
- 事件跟踪逻辑混乱:没有正确区分“历史交叉事件”和“当前触发事件”的时间顺序判断。
修复后的代码
假设需求为:当an2上穿an3时,检查此前是否发生过an1上穿an2的事件,若有则在an2上穿an3的K线显示箭头,修复代码如下:
//@version=5 indicator('Condition', overlay=true) // 改为overlay=true,让箭头直接显示在K线图上 an1 = ta.ema(close, 50) an2 = ta.ema(close, 200) an3 = ta.ema(close, 20) // 标记交叉事件的发生 an1_cross_an2 = ta.crossover(an1, an2) an2_cross_an3 = ta.crossover(an2, an3) // 记录最近一次an1上穿an2的K线索引 var int last_an1_cross_index = -1 if an1_cross_an2 last_an1_cross_index := bar_index // 判断触发条件:当前an2上穿an3,且之前存在有效的an1上穿an2事件 condition = an2_cross_an3 and last_an1_cross_index != -1 and last_an1_cross_index < bar_index // 绘制箭头,设置大小提升可读性 plotchar(condition, 'Signal Arrow', '☗', location.bottom, color=color.red, size=size.small)
修复说明
- 移除冗余静态变量,直接跟踪交叉事件的发生和最近一次交叉的K线索引,逻辑更清晰。
- 简化
condition逻辑,明确触发条件:当前发生an2上穿an3,且历史上存在an1上穿an2的事件。 - 将
overlay改为true,让箭头直接显示在K线图上,符合视觉分析需求。 - 增加
size参数控制箭头大小,提升图表可读性。
内容的提问来源于stack exchange,提问作者NqHai
相关产品推荐
相关产品推荐

