修改NumPy数组列标题及mplfinance绘图适配问题求助
解决方案:MT5数据适配mplfinance绘制布林带
方案1:简化现有代码,避免重复操作
你当前代码里重复转换了日期列,其实可以一步到位,无需新建额外DataFrame:
import pandas as pd import mt5 import mplfinance as mpf # 初始化MT5连接 if not mt5.initialize(): print("MT5初始化失败") mt5.shutdown() from_date = pd.Timestamp.now() - pd.Timedelta(days=15) # 获取EURUSD日线数据 rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_D1, from_date, 15) df_rates = pd.DataFrame(rates) # 重命名时间列并转换格式,一步完成 df_rates.rename(columns={'time': 'date'}, inplace=True) df_rates['date'] = pd.to_datetime(df_rates['date'], unit='s') # 设置日期为索引(mplfinance推荐,可避免列名兼容问题) df_rates.set_index('date', inplace=True) # 保留mplfinance所需的核心列 df_candle = df_rates[['open', 'high', 'low', 'close']]
方案2:用mplfinance内置功能直接绘制布林带
mplfinance自带布林带绘制支持,无需手动计算后再添加,两种实现方式:
# 方式1:利用mplfinance内置的均线+布林带组合 mpf.plot(df_candle, type='candle', mav=(20), volume=False, title='EURUSD 日线布林带', figratio=(12,6)) # 方式2:手动计算布林带后,通过addplot添加自定义线条 df_candle['middle'] = df_candle['close'].rolling(window=20).mean() df_candle['upper'] = df_candle['middle'] + 2*df_candle['close'].rolling(window=20).std() df_candle['lower'] = df_candle['middle'] - 2*df_candle['close'].rolling(window=20).std() add_plots = [ mpf.make_addplot(df_candle['upper'], color='red', linestyle='--'), mpf.make_addplot(df_candle['middle'], color='blue'), mpf.make_addplot(df_candle['lower'], color='green', linestyle='--') ] mpf.plot(df_candle, type='candle', addplot=add_plots, title='EURUSD 日线布林带', figratio=(12,6))
方案3:脱离mplfinance约束,用matplotlib手动绘制
如果不想受限于mplfinance的列规则,直接用matplotlib实现K线+布林带:
import matplotlib.pyplot as plt import matplotlib.dates as mdates fig, ax = plt.subplots(figsize=(12,6)) # 绘制K线柱和影线 width = 0.8 up = df_candle[df_candle['close'] >= df_candle['open']] down = df_candle[df_candle['close'] < df_candle['open']] # 上涨K线 ax.bar(up.index, up['close'] - up['open'], width, bottom=up['open'], color='green') ax.bar(up.index, up['high'] - up['close'], 0.1, bottom=up['close'], color='green') ax.bar(up.index, up['open'] - up['low'], 0.1, bottom=up['low'], color='green') # 下跌K线 ax.bar(down.index, down['close'] - down['open'], width, bottom=down['open'], color='red') ax.bar(down.index, down['high'] - down['open'], 0.1, bottom=down['open'], color='red') ax.bar(down.index, down['low'] - down['close'], 0.1, bottom=down['close'], color='red') # 绘制布林带 ax.plot(df_candle.index, df_candle['upper'], color='red', linestyle='--', label='上轨') ax.plot(df_candle.index, df_candle['middle'], color='blue', label='中轨') ax.plot(df_candle.index, df_candle['lower'], color='green', linestyle='--', label='下轨') # 格式化日期显示 ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.xticks(rotation=45) plt.title('EURUSD 日线布林带') plt.legend() plt.tight_layout() plt.show()
关键注意事项
- 确认MT5返回的
time列是秒级Unix时间戳,若为毫秒级需把unit='s'改为unit='ms' - mplfinance要求日期列必须是datetime类型,设置为索引能避免大部分兼容问题
- 布林带的窗口大小(示例中为20)和标准差倍数(示例中为2)可根据交易策略调整
内容的提问来源于stack exchange,提问作者user7366864
相关产品推荐
相关产品推荐

