Preenchimento de histórico
Um gráfico não consegue manter todo o histórico de um instrumento de uma só vez, pelo que carrega uma janela de barras recentes e obtém as mais antigas a pedido. O ChartDataController monitoriza o intervalo visível e, à medida que o gráfico é deslocado ou ampliado em direção à margem esquerda, obtém a página de histórico seguinte da fonte de dados e adiciona-a ao início.
Demonstração em direto
Desloque ou amplie o gráfico em direção à margem esquerda — as barras mais antigas são carregadas por páginas (consulte a legenda de estado). Este fluxo de dados tem um atraso artificial para tornar visível o estado de carregamento.
Configuração
Forneça ao controlador o gráfico, a série que ele controla e uma fonte de dados. A fonte de dados resolve um símbolo e devolve páginas de barras; o controlador solicita páginas mais antigas automaticamente:
import { createChart, CandlestickSeries } from '@stocksharp/chart';
import { ChartDataController } from '@stocksharp/chart/data';
// Uma fonte de dados: resolve o símbolo e então serve páginas de barras terminando antes de `to`.
const dataSource = {
resolveSymbol(request) {
return Promise.resolve({ id: request.symbol, priceFormat: { type: 'price', precision: 2, minMove: 0.01 } });
},
getBars(request) {
// request: { symbol, resolution, to?, countBack }. Devolve { bars, hasMoreBefore, hasMoreAfter }.
return fetchBars(request).then(bars => ({ bars, hasMoreBefore: bars.length > 0, hasMoreAfter: false }));
},
subscribeBars(request, listener) {
// Envie barras em tempo real pelo callback ({ bar, isFinal }); devolva uma função de cancelamento da subscrição.
return () => {};
},
};
const chart = createChart(document.getElementById('chart'), { timeScale: { timeVisible: true } });
const series = chart.addSeries(CandlestickSeries, { upColor: '#26a69a', downColor: '#ef5350' });
const controller = new ChartDataController({
chart,
series,
dataSource,
initialCount: 300, // barras carregadas primeiro
historyCount: 250, // barras por página mais antiga
historyPrefetchThreshold: 40, // pré-carrega quando estiver a 40 barras da margem esquerda
autoPrefetch: true, // carrega barras mais antigas ao deslocar / ampliar
});
// Opcional: observe o estado e o progresso do carregamento.
controller.subscribe(snap => {
console.log(snap.loadedBars, snap.hasMoreBefore, snap.loadingHistory);
});
// Carrega a primeira página e posiciona a viewport perto da margem direita para permitir o deslocamento para a esquerda.
controller.setSelection({ symbol: 'DEMO', resolution: '1h' }).then(() => {
const loaded = controller.rawData().length;
chart.timeScale().setVisibleLogicalRange({ from: Math.max(0, loaded - 90), to: loaded + 3 });
});
historyPrefetchThreshold define a proximidade da barra mais antiga carregada que a viewport deve atingir antes de ser obtida a página seguinte; autoPrefetch ativa este carregamento automático. Enquanto uma página está em trânsito, snapshot.loadingHistory é true, pelo que é possível apresentar um indicador de progresso. Invoque controller.loadMoreBefore() para obter manualmente uma página e controller.dispose() para libertar os recursos.