数据模型与所有权
类型化数组的形状、验证规则、缺口以及 Worker 转移所有权。
Sixtyfold 为每个数值字段接收自己的 Float64Array,而不是以数百万行对象的形式接收。此列式布局使得向 Worker 转移和渲染具有可预测性。
下面的形状是 line 方法 和 stock 方法 接受的输入。
折线数据
单系列数据集有一列有序的 X 和一列 Y:
interface TimeSeriesData {
x: Float64Array;
y: Float64Array;
length: number;
}多系列数据在各系列之间共享 X:
interface MultiSeriesData {
x: Float64Array;
series: Array<Float64Array | {
low: Float64Array;
high: Float64Array;
y?: Float64Array;
}>;
length: number;
seriesCount: number;
}仅在 range 或 band 系列上使用 range 对象。low 和 high 定义包络;可选的 y 提供其显式中线。若合成中点会产生误导,则省略 y 或将系列宽度设为零。
X 值必须为有限数且递增。时间戳为普通数字;惯例是使用纪元毫秒但并非强制。minViewportRange、视口值、标记时间戳以及其他所有 X 域选项均使用与 X 相同的单位。
在 Y、range-low 或 range-high 数组中使用 NaN 表示真实缺失观测值。连接型渲染器会中断路径而非穿过空隙绘制。
OHLCV 数据
interface OHLCVData {
timestamp: Float64Array;
open: Float64Array;
high: Float64Array;
low: Float64Array;
close: Float64Array;
volume: Float64Array;
length: number;
}所有六列必须具有相同长度。StockChart.setData 使用 normalizeOHLCVData 从时间戳列解析有效长度,并验证时间戳为有限且单调递增或递减。对于静态历史,允许时间戳相等。递增输入保留其数组;递减输入在不修改调用者的情况下复制并反转。
不要为了使时间戳变得规则而合成交易所闭市或缺失的行情区间。timeScale: "market"在视觉上压缩缺失的区间,而标签、事件和标记保持其真实时间戳。
缓冲区所有权
在 Worker 模式下,批量 setData、setMultiSeriesData、addVectors、StockChart.setData 以及股票批次 API 会将类型化数组缓冲区转移到渲染器,以获得最快路径。被转移的缓冲区将变为已分离状态,调用方不得读取或重用。
当应用必须保留自己的副本时请显式克隆:
chart.setData({
x: sourceX.slice(),
y: sourceY.slice(),
length: sourceX.length,
});不要依赖主线程回退行为来保留所有权。应将批量输入视为已转移,无论最终解析的渲染器为何,这样切换浏览器或 CSP 策略都不会改变应用程序的正确性。
流式传输
折线流使用以 initStreaming(seriesCount, maxPoints) 初始化的固定大小环形缓冲区。股票流使用 initStreaming(maxCandles)。容量和折线序列计数必须为正整数。达到容量后,最旧的观测值将被替换,同时保留按时间顺序的渲染。
当数据已经以列形式到达时,请使用向量或蜡烛批量方法。单一观测方法通过 requestAnimationFrame 进行批处理,并在相对于批量追加保留其顺序。折线 addVector 会在入队前复制其值,因此标量值数组可以立即重用。
Line 追加要求有限时间戳且序列列对齐。保持 X 递增,仅在 Y 列中表示缺口。Stock 追加还要求跨调用、排队的烛形以及每个块的时间戳严格递增;重复时间戳不是更新操作。
批量验证在刷新排队样本或传输输入之前运行。被拒绝的长度或时间戳不会改变挂起样本且调用方缓冲区保持附着;addCandleBatches在传输任何块之前验证所有块。这些检查不替代应用端对单位、价格、成交量或其他数据源语义的验证。有关方法特定合同,请参见Line streaming和Stock streaming。