Preenchimento de histórico
Um gráfico não consegue manter todo o histórico de um instrumento de uma só vez, então ele carrega uma janela de barras recentes e busca as mais antigas sob demanda. O ChartDataController monitora o intervalo visível e, à medida que você rola ou dá zoom em direção à borda esquerda, obtém a próxima página de histórico da sua fonte de dados e a adiciona ao início.
Demonstração ao vivo
Role ou dê zoom em direção à borda esquerda — as barras mais antigas são carregadas em páginas (observe a legenda de status). O fluxo de dados aqui possui um atraso artificial para que o estado de carregamento fique visível.
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 retorna 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 }. Retorna { 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 }); retorne uma função de cancelamento de inscriçã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 borda esquerda
autoPrefetch: true, // carrega barras mais antigas automaticamente ao rolar / dar zoom
});
// 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 borda direita para haver espaço para rolar à 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 quão perto da barra mais antiga carregada a viewport deve chegar antes que a próxima página seja buscada; autoPrefetch ativa esse carregamento automático. Enquanto uma página está em trânsito, snapshot.loadingHistory é true, então você pode exibir um indicador de progresso. Chame controller.loadMoreBefore() para acionar uma página manualmente e controller.dispose() para liberar os recursos.