You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

解决方案

问题根源有两点:

  1. candleColor存在na值,点击图表触发重新计算时,plotcandle会用默认颜色填充;
  2. 未隐藏默认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:57:50