问题描述
解决方案
在 QMT 策略中使用冰山算法(Iceberg Algorithm)下单,主要通过调用 smart_algo_passorder 函数来实现。
该函数允许用户指定智能算法类型(smartAlgoType),将其设置为 'ICEBERG' 即可启用冰山策略。冰山算法的核心逻辑是将大单拆分成多个小单,隐藏真实交易意图,通常用于减少市场冲击。
核心步骤
- 设置账号:在
init中使用set_account绑定交易账号。 - 调用函数:在
handlebar或其他触发逻辑中调用smart_algo_passorder。 - 配置参数:
smartAlgoType: 必须设置为'ICEBERG'。limitOverRate: 量比(0-100),控制委托量与市场成交量的比例。targetPriceLevel: 目标价格档位(如 6 代表最新价,1 代表己方盘口1等)。minAmountPerOrder: 单笔最小委托金额。
策略代码示例
以下是一个完整的策略示例,展示了如何在实盘模式下,当策略运行到最新 K 线时,使用冰山算法买入浦发银行(600000.SH)。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置资金账号,请替换为您的真实账号
ContextInfo.accid = '6000000248'
ContextInfo.set_account(ContextInfo.accid)
# 定义一个全局变量防止重复下单(仅作演示用)
ContextInfo.has_ordered = False
print("策略初始化完成,账号已设置")
def handlebar(ContextInfo):
# 仅在实盘的最后一根K线(最新行情)触发,且只下单一次
if ContextInfo.is_last_bar() and not ContextInfo.has_ordered:
# --- 下单参数配置 ---
opType = 23 # 23: 股票买入
orderType = 1101 # 1101: 单股单账号普通交易
accountID = ContextInfo.accid
orderCode = '600000.SH' # 标的代码
prType = 5 # 5: 最新价报价 (配合下面的 price 参数)
price = -1 # 价格,填 -1 表示跟随 prType 的逻辑,或者填具体价格
volume = 10000 # 总下单数量(股)
# --- 智能算法参数 ---
strategyName = "Iceberg_Strategy" # 策略名称
quickTrade = 1 # 1: 立即触发下单
userOrderId = "iceberg_001" # 用户自定义备注
smartAlgoType = "ICEBERG" # 核心:指定为冰山算法
limitOverRate = 30 # 量比 30%:控制拆单速率
minAmountPerOrder = 0 # 最小委托金额,0表示不限制
targetPriceLevel = 6 # 目标价格:6 代表跟随最新价
# 设定算法有效时间(可选),缺省则默认为 09:30:00 到 15:30:00
startTime = '09:30:00'
endTime = '14:55:00'
print(f"开始执行冰山算法下单:{orderCode}, 总量:{volume}")
# --- 调用智能算法下单函数 ---
smart_algo_passorder(
opType,
orderType,
accountID,
orderCode,
prType,
price,
volume,
strategyName,
quickTrade,
userOrderId,
smartAlgoType,
limitOverRate,
minAmountPerOrder,
targetPriceLevel,
startTime,
endTime,
ContextInfo
)
# 标记已下单,防止下一根tick重复触发
ContextInfo.has_ordered = True
print("冰山算法委托已发送")
关键参数详解
在 smart_algo_passorder 中,针对冰山算法(ICEBERG)的参数含义如下:
-
smartAlgoType(智能算法类型):- 填写字符串
"ICEBERG"。
- 填写字符串
-
limitOverRate(量比):- 数据范围:0-100。
- 含义:控制委托的拆单节奏。例如设置为 30,意味着策略会根据市场成交情况,控制自身的挂单或成交占比不超过一定比例,或者控制单笔暴露的量(具体行为取决于柜台算法实现细节,通常指“冰山”露出来的可见部分的比例或参与率)。
-
targetPriceLevel(目标价格):- 决定了算法单以什么价格去挂单或成交。
- 可选值:
1: 己方盘口1(买一/卖一)2-5: 己方盘口2 - 56: 最新价7: 对方盘口(对手价)
-
minAmountPerOrder(最小委托金额):- 单位:元。
- 设置单笔拆单的最小金额门槛,防止拆单过细导致废单或不满足交易所要求。默认为 0。
-
startTime/endTime:- 格式为
"HH:MM:SS"。 - 如果不填,默认全天有效。对于冰山算法,通常建议避开集合竞价时段,设置在连续竞价时段内。
- 格式为
注意事项
- 实盘权限:智能算法交易通常需要券商柜台支持并开通相应的权限(如 Level-2 行情权限或特定的算法交易权限)。如果在回测模式下,该函数可能无法模拟真实的拆单撮合过程,通常仅在实盘或模拟交易(连接了支持算法的柜台)中生效。
- 任务管理:下单后,该算法会形成一个“任务”(Task)。你可以使用
get_trade_detail_data(accountID, 'stock', 'task')来查询任务的执行进度,或者使用cancel_task来撤销未完成的冰山算法任务。 - 风控:请确保总下单量(
volume)满足资金和持仓要求,否则任务启动时可能会直接失败。
Q&A
Q: 冰山算法下单后,在交易软件的委托列表中看到的是什么?
A: 你通常会看到一系列的小单委托,而不是一笔大单。随着算法的执行,策略会根据行情不断发出新的小笔委托,直到总数量成交完毕或达到截止时间。
Q: 如何停止正在运行的冰山算法?
A: 不能使用普通的 cancel 撤单函数(那只能撤销当前挂在交易所的一笔小单)。需要使用 cancel_task(taskId, accountId, 'stock', ContextInfo) 函数来终止整个算法任务。任务 ID 可以通过 get_trade_detail_data 获取。
Q: limitOverRate 设置多少合适?
A: 这取决于你希望隐藏意图的程度和成交的紧迫性。设置过高(如 80-100)可能暴露意图,设置过低(如 5-10)可能导致在预定时间内无法完成全部成交。通常建议根据股票的流动性设置在 20-50 之间。