Modelo de dados e propriedade

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

Sixtyfold recebe cada campo numérico no seu próprio Float64Array em vez de como milhões de objetos de linha. Este layout em 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 line e stock.

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 multi-série 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 opcional y fornece o 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 da viewport, carimbos temporais de marcadores e todas as outras opções de domínio X usam a mesma unidade que X.

Use NaN em arrays Y, range-low ou range-high para uma observação real em falta. Renderizadores conectados 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;
}

Todas as seis colunas devem ter o mesmo comprimento. StockChart.setData usa normalizeOHLCVData para resolver o comprimento efectivo a partir da coluna de carimbos temporais e validar carimbos finitos, monótona e crescentemente ou decrescentemente ordenados. Carimbos iguais são aceites para histórico estático. Entrada ascendente preserva os seus arrays; entrada descendente é copiada e invertida sem mutar o chamador.

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

Posse do buffer

Em modo worker, as APIs em lote setData, setMultiSeriesData, addVectors, StockChart.setData e de lotes de ações transferem buffers de typed-array para o renderer para a via mais rápida. Os buffers transferidos tornam‑se destacados (detached) e não devem ser lidos nem reutilizados pelo remetente.

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

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

Não conte com o comportamento de fallback do thread principal para reter a propriedade. Trate entradas em grande volume como transferidas independentemente do renderer resolvido, de modo que a mudança de browser ou de políticas CSP não possa alterar a corretude da aplicação.

Streaming

O streaming de linhas utiliza um buffer circular de tamanho fixo inicializado com initStreaming(seriesCount, maxPoints). O streaming de ações utiliza initStreaming(maxCandles). Capacidades e o número de séries de linhas devem ser inteiros positivos. Uma vez atingida a capacidade, as observações mais antigas são substituídas enquanto a apresentação cronológica é preservada.

Utilize métodos de lote por vetor ou candle quando os dados já chegarem em colunas. Métodos de observação única acumulam através de requestAnimationFrame e retêm a sua ordem relativa às anexações em massa. A linha addVector copia os seus valores antes de os enfileirar, pelo que um array escalar de valores pode ser reutilizado imediatamente.

As adições a linhas exigem carimbos de data/hora finitos e colunas de séries alinhadas. Mantenha X ascendente e represente lacunas apenas nas colunas Y. As adições de stock exigem adicionalmente carimbos de data/hora estritamente crescentes entre chamadas, velas enfileiradas e em cada chunk; repetir um carimbo de data/hora não é uma operação de atualização.

A validação em lote é executada antes de esvaziar amostras enfileiradas ou transferir entradas. Comprimentos ou carimbos de data/hora rejeitados deixam as amostras pendentes inalteradas e os buffers do chamador anexados; addCandleBatches valida todos os chunks antes de transferir qualquer um deles. Estas verificações não substituem a validação do lado da aplicação de unidades, preços, volumes ou outras semânticas do feed. Veja Line streaming e Stock streaming para os contratos específicos do método.