import { CSSProperties } from 'react'; import { EChartsOption } from 'echarts'; import { EChartsType } from 'echarts/core'; import { RequestClientOptions } from 'stock-sdk'; import { KlineData, KlineWithIndicators, TimelineData } from './data'; import { ThemeConfig } from './theme'; /** * 周期类型 */ export type PeriodType = 'timeline' | 'timeline5' | '1' | '5' | '15' | '30' | '60' | 'daily' | 'weekly' | 'monthly'; /** * 市场类型 */ export type MarketType = 'A' | 'HK' | 'US'; /** * 复权类型 */ export type AdjustType = '' | 'qfq' | 'hfq'; /** * 指标类型 */ export type IndicatorType = 'ma' | 'macd' | 'boll' | 'kdj' | 'rsi' | 'wr' | 'bias' | 'cci' | 'atr' | 'obv' | 'roc' | 'dmi' | 'sar' | 'kc' | 'volume'; /** * MA 指标配置 */ export interface MAOptions { periods?: number[]; type?: 'sma' | 'ema' | 'wma'; } /** * MACD 指标配置 */ export interface MACDOptions { short?: number; long?: number; signal?: number; } /** * BOLL 指标配置 */ export interface BOLLOptions { period?: number; stdDev?: number; } /** * KDJ 指标配置 */ export interface KDJOptions { period?: number; kPeriod?: number; dPeriod?: number; } /** * RSI 指标配置 */ export interface RSIOptions { periods?: number[]; } /** * WR 指标配置 */ export interface WROptions { periods?: number[]; } /** * BIAS 指标配置 */ export interface BIASOptions { periods?: number[]; } /** * CCI 指标配置 */ export interface CCIOptions { period?: number; } /** * ATR 指标配置 */ export interface ATROptions { period?: number; } /** * OBV 指标配置(能量潮) */ export interface OBVOptions { maPeriod?: number; } /** * ROC 指标配置(变动率) */ export interface ROCOptions { period?: number; signalPeriod?: number; } /** * DMI 指标配置(趋向指标) */ export interface DMIOptions { period?: number; adxPeriod?: number; } /** * SAR 指标配置(抛物线转向) */ export interface SAROptions { afStart?: number; afIncrement?: number; afMax?: number; } /** * KC 指标配置(肯特纳通道) */ export interface KCOptions { emaPeriod?: number; atrPeriod?: number; multiplier?: number; } /** * 指标参数配置 * * 是否显示指标由 `KLineChartProps.indicators` 控制;这里仅描述每个指标的算法参数。 */ export interface IndicatorOptions { ma?: MAOptions; macd?: MACDOptions; boll?: BOLLOptions; kdj?: KDJOptions; rsi?: RSIOptions; wr?: WROptions; bias?: BIASOptions; cci?: CCIOptions; atr?: ATROptions; obv?: OBVOptions; roc?: ROCOptions; dmi?: DMIOptions; sar?: SAROptions; kc?: KCOptions; } /** * 获取 K 线数据参数 */ export interface GetKlineParams { symbol: string; market: MarketType; period: PeriodType; adjust: AdjustType; cursor?: string | number; limit?: number; } /** * 获取分时数据参数 */ export interface GetTimelineParams { symbol: string; market: MarketType; /** * 分时模式:'timeline' 单日分时(默认)/ 'timeline5' 五日分时。 * 旧版 provider 可忽略此字段(视为单日分时)。 */ period?: 'timeline' | 'timeline5'; } /** * 分时数据返回结果 */ export interface TimelineResult { data: TimelineData[]; /** 昨收价(用于分时图涨跌着色与参考线) */ prevClose?: number | null; } /** * 数据源提供者 */ export interface KLineDataProvider { /** * K 线数据(日/周/月/分钟周期)。 * * `cursor`/`limit` 仅由 loadMore(无限滚动加载历史)传入:实现基于 cursor 的 * 历史分页才能让无限滚动真正生效;忽略它们则 loadMore 静默不加载更多。 */ getKline: (params: GetKlineParams, signal?: AbortSignal) => Promise; /** * 分时数据(可选,period 为 'timeline' / 'timeline5' 时使用)。 * * - `params.period` 区分单日分时与五日分时(旧版实现可忽略,按单日处理)。 * - 推荐返回 `TimelineResult`(`{ data, prevClose }`)以驱动涨跌着色与昨收线; * 也兼容直接返回 `TimelineData[]`(此时无昨收基准)。 * - 未实现此方法时,分时/五日分时会回退为「调用 getKline 拿分钟数据 + 组件内聚合」。 */ getTimeline?: (params: GetTimelineParams, signal?: AbortSignal) => Promise; } /** * 请求配置 */ export interface RequestOptions { debounceMs?: number; abortOnChange?: boolean; dedupe?: boolean; /** loadMore 每次请求的历史数据条数,默认 180 */ loadMoreLimit?: number; } /** * 自动刷新配置 */ export interface AutoRefreshOptions { intervalMs?: number; onlyTradingTime?: boolean; } /** * ECharts Option 合并配置 */ export interface EChartsOptionMergeOptions { mode?: 'safeMerge' | 'replace'; replaceMerge?: string[]; } /** * 当前可见范围 */ export interface VisibleRange { start: number; end: number; } /** * 面板配置 */ export interface PaneConfig { /** * 面板 id。主图(蜡烛图所在面板)的 id 必须为 `'main'`, * 其余 id 任意(用于副图)。 */ id: string; height?: number | string; indicators: IndicatorType[]; } export type SDKOptions = RequestClientOptions; /** * KLineChart 组件 Props */ export interface KLineChartProps { /** 股票代码(必填) */ symbol: string; /** 市场类型 */ market?: MarketType; /** K 线周期(受控) */ period?: PeriodType; /** 非受控模式下的默认周期 */ defaultPeriod?: PeriodType; /** 复权类型(受控) */ adjust?: AdjustType; /** 非受控模式下的默认复权类型 */ defaultAdjust?: AdjustType; /** 图表高度 */ height?: number | string; /** 图表宽度 */ width?: number | string; /** 主题 */ theme?: 'light' | 'dark' | ThemeConfig; /** 启用的技术指标(受控) */ indicators?: IndicatorType[]; /** 非受控模式下默认启用的技术指标 */ defaultIndicators?: IndicatorType[]; /** 指标参数配置 */ indicatorOptions?: IndicatorOptions; /** 是否显示工具栏 */ showToolbar?: boolean; /** 是否显示周期切换 */ showPeriodSelector?: boolean; /** 是否显示指标切换 */ showIndicatorSelector?: boolean; /** * 是否启用缩放(鼠标滚轮 + 底部滑块),默认 true;可按周期单独设置, * 如 `{ timeline: false, timeline5: false }`。 * * 注意:对某周期关闭后,该周期没有任何 dataZoom 组件——工具栏的缩放/平移 * 按钮会隐藏、`visibleCount` 初始窗口不生效(始终显示全部数据)、 * 向左滚动加载历史(loadMore)也不会触发。 */ showDataZoomSlider?: boolean | Partial>; /** 最多显示几个副图,默认 3,最大 3,传入 0 表示不显示副图 */ maxSubPanes?: number; /** 初始可见 K 线数量 */ visibleCount?: number; /** 数据加载回调(仅 K 线周期触发;返回的数据已附带计算好的技术指标字段) */ onDataLoad?: (data: KlineWithIndicators[]) => void; /** 周期切换回调 */ onPeriodChange?: (period: PeriodType) => void; /** 复权切换回调 */ onAdjustChange?: (adjust: AdjustType) => void; /** 指标切换回调 */ onIndicatorsChange?: (indicators: IndicatorType[]) => void; /** 可见范围变化回调 */ onVisibleRangeChange?: (range: VisibleRange) => void; /** 错误回调 */ onError?: (error: Error) => void; /** 数据源提供者 */ dataProvider?: KLineDataProvider; /** stock-sdk 配置 */ sdkOptions?: SDKOptions; /** 请求配置 */ requestOptions?: RequestOptions; /** 自动刷新配置 */ autoRefresh?: boolean | AutoRefreshOptions; /** 自定义 ECharts 配置 */ echartsOption?: EChartsOption; /** ECharts Option 合并策略 */ echartsOptionMerge?: EChartsOptionMergeOptions; /** 面板配置 */ panes?: PaneConfig[]; /** 类名 */ className?: string; /** 样式 */ style?: CSSProperties; } /** * KLineChart Ref 方法 */ export interface KLineChartRef { refresh(): Promise; setPeriod(period: PeriodType): void; setAdjust(adjust: AdjustType): void; setIndicators(indicators: IndicatorType[]): void; zoomTo(start: number, end: number): void; resetZoom(): void; getVisibleRange(): VisibleRange; getEchartsInstance(): EChartsType | null; exportImage(type?: 'png' | 'jpeg'): string | null; /** 获取当前 K 线数据(已附带计算好的技术指标字段) */ getData(): KlineWithIndicators[]; }