mirror of
https://github.com/silencesdg/mt5_python_ea_suite.git
synced 2026-07-28 19:27:43 +00:00
96 lines
3.1 KiB
Python
96 lines
3.1 KiB
Python
|
|
import pandas as pd
|
|
import numpy as np
|
|
import plotly.graph_objects as go
|
|
import os
|
|
|
|
# 从 regime_optimizer 脚本中导入状态分类函数
|
|
from regime_optimizer import classify_market_regimes
|
|
|
|
# --- 配置 ---
|
|
DATA_FILE = "full_historical_data.parquet"
|
|
OUTPUT_HTML_FILE = "regime_visualization.html"
|
|
|
|
# --- 主函数 ---
|
|
def create_regime_candlestick_chart():
|
|
"""
|
|
加载数据,分类市场状态,并生成一个按状态染色的交互式K线图。
|
|
"""
|
|
# 1. 加载数据
|
|
if not os.path.exists(DATA_FILE):
|
|
print(f"错误: 数据文件 {DATA_FILE} 不存在。请先运行 data_downloader.py。")
|
|
return
|
|
|
|
print(f"正在从 {DATA_FILE} 加载数据...")
|
|
full_df = pd.read_parquet(DATA_FILE)
|
|
print(f"数据加载完成,共 {len(full_df)} 条记录。")
|
|
|
|
# 2. 分类市场状态
|
|
# 这个函数会返回一个带有 'regime' 列的新DataFrame
|
|
df_classified = classify_market_regimes(full_df)
|
|
|
|
print("\n--- 开始生成交互式K线图 ---")
|
|
|
|
# 3. 创建Plotly图表对象
|
|
fig = go.Figure()
|
|
|
|
# 4. 为每种市场状态分别创建一个K线图层 (Trace)
|
|
# 这是处理大数据和分类染色的最高效方法
|
|
# 我们通过将不属于当前状态的数据设置为NaN来“隐藏”它们,从而只绘制我们想要的K线
|
|
|
|
regime_colors = {
|
|
"Uptrend": "red",
|
|
"Downtrend": "green",
|
|
"Ranging": "black"
|
|
}
|
|
|
|
for regime, color in regime_colors.items():
|
|
print(f"正在为 {regime} 状态创建图层...")
|
|
|
|
# 创建一个临时DataFrame用于绘图
|
|
df_trace = df_classified.copy()
|
|
|
|
# 将不属于当前状态的K线数据设置为空值(NaN)
|
|
df_trace.loc[df_trace['regime'] != regime, ['open', 'high', 'low', 'close']] = np.nan
|
|
|
|
# 添加K线图层
|
|
fig.add_trace(go.Candlestick(
|
|
x=df_trace.index,
|
|
open=df_trace['open'],
|
|
high=df_trace['high'],
|
|
low=df_trace['low'],
|
|
close=df_trace['close'],
|
|
name=regime,
|
|
increasing_line_color=color, # 上涨部分
|
|
decreasing_line_color=color # 下跌部分
|
|
))
|
|
|
|
# 5. 更新图表布局和样式
|
|
print("正在配置图表样式...")
|
|
fig.update_layout(
|
|
title={
|
|
'text': "市场状态可视化 (XAUUSD - M1)",
|
|
'y':0.9,
|
|
'x':0.5,
|
|
'xanchor': 'center',
|
|
'yanchor': 'top'
|
|
},
|
|
xaxis_title="日期",
|
|
yaxis_title="价格",
|
|
legend_title="市场状态",
|
|
template="plotly_dark", # 使用深色主题
|
|
xaxis_rangeslider_visible=False # **关键:为提升性能,禁用底部范围滑块**
|
|
)
|
|
|
|
# 6. 保存为HTML文件
|
|
try:
|
|
fig.write_html(OUTPUT_HTML_FILE)
|
|
print(f"\n--- 图表生成成功! ---")
|
|
print(f"已保存到: {os.path.abspath(OUTPUT_HTML_FILE)}")
|
|
print("请用您的浏览器打开此文件以进行交互式分析。")
|
|
except Exception as e:
|
|
print(f"保存HTML文件时出错: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
create_regime_candlestick_chart()
|