3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 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 (量比):
targetPriceLevel (目标价格):
1: 己方盘口1(买一/卖一)2 - 5: 己方盘口2 - 56: 最新价7: 对方盘口(对手价)minAmountPerOrder (最小委托金额):
startTime / endTime:
"HH:MM:SS"。get_trade_detail_data(accountID, 'stock', 'task') 来查询任务的执行进度,或者使用 cancel_task 来撤销未完成的冰山算法任务。volume)满足资金和持仓要求,否则任务启动时可能会直接失败。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 之间。