データモデルと所有権

型付き配列の形状、検証規則、ギャップ、およびWorkerへの転送所有権。

Sixtyfoldは各数値フィールドを数百万の行オブジェクトとしてではなく、それぞれ独自のFloat64Arrayで受け取ります。このカラムレイアウトにより、Workerへの転送と描画が予測可能になります。

以下の形状はラインメソッドおよびストックメソッドが受け付ける入力です。

ラインデータ

単一系列のデータセットは、1つの順序付けられたXカラムと1つの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シリーズのみに使用してください。lowhighはエンベロープを定義し、任意の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;
}

6つすべてのカラムは整列しており、少なくともlengthエントリを持っている必要があります。normalizeOHLCVDataは昇順または降順のタイムスタンプを受け入れます。昇順の入力はその配列を保持し、降順の入力はコピーされて反転されて呼び出し元を変更しません。

タイムスタンプを規則的にするために取引所のクローズや欠落するフィード間隔を合成して生成しないでください。timeScale: "market"は欠落間隔を視覚的に圧縮しますが、ラベル、イベント、マーカーは実際のタイムスタンプを保持します。

バッファ所有権

Workerモードでは、バルクのsetDatasetMultiSeriesDataaddVectorsStockChart.setDataおよびストックバッチAPIは、最速経路のために型付き配列バッファをレンダラーに転送します。転送されたバッファは切り離され、呼び出し元が読み取ったり再利用したりしてはなりません。

アプリケーションが独自のコピーを保持する必要がある場合は明示的にクローンしてください:

chart.setData({
  x: sourceX.slice(),
  y: sourceY.slice(),
  length: sourceX.length,
});

メインスレッドのフォールバック動作に所有権保持を依存しないでください。バルク入力はレンダラーの解決結果に関わらず転送されたものとして扱い、ブラウザやCSPポリシーの切替がアプリケーションの正確性を変えないようにしてください。

ストリーミング

ラインストリーミングはinitStreaming(seriesCount, maxPoints)で初期化された固定サイズのリングバッファを使用します。ストックストリーミングはinitStreaming(maxCandles)を使用します。容量に達すると最も古い観測が置き換えられ、時系列描画は維持されます。

データが既にカラムで到着する場合はベクタまたはキャンドルのバッチメソッドを使用してください。単一観測メソッドはrequestAnimationFrameを通じてバッチ処理され、控えめなライブレートに便利です。