Python API对接MT5下单报错'Unsupported Filling Mode'求助
问题:MT5 Python提交订单报错「Unsupported Filling Mode」,如何转换成交模式类型?
我在开发Python程序,尝试向Alpari经纪商的Meta Trader 5发送订单时,出现如下错误:
Unsupported Filling Mode
使用的代码如下:
# Import the libraries import MetaTrader5 as mt5 from datetime import datetime # Create the bound between MT5 and Python mt5.initialize() # Place buy order # Initialization value symbol = "EURUSD" lot = 0.01 # Choose the deviation deviation = 10 # Find the filling mode of symbol filling_type = mt5.symbol_info(symbol).filling_mode # Create dictionary request request = { "action": mt5.TRADE_ACTION_DEAL, "symbol": symbol, "volume": lot, "type": mt5.ORDER_TYPE_SELL, "price": mt5.symbol_info_tick(symbol).bid, "deviation": deviation, "type_filling": filling_type, "type_time": mt5.ORDER_TIME_GTC } mt5.order_check(request)
执行结果:
OrderCheckResult(retcode=10030, balance=0.0, equity=0.0, profit=0.0, margin=0.0, margin_free=0.0, margin_level=0.0, comment='Unsupported filling mode', request=TradeRequest(action=1, magic=0, order=0, symbol='EURUSD', volume=0.01, price=1.0793, stoplimit=0.0, sl=0.0, tp=0.0, deviation=10, type=1, type_filling=1, type_time=0, expiration=0, comment='', position=0, position_by=0))
恳请帮忙解决:如何将SYMBOL_FILLING_MODE转换为ENUM_ORDER_TYPE_FILLING值?
解决方法
问题根源在于:mt5.symbol_info(symbol).filling_mode返回的是品种本身支持的成交模式(SYMBOL_FILLING_MODE),但订单请求里的type_filling字段需要的是经纪商允许的订单成交模式(ENUM_ORDER_TYPE_FILLING),两者不能直接复用,需要按规则映射。
1. 先确认品种支持的成交模式
先打印出当前品种的成交模式数值,以及MT5定义的相关常量,明确对应关系:
symbol = "EURUSD" symbol_info = mt5.symbol_info(symbol) print(f"品种支持的成交模式数值: {symbol_info.filling_mode}") # 打印MT5内置的成交模式常量 print(f"SYMBOL_FILLING_RETURN: {mt5.SYMBOL_FILLING_RETURN}") print(f"SYMBOL_FILLING_IOC: {mt5.SYMBOL_FILLING_IOC}") print(f"SYMBOL_FILLING_FOK: {mt5.SYMBOL_FILLING_FOK}")
2. 映射为订单允许的成交模式
大部分经纪商的映射规则是直接对应,但Alpari可能有特殊限制,你可以直接尝试以下两种方式:
方式一:按常量直接映射
如果品种支持的是SYMBOL_FILLING_RETURN(数值0),对应订单用mt5.ORDER_FILLING_RETURN;支持SYMBOL_FILLING_IOC(数值1)则对应mt5.ORDER_FILLING_IOC,以此类推。修改代码中的请求字典:
request = { "action": mt5.TRADE_ACTION_DEAL, "symbol": symbol, "volume": lot, "type": mt5.ORDER_TYPE_SELL, "price": mt5.symbol_info_tick(symbol).bid, "deviation": deviation, # 替换为订单成交模式常量,Alpari常用ORDER_FILLING_RETURN "type_filling": mt5.ORDER_FILLING_RETURN, "type_time": mt5.ORDER_TIME_GTC }
方式二:逐个测试验证
如果不知道具体映射关系,可以依次测试MT5提供的三个订单成交模式常量,用mt5.order_check()验证哪个能通过:
# 定义所有订单成交模式常量 filling_options = [mt5.ORDER_FILLING_RETURN, mt5.ORDER_FILLING_IOC, mt5.ORDER_FILLING_FOK] for option in filling_options: request["type_filling"] = option result = mt5.order_check(request) print(f"测试模式{option}: {result.comment}")
3. 辅助验证:查看MT5终端品种规格
打开MT5终端,右键点击EURUSD→「规格」→「交易」标签,里面会显示该品种允许的成交模式,直接对应到Python中的常量即可。
内容的提问来源于stack exchange,提问作者M.Rafi Biglari
相关产品推荐
相关产品推荐

