Догрузка истории
График не может держать всю историю инструмента сразу, поэтому он загружает окно последних баров и подтягивает более старые по мере необходимости. ChartDataController следит за видимым диапазоном и, когда вы прокручиваете или масштабируете к левому краю, запрашивает следующую страницу истории из вашего источника данных и добавляет её слева.
Живая демонстрация
Прокрутите или приблизьте к левому краю — старые бары подгружаются страницами (следите за плашкой статуса). У источника здесь искусственная задержка, чтобы состояние загрузки было видно.
Настройка
Передайте контроллеру график, серию, которой он управляет, и источник данных. Источник разрешает символ и возвращает страницы баров; контроллер запрашивает старые страницы автоматически:
import { createChart, CandlestickSeries } from '@stocksharp/chart';
import { ChartDataController } from '@stocksharp/chart/data';
// Источник данных: разрешает символ, затем отдаёт страницы баров, заканчивающиеся до `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 }. Верните { bars, hasMoreBefore, hasMoreAfter }.
return fetchBars(request).then(bars => ({ bars, hasMoreBefore: bars.length > 0, hasMoreAfter: false }));
},
subscribeBars(request, listener) {
// Отправляйте бары в реальном времени через слушатель ({ bar, isFinal }); верните функцию отписки.
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, // баров загружается первыми
historyCount: 250, // баров на каждую страницу более старой истории
historyPrefetchThreshold: 40, // предзагрузка, когда до левого края остаётся 40 баров
autoPrefetch: true, // автоматически подгружать старые бары при прокрутке / масштабировании
});
// Необязательно: отслеживать состояние загрузки и прогресс.
controller.subscribe(snap => {
console.log(snap.loadedBars, snap.hasMoreBefore, snap.loadingHistory);
});
// Загрузите первую страницу, затем разместите видимую область у правого края, чтобы было куда прокручивать влево.
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 — насколько близко к самому старому загруженному бару должен подойти видимый диапазон, прежде чем будет запрошена следующая страница; autoPrefetch включает эту автоматическую загрузку. Пока страница в пути, snapshot.loadingHistory равно true, так что можно показать индикатор загрузки. Вызовите controller.loadMoreBefore(), чтобы подгрузить страницу вручную, и controller.dispose() для очистки.