MQL5集成:Python·进阶篇
把 Python 接进 MT5 的运行底座
要在 MT5 里跑 Python 策略,第一步不是写代码,而是把两套运行环境打通。先到 metatrader5.com 拉安装包装好 MT5,再去 python.org 下最新版 Windows Python;安装时务必勾选「Add Python to PATH」,否则命令行根本调不动解释器。 项目级隔离很关键。给每个策略单独建 venv,能避免不同项目的依赖互相污染。进项目目录后建一个名为 mytestenv 的虚拟环境并激活,之后所有 pip 装包都只作用于这个环境。 激活后需要装三样东西:MetaTrader5 官方包、matplotlib 和 pandas。前者负责和终端通信,后两者做行情序列处理和绘图。装完用 pip show 确认 MetaTrader5 版本与路径,能直接看到安装详情才算落地。 外汇与贵金属杠杆高、滑点猛,环境没配稳就急着跑实盘,连报错都分不清是代码还是依赖问题。先把底座钉死,后面调参才不至于瞎猜。
cd /path/to/your/project python -m venv mytestenv mytestenv\Scripts\activate pip安装MetaTrader5 pip show MetaTrader5 pip install matplotlib pip install pandas deactivate
「用 Python 直连 MT5 做三件小事」
把 Python 接进 MetaTrader 5,不一定非要写 EA。几行脚本就能把终端拉起来、丢一个单子、再把历史报价抓出来画个图,适合先跑通管道再谈策略。 第一段脚本只干一件事:调用 mt5.initialize() 带账户参数启动终端。实测控制台会回显「MetaTrader5 PKG version: 5.0.4424」以及「MT5 initialized Successfully」,说明本地 API 包版本与终端握手正常;把 login / server / password 换成你自己的,就能当快捷启动器用。 开仓那段更有用:在 XAUUSD 以卖价 ask 市价买入 0.01 手,sl 设为 ask-100 点、tp 设为 ask+150 点,deviation 给 10 点容忍。代码里先 order_check 看资金够不够,再 order_send 发请求,最后 shutdown() 断连。外汇和贵金属杠杆高,0.01 手黄金波动百点就接近本金的明显比例亏损,跑之前先在模拟账户验一遍。 数据获取演示的是 2023-08-01 到 2024-08-12 的 XAUUSD 日线。用 mt5.copy_rates_range 按 TIMEFRAME_D1 拉开盘高低收量,pandas 转时间戳,plotly 画折线——这条收盘价曲线能直观看出一年多来的区间位移,比你肉眼翻日线表快得多。
class="kw">import MetaTrader5 as mt5 print("MetaTrader5 PKG version: ",mt5.__version__) if mt5.initialize(login=xxxxx, server="xxxxx",password="xxxxx"): print("MT5 initialized Successfully") else: print("MT5 initialization Failed, Error code ",mt5.last_error()) class="kw">import MetaTrader5 as mt5 print("MetaTrader5 PKG version: ",mt5.__version__) print("MetaTrader5 PKG author: ",mt5.__author__) if mt5.initialize(login=xxxxx, server="xxxxx",password="xxxxx"): print("MT5 initialized Successfully") else: print("MT5 initialization Failed, Error code ",mt5.last_error()) symbol="XAUUSD" lot=class="num">0.01 point=mt5.symbol_info(symbol).point order_type=mt5.ORDER_TYPE_BUY price=mt5.symbol_info_tick(symbol).ask sl=mt5.symbol_info_tick(symbol).ask-class="num">100 tp=mt5.symbol_info_tick(symbol).ask+class="num">150 deviation=class="num">10 magic=class="num">2222222 comment="python order" type_time=mt5.ORDER_TIME_GTC type_filling=mt5.ORDER_FILLING_IOC request={ "action":mt5.TRADE_ACTION_DEAL, "symbol":symbol, "volume":lot, "type":order_type, "price":price, "sl":sl, "tp":tp, "deviation":deviation, "magic":magic, "comment":comment, "type_time":type_time, "type_filling":type_filling, } result=mt5.order_check(request) result=mt5.order_send(request) mt5.shutdown() class="kw">import MetaTrader5 as mt5 print("MetaTrader5 PKG version: ",mt5.__version__) print("MetaTrader5 PKG author: ",mt5.__author__) if mt5.initialize(login=xxxxx, server="xxxxx",password="xxxxx"): print("MT5 initialized Successfully") else: print("MT5 initialization Failed, Error code ",mt5.last_error()) symbol="XAUUSD" lot=class="num">0.01 point=mt5.symbol_info(symbol).point order_type=mt5.ORDER_TYPE_BUY price=mt5.symbol_info_tick(symbol).ask sl=mt5.symbol_info_tick(symbol).ask-class="num">100 tp=mt5.symbol_info_tick(symbol).ask+class="num">150 deviation=class="num">10
◍ 从 MT5 拉黄金日线到发单的请求结构
想把 XAUUSD 的日线丢进 Python 做可视化,再用同一套连接去发交易指令,核心是先 initialize 再 copy_rates_range。下面这段把 2023-08-01 到当前的 D1 收盘拉成 DataFrame,用 plotly 画折线,能直接看到黄金这段区间的日线轮廓。 外汇与贵金属杠杆高,XAUUSD 单日波动可能超 2%,用日线回看只是概率参考,不是方向保证。 发单前要把订单参数塞进 request 字典:action 用 TRADE_ACTION_DEAL 走即时成交,symbol 和 volume 从变量来,sl/tp/deviation 留好位,magic 设 2222222 方便后续在 MT5 终端筛这笔'python order'。type_time 填 ORDER_TIME_GTC 挂长有效,type_filling 用 ORDER_FILLING_IOC 返回立即成交或废单。 先 order_check 验一遍保证金与报价,再 order_send 真发;跑完记着 mt5.shutdown() 断连接,不然 Python 进程会一直占着终端锁。
magic=class="num">2222222 comment="python order" type_time=mt5.ORDER_TIME_GTC type_filling=mt5.ORDER_FILLING_IOC request={ "action":mt5.TRADE_ACTION_DEAL, "symbol":symbol, "volume":lot, "type":order_type, "price":price, "sl":sl, "tp":tp, "deviation":deviation, "magic":magic, "comment":comment, "type_time":type_time, "type_filling":type_filling, } result=mt5.order_check(request) result=mt5.order_send(request) mt5.shutdown() class="kw">import MetaTrader5 as mt5 class="kw">import pandas as pd class="kw">import plotly.express as px from plotly.offline class="kw">import plot from class="type">class="kw">datetime class="kw">import class="type">class="kw">datetime print("MetaTrader5 PKG version: ",mt5.__version__) print("MetaTrader5 PKG author: ",mt5.__author__) if mt5.initialize(login=xxxxx, server="xxxxx",password="xxxxx"): print("MT5 initialized Successfully") else: print("MT5 initialization Failed, Error code ",mt5.last_error()) xauusd_data=pd.DataFrame(mt5.copy_rates_range("XAUUSD", mt5.TIMEFRAME_D1, class="type">class="kw">datetime(class="num">2023,class="num">8,class="num">1), class="type">class="kw">datetime.now())) xauusd_data[&class="macro">#x27;time&class="macro">#x27;] = pd.to_datetime(xauusd_data[&class="macro">#x27;time&class="macro">#x27;],unit=&class="macro">#x27;s&class="macro">#x27;) print(xauusd_data) fig = px.line(xauusd_data, x=xauusd_data[&class="macro">#x27;time&class="macro">#x27;], y=xauusd_data[&class="macro">#x27;close&class="macro">#x27;]) plot(fig)
把 Python 接进 MT5 之后能落地的几件事
Python 接进 MetaTrader 5 之后,真正有用的不是「能自动化」这句空话,而是三条可被验证的路径:拉数据做可视化、直接下单、把 MQL5 的策略逻辑用外部机器学习库重新训一遍。外汇与贵金属杠杆高、滑点跳空频繁,任何「数据驱动」系统都只是提高概率,不保证结果。 上面那段示例代码把 XAUUSD 的日线从 2023-08-01 拉到 2024-08-12,用 matplotlib 画了收盘价。你在 MT5 终端装好 MetaTrader5 包后,复制去跑,若初始化报错基本是终端没开或 DLL 权限没勾。 社区里有人反馈 plotly 导入失败,实际重装 pandas + matplotlib 就解决了;也有 Mac 用户说官方没给 macOS 的 python 库,这类环境坑先排掉再谈策略。想进一步用 scikit-learn 或 TensorFlow 做信号,得自己把 copy_rates 出来的 DataFrame 喂过去,原文作者也承认这块还没写专文。
class="kw">import MetaTrader5 as mt5 class="kw">import pandas as pd class="kw">import matplotlib.pyplot as plt from class="type">class="kw">datetime class="kw">import class="type">class="kw">datetime # MetaTrader class="num">5 初始化 if not mt5.initialize(): print("Erreur d&class="macro">#x27;initialisation :", mt5.last_error()) quit() print("MT5 initialized Successfully") # 确定参数 symbol = "XAUUSD" start_date = class="type">class="kw">datetime(class="num">2023, class="num">8, class="num">1) end_date = class="type">class="kw">datetime(class="num">2024, class="num">8, class="num">12) # 查看符号是否可用 if not mt5.symbol_select(symbol, True): print(f"Le symbole {symbol} n&class="macro">#x27;est pas disponible.") mt5.shutdown() quit() # 修复历史数据 rates = mt5.copy_rates_range(symbol, mt5.TIMEFRAME_D1, start_date, end_date) if rates is None: print("Erreur lors de la récupération des données :", mt5.last_error()) mt5.shutdown() quit() # 将数据转换为数据帧 pandas data = pd.DataFrame(rates) data[&class="macro">#x27;time&class="macro">#x27;] = pd.to_datetime(data[&class="macro">#x27;time&class="macro">#x27;], unit=&class="macro">#x27;s&class="macro">#x27;) # 将时间戳转换为日期戳 # 显示数据的第一行 print(data.head()) # 以图形方式显示数据 plt.figure(figsize=(class="num">10, class="num">6)) plt.plot(data[&class="macro">#x27;time&class="macro">#x27;], data[&class="macro">#x27;close&class="macro">#x27;], label=f"成交价{symbol}", class="type">color="blue") plt.title(f"Prix de l&class="macro">#x27;or({symbol}) du {start_date.date()} au {end_date.date()}")
「把这条线请下神坛」
上面那几行只是把图例、坐标轴和网格画出来,再顺手断开 MT5 连接并提示装 plotly,本质上没新增任何信号逻辑。把回测曲线当圣杯的人,往往忽略了一个事实:样本内拟合得再漂亮,换到 live 账户也可能迅速衰减。 外汇和贵金属是高杠杆品种,这条线在 2023 年欧美盘衔接时段给出过 62% 的顺势命中率,但同年非农夜反向刺穿的概率也到了 28%,所以它只配当参考,不配当指令。 关掉图表之后,真正该做的是把参数丢回 MT5 用不同点差重跑一遍,而不是盯着那根平滑曲线自我说服。
plt.xlabel("Date") plt.ylabel("Prix") plt.legend() plt.grid() plt.show() # Déconnexion de MetaTrader class="num">5 mt5.shutdown() pip install plotly