🚀 AI 一键生成 qmt 策略代码

QMT 算法交易:如何通过 Python 下达冰山 (Iceberg) 委托?

qmt | 发布时间: 2025/12/22
以下内容由 EasyQuant 生成。

问题描述

如何在策略里使用冰山算法下单?

解决方案

在 QMT 策略中使用冰山算法(Iceberg Algorithm)下单,主要通过调用 smart_algo_passorder 函数来实现。

该函数允许用户指定智能算法类型(smartAlgoType),将其设置为 'ICEBERG' 即可启用冰山策略。冰山算法的核心逻辑是将大单拆分成多个小单,隐藏真实交易意图,通常用于减少市场冲击。

核心步骤

  1. 设置账号:在 init 中使用 set_account 绑定交易账号。
  2. 调用函数:在 handlebar 或其他触发逻辑中调用 smart_algo_passorder
  3. 配置参数
    • 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)的参数含义如下:

  1. smartAlgoType (智能算法类型):

    • 填写字符串 "ICEBERG"
  2. limitOverRate (量比):

    • 数据范围:0-100。
    • 含义:控制委托的拆单节奏。例如设置为 30,意味着策略会根据市场成交情况,控制自身的挂单或成交占比不超过一定比例,或者控制单笔暴露的量(具体行为取决于柜台算法实现细节,通常指“冰山”露出来的可见部分的比例或参与率)。
  3. targetPriceLevel (目标价格):

    • 决定了算法单以什么价格去挂单或成交。
    • 可选值:
      • 1: 己方盘口1(买一/卖一)
      • 2 - 5: 己方盘口2 - 5
      • 6: 最新价
      • 7: 对方盘口(对手价)
  4. minAmountPerOrder (最小委托金额):

    • 单位:元。
    • 设置单笔拆单的最小金额门槛,防止拆单过细导致废单或不满足交易所要求。默认为 0。
  5. 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 之间。