Skip to content

设置与事件

ChartSettings trait 管理图表级别的全局设置——主题、语言、标的、时间框架、磁吸行为和表情字形。ChartView 实现了此 trait。

导入

rust
use navi_chart::{
    ChartView, ChartSettings,
    Theme, MagnetConfig, MagnetMode, ChartEvent,
};

用法

rust
use navi_chart::{ChartSettings, Theme, MagnetConfig, MagnetMode};

fn initialize_chart<C>(cv: &C, dark: bool)
where
    C: ChartSettings,
{
    cv.set_theme(if dark { Theme::dark() } else { Theme::light() });
    cv.set_magnet(MagnetConfig {
        mode: MagnetMode::Weak,
        enabled: true,
    });
    cv.set_locale("zh-CN");
}

方法参考

方法说明
set_theme(theme)为图表应用 Theme。内置主题:Theme::dark()Theme::light()。自定义主题请参阅主题定制
set_locale(locale)设置图例标签和错误信息的显示语言(如 "en""zh-CN")。
locale()返回当前显示语言字符串。
set_symbol(symbol)切换标的,保持当前时间框架。symbol 接受任何实现 Into<String> 的类型。会重启数据流并重新执行所有脚本。
set_timeframe(timeframe)切换时间框架,保持当前标的。会重启数据流并重新执行所有脚本。
symbol()返回当前标的字符串(如 "NASDAQ:AAPL")。
timeframe()返回当前时间框架。
magnet()返回当前磁吸(吸附 OHLC)配置。
set_magnet(config)设置磁吸行为。
set_default_emoji_glyph(glyph)设置表情工具在未指定字符时放置新标记所用的默认字形字符。
default_emoji_glyph()返回当前默认表情字形字符。
set_candlestick_style(style)切换 K 线渲染风格。详见 K 线风格
candlestick_style()返回当前 CandlestickStyle
set_candlestick_config(config)替换整个 K 线配置(编程式 API,直接传入结构体)。
candlestick_config()返回当前 CandlestickConfig 的克隆。
reset_candlestick_config()将当前活跃风格的子配置重置为默认值(其他风格的设置不受影响)。
candlestick_properties()返回活跃 K 线风格(如 Bars、HeikinAshi)对应的本地化 PropertyDescriptor 列表,用于自动生成该风格的设置控件。
candlestick_property(name)按名称读取单个属性(None 字段返回 theme 回退色)。
set_candlestick_property(name, value)写入单个属性并重绘,成功返回 true
set_last_price_line_visible(visible)显示或隐藏最后一根 K 线收盘价处的水平价格线。默认为 true。样式由 Theme::last_price_line 控制。
last_price_line_visible()返回当前是否显示最新价格线。
set_y_axis_mode(mode)控制 Y 轴的显示模式。mode 为 bitflags 整数:0b01 = 仅右轴,0b10 = 仅左轴,0b11 = 两侧均显示(默认),0b00 = 全隐藏。影响坐标轴刻度标签、十字光标价格标签、价格线标签及标注的轴标签。
y_axis_mode()返回当前 Y 轴显示模式的 bitflags 整数。
set_cyq_visible(visible)显示或隐藏筹码分布(CYQ)面板。默认为 false。详见下文「筹码分布(CYQ)」。
cyq_visible()返回当前是否显示筹码分布面板。
set_cyq_width(width)设置筹码分布面板宽度(像素,默认 270,有最小值限制)。K 线绘图区会相应压缩以腾出空间。
cyq_width()返回当前筹码分布面板宽度(像素)。
set_ui_font_size(size)设置所有 UI 字体大小:坐标轴刻度标签、十字光标图例、价格线标签和脚本覆盖标签。默认为 12.0
ui_font_size()返回当前 UI 字体大小。

MagnetConfig

