数据模型与所有权

类型化数组的形状、验证规则、缺口以及 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。