Plotcandle交互图表时蜡烛颜色重置问题求助
问题解决:Plotcandle点击图表后颜色变回默认值
问题说明
想要基于当日VWAP、前一日VWAP和EMA5指标修改K线的蜡烛主体及烛芯颜色:
- 用
barcolor可实现蜡烛主体变色,但无法修改烛芯颜色; - 改用
plotcandle后初始显示正常,但点击图表任意位置,蜡烛颜色就变回默认的红绿。
原有效代码(仅修改主体颜色)
//@version=5 indicator("VWAP Color", overlay=true) vwapSrc = hlc3 daily = "D" computeVWAP(src, isNewPeriod) => var float sumSrcVol = na var float sumVol = na var float sumSrcSrcVol = na sumSrcVol := isNewPeriod ? src * volume : src * volume + sumSrcVol[1] sumVol := isNewPeriod ? volume : volume + sumVol[1] sumSrcSrcVol := isNewPeriod ? volume * math.pow(src, 2) : volume * math.pow(src, 2) + sumSrcSrcVol[1] vwap = sumSrcVol / sumVol prevwap = 0.0 prevwap := isNewPeriod ? vwap[1] : prevwap[1] [vwap, prevwap] [currentDayVWAP, prevDayVWAP] = computeVWAP(vwapSrc, ta.change(time(daily))) ema5 = ta.ema(close, 5) isRed = close < prevDayVWAP and close < currentDayVWAP and close < ema5 isGreen = close > prevDayVWAP and close > currentDayVWAP and close > ema5 isSkyBlue = close < prevDayVWAP and close > currentDayVWAP isYellow = close > prevDayVWAP and close < currentDayVWAP candleColor = isRed ? color.red : isGreen ? color.green : isSkyBlue ? color.blue : isYellow ? color.yellow : na var color candleColorPrev = na candleColorPrev := nz(candleColorPrev[1], na) candleColorChanged = candleColor != candleColorPrev candleColor := ta.valuewhen(isRed or isGreen or isSkyBlue or isYellow, candleColor, 0) barcolor(candleColor)
失效代码(尝试修改烛芯但点击后变色)
//@version=5 indicator("VWAP Color", overlay = true) vwapSrc = hlc3 daily = "D" computeVWAP(src, isNewPeriod) => var float sumSrcVol = na var float sumVol = na var float sumSrcSrcVol = na sumSrcVol := isNewPeriod ? src * volume : src * volume + sumSrcVol[1] sumVol := isNewPeriod ? volume : volume + sumVol[1] sumSrcSrcVol := isNewPeriod ? volume * math.pow(src, 2) : volume * math.pow(src, 2) + sumSrcSrcVol[1] vwap = sumSrcVol / sumVol prevwap = 0.0 prevwap := isNewPeriod ? vwap[1] : prevwap[1] [vwap, prevwap] [currentDayVWAP, prevDayVWAP] = computeVWAP(vwapSrc, ta.change(time(daily))) ema5 = ta.ema(close, 5) isRed = close < prevDayVWAP and close < currentDayVWAP and close < ema5 isGreen = close > prevDayVWAP and close > currentDayVWAP and close > ema5 isSkyBlue = close < prevDayVWAP and close > currentDayVWAP isYellow = close > prevDayVWAP and close < currentDayVWAP candleColor = isRed ? color.red : isGreen ? color.green : isSkyBlue ? color.blue : isYellow ? color.yellow : na var color candleColorPrev = na candleColorPrev := nz(candleColorPrev[1], na) candleColorChanged = candleColor != candleColorPrev candleColor := ta.valuewhen(isRed or isGreen or isSkyBlue or isYellow, candleColor, 0) //barcolor(candleColor) //Determine wick color wickColor = close >= open ? color.blue : color.yellow plotcandle(open, high, low, close, "My candles", candleColor, wickColor, bordercolor=wickColor,editable = false)
解决方案
问题根源有两点:
candleColor存在na值,点击图表触发重新计算时,plotcandle会用默认颜色填充;- 未隐藏默认K线,点击后默认蜡烛会覆盖自定义蜡烛。
修改后的代码如下:
//@version=5 indicator("VWAP Color", overlay=true) vwapSrc = hlc3 daily = "D" computeVWAP(src, isNewPeriod) => var float sumSrcVol = na var float sumVol = na var float sumSrcSrcVol = na sumSrcVol := isNewPeriod ? src * volume : src * volume + sumSrcVol[1] sumVol := isNewPeriod ? volume : volume + sumVol[1] sumSrcSrcVol := isNewPeriod ? volume * math.pow(src, 2) : volume * math.pow(src, 2) + sumSrcSrcVol[1] vwap = sumSrcVol / sumVol prevwap = 0.0 prevwap := isNewPeriod ? vwap[1] : prevwap[1] [vwap, prevwap] [currentDayVWAP, prevDayVWAP] = computeVWAP(vwapSrc, ta.change(time(daily))) ema5 = ta.ema(close, 5) // 定义蜡烛颜色条件 isRed = close < prevDayVWAP and close < currentDayVWAP and close < ema5 isGreen = close > prevDayVWAP and close > currentDayVWAP and close > ema5 isSkyBlue = close < prevDayVWAP and close > currentDayVWAP isYellow = close > prevDayVWAP and close < currentDayVWAP // 确保每根K线都有明确颜色,避免na candleColor = isRed ? color.red : isGreen ? color.green : isSkyBlue ? color.blue : isYellow ? color.yellow : close >= open ? color.green : color.red // fallback到默认红绿,可按需调整 // 烛芯颜色与主体颜色一致,也可自定义其他逻辑 wickColor = candleColor // 隐藏默认K线,防止点击后显示 barcolor(na) // 绘制自定义蜡烛 plotcandle(open, high, low, close, "Custom VWAP Candles", candleColor, wickColor, bordercolor=wickColor, editable=false)
修改要点:
- 移除冗余的
ta.valuewhen和颜色追踪逻辑,直接给每根K线分配明确颜色,避免na值; - 让烛芯颜色与主体颜色保持统一(可根据需求修改);
- 添加
barcolor(na)隐藏默认K线; - 增加颜色fallback逻辑,确保所有K线都有颜色值。
内容的提问来源于stack exchange,提问作者Pankaj Ahuja
相关产品推荐
相关产品推荐

