Datenmodell und Eigentum

Shapes von Typed Arrays, Validierungsregeln, Lücken und Worker-Transfer-Eigentum.

Sixtyfold erhält jedes numerische Feld in seinem eigenen Float64Array statt als Millionen von Zeilenobjekten. Dieses Spaltenlayout macht den Transfer zu einem Worker und das Rendern vorhersehbar.

Die unten stehenden Shapes sind die Eingaben, die von den line methods und den stock methods akzeptiert werden.

Liniendaten

Ein Single-Series-Dataset hat eine geordnete X-Spalte und eine Y-Spalte:

interface TimeSeriesData {
  x: Float64Array;
  y: Float64Array;
  length: number;
}

Multi-Series-Daten teilen X über alle Serien hinweg:

interface MultiSeriesData {
  x: Float64Array;
  series: Array<Float64Array | {
    low: Float64Array;
    high: Float64Array;
    y?: Float64Array;
  }>;
  length: number;
  seriesCount: number;
}

Verwenden Sie das Range-Objekt nur für eine range oder band Serie. low und high definieren die Hülle; optional liefert y ihren expliziten Mittellinienstrich. Lassen Sie y weg oder setzen Sie die Serienbreite auf null, wenn ein synthetisierter Mittelpunkt irreführend wäre.

X-Werte müssen endlich und aufsteigend sein. Zeitstempel sind gewöhnliche Zahlen; Epoch-Millisekunden sind konventionell, aber nicht zwingend. minViewportRange, Viewport-Werte, Marker-Zeitstempel und alle anderen X-Domain-Optionen verwenden dieselbe Einheit wie X.

Verwenden Sie NaN in Y-, range-low- oder range-high-Arrays für eine echte fehlende Beobachtung. Verbundene Renderer unterbrechen die Pfadlinie, anstatt durch die Lücke zu zeichnen.

OHLCV-Daten

interface OHLCVData {
  timestamp: Float64Array;
  open: Float64Array;
  high: Float64Array;
  low: Float64Array;
  close: Float64Array;
  volume: Float64Array;
  length: number;
}

Alle sechs Spalten müssen ausgerichtet sein und mindestens length Einträge haben. normalizeOHLCVData akzeptiert aufsteigende oder absteigende Zeitstempel. Aufsteigende Eingaben behalten ihre Arrays; absteigende Eingaben werden ohne Mutation des Aufrufers kopiert und umgekehrt.

Synthetisieren Sie nicht einfach Börsenschlusszeiten oder fehlende Feed-Intervalle, nur um Zeitstempel regelmäßig zu machen. timeScale: "market" komprimiert fehlende Intervalle visuell, während Labels, Events und Marker ihre realen Zeitstempel beibehalten.

Puffer-Eigentum

Im Worker-Modus übertragen Bulk-setData, setMultiSeriesData, addVectors, StockChart.setData und Stock-Batch-APIs Typed-Array-Puffer an den Renderer für den schnellsten Pfad. Übertragene Puffer werden detached und dürfen vom Aufrufer nicht gelesen oder wiederverwendet werden.

Klonen Sie explizit, wenn die Anwendung eine eigene Kopie behalten muss:

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

Verlassen Sie sich nicht auf ein Main-Thread-Fallback-Verhalten, um das Eigentum zu behalten. Behandeln Sie Bulk-Eingaben als übertragen, unabhängig vom ausgewählten Renderer, damit ein Wechsel von Browsern oder CSP-Richtlinien die Anwendungs-Korrektheit nicht verändert.

Streaming

Line-Streaming verwendet einen festen Ringpuffer, der mit initStreaming(seriesCount, maxPoints) initialisiert wird. Stock-Streaming verwendet initStreaming(maxCandles). Sobald die Kapazität erreicht ist, werden die ältesten Beobachtungen ersetzt, wobei die chronologische Darstellung erhalten bleibt.

Verwenden Sie Vektor- oder Kerzen-Batch-Methoden, wenn Daten bereits in Spalten ankommen. Einzelbeobachtungs-Methoden sammeln über requestAnimationFrame und sind bei mäßigen Live-Raten bequem.