rust
pub struct MagnetConfig {
    /// 磁吸行为模式。
    pub mode: MagnetMode,
    /// 是否启用磁吸吸附。
    pub enabled: bool,
}
MagnetMode行为
Off不吸附
Weak光标在 OHLC 值附近小范围内时吸附
Strong始终吸附到最近的 OHLC 值

ChartEvent

poll_event() 返回用户交互和程序调用产生的事件。每次调用交互方法后都应清空事件队列:

事件说明
EditScript(ScriptId)用户点击了脚本图例上的编辑按钮。
RemoveScript(ScriptId)用户点击了脚本图例上的移除按钮。
ShowError(ScriptId)用户点击了错误图标——调用 script_error(id) 获取错误信息。
ConfigureScript(ScriptId)用户点击了配置按钮——调用 script_inputs(id)graph_configs(id) 构建配置对话框。
DoubleClick(ChartElement)用户双击了某条系列图形或 K 线。
SelectionChanged(Option<ChartElement>)选中元素发生变化或被清除。ChartElementBar(usize)Series { script_id, graph_id }Annotation(AnnotationId)
AnnotationClicked(AnnotationId)用户点击了某个标注(用户标注或系统标注)。始终在 SelectionChanged 之前发出。若标注不含 SELECTABLE flag,则只发此事件,不更新选中状态。
AnnotationCreated(AnnotationId)新标注被添加(绘图工具手势、add_annotationadd_system_annotation)。
AnnotationUpdated(AnnotationId)标注 spec 通过 update_annotationupdate_system_annotation 或用户拖动被替换。
AnnotationDeleted(AnnotationId)标注被移除。

ToggleVisibility 由图表内部处理——图表自动切换脚本可见性并重新渲染,不推送事件。

初始化设置示例

rust
use navi_chart::{ChartSettings, ChartView, Theme, MagnetConfig, MagnetMode};
use navi_vm::TimeFrame;

fn setup<P>(cv: &ChartView<P, String>, dark_mode: bool)
where
    P: DataProvider,
{
    cv.set_theme(if dark_mode { Theme::dark() } else { Theme::light() });
    cv.set_locale("zh-CN");
    cv.set_magnet(MagnetConfig {
        mode: MagnetMode::Weak,
        enabled: true,
    });
    cv.set_default_emoji_glyph('★');
}

事件清空循环

poll_event() 属于 ChartInteraction。每次交互方法调用后循环调用,事件在两次清空之间会持续积累:

rust
use navi_chart::{ChartInteraction, ChartSettings, ChartEvent, ChartElement, ScriptManagement};

fn handle_interaction<C>(cv: &C, event: UiEvent)
where
    C: ChartInteraction + ChartSettings + ScriptManagement<String>,
{
    // 转发事件
    match event {
        UiEvent::MouseDown(pos) => { cv.on_mouse_down(pos, Modifiers::empty()); }
        UiEvent::MouseUp(pos) => cv.on_mouse_up(pos),
        UiEvent::MouseMove(x, y) => cv.on_mouse_move(x, y),
        // ...
        _ => {}
    }

    // 清空所有待处理图表事件
    while let Some(chart_event) = cv.poll_event() {
        match chart_event {
            ChartEvent::EditScript(id) => {
                if let Some(tag) = cv.tag_for(id) {
                    open_editor(&tag);
                }
            }
            ChartEvent::RemoveScript(id) => {
                cv.remove_script(id);
            }
            ChartEvent::ShowError(id) => {
                if let Some(err) = cv.script_error(id) {
                    show_error_dialog(&err.to_string());
                }
            }
            ChartEvent::ConfigureScript(id) => {
                let inputs = cv.script_inputs(id).unwrap_or_default();
                let graphs = cv.graph_configs(id).unwrap_or_default();
                open_config_dialog(id, inputs, graphs);
            }
            ChartEvent::SelectionChanged(sel) => {
                update_toolbar_for_selection(sel);
            }
            ChartEvent::AnnotationCreated(id) => persist_annotation_added(id),
            ChartEvent::AnnotationUpdated(id) => persist_annotation_updated(id),
            ChartEvent::AnnotationDeleted(id) => persist_annotation_deleted(id),
            _ => {}
        }
    }
}

