Python连接MT5自动下单全流程(附源码)
### 一、准备工作 首先安装MetaTrader5的Python包: ```javascript pip install MetaTrader5 ``` 然后打开你的MT5客户端,进入 **工具 → 选项 → 智能交易系统**,勾选「允许算法交易」——这一步很多人忘了,导致死活下不了单。 ### 二、连接MT5终端 ```javascript import MetaTrader5 as mt5 if not mt5.initialize(): print("MT5初始化失败") exit() print("MT5版本:", mt5.version()) ``` 只要有MT5客户端在运行,这行代码就会连上。不需要填账号密码,用的是你MT5里已经登录的账户。 ### 三、获取行情数据 ```javascript import pandas as pd from datetime import datetime, timezone # 获取XAUUSD最近100根M5 K线 rates = mt5.copy_rates_from_pos( "XAUUSD", # 品种 mt5.TIMEFRAME_M5, # 5分钟周期 0, # 起始位置(0=最新) 100 # 数量 ) df = pd.DataFrame(rates) # time → open → high → low → close → tick_volume → spread → real_volume print(df.tail()) ``` `copy_rates_from_pos` 返回的是numpy数组,转成DataFrame后每列分别是:时间、开盘价、最高价、最低价、收盘价、成交量、点差、真实成交量。 ### 四、写一个简单的策略 这里用一个最简单的双均线交叉策略做演示: ```javascript def check_signal(df): """5均线上穿20均线=做多,下穿=做空""" df["ma5"] = df["close"].rolling(5).mean() df["ma20"] = df["close"].rolling(20).mean() curr = df.iloc[-1] # 当前K线 prev = df.iloc[-2] # 前一根 if prev["ma5"] curr["ma20"]: return "BUY" elif prev["ma5"] >= prev["ma20"] and curr["ma5"] 0 else "🔴" direction = "多" if pos.type == 0 else "空" print(f"{icon} 持仓: {direction} @{pos.price_open} 浮盈{profit:.2f}") has_position = True time.sleep(60) continue # 刚平仓 if has_position: print("已平仓,进入冷却...") has_position = False time.sleep(60) continue # 取数据、跑策略 rates = mt5.copy_rates_from_pos(SYMBOL, mt5.TIMEFRAME_M5, 0, 50) df = pd.DataFrame(rates) signal = check_signal(df) print(f"当前价格: {mt5.symbol_info_tick(SYMBOL).bid} | 信号: {signal or '无'}") if signal: place_order(signal) time.sleep(60) # 每分钟检查一次 except KeyboardInterrupt: print("手动停止") break except Exception as e: print(f"异常: {e}") time.sleep(30) mt5.shutdown() ``` ### 七、常见坑 - ❌ `Trade deals are not allowed` → MT5里算法交易开关没开 - ❌ `Market closed` → 不在交易时间(黄金周末休市) - ❌ `Not enough money` → 手数太大或账户余额不够 - ❌ `TRADE_RETCODE_REQUOTE` → 行情波动太快,加大`deviation`值 ### 八、进阶方向 上面只是一个单策略demo。实际交易系统需要考虑更多: 1. **多策略共振**:我们用32个策略,3个以上同向才下单 1. **行情分类**:横盘/单边/震荡用不同策略 1. **自学习**:每单复盘,淘汰低胜率策略、自动替换新策略 1. **移动止盈**:浮盈超过阈值后动态推止盈位