Skip to content

脚本管理

ScriptManagement<T> trait 定义了 ChartView 完整的脚本生命周期 API,涵盖脚本的添加、移除、查询与配置。

T 是用户自定义的标签类型——可以是 String(脚本名称)、UUID,或任何实现了 Clone + PartialEq + Display 的类型。

同一图表上各脚本的 tag 必须唯一。 set_scripts 通过 tag 对比新旧列表:两侧都存在的 tag 对应的脚本保持不变(不重算);仅出现在新列表的 tag 对应脚本被添加;仅出现在旧列表的 tag 对应脚本被移除。若两个脚本共用相同 tag,diff 结果不可预期。请使用脚本名称、UUID 或其他每个脚本都唯一的值作为 tag。

导入

rust
use navi_chart::{ChartView, ScriptManagement};

添加脚本

add_scriptScriptManagement<T> 的一部分,接收 Script 类型的值(即 provider 的关联类型 P::Script):

rust
// LocalChartProvider — Script = String(源码字符串)
let id = cv.add_script(source.to_string(), "RSI".to_string());

// 自定义 ChartProvider — Script 取决于 P::Script 的具体类型
let id = cv.add_script(script_handle, "RSI".to_string());

使用 add_script_with_complete 可在初次历史回放完成时收到通知:

rust
let id = cv.add_script_with_complete(source, "RSI".to_string(), |result| {
    match result {
        Ok(()) => println!("RSI 加载成功"),
        Err(e) => eprintln!("RSI 错误: {e}"),
    }
});

添加脚本会触发 session 重启——所有脚本(含已有脚本)从第 0 根 bar 重新回放。

批量替换

要一次性替换所有脚本,使用 set_scripts。在 stream 已运行时,它通过 tag 对比新旧列表进行增量操作——保留未变化的脚本、添加新脚本、移除已删除的脚本,无需重启 stream,且只有新增脚本会被重新计算。若 stream 尚未启动,则以一次 stream 启动覆盖所有脚本。

rust
let ids = cv.set_scripts(vec![
    (source1, "RSI".to_string()),
    (source2, "MACD".to_string()),
]);

使用 set_scripts_with_complete 可在初次历史回放完成时收到通知:

rust
let ids = cv.set_scripts_with_complete(
    vec![(source1, "RSI".to_string()), (source2, "MACD".to_string())],
    |result| match result {
        Ok(()) => println!("全部加载完成"),
        Err(e) => eprintln!("错误: {e}"),
    },
);

回调只触发一次——若任意脚本出错则携带该错误,全部成功时携带 Ok(())

传入空 Vec 等价于 remove_all_scripts

泛型代码

由于 add_script 在 trait 中,可以编写适用于任意图表视图的泛型函数:

rust
use navi_chart::{ScriptManagement, ScriptId};

fn add_and_track<C>(cv: &C, source: C::Script, tag: String) -> ScriptId
where
    C: ScriptManagement<String>,
{
    cv.add_script(source, tag)
}

方法参考

方法说明
add_script(script, tag)添加脚本,返回 ScriptId。触发 session 重启。
add_script_with_complete(script, tag, cb)同上,但初次回放完成后调用 cb
set_scripts(scripts)一次性替换所有脚本,只触发一次重启。返回 Vec<ScriptId>,顺序与输入一致。
set_scripts_with_complete(scripts, cb)同上,但全部完成或首次出错时调用一次 cb
remove_script(id)ScriptId 移除脚本,释放所有资源并重新渲染。
remove_all_scripts()移除图表上的所有脚本。
set_script_config(id, config)应用 ScriptConfig(输入覆盖 + 策略配置覆盖 + 视觉覆盖)。输入或策略配置变化触发重启;仅视觉变化则立即重渲染。
strategy_report(id)返回策略报告;若非策略脚本或尚无输出则返回 None
scripts()按插入顺序返回所有脚本的 (tag, id) 对。
has_script_tag(tag)若存在指定标签的脚本则返回 true
script_id_for_tag(tag)按标签查找 ScriptId
script_config(id)返回脚本当前的 ScriptConfig
graph_configs(id)返回各系列图形的原始(未覆盖)视觉配置。
script_overrides(id)返回各系列图形当前的视觉覆盖。
script_inputs(id)返回脚本的输入定义及其默认值
script_error(id)返回最近一次编译或运行时错误(如有)。
tag_for(id)反查:根据 ScriptId 返回对应标签。

注意

  • ScriptId 是不透明且非零的。若需配置或移除脚本,请保存它;可通过 tag_for 从事件中恢复标签。

持久化

内置的 save / load API 返回泛型 ChartSnapshot<T, P::Script>

rust
let snapshot = cv.save();  // ChartSnapshot<String, P::Script>
let json = serde_json::to_string(&snapshot).unwrap();
// ...
cv.load(serde_json::from_str(&json).unwrap());

完整的保存/恢复流程请参阅 ChartView — 持久化ScriptConfig 数据模型和配置 UI 教程请参阅 脚本配置界面

基于 MIT 许可证发布。