脚本管理
ScriptManagement<T> trait 定义了 ChartView 完整的脚本生命周期 API,涵盖脚本的添加、移除、查询与配置。
T 是用户自定义的标签类型——可以是 String(脚本名称)、UUID,或任何实现了 Clone + PartialEq + Display 的类型。
同一图表上各脚本的 tag 必须唯一。 set_scripts 通过 tag 对比新旧列表:两侧都存在的 tag 对应的脚本保持不变(不重算);仅出现在新列表的 tag 对应脚本被添加;仅出现在旧列表的 tag 对应脚本被移除。若两个脚本共用相同 tag,diff 结果不可预期。请使用脚本名称、UUID 或其他每个脚本都唯一的值作为 tag。
导入
use navi_chart::{ChartView, ScriptManagement};添加脚本
add_script 是 ScriptManagement<T> 的一部分,接收 Script 类型的值(即 provider 的关联类型 P::Script):
// 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 可在初次历史回放完成时收到通知:
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 启动覆盖所有脚本。
let ids = cv.set_scripts(vec![
(source1, "RSI".to_string()),
(source2, "MACD".to_string()),
]);使用 set_scripts_with_complete 可在初次历史回放完成时收到通知:
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 中,可以编写适用于任意图表视图的泛型函数:
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>:
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 教程请参阅 脚本配置界面。