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/
98 lines
2.6 KiB
Python
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
|