如何在每一次EMA交叉位置绘制水平射线(hray)?
问题分析与代码修正
原代码无法实现需求的核心原因是:hline() 是全局绘图函数,不允许在条件语句(if)内调用。它会在整个图表周期内固定显示一条水平线,无法根据交叉事件动态创建多条射线。
要实现“每次EMA金叉时绘制水平射线”的需求,需要使用Pine Script的动态线条函数 line.new(),它支持在特定条件下创建独立的线条对象。
修正后的代码
//@version=4 study("EMA交叉水平射线", overlay=true) // 定义5和13周期EMA ema5 = ema(close, 5) ema13 = ema(close, 13) // 检测EMA5上穿EMA13的金叉信号 crossUp = crossover(ema5, ema13) // 可选:检测死叉信号,如需绘制死叉射线可启用 crossDown = crossunder(ema5, ema13) // 金叉时绘制红色水平射线 if crossUp // 创建从交叉K线开始,向右无限延伸的水平射线 line.new(bar_index, ema5[1], bar_index + 10000, ema5[1], color=color.red, linewidth=2, title="EMA金叉射线") // 可选:死叉时绘制绿色水平射线 if crossDown line.new(bar_index, ema5[1], bar_index + 10000, ema5[1], color=color.green, linewidth=2, title="EMA死叉射线") // 隐藏EMA曲线(可选,如需查看可删除display=hidden) plot(ema5, title="EMA 5", display=hidden) plot(ema13, title="EMA 13", display=hidden)
关键修正点说明
- 使用
line.new()替代hline():该函数可以在指定条件下动态创建线条,每个交叉事件都会生成一条独立的射线 - 射线延伸设置:将终点的x坐标设为
bar_index + 10000,确保射线能覆盖未来足够多的K线,实现“无限延伸”的效果 - 信号检测:保留
crossover()检测金叉,新增crossunder()可选检测死叉,按需启用即可 - 脚本属性:添加
overlay=true确保射线直接绘制在K线图上(原代码缺失,会导致线条在独立子图显示)
内容的提问来源于stack exchange,提问作者F.D.
相关产品推荐
相关产品推荐

