Python调用MetaTrader5下单失败:返回None且曾报10013错误
问题分析与解决方案
先排查初始化有效性
你的代码仅调用mt5.initialize()但未校验返回状态,若初始化失败,后续所有操作都会返回None。先补充初始化检查:
if not mt5.initialize(): print(f"初始化失败,错误码: {mt5.last_error()}") quit()
错误码10013的核心原因
10013代表无效交易量,你使用的0.15手可能不符合品种NQ100_m_i的交易规则,先确认该品种的最小交易量、交易量步长:
symbol_info = mt5.symbol_info("NQ100_m_i") if symbol_info is None: print(f"未找到品种NQ100_m_i,错误码: {mt5.last_error()}") else: print(f"最小手数: {symbol_info.volume_min}, 步长: {symbol_info.volume_step}")
比如若品种最小手数为0.2、步长0.1,那0.15就不符合要求,必须用0.2、0.3这类符合步长倍数的数值。
订单返回None的其他排查点
- MT5端权限设置:确保MT5客户端开启自动交易权限(工具→选项→EA交易,勾选「允许自动交易」),且未阻止Python脚本的连接请求。
- tick数据有效性:
symbol_info_tick("NQ100_m_i")可能返回None,先校验tick获取状态:
tick = mt5.symbol_info_tick("NQ100_m_i") if tick is None: print(f"获取tick失败,错误码: {mt5.last_error()}") else: price = tick.bid
- 成交模式匹配:不同品种支持的成交模式不同,
FOK(立即全成否则取消)可能不适用于当前品种,建议先使用品种默认成交模式:
type_filling = symbol_info.filling_mode
替换订单中的type_filling参数。
完整调试代码
整合所有校验逻辑,便于精准定位问题:
import MetaTrader5 as mt5 # 初始化校验 if not mt5.initialize(): print(f"初始化失败,错误码: {mt5.last_error()}") mt5.shutdown() quit() # 品种信息校验 symbol = "NQ100_m_i" symbol_info = mt5.symbol_info(symbol) if symbol_info is None: print(f"品种{symbol}不存在,错误码: {mt5.last_error()}") mt5.shutdown() quit() if not symbol_info.visible: print(f"品种{symbol}不可见,尝试添加到市场观察") if not mt5.symbol_select(symbol, True): print(f"添加失败,错误码: {mt5.last_error()}") mt5.shutdown() quit() # 打印品种交易参数 print(f"最小手数: {symbol_info.volume_min}, 最大手数: {symbol_info.volume_max}, 步长: {symbol_info.volume_step}") print(f"默认成交模式: {symbol_info.filling_mode}") # Tick数据校验 tick = mt5.symbol_info_tick(symbol) if tick is None: print(f"获取tick失败,错误码: {mt5.last_error()}") mt5.shutdown() quit() price = tick.bid print(f"当前买价: {price}") # 构造合规订单 requester = { "action": mt5.TRADE_ACTION_DEAL, "symbol": symbol, "volume": round(0.2, 2), # 替换为符合品种步长的手数 "type": mt5.ORDER_TYPE_BUY, "price": price, "sl": price - 50, # 示例止损,替换为合理数值 "tp": price + 50, # 示例止盈,替换为合理数值 "deviation": 30, "magic": 234000, "comment": 'test_order', "type_time": mt5.ORDER_TIME_GTC, "type_filling": symbol_info.filling_mode, # 使用品种默认成交模式 } # 发送订单并校验结果 result = mt5.order_send(requester) if result is None: print(f"订单发送无返回,错误码: {mt5.last_error()}") else: print(f"订单结果: {result}") if result.retcode != mt5.TRADE_RETCODE_DONE: print(f"订单未执行,返回码: {result.retcode}, 错误信息: {mt5.last_error()}") # 关闭连接 mt5.shutdown()
额外注意事项
- 确保MT5客户端处于登录状态,且交易账号拥有对应品种的交易权限。
- 部分品种不允许止损/止盈为0,建议设置合理的止损止盈数值。
- 模拟账户需确认交易规则与实盘一致,避免因规则差异导致订单失败。
内容的提问来源于stack exchange,提问作者mahdi abbasi nourabadi
相关产品推荐
相关产品推荐

