Pine Script v5多时间多条件plotshape()失效问题求助
问题描述
在Pine Script v5中使用plotshape()时遇到以下异常:
- 结合2分钟周期自身条件与通过
request.security()获取的5分钟周期条件绘制信号 - 仅加入单个跨周期条件时,
plotshape()能正常显示信号 - 同时加入2个及以上跨周期条件时,
plotshape()完全不显示信号,但跨周期数据hist5Min的历史值可正常绘制
需要排查是代码错误还是plotshape()函数的bug,原代码如下:
//////// Long and Short Signals by MACD Histogram, //////// 2 minutes(indicator) AND 5 minutes(through request.security() indicator(title="Moving Average Convergence Divergence Cross w/ Fill & Signal", shorttitle="MACD Cross w/ Fill & Signal") // Calculate 2 Min MACD fast_ma = fast_ma_type == "SMA" ? ta.sma(src, fast_len) : ta.ema(src, fast_len) slow_ma = fast_ma_type == "SMA" ? ta.sma(src, slow_len) : ta.ema(src, slow_len) macd = fast_ma - slow_ma signal = slow_ma_type == "SMA" ? ta.sma(macd, signal_len) : ta.ema(macd, signal_len) hist = macd - signal // Get 5 Min Histogram Data [_, _, hist5] = ta.macd(src, fast_len, slow_len, signal_len) hist5Min = request.security(syminfo.tickerid, "5", hist5, gaps = barmerge.gaps_off) // Go Long conditions go_long2 = hist > hist[1] go_long5A = hist5Min > hist5Min[1] go_long5B = hist5Min[1] < hist5Min[2] // Go Short conditions go_short2 = hist < hist[1] go_short5A = hist5Min < hist5Min[1] go_short5B = hist5Min[1] > hist5Min[2] // Plots // This works plot_shape_condition = timeframe.period == "2" plotshape((plot_shape_condition and hist < 0 and go_long2 and go_long5A) ? hist:na, style=shape.labelup, color=color.new(color.green, 90), text="⬆", textcolor=color.new(color.green, 0), size=size.tiny, location=location.bottom) // This DOESN'T work, doesn't plot any shape at all plotshape((plot_shape_condition and hist < 0 and go_long2 and go_long5A and go_long5B) ? hist:na, style=shape.labelup, color=color.new(color.green, 90), text="⬆", textcolor=color.new(color.green, 0), size=size.tiny, location=location.bottom) // These works, so there's data for Hist5Min[1] and [2] plot(hist5Min, color=color.red) plot(hist5Min[1], color=color.green) plot(hist5Min[2], color=color.blue)
问题原因与解决方案
这不是plotshape()的bug,是跨周期数据引用的逻辑错误:
- 2分钟周期里,每5根K线对应1根5分钟K线,
request.security()返回的hist5Min在连续的2分钟K线上会重复同一个5分钟周期的MACD值 - 当你在2分钟周期里引用
hist5Min[1]和hist5Min[2]时,这两个值很多时候和当前的hist5Min是同一个5分钟周期的数据,导致go_long5B = hist5Min[1] < hist5Min[2]的条件几乎无法满足,最终组合条件没有符合的K线,plotshape()自然不显示信号
解决方法是把跨周期的条件计算逻辑放在request.security()内部的5分钟周期环境中完成,而非在主周期(2分钟)里引用历史值。这样能确保跨周期条件是基于5分钟K线的变化来判断,而非重复的2分钟K线数据。
修改后的代码示例:
//////// Long and Short Signals by MACD Histogram, //////// 2 minutes(indicator) AND 5 minutes(through request.security() indicator(title="Moving Average Convergence Divergence Cross w/ Fill & Signal", shorttitle="MACD Cross w/ Fill & Signal") // 补充原代码遗漏的输入参数 src = input(close, title="Source") fast_len = input(12, title="Fast Length") slow_len = input(26, title="Slow Length") signal_len = input(9, title="Signal Length") fast_ma_type = input.string("EMA", title="Fast MA Type", options=["SMA", "EMA"]) slow_ma_type = input.string("EMA", title="Slow MA Type", options=["SMA", "EMA"]) // Calculate 2 Min MACD fast_ma = fast_ma_type == "SMA" ? ta.sma(src, fast_len) : ta.ema(src, fast_len) slow_ma = fast_ma_type == "SMA" ? ta.sma(src, slow_len) : ta.ema(src, slow_len) macd = fast_ma - slow_ma signal = slow_ma_type == "SMA" ? ta.sma(macd, signal_len) : ta.ema(macd, signal_len) hist = macd - signal // 在5分钟周期内直接计算多组条件的组合结果 get_5min_long_cond() => [_, _, hist5] = ta.macd(src, fast_len, slow_len, signal_len) go_long5A = hist5 > hist5[1] go_long5B = hist5[1] < hist5[2] go_long5A and go_long5B // 获取5分钟周期的组合多空条件 5min_long_cond = request.security(syminfo.tickerid, "5", get_5min_long_cond(), gaps = barmerge.gaps_off) // Go Long conditions go_long2 = hist > hist[1] // Plots plot_shape_condition = timeframe.period == "2" // 使用预计算好的跨周期组合条件,即可正常显示信号 plotshape((plot_shape_condition and hist < 0 and go_long2 and 5min_long_cond) ? hist:na, style=shape.labelup, color=color.new(color.green, 90), text="⬆", textcolor=color.new(color.green, 0), size=size.tiny, location=location.bottom) // 验证跨周期数据 [_, _, hist5] = ta.macd(src, fast_len, slow_len, signal_len) hist5Min = request.security(syminfo.tickerid, "5", hist5, gaps = barmerge.gaps_off) plot(hist5Min, color=color.red) plot(hist5Min[1], color=color.green) plot(hist5Min[2], color=color.blue)
内容的提问来源于stack exchange,提问作者Om Nom
相关产品推荐
相关产品推荐