读取标的与时间框架

rust
use navi_chart::ChartSettings;

fn display_header<C>(cv: &C) -> String
where
    C: ChartSettings,
{
    format!("{} — {}", cv.symbol(), cv.timeframe())
}

更多 ChartEvent 上下文和完整的 DrawingContext 参考,请参阅概述

筹码分布(CYQ)

筹码分布(成本分布)面板估算每个价位上的持仓量并绘制在图表旁。默认关闭,在日线周期下最有意义。它完全由蜡烛序列(high / low / close / volume / turnover / turnover_rate)计算,因此数据需要带换手率——无需外部流通股本或服务端。

rust
use navi_chart::ChartSettings;

cv.set_cyq_visible(true);   // 显示面板
cv.set_cyq_width(270.0);    // 可选:面板宽度(像素,默认 270)

绘制在价格轴右侧的固定宽度带内(K 线绘图区会被压缩以腾出空间):

  • 横向直方图——每个价位一根横条,长度正比于持仓量,以最新收盘价为界分为获利(下方)与套牢(上方)两色(沿用 K 线涨跌色)。
  • 三条参考线——平均成本、压力位、支撑位,各为一条对齐价格轴的水平价格线,右端带彩色数值徽标。
  • 状态栏——获利比例、平均成本、压力/支撑位、所选区间与集中度,以及 70% / 90% 切换(在图上点击即可切换区间)。

整段序列只滚动计算一次并按 bar 集合缓存,因此平移、缩放、移动十字光标都是 O(1);显示的交易日跟随选中 / 十字光标所在 bar。当绘图区宽度不足以容纳面板时会自动隐藏。

在 Playground 中,可通过工具栏上最新价格线按钮旁边的按钮开关(状态保存在 localStorage["navi.cyq"])。

K 线风格

图表支持 13 种 K 线渲染风格。所有配置类型位于 navi_chart::style

切换风格

rust
use navi_chart::{ChartSettings, CandlestickStyle};

cv.set_candlestick_style(CandlestickStyle::HeikinAshi);

编程式配置(直接构造结构体)

rust
use navi_chart::{ChartSettings, style::{CandlestickConfig, CandlestickStyle, CandleConfig, CandleColors}};
use navi_chart::Color;

let config = CandlestickConfig {
    style: CandlestickStyle::Candlestick,
    candle: CandleConfig {
        color_based_on_prev_close: true,
        colors: CandleColors {
            up_body: Some(Color::from_rgb(0, 180, 90)),
            down_body: Some(Color::from_rgb(200, 40, 40)),
            ..Default::default()
        },
    },
    ..Default::default()
};

cv.set_candlestick_config(config);

UI property API(自动生成设置控件)

rust
// 获取当前风格的属性列表(含本地化显示名)
let descriptors = cv.candlestick_properties();

// 读取属性(None 字段返回 theme 实际颜色,如 theme.bull)
let result = cv.candlestick_property("upBody");

// 写入属性
cv.set_candlestick_property("upBody", PropertyValue::Enableable(/* ... */));

风格列表

变体说明
Candlestick实心蜡烛图(默认)
BarsOHLC 柱:高低竖线加开收刻度
HollowCandle涨空心、跌实心蜡烛
VolumeCandle蜡烛宽度随成交量缩放
Line收盘价折线图
LineWithMarkers折线 + 每根 bar 圆点标记
StepLine阶梯折线
Area折线 + 下方渐变面积填充
HlcArea高低收盘三条线 + 色带填充
Baseline基准线上下分色填充
Columns从底部到收盘价的竖柱
HighLow仅高低竖线
HeikinAshi平均 K 线(Heikin-Ashi)

详细类型参考请见 navi_chart::style

基于 MIT 许可证发布。