工作原理
三张从内部看这个库的图,使用代码中的名称,方便你在源码中找到每个部分。将指针移到某一步上, 或用 Tab 键聚焦它,即可看到它涉及的方框。使用图表并不需要了解这些;当你编写数据源、插件或修改库本身时, 它们会有帮助。
从数据源到屏幕
无论 K 线来自交易所还是你自己的代码,它都走同一条路径,并由同一个存储保存。 所有绘制的内容都由这个存储和视图计算得出。
- K 线进入. DataFeed 被请求历史数据(getBars)并被订阅以获取实时 K 线;DataAdapter(例如 BinanceAdapter)则以事件推送一切。StreamManager 把 feed 转换为 adapter,按图表的周期重新采样,并由 tick 生成 K 线。
- 图表接收. chart.connect() 监听 snapshot、barUpdate、barClose 和 barCorrection 事件。你自己的代码用 setData、appendBar、updateLastBar 或 updateBar 写入同样的 K 线,完全不需要 feed。
- 一个存储. 每次写入都经过 SeriesStore。它保存当前显示的 K 线、隐藏盘外 K 线时的完整序列,以及回放期间搁置的实时序列,并告诉图表每次写入做了什么。
- 计算出要绘制的内容. DisplaySeries 生成当前图表类型要绘制的序列(平均 K 线、砖形图、卡吉图……),在 K 线变化前一直缓存。IndicatorEngine 只从第一根变化的 K 线开始重新计算。PriceFit 适配价格刻度,PaneLayout 确定各窗格的大小。
- 视图. Viewport 记录哪些 K 线可见、每根有多宽以及滚动到了哪里。拖动、滚轮和按键通过 InteractionManager 滚动和缩放它。
- 一帧. RenderEngine 标记发生变化的图层,并在下一个动画帧中绘制;实时 tick 会先被合并,所以一阵突发只算一帧。scene 画布包含网格、序列、指标、绘图和坐标轴;top 画布包含十字光标和图例,所以移动指针只会重绘它。使用 renderer: 'webgl' 时,下方由一个 GPU 画布绘制 K 线和成交量。
- 回到你的应用. 图表通过事件报告:crosshairMove、dataUpdate、visibleRangeChange、symbolChange 等,完整列表见 API 参考。
ChartWidget 由什么组成
ChartWidget 是围绕一个 Chart 的完整交易界面。它的各个部分都是小类,
每个只能看到交给它的东西。
- 一个公开类. ChartWidget 保留公开方法和初始化。它的构造函数是一串步骤,按各部分相互依赖的顺序排列:readOptions、buildRoot、buildToolbar、buildBody、buildChart … finishSetup。
- 每个区域通过一个 host. 回放、交易、提醒、对比、自选列表、图例、菜单、命令、布局、停靠栏、Chart Settings、绘图编辑和周期都是独立的类。每个类得到一个 host 接口,准确列出它从 widget 使用的内容;ChartWidget 上的公开方法再转交给对应的区域。
- 一个图表. buildChart 创建 widget 包裹的唯一一个 Chart。每个区域都通过自己的 host 访问它,没有区域拥有自己的图表。widget 监听图表事件,让工具栏和图例保持同步。
- Signal. 多个部分共同显示的状态是一个 signal:主题(look)、工具栏中哪些按钮处于打开状态(openRoles)以及 Chart Settings。一个 effect 更新所有显示它的地方,写入方无需逐一调用更新。
- 对话框首次打开时加载. 较大的对话框、指标对话框、命令面板和代码搜索都在 DIALOGS 中,第一次打开时才加载代码。它们在 overlayHost 中打开,全屏时 overlayHost 会移到 widget 内部。
一次 K 线回放
回放在同一个图表上逐根重放过去的 K 线,实时 K 线则被搁置,直到回放结束。
- 选择一根 K 线. 回放按钮打开回放栏;点击一根 K 线或调用 replayFrom() 来选择回放的起点。
- 开始. chart.replayStart() 让 SeriesStore 把实时 K 线搁置,然后把要播放的 K 线载入 ReplayManager,它在起点暂停等待。
- 逐步. 播放、暂停、前进或后退一步以及速度都交给 ReplayManager。每一步发出一个 bar 事件;图表显示到该处为止的 K 线(showReplayed,向前时用 appendReplayed)。
- 跟随回放的内容. 指标从变化的那根 K 线开始重新计算,价格线显示回放中的收盘价,模拟账户以回放价格成交。实盘账户的订单和提醒仍按实时行情运行。
- 结束. 到达最后一根 K 线时回放暂停。退出时调用 replayStop():SeriesStore 放回实时序列,图表重新进入实时状态。
选项和事件见 实时数据与回放。