问题描述
解决方案
在 QMT 平台中,拆分大额买单最推荐的方式是使用平台内置的 智能算法交易接口 smart_algo_passorder。
该接口内置了 VWAP(成交量加权平均价)策略,能够自动根据历史成交量分布规律,将大单拆解为多个小单,在指定的时间段内分批执行,从而降低对市场的冲击并争取获得接近市场均价的成交成本。
以下是具体的实现代码和详细说明。
QMT VWAP 算法交易策略代码
# -*- coding: gbk -*-
import time
def init(ContextInfo):
# 1. 设置资金账号 (请修改为您的实际账号)
ContextInfo.accID = '6000000000'
ContextInfo.set_account(ContextInfo.accID)
# 2. 定义全局变量,防止重复下单
ContextInfo.has_ordered = False
def handlebar(ContextInfo):
# 仅在最后一根K线(实时行情)运行,且只运行一次
if not ContextInfo.is_last_bar() or ContextInfo.has_ordered:
return
# --- 交易参数设置 ---
stock_code = '600000.SH' # 标的代码
total_volume = 100000 # 计划买入总股数 (大单)
algo_type = "VWAP" # 算法类型:VWAP
# 策略名称和备注
strategy_name = "VWAP_Strategy"
remark = "Large_Order_Split"
# 智能算法参数
limit_over_rate = 20 # 量比控制 (0-100):例如20表示下单量不超过市场同期成交量的20%
min_amount = 0 # 最小委托金额 (0表示不限制)
# 算法执行时间段 (格式 HH:MM:SS)
# 建议避开集合竞价,例如从 09:30:00 到 14:55:00
start_time = '09:30:00'
end_time = '14:55:00'
print(f"开始执行 {algo_type} 算法下单:{stock_code}, 总量:{total_volume}")
# --- 调用智能算法接口 ---
# opType=23 (买入), orderType=1101 (单股单账号股数下单)
# prType=5 (最新价,算法交易通常以此为基准或由算法内部决定)
# price=-1 (由算法控制价格)
# quickTrade=0 (非快速交易,走算法逻辑)
ContextInfo.smart_algo_passorder(
23, # opType: 23-买入
1101, # orderType: 1101-按股数下单
ContextInfo.accID, # accountid: 资金账号
stock_code, # orderCode: 标的代码
5, # prType: 报价类型 (5-最新价,算法会自动调整)
-1, # modelprice: 价格 (-1表示由算法控制)
total_volume, # volume: 总下单量
strategy_name, # strategyName: 策略名
0, # quickTrade: 0-否 (必须为0才能启动算法)
remark, # userOrderId: 备注
algo_type, # smartAlgoType: "VWAP"
limit_over_rate, # limitOverRate: 量比
min_amount, # minAmountPerOrder: 最小金额
ContextInfo, # ContextInfo对象
# 注意:smart_algo_passorder 的最后几个参数在不同版本文档中可能略有差异
# 通常需要通过位置参数传递 start_time 和 end_time,或者部分版本封装在内部
# 如果您的QMT版本支持直接传参,请参考以下方式(部分旧版本可能不支持时间参数,默认全天):
# targetPriceLevel (缺省), startTime, endTime
)
# 针对支持时间参数的完整调用形式(推荐尝试):
# smart_algo_passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume,
# strategyName, quickTrade, userOrderId, smartAlgoType, limitOverRate,
# minAmountPerOrder, targetPriceLevel, startTime, endTime, ContextInfo)
# 下面是带时间参数的完整调用示例:
# ContextInfo.smart_algo_passorder(
# 23, 1101, ContextInfo.accID, stock_code, 5, -1, total_volume,
# strategy_name, 0, remark, algo_type, limit_over_rate, min_amount,
# 6, start_time, end_time, ContextInfo
# )
ContextInfo.has_ordered = True
print("VWAP 母单已发送,请在交易界面的【算法交易】或【任务管理】中查看进度。")
关键参数详解
在使用 smart_algo_passorder 实现 VWAP 时,以下参数至关重要:
-
smartAlgoType(算法类型):- 必须设置为
"VWAP"。这告诉 QMT 按照成交量加权平均价的逻辑来拆单。
- 必须设置为
-
limitOverRate(量比/参与率):- 含义: 控制子单占市场成交量的比例。
- 设置建议: 通常设置为 10% - 30%。
- 作用: 如果设置为 20,意味着如果市场在某分钟成交了 100 手,你的算法最多只会成交 20 手。这能有效隐藏大单,避免把价格买高。
-
startTime和endTime(执行时间):- 含义: 算法运行的起止时间。
- 设置建议:
- 开始时间通常设为
09:30:00或稍晚(如09:35:00)以避开开盘剧烈波动。 - 结束时间通常设为
14:55:00或14:57:00,避开尾盘集合竞价或确保在收盘前完成。
- 开始时间通常设为
- 注意: 如果不填,默认可能是当前时间到收盘。
-
volume(总量):- 这是你要买入的总股数(母单数量)。算法会自动将其拆分成无数个小的子单。
运行后的效果
- 母单生成: 代码运行后,不会立即成交 10 万股。
- 任务创建: 在 QMT 交易终端的“算法交易”或“策略交易”面板中,会看到一条状态为“运行中”的 VWAP 任务。
- 自动拆单: 随着行情时间的推移,算法会根据该股票的历史成交量曲线和实时盘口,不断地发出小的限价单(子单)。
- 风控: 如果市场流动性不足(成交量小),算法会自动降低下单速度,严格遵守
limitOverRate的限制。
常见问题 Q&A
Q: 为什么代码运行了但没有立即成交?
A: VWAP 的目的就是不立即成交。它是一个时间加权策略,会在设定的 startTime 到 endTime 之间慢慢买入。请去交易界面的“任务”栏查看进度。
Q: smart_algo_passorder 和 passorder 有什么区别?
A: passorder 是普通下单,发出去就是一笔委托,直接报送交易所。smart_algo_passorder 是发送给 QMT 的算法服务器,由算法服务器拆分成无数个 passorder 再报送交易所。
Q: 回测模式下支持 VWAP 算法吗?
A: QMT 的回测模式主要针对逻辑回测,不支持 smart_algo_passorder 的真实拆单逻辑模拟。回测时请使用 passorder 配合逻辑模拟,或者仅在“实盘/模拟交易”模式下测试此代码。
Q: 如何中途停止 VWAP 任务?
A: 可以使用 cancel_task 函数,传入任务 ID 来停止;或者直接在 QMT 交易界面的算法任务列表中手动点击“暂停”或“撤销”。