昨天在汇友群里看到有人问,说想学Python量化但不知道从哪下手,装了Anaconda就卡住了。这让我想起自己刚入坑那会儿,光是把MT5和Python连起来就折腾了两天,最后发现是个很蠢的版本问题。既然论坛里想走这条路的人不少,我就把自己从零到跑通第一笔自动单的过程捋一遍,尽量把那些坑都标出来,给想入门的朋友做个参考。
先说环境搭建。很多新手一上来就装最新版Python,然后发现第三方库各种不兼容。我的建议是直接用
接下来是连接MT5终端。这一步的要点是必须先在MT5里开启Algo Trading选项,不然你代码写得再好也是白搭。具体做法是MT5界面里Tools-Options-Expert Advisors,勾上Allow Algo Trading。然后Python端就简单了,两行代码的事:
import MetaTrader5 as mt5
mt5.initialize()
这里有个细节容易忽略:initialize()不带参数时,默认连接你本机安装的MT5终端。如果你像我一样用VPS跑策略,就得在VPS上也装个MT5,然后指定路径。我当时图省事直接在本机测,后来上VPS才发现路径问题又折腾了半天。
数据获取和策略回测就不多说了,论坛里教程很多,我重点讲第一笔自动单怎么落地。新手最容易犯的错是急着写复杂逻辑,我的建议是先跑通最简单的挂单流程。比如用buy limit挂个单,代码就几行:
symbol = "EURUSD"
lot = 0.01
price = mt5.symbol_info(symbol).ask - 100
request = {
"action": mt5.TRADE_ACTION_PENDING,
"symbol": symbol,
"volume": lot,
"type": mt5.ORDER_TYPE_BUY_LIMIT,
"price": price,
"deviation": 20,
"magic": 202401,
"comment": "first order",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_FOK,
}
result = mt5.order_send(request)
注意type_filling一定要确认你的经纪商支持哪种模式,有的用FOK有的用IOC,填错了直接报错返回。我当时就是没查这个参数,卡了一下午,最后翻经纪商文档才发现用的是ORDER_FILLING_IOC。
还有个小坑是价格精度问题。EURUSD报价到小数点后5位,你直接算出来的价格可能带6位小数,MT5会拒绝执行。用mt5.symbol_info(symbol).point先取点值,再四舍五入到正确的精度,这个习惯要养成。
最后说下实盘和模拟盘的心态差异。我在模拟盘跑了一周稳稳当当,一上实盘小账户就手忙脚乱,连魔法数字都忘了设置,结果手动单和自动单混在一起,复盘时根本分不清哪笔是哪笔。所以magic number一定要从一开始就固定下来,这是区分策略单和人工单的唯一标识。另外VPS的延迟影响也比我预期大,本机测试时滑点几乎为零,上了VPS后偶尔会滑个两三跳,虽然不大,但对EA的参数回测结果还是有影响的。
其实Python量化入门没有想象中那么难,核心就是把环境搭对、把流程跑通,剩下的都是策略层面的打磨。我现在回头看,最耗时间的反而是那些看似不起眼的配置问题,真跑起来反而顺利。不知道论坛里有没有也在走这条路的汇友,你们在连接MT5或下第一单时碰到过什么奇怪的问题?说出来大家交流下,说不定你踩过的坑正是别人正在爬的。
先说环境搭建。很多新手一上来就装最新版Python,然后发现第三方库各种不兼容。我的建议是直接用
- Anaconda发行版,自带conda管理环境,省去一堆麻烦
- 用Python 3.9或3.10,别追新,MetaTrader5的API在这两个版本上最稳
- 装完记得把pip源换成国内的,不然下载库能等到你怀疑人生
接下来是连接MT5终端。这一步的要点是必须先在MT5里开启Algo Trading选项,不然你代码写得再好也是白搭。具体做法是MT5界面里Tools-Options-Expert Advisors,勾上Allow Algo Trading。然后Python端就简单了,两行代码的事:
import MetaTrader5 as mt5
mt5.initialize()
这里有个细节容易忽略:initialize()不带参数时,默认连接你本机安装的MT5终端。如果你像我一样用VPS跑策略,就得在VPS上也装个MT5,然后指定路径。我当时图省事直接在本机测,后来上VPS才发现路径问题又折腾了半天。
数据获取和策略回测就不多说了,论坛里教程很多,我重点讲第一笔自动单怎么落地。新手最容易犯的错是急着写复杂逻辑,我的建议是先跑通最简单的挂单流程。比如用buy limit挂个单,代码就几行:
symbol = "EURUSD"
lot = 0.01
price = mt5.symbol_info(symbol).ask - 100
request = {
"action": mt5.TRADE_ACTION_PENDING,
"symbol": symbol,
"volume": lot,
"type": mt5.ORDER_TYPE_BUY_LIMIT,
"price": price,
"deviation": 20,
"magic": 202401,
"comment": "first order",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_FOK,
}
result = mt5.order_send(request)
注意type_filling一定要确认你的经纪商支持哪种模式,有的用FOK有的用IOC,填错了直接报错返回。我当时就是没查这个参数,卡了一下午,最后翻经纪商文档才发现用的是ORDER_FILLING_IOC。
还有个小坑是价格精度问题。EURUSD报价到小数点后5位,你直接算出来的价格可能带6位小数,MT5会拒绝执行。用mt5.symbol_info(symbol).point先取点值,再四舍五入到正确的精度,这个习惯要养成。
最后说下实盘和模拟盘的心态差异。我在模拟盘跑了一周稳稳当当,一上实盘小账户就手忙脚乱,连魔法数字都忘了设置,结果手动单和自动单混在一起,复盘时根本分不清哪笔是哪笔。所以magic number一定要从一开始就固定下来,这是区分策略单和人工单的唯一标识。另外VPS的延迟影响也比我预期大,本机测试时滑点几乎为零,上了VPS后偶尔会滑个两三跳,虽然不大,但对EA的参数回测结果还是有影响的。
其实Python量化入门没有想象中那么难,核心就是把环境搭对、把流程跑通,剩下的都是策略层面的打磨。我现在回头看,最耗时间的反而是那些看似不起眼的配置问题,真跑起来反而顺利。不知道论坛里有没有也在走这条路的汇友,你们在连接MT5或下第一单时碰到过什么奇怪的问题?说出来大家交流下,说不定你踩过的坑正是别人正在爬的。
