Modelo de dados e propriedade

Formas de arrays tipados, regras de validação, lacunas e transferência de propriedade para worker

A Sixtyfold recebe cada campo numérico na sua própria Float64Array em vez de como milhões de objetos de linha. Este layout por colunas torna a transferência para um worker e a renderização previsíveis.

As formas abaixo são as entradas aceites pelos métodos de linha e métodos de ações.

Dados de linha

Um conjunto de dados de série única tem uma coluna X ordenada e uma coluna Y:

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

Dados de múltiplas séries partilham X por todas as séries:

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

Use o objeto range apenas para uma série range ou band. low e high definem o envelope; a y opcional fornece o seu traço central explícito. Omitir y, ou definir a largura da série para zero, quando um ponto médio sintetizado seria enganador.

Os valores X devem ser finitos e ascendentes. Carimbos temporais são números ordinários; milissegundos desde a época são convencionais mas não obrigatórios. minViewportRange, valores de viewport, carimbos de marcadores e todas as outras opções de domínio X usam a mesma unidade que X.

Use NaN em arrays de Y, range-low ou range-high para uma observação real em falta. Renderizadores com ligação interrompem o traço em vez de desenhar através da lacuna.

Dados OHLCV

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

As seis colunas devem estar alinhadas e ter pelo menos length entradas. normalizeOHLCVData aceita carimbos ascendentes ou descendentes. Entrada ascendente mantém os seus arrays; entrada descendente é copiada e invertida sem mutar o chamador.

Não sintetize encerramentos de bolsa ou intervalos de feed ausentes apenas para tornar os carimbos regulares. timeScale: "market" comprime visualmente intervalos ausentes enquanto rótulos, eventos e marcadores mantêm os seus carimbos reais.

Propriedade de buffers

Em modo worker, as APIs de lotes em massa setData, setMultiSeriesData, addVectors, StockChart.setData e de ações transferem buffers de arrays tipados para o renderizador para o caminho mais rápido. Buffers transferidos ficam destacados e não devem ser lidos nem reutilizados pelo chamador.

Clone explicitamente quando a aplicação precisar de reter a sua própria cópia:

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

Não confie no comportamento de fallback do thread principal para reter a propriedade. Trate entradas em massa como transferidas independentemente do renderizador resolvido para que a mudança de browser ou políticas CSP não altere a corretude da aplicação.

Fluxo contínuo

O streaming de linha usa um buffer circular de tamanho fixo inicializado com initStreaming(seriesCount, maxPoints). O streaming de ações usa initStreaming(maxCandles). Uma vez atingida a capacidade, as observações mais antigas são substituídas enquanto a renderização cronológica é preservada.

Use métodos de lote vetorial ou de velas quando os dados já chegam em colunas. Métodos de observação única agrupam através de requestAnimationFrame e são convenientes para taxas de atualização moderadas.