Feature Description
背景
A 股主流软件(通达信、同花顺、东方财富等)的 K 线颜色一般不是简单的二选一:
-
普通 K 线:
close > open:红色阳线
close < open:绿色阴线
-
open === close:
- 与前一交易日
close 比较:
- 高于昨收:红
- 低于昨收:绿
- 等于昨收:白/灰,常称平盘
-
涨跌停:
- 收盘价 ≥ 涨停价:红
- 收盘价 ≤ 跌停价:绿
- 一字涨跌停同样按涨/跌方向着色
所以 open === close 是一个特殊分支,不能简单当成 noChange,也不能全局改成 previous_close。
当前 klinecharts 的问题
klinecharts@10.0.3 目前只有两种 compareRule:
current_open
previous_close
CandleBarView.drawImp 当前逻辑大致是:
var comparePrice =
styles.compareRule === 'current_open'
? open
: (prev?.close ?? close)
if (close > comparePrice) {
// upColor
} else if (close < comparePrice) {
// downColor
} else {
// noChangeColor
}
这会导致:
-
一字涨停:open === close,走 noChange。
如果上层把 noChangeColor 设成上涨红,看起来会碰巧正确。
-
一字跌停:open === close,也走 noChange。
如果 noChangeColor 是红色,一字跌停会被画成红色,这是错误的。
-
T 字跌停、下跌十字星同理。
-
如果全局改用 previous_close,虽然一字跌停会正确,但“假阴线/假阳线”也会被改变:
- 昨收 10,今开 10.5,今收 10.2
- A 股主流习惯:
close < open,阴线绿
previous_close 逻辑:close > prev.close,会被标红
- 这和主流 A 股软件不一致
期望行为
希望新增一个可选的 compareRule,例如:
current_open_then_previous_close
规则:
close !== open -> 与 open 比较
close === open -> 与 prev.close 比较
prev 不存在 -> 回退到 close,即走 noChange
这样:
- 普通阳线/阴线保持现有行为
- 一字涨停、一字跌停、T 字板、上下跌十字星按昨收正确着色
- 完全平盘走
noChange,上层可设置成白/灰
To Do
具体实现建议
- 扩展类型,保持旧值兼容:
export type CandleColorCompareRule =
| 'current_open'
| 'previous_close'
| 'current_open_then_previous_close'
CandleBarView.drawImp 增加分支,旧行为不变:
var comparePrice
if (styles.compareRule === 'previous_close') {
comparePrice = prev?.close ?? close
} else if (styles.compareRule === 'current_open_then_previous_close') {
comparePrice = close === open
? (prev?.close ?? close)
: open
} else {
comparePrice = open
}
-
indicator.ohlc 复用同一类型和同一段逻辑。
-
可选后续增强:
如果希望精确识别涨跌停或支持“一字板单独颜色”(部分软件可把一字板设成黄色),可以在 KLineData 上增加:
isLimitUp?: boolean
isLimitDown?: boolean
或:
limitUpPrice?: number
limitDownPrice?: number
绘制时优先判断涨跌停标记,再做普通开收/昨收比较。
感谢维护者考虑这个需求。如果新增第三个 compareRule 的方式不合适,也可以接受其他 API 设计,例如增加 noChangeCompareRule。
Feature Description
背景
A 股主流软件(通达信、同花顺、东方财富等)的 K 线颜色一般不是简单的二选一:
普通 K 线:
close > open:红色阳线close < open:绿色阴线open === close:close比较:涨跌停:
所以
open === close是一个特殊分支,不能简单当成noChange,也不能全局改成previous_close。当前 klinecharts 的问题
klinecharts@10.0.3目前只有两种compareRule:current_openprevious_closeCandleBarView.drawImp当前逻辑大致是:这会导致:
一字涨停:
open === close,走noChange。如果上层把
noChangeColor设成上涨红,看起来会碰巧正确。一字跌停:
open === close,也走noChange。如果
noChangeColor是红色,一字跌停会被画成红色,这是错误的。T 字跌停、下跌十字星同理。
如果全局改用
previous_close,虽然一字跌停会正确,但“假阴线/假阳线”也会被改变:close < open,阴线绿previous_close逻辑:close > prev.close,会被标红期望行为
希望新增一个可选的
compareRule,例如:current_open_then_previous_close规则:
这样:
noChange,上层可设置成白/灰To Do
具体实现建议
CandleBarView.drawImp增加分支,旧行为不变:indicator.ohlc复用同一类型和同一段逻辑。可选后续增强:
如果希望精确识别涨跌停或支持“一字板单独颜色”(部分软件可把一字板设成黄色),可以在
KLineData上增加:或:
绘制时优先判断涨跌停标记,再做普通开收/昨收比较。
感谢维护者考虑这个需求。如果新增第三个
compareRule的方式不合适,也可以接受其他 API 设计,例如增加noChangeCompareRule。