Загрузка данных


===== 1. Публичные методы и основные потоки symbol =====
./src/core/Chart.ts:416:    const symbols$ = combineLatest([this.eventManager.symbol(), this.compareManager.itemsObs()]).pipe(
./src/core/CompareManager.ts:19:  symbol$: BehaviorSubject<string>;
./src/core/CompareManager.ts:113:    const symbol$ = new BehaviorSubject(symbol);
./src/core/CompareManager.ts:145:        mainSymbol$: symbol$,
./src/core/CompareManager.ts:180:      symbol$,
./src/core/CompareManager.ts:306:    entry.symbol$.complete();
./src/core/EventManager.ts:35:  private symbol$: BehaviorSubject<string>;
./src/core/EventManager.ts:58:    this.symbol$ = new BehaviorSubject<string>(initialSymbol);
./src/core/EventManager.ts:68:      symbol: (value) => this.symbol$.next(value),
./src/core/EventManager.ts:123:    this.setWithHistory('symbol', this.symbol$, symbol, options);
./src/core/EventManager.ts:126:  public getSymbol(): Observable<string> {
./src/core/EventManager.ts:127:    return this.symbol$.asObservable();
./src/core/EventManager.ts:142:      this.setWithHistory('symbol', this.symbol$, symbol, options);
./src/core/EventManager.ts:186:    return this.symbol$.asObservable();
./src/core/EventManager.ts:224:      symbol: this.symbol$.value,
./src/core/EventManager.ts:236:      this.setSymbol(symbol, setOptions);
./src/core/EventManager.ts:266:    this.symbol$.complete();
./src/core/Indicator.ts:16:  mainSymbol$: Observable<string>;
./src/core/Indicator.ts:33:  private mainSymbol$: Observable<string>;
./src/core/Indicator.ts:52:    mainSymbol$,
./src/core/Indicator.ts:62:    this.mainSymbol$ = mainSymbol$;
./src/core/Indicator.ts:63:    this.mainSymbolName$ = mainSymbolName$ ?? mainSymbol$;
./src/core/Indicator.ts:64:    this.mainSymbolTicker$ = mainSymbolTicker$ ?? mainSymbol$;
./src/core/Indicator.ts:211:        mainSymbol$: this.mainSymbol$,
./src/core/IndicatorManager.ts:89:          mainSymbol$: this.eventManager.getSymbol(),
./src/core/MoexChart.tsx:278:  public setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void {
./src/core/Pane.tsx:405:        mainSymbol$: this.eventManager.getSymbol(),
./src/core/Series/BaseSeries.ts:71:  mainSymbol$: Observable<string>;
./src/core/Series/BaseSeries.ts:107:  protected mainSymbol$: Observable<string>;
./src/core/Series/BaseSeries.ts:121:    mainSymbol$,
./src/core/Series/BaseSeries.ts:141:    this.mainSymbol$ = mainSymbol$;
./src/core/Series/BaseSeries.ts:142:    this.mainSymbolName$ = mainSymbolName$ ?? mainSymbol$;
./src/core/Series/BaseSeries.ts:143:    this.mainSymbolTicker$ = mainSymbolTicker$ ?? mainSymbol$;
./src/core/Series/BaseSeries.ts:411:      this.mainSymbol$.pipe(distinctUntilChanged()).subscribe((symbol) => {
./types/core/EventManager.d.ts:28:    private symbol$;
./types/core/EventManager.d.ts:44:    getSymbol(): Observable<string>;
./types/core/Indicator.d.ts:11:    mainSymbol$: Observable<string>;
./types/core/Indicator.d.ts:27:    private mainSymbol$;
./types/core/Indicator.d.ts:35:    constructor({ id, type, lwcChart, dataSource, zIndex, onDelete, moveUp, moveDown, mainSymbol$, mainSymbolName$, mainSymbolTicker$, associatedPane, paneId, config, }: IndicatorParams);
./types/core/MoexChart.d.ts:91:    setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void;
./types/core/Series/BaseSeries.d.ts:30:    mainSymbol$: Observable<string>;
./types/core/Series/BaseSeries.d.ts:45:    protected mainSymbol$: Observable<string>;
./types/core/Series/BaseSeries.d.ts:55:    constructor({ lwcChart, mainSymbol$, mainSymbolName$, mainSymbolTicker$, mainSerie$, customFormatter, seriesOptions, priceScaleOptions, showSymbolLabel, paneIndex, indicatorReference, }: BaseSeriesParams<TSeries>);

===== 2. Объявление DataSource =====
./src/core/DataSource.ts:10:export interface DataSourceParams {
./src/core/DataSource.ts:24:export class DataSource {
./stories/common.ts:14:class DataSourceProvider {
./types/core/DataSource.d.ts:5:export interface DataSourceParams {
./types/core/DataSource.d.ts:13:export declare class DataSource {

===== 3. Все использования DataSource =====
src/core/Chart.ts:21:import { DataSource } from '@core/DataSource';
src/core/Chart.ts:67:    dataSource: DataSource;
src/core/Chart.ts:104:  private dataSource: DataSource;
src/core/Chart.ts:121:    const { eventManager, dataSource, modalRenderer, ohlcConfig, tooltipConfig, panes: panesSnapshot } = params;
src/core/Chart.ts:124:    this.dataSource = dataSource;
src/core/Chart.ts:169:      dataSource,
src/core/Chart.ts:187:      dataSource: this.dataSource,
src/core/Chart.ts:197:      dataSource: this.dataSource,
src/core/Chart.ts:210:    this.setupDataSourceSubs();
src/core/Chart.ts:348:        this.dataSource.updateRealtime(symbol, candle);
src/core/Chart.ts:377:      Promise.all(symbols.map((symbol) => this.dataSource.loadMoreHistory(symbol))).finally(() => {
src/core/Chart.ts:389:  private setupDataSourceSubs() {
src/core/Chart.ts:411:      Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from))).catch((error) => {
src/core/Chart.ts:430:            Promise.all(symbols.map((symbol) => this.dataSource.loadAllHistory(symbol)))
src/core/Chart.ts:441:          Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from)))
src/core/Chart.ts:460:        this.dataSource.setSymbols(symbols);
src/core/CompareManager.ts:6:import { DataSource } from '@core/DataSource';
src/core/CompareManager.ts:27:  dataSource: DataSource;
src/core/CompareManager.ts:36:  private readonly dataSource: DataSource;
src/core/CompareManager.ts:50:    dataSource,
src/core/CompareManager.ts:57:    this.dataSource = dataSource;
src/core/CompareManager.ts:147:        dataSource: this.dataSource,
src/core/CompareManager.ts:187:    await this.dataSource.isReady(symbol);
src/core/DataSource.ts:10:export interface DataSourceParams {
src/core/DataSource.ts:24:export class DataSource {
src/core/DataSource.ts:25:  private readonly getData: DataSourceParams['getData'];
src/core/DataSource.ts:34:  constructor({ getData, eventManager }: DataSourceParams) {
src/core/DataSource.ts:188:        ).catch((error) => console.error('[DataSource] Global timeframe reload error:', error));
src/core/Indicator.ts:4:import { DataSource } from '@core/DataSource';
src/core/Indicator.ts:20:  dataSource: DataSource;
src/core/Indicator.ts:32:  private dataSource: DataSource;
src/core/Indicator.ts:47:    dataSource,
src/core/Indicator.ts:61:    this.dataSource = dataSource;
src/core/Indicator.ts:175:      dataSource: this.dataSource,
src/core/Indicator.ts:200:        dataSource: this.dataSource,
src/core/IndicatorManager.ts:4:import { DataSource } from '@core/DataSource';
src/core/IndicatorManager.ts:17:  dataSource: DataSource;
src/core/IndicatorManager.ts:33:  private dataSource: DataSource;
src/core/IndicatorManager.ts:36:  constructor({ eventManager, dataSource, lwcChart, DOM, chartOptions, initialIndicators, paneManager }: SeriesParams) {
src/core/IndicatorManager.ts:41:    this.dataSource = dataSource;
src/core/IndicatorManager.ts:91:          dataSource: this.dataSource,
src/core/MoexChart.tsx:7:import { DataSource, DataSourceParams } from '@core/DataSource';
src/core/MoexChart.tsx:78:  getDataSource: DataSourceParams['getData'];
src/core/MoexChart.tsx:115:  private dataSource!: DataSource;
src/core/MoexChart.tsx:152:    this.dataSource = new DataSource({
src/core/MoexChart.tsx:153:      getData: config.chartCollectionPreset.getDataSource,
src/core/MoexChart.tsx:183:        dataSource: this.dataSource,
src/core/MoexChart.tsx:395:    this.dataSource.destroy();
src/core/Pane.tsx:9:import { DataSource } from '@core/DataSource';
src/core/Pane.tsx:43:  dataSource: DataSource | null; // todo: deal with dataSource. На каких то пейнах он нужен, на каких то нет
src/core/Pane.tsx:59:// todo: в CompareManage, при создании нового пейна для сравнения - инициализируем новый dataSource, принадлежащий только конкретному пейну. Убираем возможность добавлять индикаторы на такие пейны
src/core/Pane.tsx:60:// todo: на каждый символ свой DataSource (учитывать что есть MainPane и "главный" DataSource, который инициализиурется во время старта moexChart)
src/core/Pane.tsx:92:    dataSource,
src/core/Pane.tsx:155:    if (dataSource) {
src/core/Pane.tsx:156:      this.initializeMainSerie({ lwcChart, dataSource });
src/core/Pane.tsx:398:  private initializeMainSerie({ lwcChart, dataSource }: { lwcChart: IChartApi; dataSource: DataSource }): void {
src/core/Pane.tsx:404:        dataSource,
src/core/PaneManager.ts:1:import { DataSource } from '@core/DataSource';
src/core/PaneManager.ts:36:// todo: в CompareManage, при создании нового пейна для сравнения - инициализируем новый dataSource, принадлежащий только конкретному пейну. Убираем возможность добавлять индикаторы на такие пейны
src/core/PaneManager.ts:37:// todo: на каждый символ свой DataSource (учитывать что есть MainPane и "главный" DataSource, который инициализиурется во время старта moexChart)
src/core/PaneManager.ts:145:  public addPane(dataSource?: DataSource, paneId?: number, initialPriceScales?: PriceScaleSnapshot[]): Pane {
src/core/PaneManager.ts:154:      dataSource: dataSource ?? null,
src/core/PaneManager.ts:155:      basedOn: dataSource ? undefined : this.mainPane,
src/core/Series/BarSeriesStrategy.ts:26:    this.subscribeDataSource(params.dataSource);
src/core/Series/BarSeriesStrategy.ts:61:  protected dataSourceSubscription = (dataToSet: Candle[]): void => {
src/core/Series/BarSeriesStrategy.ts:70:  protected dataSourceRealtimeSubscription = (dataToSet: Candle): void => {
src/core/Series/BaseSeries.ts:7:import type { DataSource } from '@core/DataSource';
src/core/Series/BaseSeries.ts:70:  dataSource: DataSource;
src/core/Series/BaseSeries.ts:331:  protected abstract dataSourceSubscription(next: Candle[]): void;
src/core/Series/BaseSeries.ts:335:  protected abstract dataSourceRealtimeSubscription(next: Candle): void;
src/core/Series/BaseSeries.ts:391:  protected subscribeDataSource = (dataSource: DataSource): void => {
src/core/Series/BaseSeries.ts:415:        this.dataSub = dataSource.subscribe(symbol, (next) => {
src/core/Series/BaseSeries.ts:416:          this.dataSourceSubscription(next);
src/core/Series/BaseSeries.ts:419:        this.realtimeSub = dataSource.subscribeRealtime(symbol, (next: Candle) => {
src/core/Series/BaseSeries.ts:420:          this.dataSourceRealtimeSubscription(next);
src/core/Series/CandlestickSeriesStrategy.ts:28:    this.subscribeDataSource(params.dataSource);
src/core/Series/CandlestickSeriesStrategy.ts:75:  protected dataSourceSubscription = (dataToSet: Candle[]): void => {
src/core/Series/CandlestickSeriesStrategy.ts:84:  protected dataSourceRealtimeSubscription = (dataToSet: Candle): void => {
src/core/Series/HistogramSeriesStrategy.ts:26:    this.subscribeDataSource(params.dataSource);
src/core/Series/HistogramSeriesStrategy.ts:51:  protected dataSourceSubscription = (dataToSet: Candle[]): void => {
src/core/Series/HistogramSeriesStrategy.ts:60:  protected dataSourceRealtimeSubscription = (dataToSet: Candle): void => {
src/core/Series/LineSeriesStrategy.ts:29:    this.subscribeDataSource(params.dataSource);
src/core/Series/LineSeriesStrategy.ts:60:  protected dataSourceSubscription = (dataToSet: Candle[]): void => {
src/core/Series/LineSeriesStrategy.ts:69:  protected dataSourceRealtimeSubscription = (dataToSet: Candle): void => {
src/core/SymbolSource.ts:197:        console.error('[DataSource] Ошибка при догрузке истории:', error);
src/core/SymbolSource.ts:278:        console.error('[DataSource] Ошибка при полной загрузке истории:', error);
src/core/SymbolSource.ts:342:        console.error('[DataSource] Ошибка при загрузке данных:', error);
src/types/snapshot.ts:1:import { DataSource } from '@core/DataSource';
src/types/snapshot.ts:53:  dataSource?: DataSource;

===== 4. Прямые вызовы методов dataSource =====
src/core/Chart.ts:348:        this.dataSource.updateRealtime(symbol, candle);
src/core/Chart.ts:377:      Promise.all(symbols.map((symbol) => this.dataSource.loadMoreHistory(symbol))).finally(() => {
src/core/Chart.ts:411:      Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from))).catch((error) => {
src/core/Chart.ts:430:            Promise.all(symbols.map((symbol) => this.dataSource.loadAllHistory(symbol)))
src/core/Chart.ts:441:          Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from)))
src/core/Chart.ts:460:        this.dataSource.setSymbols(symbols);
src/core/CompareManager.ts:187:    await this.dataSource.isReady(symbol);
src/core/MoexChart.tsx:395:    this.dataSource.destroy();
src/core/Series/BaseSeries.ts:415:        this.dataSub = dataSource.subscribe(symbol, (next) => {
src/core/Series/BaseSeries.ts:419:        this.realtimeSub = dataSource.subscribeRealtime(symbol, (next: Candle) => {

===== 5. Где symbol участвует в загрузке или подписке =====
src/core/Chart.ts:348:        this.dataSource.updateRealtime(symbol, candle);
src/core/Chart.ts:364:      symbolName: this.eventManager.getSymbolName(),
src/core/Chart.ts:365:      symbolTicker: this.eventManager.getSymbolTicker(),
src/core/Chart.ts:377:      Promise.all(symbols.map((symbol) => this.dataSource.loadMoreHistory(symbol))).finally(() => {
src/core/Chart.ts:411:      Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from))).catch((error) => {
src/core/Chart.ts:424:        .subscribe(([interval, symbols]) => {
src/core/Chart.ts:430:            Promise.all(symbols.map((symbol) => this.dataSource.loadAllHistory(symbol)))
src/core/Chart.ts:441:          Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from)))
src/core/Chart.ts:455:      symbols$.subscribe((symbols) => {
src/core/Chart.ts:460:        this.dataSource.setSymbols(symbols);
src/core/CompareManager.ts:133:      const config = getDefaultCompareIndicatorConfig(seriesType, symbol, symbolName, symbolTicker, usedColors);
src/core/CompareManager.ts:187:    await this.dataSource.isReady(symbol);
src/core/DataSource.ts:11:  getData: (timeframe: Timeframes, symbol: string, until?: Candle) => Promise<Candle[] | null>;
src/core/DataSource.ts:70:    this.realtimeSub = stream$.subscribe(({ symbol, candle }) => {
src/core/DataSource.ts:85:  public subscribe(symbolRaw: string, cb: (next: Candle[]) => void): Subscription {
src/core/DataSource.ts:88:    return this.ensureState(symbol).data$().subscribe(cb);
src/core/DataSource.ts:91:  public subscribeRealtime(symbolRaw: string, cb: (next: Candle) => void): Subscription {
src/core/DataSource.ts:94:    return this.ensureState(symbol).realtime$().subscribe(cb);
src/core/DataSource.ts:97:  public data$(symbolRaw: string): Observable<Candle[]> {
src/core/DataSource.ts:99:    return symbol ? this.ensureState(symbol).data$() : EMPTY_CANDLES$.asObservable();
src/core/DataSource.ts:102:  public realtime$(symbolRaw: string): Observable<Candle> {
src/core/DataSource.ts:104:    return symbol ? this.ensureState(symbol).realtime$() : EMPTY_REALTIME$.asObservable();
src/core/DataSource.ts:112:  public getLastCandle(symbolRaw: string): Candle | null {
src/core/DataSource.ts:114:    return symbol ? (this.states.get(symbol)?.getLastValue() ?? null) : null;
src/core/DataSource.ts:131:  public async loadTill(symbolRaw: string, time: number): Promise<void> {
src/core/DataSource.ts:134:      await this.ensureState(symbol).loadTill(time);
src/core/DataSource.ts:138:  public loadMoreHistory = async (symbolRaw: string): Promise<void> => {
src/core/DataSource.ts:141:      await this.ensureState(symbol).loadMoreHistory();
src/core/DataSource.ts:145:  public loadAllHistory = async (symbolRaw: string): Promise<void> => {
src/core/DataSource.ts:153:  public getIsLoading(symbolRaw: string): boolean {
src/core/DataSource.ts:155:    return symbol ? (this.states.get(symbol)?.isLoadingValue() ?? false) : false;
src/core/DataSource.ts:158:  public getOldestTime(symbolRaw: string): number | null {
src/core/DataSource.ts:160:    return symbol ? (this.states.get(symbol)?.getOldestTime() ?? null) : null;
src/core/DataSource.ts:194:    let st = this.states.get(symbol);
src/core/DataSource.ts:208:    const st = this.states.get(symbol);
src/core/Legend.ts:113:      this.eventManager.symbolName().subscribe((symbolName) => {
src/core/PriceAxisLabels/PriceAxisLabels.ts:155:      mainSymbolTicker$.subscribe((symbolTicker) => {
src/core/Series/BaseSeries.ts:403:      this.mainSymbolTicker$.pipe(distinctUntilChanged()).subscribe((symbolTicker) => {
src/core/Series/BaseSeries.ts:411:      this.mainSymbol$.pipe(distinctUntilChanged()).subscribe((symbol) => {
src/core/Series/BaseSeries.ts:415:        this.dataSub = dataSource.subscribe(symbol, (next) => {
src/core/Series/BaseSeries.ts:419:        this.realtimeSub = dataSource.subscribeRealtime(symbol, (next: Candle) => {
src/core/SymbolSource.ts:12:  getData: (timeframe: Timeframes, symbol: string, until?: Candle) => Promise<Candle[] | null>;
src/core/SymbolSource.ts:39:  constructor({ symbol, getData, getTimeframe }: SymbolSourceParams) {
src/core/SymbolSource.ts:172:        const olderData = await this.getData(tf, this.symbol, this.oldestCandle);
src/core/SymbolSource.ts:249:          const olderData = await this.getData(tf, this.symbol, oldest);
src/core/SymbolSource.ts:328:        const loaded = (await this.getData(tf, this.symbol)) ?? [];

===== 6. Метод subscribeDataSource и связанные подписки =====
src/core/DataSource.ts:31:  private realtimeSub: Subscription | null = null;
src/core/DataSource.ts:70:    this.realtimeSub = stream$.subscribe(({ symbol, candle }) => {
src/core/DataSource.ts:79:    if (this.realtimeSub) {
src/core/DataSource.ts:80:      this.realtimeSub.unsubscribe();
src/core/DataSource.ts:81:      this.realtimeSub = null;
src/core/Series/BarSeriesStrategy.ts:26:    this.subscribeDataSource(params.dataSource);
src/core/Series/BaseSeries.ts:116:  private dataSub: Subscription | null = null;
src/core/Series/BaseSeries.ts:117:  private realtimeSub: Subscription | null = null;
src/core/Series/BaseSeries.ts:195:    this.dataSub?.unsubscribe();
src/core/Series/BaseSeries.ts:196:    this.realtimeSub?.unsubscribe();
src/core/Series/BaseSeries.ts:391:  protected subscribeDataSource = (dataSource: DataSource): void => {
src/core/Series/BaseSeries.ts:412:        this.dataSub?.unsubscribe();
src/core/Series/BaseSeries.ts:413:        this.realtimeSub?.unsubscribe();
src/core/Series/BaseSeries.ts:415:        this.dataSub = dataSource.subscribe(symbol, (next) => {
src/core/Series/BaseSeries.ts:419:        this.realtimeSub = dataSource.subscribeRealtime(symbol, (next: Candle) => {
src/core/Series/CandlestickSeriesStrategy.ts:28:    this.subscribeDataSource(params.dataSource);
src/core/Series/HistogramSeriesStrategy.ts:26:    this.subscribeDataSource(params.dataSource);
src/core/Series/LineSeriesStrategy.ts:29:    this.subscribeDataSource(params.dataSource);
src/core/SymbolSource.ts:23:  private readonly realtimeSubject = new Subject<Candle>();
src/core/SymbolSource.ts:54:    return this.realtimeSubject.asObservable();
src/core/SymbolSource.ts:87:    this.realtimeSubject.complete();
src/core/SymbolSource.ts:113:    this.realtimeSubject.next(res.newestCandle);
src/core/SymbolSource.ts:372:      this.realtimeSubject.next(c);

===== 7. Все параметры и поля с названием symbol =====
src/components/CompareLegendRow/index.tsx:12:  onRemove?: (symbol: string, mode: CompareMode) => void;
src/components/CompareLegendRow/index.tsx:16:  const { symbol, mode, value, color } = item;
src/components/CompareLegendRow/index.tsx:18:  const handleDelete = () => onRemove?.(symbol, mode);
src/components/CompareLegendRow/index.tsx:22:      <div className={styles.symbol}>{symbol}</div>
src/components/Legend/index.tsx:35:          <div className={styles.symbol}>{item.name}</div>
src/core/Chart.ts:116:  private activeSymbols: string[] = [];
src/core/Chart.ts:346:      getSymbols: () => this.activeSymbols,
src/core/Chart.ts:347:      update: (symbol: string, candle: Candle) => {
src/core/Chart.ts:348:        this.dataSource.updateRealtime(symbol, candle);
src/core/Chart.ts:363:      symbol: this.activeSymbols[0],
src/core/Chart.ts:375:      const symbols = this.activeSymbols.slice();
src/core/Chart.ts:377:      Promise.all(symbols.map((symbol) => this.dataSource.loadMoreHistory(symbol))).finally(() => {
src/core/Chart.ts:411:      Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from))).catch((error) => {
src/core/Chart.ts:416:    const symbols$ = combineLatest([this.eventManager.symbol(), this.compareManager.itemsObs()]).pipe(
src/core/Chart.ts:417:      map(([main, items]) => Array.from(new Set([main, ...items.map((item) => item.symbol)]))),
src/core/Chart.ts:430:            Promise.all(symbols.map((symbol) => this.dataSource.loadAllHistory(symbol)))
src/core/Chart.ts:441:          Promise.all(symbols.map((symbol) => this.dataSource.loadTill(symbol, from)))
src/core/Chart.ts:456:        const previousSymbols = this.activeSymbols;
src/core/Chart.ts:458:        this.activeSymbols = symbols;
src/core/Chart.ts:466:          const symbol = symbols[index];
src/core/Chart.ts:468:          if (!symbol) continue;
src/core/Chart.ts:469:          if (previousSymbolsSet.has(symbol)) {
src/core/Chart.ts:473:          addedSymbols.push(symbol);
src/core/ChartSettings.ts:8:  symbol: string;
src/core/ChartSettings.ts:58:    symbol: asString(settingsObject.symbol),
src/core/CompareManager.ts:13:import { CompareInstrument, CompareItem, CompareMode, Direction, IndicatorConfig } from '@src/types';
src/core/CompareManager.ts:17:interface CompareEntry extends CompareItem {
src/core/CompareManager.ts:19:  symbol$: BehaviorSubject<string>;
src/core/CompareManager.ts:40:  private readonly itemsSubject = new BehaviorSubject<CompareItem[]>([]);
src/core/CompareManager.ts:70:  public itemsObs(): Observable<CompareItem[]> {
src/core/CompareManager.ts:90:    instrument: CompareInstrument,
src/core/CompareManager.ts:94:    const symbol = normalizeSymbol(instrument.symbol);
src/core/CompareManager.ts:96:    if (!symbol) {
src/core/CompareManager.ts:100:    const symbolName = instrument.symbolName.trim() || symbol;
src/core/CompareManager.ts:101:    const symbolTicker = instrument.symbolTicker.trim() || symbol;
src/core/CompareManager.ts:107:    const key = makeKey(symbol, mode);
src/core/CompareManager.ts:113:    const symbol$ = new BehaviorSubject(symbol);
src/core/CompareManager.ts:133:      const config = getDefaultCompareIndicatorConfig(seriesType, symbol, symbolName, symbolTicker, usedColors);
src/core/CompareManager.ts:145:        mainSymbol$: symbol$,
src/core/CompareManager.ts:176:      symbol,
src/core/CompareManager.ts:180:      symbol$,
src/core/CompareManager.ts:187:    await this.dataSource.isReady(symbol);
src/core/CompareManager.ts:191:    const symbol = normalizeSymbol(symbolRaw);
src/core/CompareManager.ts:193:    if (!symbol) {
src/core/CompareManager.ts:197:    if (this.removeEntry(makeKey(symbol, mode))) {
src/core/CompareManager.ts:203:    const symbol = normalizeSymbol(symbolRaw);
src/core/CompareManager.ts:205:    if (!symbol) {
src/core/CompareManager.ts:215:      if (entry.symbol !== symbol) {
src/core/CompareManager.ts:239:    return Array.from(this.entries.values()).map(({ symbol, symbolName, symbolTicker, entity, mode }) => ({
src/core/CompareManager.ts:240:      symbol,
src/core/CompareManager.ts:269:        const symbol = indicator.config.symbol ?? indicator.config.label;
src/core/CompareManager.ts:270:        const symbolTicker = indicator.config.symbolTicker ?? symbol;
src/core/CompareManager.ts:283:            symbol,
src/core/CompareManager.ts:306:    entry.symbol$.complete();
src/core/CompareManager.ts:319:    const items: CompareItem[] = [];
src/core/CompareManager.ts:324:        symbol: values[index].symbol,
src/core/CompareManager.ts:402:function makeKey(symbol: string, mode: CompareMode): string {
src/core/CompareManager.ts:403:  return `${symbol}|${mode}`;
src/core/CompareManager.ts:420:  symbol: string,
src/core/CompareManager.ts:428:    symbol,
src/core/DataSource.ts:11:  getData: (timeframe: Timeframes, symbol: string, until?: Candle) => Promise<Candle[] | null>;
src/core/DataSource.ts:16:  symbol: string;
src/core/DataSource.ts:29:  private readonly activeSymbols$ = new BehaviorSubject<Set<string>>(new Set());
src/core/DataSource.ts:60:    this.activeSymbols$.next(nextSet);
src/core/DataSource.ts:64:    return this.activeSymbols$.pipe(map((set) => Array.from(set)));
src/core/DataSource.ts:70:    this.realtimeSub = stream$.subscribe(({ symbol, candle }) => {
src/core/DataSource.ts:71:      const s = normalizeSymbol(symbol);
src/core/DataSource.ts:72:      if (s && this.activeSymbols$.value.has(s)) {
src/core/DataSource.ts:86:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:87:    if (!symbol) return new Subscription();
src/core/DataSource.ts:88:    return this.ensureState(symbol).data$().subscribe(cb);
src/core/DataSource.ts:92:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:93:    if (!symbol) return new Subscription();
src/core/DataSource.ts:94:    return this.ensureState(symbol).realtime$().subscribe(cb);
src/core/DataSource.ts:98:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:99:    return symbol ? this.ensureState(symbol).data$() : EMPTY_CANDLES$.asObservable();
src/core/DataSource.ts:103:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:104:    return symbol ? this.ensureState(symbol).realtime$() : EMPTY_REALTIME$.asObservable();
src/core/DataSource.ts:108:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:109:    return symbol ? this.ensureState(symbol).lastCandle$() : EMPTY_LAST_CANDLE$.asObservable();
src/core/DataSource.ts:113:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:114:    return symbol ? (this.states.get(symbol)?.getLastValue() ?? null) : null;
src/core/DataSource.ts:118:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:119:    if (!symbol) return;
src/core/DataSource.ts:120:    const st = this.ensureState(symbol);
src/core/DataSource.ts:125:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:126:    if (symbol && this.activeSymbols$.value.has(symbol)) {
src/core/DataSource.ts:127:      this.ensureState(symbol).pushRealtime(next);
src/core/DataSource.ts:132:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:133:    if (symbol && this.activeSymbols$.value.has(symbol)) {
src/core/DataSource.ts:134:      await this.ensureState(symbol).loadTill(time);
src/core/DataSource.ts:139:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:140:    if (symbol && this.activeSymbols$.value.has(symbol)) {
src/core/DataSource.ts:141:      await this.ensureState(symbol).loadMoreHistory();
src/core/DataSource.ts:146:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:147:    if (!symbol || !this.activeSymbols$.value.has(symbol)) return;
src/core/DataSource.ts:149:    const st = this.ensureState(symbol);
src/core/DataSource.ts:154:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:155:    return symbol ? (this.states.get(symbol)?.isLoadingValue() ?? false) : false;
src/core/DataSource.ts:159:    const symbol = normalizeSymbol(symbolRaw);
src/core/DataSource.ts:160:    return symbol ? (this.states.get(symbol)?.getOldestTime() ?? null) : null;
src/core/DataSource.ts:169:    this.activeSymbols$.complete();
src/core/DataSource.ts:181:        const symbols = Array.from(this.activeSymbols$.value);
src/core/DataSource.ts:193:  private ensureState(symbol: string): SymbolSource {
src/core/DataSource.ts:194:    let st = this.states.get(symbol);
src/core/DataSource.ts:197:        symbol,
src/core/DataSource.ts:201:      this.states.set(symbol, st);
src/core/DataSource.ts:207:  private dropState(symbol: string): void {
src/core/DataSource.ts:208:    const st = this.states.get(symbol);
src/core/DataSource.ts:211:      this.states.delete(symbol);
src/core/DOMModel.tsx:16:  // ∈ symbol&pane
src/core/EventManager.ts:15:  initialSymbol: string;
src/core/EventManager.ts:16:  initialSymbolName?: string;
src/core/EventManager.ts:17:  initialSymbolTicker?: string;
src/core/EventManager.ts:35:  private symbol$: BehaviorSubject<string>;
src/core/EventManager.ts:49:    initialSymbol,
src/core/EventManager.ts:50:    initialSymbolName,
src/core/EventManager.ts:51:    initialSymbolTicker,
src/core/EventManager.ts:58:    this.symbol$ = new BehaviorSubject<string>(initialSymbol);
src/core/EventManager.ts:59:    this.symbolName$ = new BehaviorSubject<string>(initialSymbolName?.trim() || initialSymbol);
src/core/EventManager.ts:60:    this.symbolTicker$ = new BehaviorSubject<string>(initialSymbolTicker?.trim() || initialSymbol);
src/core/EventManager.ts:68:      symbol: (value) => this.symbol$.next(value),
src/core/EventManager.ts:122:  public setSymbol = (symbol: string, options?: SetWithHistoryOptions): void => {
src/core/EventManager.ts:123:    this.setWithHistory('symbol', this.symbol$, symbol, options);
src/core/EventManager.ts:127:    return this.symbol$.asObservable();
src/core/EventManager.ts:131:    symbol: string,
src/core/EventManager.ts:136:    const nextSymbolName = symbolName.trim() || symbol;
src/core/EventManager.ts:137:    const nextSymbolTicker = symbolTicker?.trim() || symbol;
src/core/EventManager.ts:142:      this.setWithHistory('symbol', this.symbol$, symbol, options);
src/core/EventManager.ts:185:  public symbol(): Observable<string> {
src/core/EventManager.ts:186:    return this.symbol$.asObservable();
src/core/EventManager.ts:224:      symbol: this.symbol$.value,
src/core/EventManager.ts:232:    const { symbol, seriesSelected, timeframe, timeFormat, dateFormat, interval } = parseChartSettings(settings);
src/core/EventManager.ts:235:    if (symbol) {
src/core/EventManager.ts:236:      this.setSymbol(symbol, setOptions);
src/core/EventManager.ts:266:    this.symbol$.complete();
src/core/Legend.ts:36:  symbol: string;
src/core/MoexChart.tsx:58:   *      symbol: { visible: true, label: 'Инструмент' },
src/core/MoexChart.tsx:82:    update: (symbol: string, candle: Candle) => void,
src/core/MoexChart.tsx:133:    const { chartSeriesType, symbol, symbolName, symbolTicker, timeframe, interval, dateFormat, timeFormat } =
src/core/MoexChart.tsx:139:      initialSymbol: symbol,
src/core/MoexChart.tsx:140:      initialSymbolName: symbolName,
src/core/MoexChart.tsx:141:      initialSymbolTicker: symbolTicker,
src/core/MoexChart.tsx:278:  public setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void {
src/core/MoexChart.tsx:279:    if (!symbol) return;
src/core/MoexChart.tsx:281:    this.eventManager.setInstrument(symbol, symbolName ?? symbol, symbolTicker ?? symbol);
src/core/Series/BaseSeries.ts:411:      this.mainSymbol$.pipe(distinctUntilChanged()).subscribe((symbol) => {
src/core/Series/BaseSeries.ts:415:        this.dataSub = dataSource.subscribe(symbol, (next) => {
src/core/Series/BaseSeries.ts:419:        this.realtimeSub = dataSource.subscribeRealtime(symbol, (next: Candle) => {
src/core/SymbolSource.ts:11:  symbol: string;
src/core/SymbolSource.ts:12:  getData: (timeframe: Timeframes, symbol: string, until?: Candle) => Promise<Candle[] | null>;
src/core/SymbolSource.ts:17:  public readonly symbol: string;
src/core/SymbolSource.ts:39:  constructor({ symbol, getData, getTimeframe }: SymbolSourceParams) {
src/core/SymbolSource.ts:40:    this.symbol = symbol;
src/core/SymbolSource.ts:172:        const olderData = await this.getData(tf, this.symbol, this.oldestCandle);
src/core/SymbolSource.ts:249:          const olderData = await this.getData(tf, this.symbol, oldest);
src/core/SymbolSource.ts:328:        const loaded = (await this.getData(tf, this.symbol)) ?? [];
src/core/UndoRedo.ts:9:  symbol: (value: string) => void;
src/types/compare.ts:7:export interface CompareInstrument {
src/types/compare.ts:8:  symbol: string;
src/types/compare.ts:12:export interface CompareItem extends CompareInstrument {
src/types/indicator.ts:51:  symbol?: string;
src/types/snapshot.ts:19:  symbol: string; // todo: move to snap
src/types/snapshot.ts:30:  symbol: string;
stories/argTypes.ts:50://   initialSymbol: {
stories/argTypes.ts:78://         symbol: { required: false, name: 'string' },
stories/argTypes.ts:123://         'symbol.visible': { required: false, name: 'boolean' },
stories/argTypes.ts:124://         'symbol.label': { required: false, name: 'string' },
stories/argTypes.ts:147://           '  symbol: { visible: false, label: \'Инстр.\' },\n' +
stories/common.ts:15:  // todo: add cache по `${symbol}${timeframe}`
stories/common.ts:37:    update: (symbol: string, candle: Candle) => void,
stories/common.ts:47:        const symbol = normalizeSymbol(symbols[i]);
stories/common.ts:48:        if (!symbol) continue;
stories/common.ts:50:        update(symbol, this.nextRealtimeCandle(tf, symbol, periodMs));
stories/common.ts:60:  private nextRealtimeCandle(timeframe: Timeframes, symbol: string, realtimePeriodMs: number): Candle {
stories/common.ts:63:    const prev = this.realtimeLastBySymbol.get(symbol);
stories/common.ts:101:    this.realtimeLastBySymbol.set(symbol, next);
stories/common.ts:109:   * @param symbol - symbol.
stories/MB/MB.stories.tsx:8:import { CompareInstrument, CompareMode } from '@lib/types';
stories/MB/MB.stories.tsx:108:        symbol: 'APPL',
stories/MB/MB.stories.tsx:186:const COMPARE_ITEMS: CompareInstrument[] = [
stories/MB/MB.stories.tsx:187:  { symbol: 'SBER', symbolName: 'SBER', symbolTicker: 'SBER' },
stories/MB/MB.stories.tsx:188:  { symbol: 'APAX', symbolName: 'APAX', symbolTicker: 'APAX' },
stories/MB/MB.stories.tsx:189:  { symbol: 'SOL', symbolName: 'SOL', symbolTicker: 'SOL' },
stories/MB/MB.stories.tsx:245:            key={instrument.symbol}
stories/MXT/MXT.stories.tsx:88:        symbol: 'APPL',
stories/TradeRadar/TradeRadar.stories.tsx:8:import { CompareInstrument, CompareMode } from '@lib/types';
stories/TradeRadar/TradeRadar.stories.tsx:134:        symbol: 'appl',
stories/TradeRadar/TradeRadar.stories.tsx:222:const COMPARE_ITEMS: CompareInstrument[] = [
stories/TradeRadar/TradeRadar.stories.tsx:223:  { symbol: 'SBER', symbolName: 'SBER', symbolTicker: 'SBER' },
stories/TradeRadar/TradeRadar.stories.tsx:224:  { symbol: 'APAX', symbolName: 'APAX', symbolTicker: 'APAX' },
stories/TradeRadar/TradeRadar.stories.tsx:225:  { symbol: 'SOL', symbolName: 'SOL', symbolTicker: 'SOL' },
stories/TradeRadar/TradeRadar.stories.tsx:273:            key={instrument.symbol}

===== 8. Текущие новые названия =====
src/core/Chart.ts:364:      symbolName: this.eventManager.getSymbolName(),
src/core/Chart.ts:365:      symbolTicker: this.eventManager.getSymbolTicker(),
src/core/CompareManager.ts:20:  symbolTicker$: BehaviorSubject<string>;
src/core/CompareManager.ts:100:    const symbolName = instrument.symbolName.trim() || symbol;
src/core/CompareManager.ts:101:    const symbolTicker = instrument.symbolTicker.trim() || symbol;
src/core/CompareManager.ts:114:    const symbolTicker$ = new BehaviorSubject(symbolTicker);
src/core/CompareManager.ts:133:      const config = getDefaultCompareIndicatorConfig(seriesType, symbol, symbolName, symbolTicker, usedColors);
src/core/CompareManager.ts:146:        mainSymbolTicker$: symbolTicker$,
src/core/CompareManager.ts:177:      symbolName,
src/core/CompareManager.ts:178:      symbolTicker,
src/core/CompareManager.ts:181:      symbolTicker$,
src/core/CompareManager.ts:239:    return Array.from(this.entries.values()).map(({ symbol, symbolName, symbolTicker, entity, mode }) => ({
src/core/CompareManager.ts:241:      symbolName,
src/core/CompareManager.ts:242:      symbolTicker,
src/core/CompareManager.ts:270:        const symbolTicker = indicator.config.symbolTicker ?? symbol;
src/core/CompareManager.ts:284:            symbolName: indicator.config.label,
src/core/CompareManager.ts:285:            symbolTicker,
src/core/CompareManager.ts:307:    entry.symbolTicker$.complete();
src/core/CompareManager.ts:325:        symbolName: values[index].symbolName,
src/core/CompareManager.ts:326:        symbolTicker: values[index].symbolTicker,
src/core/CompareManager.ts:421:  symbolName: string,
src/core/CompareManager.ts:422:  symbolTicker: string,
src/core/CompareManager.ts:429:    symbolTicker,
src/core/CompareManager.ts:431:    label: symbolName,
src/core/EventManager.ts:16:  initialSymbolName?: string;
src/core/EventManager.ts:17:  initialSymbolTicker?: string;
src/core/EventManager.ts:36:  private symbolName$: BehaviorSubject<string>;
src/core/EventManager.ts:37:  private symbolTicker$: BehaviorSubject<string>;
src/core/EventManager.ts:50:    initialSymbolName,
src/core/EventManager.ts:51:    initialSymbolTicker,
src/core/EventManager.ts:59:    this.symbolName$ = new BehaviorSubject<string>(initialSymbolName?.trim() || initialSymbol);
src/core/EventManager.ts:60:    this.symbolTicker$ = new BehaviorSubject<string>(initialSymbolTicker?.trim() || initialSymbol);
src/core/EventManager.ts:69:      symbolName: (value) => this.symbolName$.next(value),
src/core/EventManager.ts:70:      symbolTicker: (value) => this.symbolTicker$.next(value),
src/core/EventManager.ts:132:    symbolName: string,
src/core/EventManager.ts:133:    symbolTicker?: string,
src/core/EventManager.ts:136:    const nextSymbolName = symbolName.trim() || symbol;
src/core/EventManager.ts:137:    const nextSymbolTicker = symbolTicker?.trim() || symbol;
src/core/EventManager.ts:140:      this.setWithHistory('symbolName', this.symbolName$, nextSymbolName, options);
src/core/EventManager.ts:141:      this.setWithHistory('symbolTicker', this.symbolTicker$, nextSymbolTicker, options);
src/core/EventManager.ts:146:  public symbolName(): Observable<string> {
src/core/EventManager.ts:147:    return this.symbolName$.asObservable();
src/core/EventManager.ts:151:    return this.symbolName$.value;
src/core/EventManager.ts:154:  public symbolTicker(): Observable<string> {
src/core/EventManager.ts:155:    return this.symbolTicker$.asObservable();
src/core/EventManager.ts:159:    return this.symbolTicker$.value;
src/core/EventManager.ts:267:    this.symbolName$.complete();
src/core/EventManager.ts:268:    this.symbolTicker$.complete();
src/core/Indicator.ts:17:  mainSymbolName$?: Observable<string>;
src/core/Indicator.ts:18:  mainSymbolTicker$?: Observable<string>;
src/core/Indicator.ts:34:  private mainSymbolName$: Observable<string>;
src/core/Indicator.ts:35:  private mainSymbolTicker$: Observable<string>;
src/core/Indicator.ts:53:    mainSymbolName$,
src/core/Indicator.ts:54:    mainSymbolTicker$,
src/core/Indicator.ts:63:    this.mainSymbolName$ = mainSymbolName$ ?? mainSymbol$;
src/core/Indicator.ts:64:    this.mainSymbolTicker$ = mainSymbolTicker$ ?? mainSymbol$;
src/core/Indicator.ts:212:        mainSymbolName$: this.mainSymbolName$,
src/core/Indicator.ts:213:        mainSymbolTicker$: this.mainSymbolTicker$,
src/core/Legend.ts:83:  private mainSymbolName = '';
src/core/Legend.ts:113:      this.eventManager.symbolName().subscribe((symbolName) => {
src/core/Legend.ts:114:        this.mainSymbolName = symbolName;
src/core/Legend.ts:190:        name: this.mainSymbolName,
src/core/Legend.ts:267:        name: this.mainSymbolName,
src/core/MoexChart.tsx:133:    const { chartSeriesType, symbol, symbolName, symbolTicker, timeframe, interval, dateFormat, timeFormat } =
src/core/MoexChart.tsx:140:      initialSymbolName: symbolName,
src/core/MoexChart.tsx:141:      initialSymbolTicker: symbolTicker,
src/core/MoexChart.tsx:278:  public setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void {
src/core/MoexChart.tsx:281:    this.eventManager.setInstrument(symbol, symbolName ?? symbol, symbolTicker ?? symbol);
src/core/Pane.tsx:406:        mainSymbolName$: this.eventManager.symbolName(),
src/core/Pane.tsx:407:        mainSymbolTicker$: this.eventManager.symbolTicker(),
src/core/PaneManager.ts:98:      mainSymbolTicker$: this.sharedPaneParams.eventManager.symbolTicker(),
src/core/PriceAxisLabels/PriceAxisLabels.ts:27:  mainSymbolTicker$: Observable<string>;
src/core/PriceAxisLabels/PriceAxisLabels.ts:149:  private mainSymbolTicker = '';
src/core/PriceAxisLabels/PriceAxisLabels.ts:153:  constructor({ mainSeries$, mainSymbolTicker$, compareEntities$, indicatorEntities$ }: PriceAxisLabelsParams) {
src/core/PriceAxisLabels/PriceAxisLabels.ts:155:      mainSymbolTicker$.subscribe((symbolTicker) => {
src/core/PriceAxisLabels/PriceAxisLabels.ts:156:        this.mainSymbolTicker = symbolTicker;
src/core/PriceAxisLabels/PriceAxisLabels.ts:428:            title: this.isHistoryMode ? '' : this.mainSymbolTicker || defaults.title,
src/core/PriceAxisLabels/PriceAxisLabels.ts:674:      title: this.mainSymbolTicker,
src/core/Series/BaseSeries.ts:72:  mainSymbolName$?: Observable<string>;
src/core/Series/BaseSeries.ts:73:  mainSymbolTicker$?: Observable<string>;
src/core/Series/BaseSeries.ts:108:  protected mainSymbolName$: Observable<string>;
src/core/Series/BaseSeries.ts:109:  protected mainSymbolTicker$: Observable<string>;
src/core/Series/BaseSeries.ts:122:    mainSymbolName$,
src/core/Series/BaseSeries.ts:123:    mainSymbolTicker$,
src/core/Series/BaseSeries.ts:142:    this.mainSymbolName$ = mainSymbolName$ ?? mainSymbol$;
src/core/Series/BaseSeries.ts:143:    this.mainSymbolTicker$ = mainSymbolTicker$ ?? mainSymbol$;
src/core/Series/BaseSeries.ts:403:      this.mainSymbolTicker$.pipe(distinctUntilChanged()).subscribe((symbolTicker) => {
src/core/Series/BaseSeries.ts:405:          title: this.showSymbolLabel ? symbolTicker : '',
src/core/UndoRedo.ts:10:  symbolName: (value: string) => void;
src/core/UndoRedo.ts:11:  symbolTicker: (value: string) => void;
src/types/compare.ts:9:  symbolName: string;
src/types/compare.ts:10:  symbolTicker: string;
src/types/indicator.ts:52:  symbolTicker?: string;
src/types/snapshot.ts:31:  symbolName?: string;
src/types/snapshot.ts:32:  symbolTicker?: string;
stories/MB/MB.stories.tsx:187:  { symbol: 'SBER', symbolName: 'SBER', symbolTicker: 'SBER' },
stories/MB/MB.stories.tsx:188:  { symbol: 'APAX', symbolName: 'APAX', symbolTicker: 'APAX' },
stories/MB/MB.stories.tsx:189:  { symbol: 'SOL', symbolName: 'SOL', symbolTicker: 'SOL' },
stories/MB/MB.stories.tsx:248:            <span>{instrument.symbolTicker}</span>
stories/TradeRadar/TradeRadar.stories.tsx:223:  { symbol: 'SBER', symbolName: 'SBER', symbolTicker: 'SBER' },
stories/TradeRadar/TradeRadar.stories.tsx:224:  { symbol: 'APAX', symbolName: 'APAX', symbolTicker: 'APAX' },
stories/TradeRadar/TradeRadar.stories.tsx:225:  { symbol: 'SOL', symbolName: 'SOL', symbolTicker: 'SOL' },
stories/TradeRadar/TradeRadar.stories.tsx:276:            <span>{instrument.symbolTicker}</span>
CHANGELOG.md:3:- `breaking change`: Добавлен необязательный параметр `symbolName?: string` для отображения полного названия инструмента в легенде
CHANGELOG.md:4:- `breaking change`: Добавлен необязательный параметр `symbolTicker?: string` для отображения короткого тикера инструмента в ценовом лейбле

===== 9. Использование symbol в snapshot =====
src/core/Chart.ts:45:import { ChartSnapshot, ISerializable, PaneSnapshot } from '@src/types/snapshot';
src/core/Chart.ts:95:export class Chart implements ISerializable<ChartSnapshot> {
src/core/Chart.ts:353:  public getSnapshot(): ChartSnapshot {
src/core/Chart.ts:364:      symbolName: this.eventManager.getSymbolName(),
src/core/Chart.ts:365:      symbolTicker: this.eventManager.getSymbolTicker(),
src/core/CompareManager.ts:20:  symbolTicker$: BehaviorSubject<string>;
src/core/CompareManager.ts:100:    const symbolName = instrument.symbolName.trim() || symbol;
src/core/CompareManager.ts:101:    const symbolTicker = instrument.symbolTicker.trim() || symbol;
src/core/CompareManager.ts:114:    const symbolTicker$ = new BehaviorSubject(symbolTicker);
src/core/CompareManager.ts:133:      const config = getDefaultCompareIndicatorConfig(seriesType, symbol, symbolName, symbolTicker, usedColors);
src/core/CompareManager.ts:146:        mainSymbolTicker$: symbolTicker$,
src/core/CompareManager.ts:177:      symbolName,
src/core/CompareManager.ts:178:      symbolTicker,
src/core/CompareManager.ts:181:      symbolTicker$,
src/core/CompareManager.ts:239:    return Array.from(this.entries.values()).map(({ symbol, symbolName, symbolTicker, entity, mode }) => ({
src/core/CompareManager.ts:241:      symbolName,
src/core/CompareManager.ts:242:      symbolTicker,
src/core/CompareManager.ts:270:        const symbolTicker = indicator.config.symbolTicker ?? symbol;
src/core/CompareManager.ts:284:            symbolName: indicator.config.label,
src/core/CompareManager.ts:285:            symbolTicker,
src/core/CompareManager.ts:307:    entry.symbolTicker$.complete();
src/core/CompareManager.ts:325:        symbolName: values[index].symbolName,
src/core/CompareManager.ts:326:        symbolTicker: values[index].symbolTicker,
src/core/CompareManager.ts:421:  symbolName: string,
src/core/CompareManager.ts:422:  symbolTicker: string,
src/core/CompareManager.ts:429:    symbolTicker,
src/core/CompareManager.ts:431:    label: symbolName,
src/core/EventManager.ts:36:  private symbolName$: BehaviorSubject<string>;
src/core/EventManager.ts:37:  private symbolTicker$: BehaviorSubject<string>;
src/core/EventManager.ts:59:    this.symbolName$ = new BehaviorSubject<string>(initialSymbolName?.trim() || initialSymbol);
src/core/EventManager.ts:60:    this.symbolTicker$ = new BehaviorSubject<string>(initialSymbolTicker?.trim() || initialSymbol);
src/core/EventManager.ts:69:      symbolName: (value) => this.symbolName$.next(value),
src/core/EventManager.ts:70:      symbolTicker: (value) => this.symbolTicker$.next(value),
src/core/EventManager.ts:132:    symbolName: string,
src/core/EventManager.ts:133:    symbolTicker?: string,
src/core/EventManager.ts:136:    const nextSymbolName = symbolName.trim() || symbol;
src/core/EventManager.ts:137:    const nextSymbolTicker = symbolTicker?.trim() || symbol;
src/core/EventManager.ts:140:      this.setWithHistory('symbolName', this.symbolName$, nextSymbolName, options);
src/core/EventManager.ts:141:      this.setWithHistory('symbolTicker', this.symbolTicker$, nextSymbolTicker, options);
src/core/EventManager.ts:146:  public symbolName(): Observable<string> {
src/core/EventManager.ts:147:    return this.symbolName$.asObservable();
src/core/EventManager.ts:151:    return this.symbolName$.value;
src/core/EventManager.ts:154:  public symbolTicker(): Observable<string> {
src/core/EventManager.ts:155:    return this.symbolTicker$.asObservable();
src/core/EventManager.ts:159:    return this.symbolTicker$.value;
src/core/EventManager.ts:267:    this.symbolName$.complete();
src/core/EventManager.ts:268:    this.symbolTicker$.complete();
src/core/Legend.ts:113:      this.eventManager.symbolName().subscribe((symbolName) => {
src/core/Legend.ts:114:        this.mainSymbolName = symbolName;
src/core/MoexChart.tsx:21:import { ISerializable, MoexChartSnapshot } from '@src/types/snapshot';
src/core/MoexChart.tsx:94:  snapshot: MoexChartSnapshot;
src/core/MoexChart.tsx:101:export class MoexChart implements ISerializable<MoexChartSnapshot> {
src/core/MoexChart.tsx:133:    const { chartSeriesType, symbol, symbolName, symbolTicker, timeframe, interval, dateFormat, timeFormat } =
src/core/MoexChart.tsx:140:      initialSymbolName: symbolName,
src/core/MoexChart.tsx:141:      initialSymbolTicker: symbolTicker,
src/core/MoexChart.tsx:257:  public setSnapshot(snap: MoexChartSnapshot) {
src/core/MoexChart.tsx:269:  public getSnapshot(): MoexChartSnapshot {
src/core/MoexChart.tsx:278:  public setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void {
src/core/MoexChart.tsx:281:    this.eventManager.setInstrument(symbol, symbolName ?? symbol, symbolTicker ?? symbol);
src/core/Pane.tsx:406:        mainSymbolName$: this.eventManager.symbolName(),
src/core/Pane.tsx:407:        mainSymbolTicker$: this.eventManager.symbolTicker(),
src/core/PaneManager.ts:98:      mainSymbolTicker$: this.sharedPaneParams.eventManager.symbolTicker(),
src/core/PriceAxisLabels/PriceAxisLabels.ts:155:      mainSymbolTicker$.subscribe((symbolTicker) => {
src/core/PriceAxisLabels/PriceAxisLabels.ts:156:        this.mainSymbolTicker = symbolTicker;
src/core/Series/BaseSeries.ts:403:      this.mainSymbolTicker$.pipe(distinctUntilChanged()).subscribe((symbolTicker) => {
src/core/Series/BaseSeries.ts:405:          title: this.showSymbolLabel ? symbolTicker : '',
src/core/UndoRedo.ts:10:  symbolName: (value: string) => void;
src/core/UndoRedo.ts:11:  symbolTicker: (value: string) => void;
src/index.ts:6:export type { Candle, ChartSeriesType, MoexChartSnapshot, ThemeKey, ThemeMode, TooltipConfig } from '@src/types';
src/types/compare.ts:9:  symbolName: string;
src/types/compare.ts:10:  symbolTicker: string;
src/types/indicator.ts:52:  symbolTicker?: string;
src/types/snapshot.ts:22:export interface MoexChartSnapshot {
src/types/snapshot.ts:24:  charts: ChartSnapshot[];
src/types/snapshot.ts:27:export interface ChartSnapshot {
src/types/snapshot.ts:31:  symbolName?: string;
src/types/snapshot.ts:32:  symbolTicker?: string;

===== 10. Использование symbol в IndicatorConfig =====
src/core/CompareManager.ts:13:import { CompareInstrument, CompareItem, CompareMode, Direction, IndicatorConfig } from '@src/types';
src/core/CompareManager.ts:133:      const config = getDefaultCompareIndicatorConfig(seriesType, symbol, symbolName, symbolTicker, usedColors);
src/core/CompareManager.ts:269:        const symbol = indicator.config.symbol ?? indicator.config.label;
src/core/CompareManager.ts:270:        const symbolTicker = indicator.config.symbolTicker ?? symbol;
src/core/CompareManager.ts:284:            symbolName: indicator.config.label,
src/core/CompareManager.ts:418:const getDefaultCompareIndicatorConfig = (
src/core/CompareManager.ts:424:): IndicatorConfig => {
src/core/Indicator.ts:10:import { ChartTypeOptions, IndicatorConfig, SettingsValues } from '@src/types';
src/core/Indicator.ts:22:  config: IndicatorConfig;
src/core/Indicator.ts:37:  private config: IndicatorConfig;
src/core/Indicator.ts:87:    if (this.config.label) {
src/core/Indicator.ts:88:      return this.config.label;
src/core/Indicator.ts:126:  public getConfig(): IndicatorConfig {
src/core/IndicatorManager.ts:11:import { ChartTypeOptions, IndicatorConfig } from '@src/types';
src/core/IndicatorManager.ts:66:    const baseConfig = snap.config ?? (indicatorsConfigMap()[snap.indicatorType] as IndicatorConfig);
src/core/Indicators/index.tsx:14:import { Direction, IndicatorConfig, LineCandle, SettingsValues } from '@src/types';
src/core/Indicators/index.tsx:34:export const indicatorsMap = (): Partial<Record<IndicatorsIds, IndicatorConfig>> => ({
src/types/indicator.ts:47:export interface IndicatorConfig {
src/types/snapshot.ts:5:import { IndicatorConfig } from '@src/types/indicator';
src/types/snapshot.ts:55:  config?: IndicatorConfig;
src/utils/indicator.ts:4:import { IndicatorConfig, IndicatorSerie, MASource, SerieOptionsWithColor } from '@src/types';
src/utils/indicator.ts:11:export function applyNextIndicatorColors(config: IndicatorConfig, usedColors: readonly string[]): IndicatorConfig {
src/utils/indicator.ts:51:export function getIndicatorColors(config: IndicatorConfig): string[] {

===== 11. Отображение symbol в title, name и label =====
src/components/Legend/index.tsx:35:          <div className={styles.symbol}>{item.name}</div>
src/core/CompareManager.ts:269:        const symbol = indicator.config.symbol ?? indicator.config.label;
src/core/CompareManager.ts:284:            symbolName: indicator.config.label,
src/core/CompareManager.ts:431:    label: symbolName,
src/core/MoexChart.tsx:58:   *      symbol: { visible: true, label: 'Инструмент' },
src/core/Series/BaseSeries.ts:405:          title: this.showSymbolLabel ? symbolTicker : '',

===== 12. Извлечение тикера через split =====

===== 13. Вызовы setSymbolMode =====
./src/core/CompareManager.ts:88:  public async setSymbolMode(
./src/core/CompareManager.ts:280:        await this.setSymbolMode(
./stories/MB/MB.stories.tsx:251:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.Percentage)}
./stories/MB/MB.stories.tsx:258:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewScale)}
./stories/MB/MB.stories.tsx:270:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewPane)}
./stories/TradeRadar/TradeRadar.stories.tsx:279:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.Percentage)}
./stories/TradeRadar/TradeRadar.stories.tsx:286:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewScale)}
./stories/TradeRadar/TradeRadar.stories.tsx:298:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewPane)}
./types/core/CompareManager.d.ts:34:    setSymbolMode(seriesType: SeriesType, instrument: CompareInstrument, mode: CompareMode, paneId?: number): Promise<void>;

===== 14. Вызовы setSymbol =====
./src/core/EventManager.ts:236:      this.setSymbol(symbol, setOptions);
./src/core/MoexChart.tsx:278:  public setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void {
./types/core/MoexChart.d.ts:91:    setSymbol(symbol: string, symbolName?: string, symbolTicker?: string): void;

===== 15. Использование symbol в тестах и stories =====
stories/argTypes.ts:78://         symbol: { required: false, name: 'string' },
stories/argTypes.ts:123://         'symbol.visible': { required: false, name: 'boolean' },
stories/argTypes.ts:124://         'symbol.label': { required: false, name: 'string' },
stories/argTypes.ts:147://           '  symbol: { visible: false, label: \'Инстр.\' },\n' +
stories/common.ts:15:  // todo: add cache по `${symbol}${timeframe}`
stories/common.ts:37:    update: (symbol: string, candle: Candle) => void,
stories/common.ts:44:      const symbols = getSymbols();
stories/common.ts:46:      for (let i = 0; i < symbols.length; i += 1) {
stories/common.ts:47:        const symbol = normalizeSymbol(symbols[i]);
stories/common.ts:48:        if (!symbol) continue;
stories/common.ts:50:        update(symbol, this.nextRealtimeCandle(tf, symbol, periodMs));
stories/common.ts:60:  private nextRealtimeCandle(timeframe: Timeframes, symbol: string, realtimePeriodMs: number): Candle {
stories/common.ts:63:    const prev = this.realtimeLastBySymbol.get(symbol);
stories/common.ts:101:    this.realtimeLastBySymbol.set(symbol, next);
stories/common.ts:109:   * @param symbol - symbol.
stories/common.ts:112:  public async generateCandles(timeframe: Timeframes, _symbol: string, untilCandle?: Candle): Promise<Candle[] | null> {
stories/common.ts:174:      this.realtimeLastBySymbol.set(_symbol, data[data.length - 1])
stories/MB/MB.stories.tsx:108:        symbol: 'APPL',
stories/MB/MB.stories.tsx:187:  { symbol: 'SBER', symbolName: 'SBER', symbolTicker: 'SBER' },
stories/MB/MB.stories.tsx:188:  { symbol: 'APAX', symbolName: 'APAX', symbolTicker: 'APAX' },
stories/MB/MB.stories.tsx:189:  { symbol: 'SOL', symbolName: 'SOL', symbolTicker: 'SOL' },
stories/MB/MB.stories.tsx:245:            key={instrument.symbol}
stories/MB/MB.stories.tsx:248:            <span>{instrument.symbolTicker}</span>
stories/MB/MB.stories.tsx:251:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.Percentage)}
stories/MB/MB.stories.tsx:258:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewScale)}
stories/MB/MB.stories.tsx:270:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewPane)}
stories/MXT/MXT.stories.tsx:88:        symbol: 'APPL',
stories/TradeRadar/TradeRadar.stories.tsx:134:        symbol: 'appl',
stories/TradeRadar/TradeRadar.stories.tsx:223:  { symbol: 'SBER', symbolName: 'SBER', symbolTicker: 'SBER' },
stories/TradeRadar/TradeRadar.stories.tsx:224:  { symbol: 'APAX', symbolName: 'APAX', symbolTicker: 'APAX' },
stories/TradeRadar/TradeRadar.stories.tsx:225:  { symbol: 'SOL', symbolName: 'SOL', symbolTicker: 'SOL' },
stories/TradeRadar/TradeRadar.stories.tsx:273:            key={instrument.symbol}
stories/TradeRadar/TradeRadar.stories.tsx:276:            <span>{instrument.symbolTicker}</span>
stories/TradeRadar/TradeRadar.stories.tsx:279:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.Percentage)}
stories/TradeRadar/TradeRadar.stories.tsx:286:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewScale)}
stories/TradeRadar/TradeRadar.stories.tsx:298:                onClick={() => compareManager?.setSymbolMode('Line', instrument, CompareMode.NewPane)}