问题描述
解决方案
在 QMT 中,若要通过代码修改算法交易的参数(例如“最大委托次数”、“下单间隔”等),需要使用 algo_passorder 函数,并通过 userOrderParam 参数传递一个字典来指定具体的算法设置。
核心步骤
- 构建参数字典:创建一个 Python 字典,设置
OrderType为1(表示算法交易),并设置MaxOrderCount(最大下单次数)等键值对。 - 调用下单函数:将该字典作为第 11 个参数传递给
algo_passorder。 - 注意报价类型:通常将
algo_passorder的prType参数设置为-1,以便让算法参数中的报价设置生效。
代码示例
以下是一个完整的策略示例,展示了如何将最大委托次数设置为 50 次,下单间隔设置为 10 秒:
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置资金账号
ContextInfo.accid = '6000000000' # 请替换为您的真实资金账号
ContextInfo.set_account(ContextInfo.accid)
def handlebar(ContextInfo):
# 获取当前K线索引
index = ContextInfo.barpos
# 获取当前时间
realtime = ContextInfo.get_bar_timetag(index)
# 仅在最后一根K线运行,避免历史回测重复下单(视需求而定)
if not ContextInfo.is_last_bar():
return
# 1. 定义算法交易参数字典
# OrderType: 1 代表算法交易
# MaxOrderCount: 最大下单次数
# PlaceOrderInterval: 下撤单时间间隔(秒)
user_param = {
"OrderType": 1, # 必须为1,表示算法交易
"MaxOrderCount": 50, # 修改最大委托次数为50
"PlaceOrderInterval": 10, # 修改下单间隔为10秒
"PriceType": 5, # 报价方式:5代表最新价 (数值定义同prType)
"VolumeType": 0 # 单笔基准量类型:0代表卖1至卖5量之和
}
# 2. 执行算法下单
# opType=23 (买入), orderType=1101 (单股单账号)
# prType=-1 (使用user_param中的报价设置)
# volume=1000 (总下单量)
algo_passorder(
23, # opType: 23-买入
1101, # orderType: 1101-单股单账号
ContextInfo.accid, # accountid
'600000.SH', # orderCode
-1, # prType: -1 表示使用user_param中的PriceType
-1, # modelprice: 价格,随行就市填-1
1000, # volume: 下单总量
"my_algo_strategy", # strategyName
2, # quickTrade: 2-立即下单
"remark_id", # userOrderId
user_param, # userOrderParam: 传入自定义参数字典
ContextInfo # ContextInfo
)
print("算法交易单已发送,参数:", user_param)
userOrderParam 常用参数字典对照表
您可以根据需要在字典中添加或修改以下键值:
| 键名 (Key) | 说明 | 常用值/备注 |
|---|---|---|
| OrderType | 交易类型 | 1:算法交易 (必须设置) 0:普通交易 2:随机量交易 |
| MaxOrderCount | 最大下单次数 | 整数,例如 20, 50, 100 |
| PlaceOrderInterval | 下撤单时间间隔 | 整数 (秒),例如 15 |
| PriceType | 报价方式 | 同 passorder 的 prType。5: 最新价, 4: 卖1价, 6: 买1价 等 |
| VolumeType | 单笔基准量类型 | 0: 卖1+..+卖5量 1: 卖1+..+卖4量 ... 11: 目标剩余量 |
| VolumeRate | 单笔下单比率 | 浮点数 [0-1],例如 0.5 代表 50% |
| SingleNumMin | 单笔下单量最小值 | 整数 |
| SingleNumMax | 单笔下单量最大值 | 整数 |
| ValidTimeElapse | 有效持续时间 | 整数 (秒) |
| UseTrigger | 是否触价 | 0: 否, 1: 是 |
| TriggerPrice | 触价价格 | 数值 |
注意事项
- 函数选择:请务必使用
algo_passorder而不是普通的passorder。普通passorder不支持userOrderParam参数。 - 参数位置:
userOrderParam是algo_passorder的第 11 个参数(在ContextInfo之前)。 - 智能算法区别:如果您使用的是 VWAP、TWAP 等高级智能算法(如冰山策略),则应使用
smart_algo_passorder函数,其参数设置方式不同(直接通过函数参数传递smartAlgoType等)。上述方法仅适用于 QMT 自带的基础拆单算法。
Q&A
Q: 如果我想修改单笔下单量的最大值和最小值,应该改哪个参数?
A: 在 userOrderParam 字典中,分别设置 SingleNumMax (最大值) 和 SingleNumMin (最小值)。例如:{"SingleNumMin": 100, "SingleNumMax": 500}。
Q: algo_passorder 和 smart_algo_passorder 有什么区别?
A: algo_passorder 用于 QMT 客户端内置的基础拆单算法(如按固定间隔、按盘口量拆单)。smart_algo_passorder 用于更高级的策略算法,如 VWAP(成交量加权平均价)、TWAP(时间加权平均价)、冰山算法等,通常需要服务端或特定算法柜台支持。
Q: 为什么我设置了 userOrderParam 但没有生效?
A: 请检查两点:1. 确保 OrderType 键的值设为了 1。2. 确保 algo_passorder 函数的第 5 个参数 prType 设置为了 -1,否则系统可能会优先使用函数参数中的报价类型而非字典中的设置。