Files
etf/archive/visualization/charts/kline.py
aszerW c905230a40 refactor(archive): move unused modules to archive/
Archive legacy framework and utility modules that are no longer
referenced by the active core (datasource/ and rotation/):

- framework/ -> archive/framework/
- framework_v2/ -> archive/framework_v2/
- strategies/ -> archive/strategies/
- config/ -> archive/config/
- visualization/ -> archive/visualization/
- scripts/ -> archive/scripts/
- tests/ -> archive/tests/
- run_rotation.py, run_us_rotation.py -> archive/single_files/
- compare_*.py, test_api_dates.py -> archive/single_files/
2026-06-03 23:41:46 +08:00

98 lines
2.6 KiB
Python

"""
K线图表组件
基于lightweight-charts的K线图表
"""
import pandas as pd
from lightweight_charts import Chart
from datetime import datetime
class KlineChart:
"""K线图表类"""
def __init__(self, title: str = "K线图", toolbox: bool = True):
self.title = title
self.toolbox = toolbox
self.chart = None
self.subcharts = {}
def create(self, maximize: bool = True) -> Chart:
"""创建图表实例"""
self.chart = Chart(toolbox=self.toolbox, inner_height=0.8, maximize=maximize)
self.chart.layout(font_family="Times New Roman")
self.chart.legend(visible=True, font_size=14, color="#FFFFFF")
return self.chart
def set_data(self, df: pd.DataFrame, time_col: str = "time"):
"""设置K线数据"""
if self.chart is None:
self.create()
# 验证数据
required_cols = ["open", "high", "low", "close", "volume"]
missing = [c for c in required_cols if c not in df.columns]
if missing:
raise ValueError(f"缺少必要列: {missing}")
# 确保时间列格式正确
df = df.copy()
if time_col in df.columns:
df[time_col] = pd.to_datetime(df[time_col])
self.chart.set(df)
def set_visible_range(self, start_time: datetime, end_time: datetime):
"""设置可见范围"""
if self.chart:
self.chart.set_visible_range(start_time, end_time)
def add_topbar_text(self, key: str, text: str):
"""添加顶部栏文本"""
if self.chart:
self.chart.topbar.textbox(key, text)
def show(self, block: bool = True):
"""显示图表"""
if self.chart:
self.chart.show(block=block)
def create_kline_chart(
df: pd.DataFrame,
symbol: str,
name: str,
timeframe: str,
init_visible_bars: int = 90,
) -> Chart:
"""
快速创建K线图表
Args:
df: DataFrame with OHLCV data
symbol: 标的代码
name: 标的名称
timeframe: 时间周期
init_visible_bars: 初始可见K线数量
Returns:
Chart实例
"""
chart = KlineChart()
chart.create(maximize=True)
chart.add_topbar_text("symbol", symbol)
chart.add_topbar_text("name", name)
chart.add_topbar_text("timeframe", timeframe)
chart.set_data(df)
# 设置初始可见范围
if len(df) > init_visible_bars:
end_time = df["time"].iloc[-1]
start_time = df["time"].iloc[-init_visible_bars]
chart.set_visible_range(start_time, end_time)
return chart.chart