3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行大额订单交易时,为了减少对市场的冲击成本(Market Impact)并隐藏交易意图,量化交易员通常会采用**算法交易(Algorithms Trading)**进行拆单。QMT 平台提供了强大的智能算法交易接口 smart_algo_passorder,支持 TWAP(时间加权平均价格) 和 VWAP(成交量加权平均价格) 等主流算法。
本文将详细解析 smart_algo_passorder 的参数配置,并给出高效拆单的 Python 代码示例。
QMT 中智能算法交易的调用格式如下:
smart_algo_passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, strageName, quickTrade, userid, smartAlgoType, limitOverRate, minAmountPerOrder, [targetPriceLevel], [startTime], [endTime], ContextInfo)
23,股票卖出填 24;信用账户买入填 33,卖出填 34。1101(单股、单账号、股数方式下单)。5(最新价)或 11(指定模型价)。"TWAP":时间加权平均价格算法,将订单均匀地分布在设定的时间段内执行。"VWAP":成交量加权平均价格算法,根据历史成交量分布预测,在成交量大的时段多投单,成交量小时段少投单。0-100。控制算法交易的成交量占市场即时成交量的最大比例,防止因下单过多推高股价。0-100000,默认 0。"HH:MM:SS",如 "09:30:00" 到 "14:30:00"。合理设置起止时间可以避开开盘或收盘的剧烈波动期。以下是在 QMT 中实现智能拆单的完整策略示例:
#coding:gbk
import time
def init(ContextInfo):
# 设定交易账号
ContextInfo.accid = '6000000105'
ContextInfo.set_account(ContextInfo.accid)
# 设定股票池
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 仅在最后一根Bar(最新Tick驱动)时执行算法交易,避免历史回测重复触发
if not ContextInfo.is_last_bar():
return
stock_code = '000001.SZ'
volume = 50000 # 计划交易 50,000 股
# 示例 1:使用 TWAP 算法在 09:30 到 11:30 之间均匀拆单买入
# limitOverRate 设为 20(即单笔不超过市场成交量的 20%)
print("触发 TWAP 智能拆单任务...")
smart_algo_passorder(
23, # opType: 股票买入
1101, # orderType: 单股单账号股数下单
ContextInfo.accid, # 资金账号
stock_code, # 股票代码
5, # prType: 最新价
-1, # modelprice: 非指定价填 -1
volume, # 委托总量
"MyTwapStrategy", # 策略名
1, # quickTrade: 1 表示立即触发
"remark_twap", # 投资备注
"TWAP", # 智能算法类型
20, # limitOverRate: 量比 20%
0, # minAmountPerOrder: 最小委托金额 0
0, # targetPriceLevel: 目标价格(非冰山算法可填0)
'09:30:00', # 算法开始时间
'11:30:00', # 算法截止时间
ContextInfo
)
# 示例 2:使用 VWAP 算法在 13:00 到 14:30 之间根据市场成交量分布拆单卖出
# smart_algo_passorder(24, 1101, ContextInfo.accid, stock_code, 5, -1, volume, "MyVwapStrategy", 1, "remark_vwap", "VWAP", 15, 0, 0, '13:00:00', '14:30:00', ContextInfo)
limitOverRate 限制在 10% - 15% 以内;流动性极佳的宽基指数成分股可放宽至 20% - 30%。09:30 - 09:45(开盘前15分钟市场波动剧烈,容易产生滑点)以及 14:57 - 15:00(尾盘集合竞价期),将算法时间段设在市场交易平稳的中盘时段。get_trade_detail_data(accountID, 'STOCK', 'TASK') 可以实时监控拆单任务的执行状态,并使用 pause_task() 或 cancel_task() 进行灵活干预。