如何从MT5拉取数据并为货币对列表生成多个Pandas DataFrame
解决方案
直接遍历Symbols列表,通过动态变量命名或字典存储就能实现需求,以下是两种实用实现方式:
方式一:动态生成Table_1、Table_2这类独立变量
import MetaTrader5 as mt5 import pandas as pd mt5.initialize() # 连接MetaTrader 5 Symbols = ['AUDCAD', 'AUDCHF', 'AUDJPY', 'AUDNZD', 'AUDUSD', 'CADCHF', 'CADJPY', 'CHFJPY', 'GBPAUD', 'GBPCAD', 'GBPCHF', 'GBPJPY', 'GBPNZD', 'GBPUSD', 'EURAUD', 'EURCAD', 'EURCHF', 'EURGBP', 'EURJPY', 'EURNZD', 'EURUSD', 'NZDCAD', 'NZDCHF', 'NZDJPY', 'NZDUSD', 'USDCAD', 'USDCHF', 'USDJPY'] # 遍历货币对列表,按顺序生成对应DataFrame for idx, symbol in enumerate(Symbols, start=1): # 拉取日线级别最近100条数据 rates = mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_D1, 0, 100) # 生成DataFrame并筛选需要的列 df = pd.DataFrame(rates)[["time", "open", "high", "low", "close"]] # 动态创建变量,比如AUDCAD对应Table_1,AUDCHF对应Table_2 globals()[f"Table_{idx}"] = df # 验证:打印Table_1的前5行 print(Table_1.head())
方式二:用字典统一管理所有DataFrame(更推荐)
动态生成独立变量虽然能满足需求,但后续批量操作、遍历这些变量会很麻烦,用字典存储更便于管理:
import MetaTrader5 as mt5 import pandas as pd mt5.initialize() # 连接MetaTrader 5 Symbols = ['AUDCAD', 'AUDCHF', 'AUDJPY', 'AUDNZD', 'AUDUSD', 'CADCHF', 'CADJPY', 'CHFJPY', 'GBPAUD', 'GBPCAD', 'GBPCHF', 'GBPJPY', 'GBPNZD', 'GBPUSD', 'EURAUD', 'EURCAD', 'EURCHF', 'EURGBP', 'EURJPY', 'EURNZD', 'EURUSD', 'NZDCAD', 'NZDCHF', 'NZDJPY', 'NZDUSD', 'USDCAD', 'USDCHF', 'USDJPY'] tables = {} for idx, symbol in enumerate(Symbols, start=1): rates = mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_D1, 0, 100) df = pd.DataFrame(rates)[["time", "open", "high", "low", "close"]] tables[f"Table_{idx}"] = df # 验证:获取Table_3并打印前5行 print(tables["Table_3"].head())
核心说明
enumerate(Symbols, start=1)用来获取每个货币对的序号(从1开始),对应Table_N的数字部分- 若要调整数据量或时间周期,直接修改
mt5.copy_rates_from_pos的最后两个参数即可 - 字典存储的优势:后续批量处理所有DataFrame时更灵活,不会造成全局变量混乱
内容的提问来源于stack exchange,提问作者Hellfire
相关产品推荐
相关产品推荐

