如何在Pine Script中检测价格穿越自定义绘制的基准线?
如何在Pine Script中检测价格穿越自定义基准线?
问题场景
我在Pine Script中绘制了一条基准线:
baseLine := line.new(x1, y1, x2, y2, width=1, extend=extendStyle, color=color.new(colorLower, 0))
想要检测价格是否穿越这条基准线,尝试使用以下代码:
isCrossed = ta.crossover(high, baseline)
但运行后出现错误:
Cannot call 'ta.crossover' with argument 'source2'='baseline'. An argument of 'series line' type was used but a 'series float' is expected.
错误原因
line.new()创建的是绘图用的线段对象,并非代表价格数值的序列(series float)。而ta.crossover()要求两个参数都是浮点数序列(比如价格K线、均线这类数值序列),直接传入线段对象会导致类型不匹配。
解决方案
根据基准线的生成逻辑,有两种正确实现方式:
方式一:直接使用基准线的数值序列(优先推荐)
如果你的基准线是通过公式计算出来的数值序列(比如固定价格、动态均线类数值),直接用这个数值序列替代线段对象做检测即可。例如:
// 示例:假设基准线是固定价格3000,或是根据逻辑计算出的动态数值 baseValue = 3000 // 检测价格穿越基准线 isCrossed = ta.crossover(high, baseValue)
方式二:获取线段对象对应位置的数值
如果基准线是基于特定坐标绘制的线段(比如手动定位的线段),可以通过line.get_y()方法获取当前K线位置对应的基准线y轴数值,再进行穿越检测:
// 创建基准线(建议用var避免重复创建) var line baseLine = line.new(x1, y1, x2, y2, width=1, extend=extendStyle, color=color.new(colorLower, 0)) // 获取当前K线位置的基准线数值 baseValue = line.get_y(baseLine, bar_index) // 检测价格穿越 isCrossed = ta.crossover(high, baseValue)
注意事项
- 如果基准线未延伸到当前K线位置,
line.get_y()会返回na,需要用ta.isna()做判断处理; - 避免在每个K线周期都创建新的线段对象,建议用
var关键字初始化线段,仅在需要更新时修改线段属性。
内容的提问来源于stack exchange,提问作者Saeed Mousavi
相关产品推荐
相关产品推荐

