🚀 AI 一键生成 qmt 策略代码

QMT 算法交易进阶:如何通过代码调整 TWAP/VWAP 算法参数?

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

问题描述

如何在代码里修改算法交易的参数,比如最大委托次数?

解决方案

在 QMT 中,若要通过代码修改算法交易的参数(例如“最大委托次数”、“下单间隔”等),需要使用 algo_passorder 函数,并通过 userOrderParam 参数传递一个字典来指定具体的算法设置。

核心步骤

  1. 构建参数字典:创建一个 Python 字典,设置 OrderType1(表示算法交易),并设置 MaxOrderCount(最大下单次数)等键值对。
  2. 调用下单函数:将该字典作为第 11 个参数传递给 algo_passorder
  3. 注意报价类型:通常将 algo_passorderprType 参数设置为 -1,以便让算法参数中的报价设置生效。

代码示例

以下是一个完整的策略示例,展示了如何将最大委托次数设置为 50 次,下单间隔设置为 10 秒:

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置资金账号
    ContextInfo.accid = '6000000000' # 请替换为您的真实资金账号
    ContextInfo.set_account(ContextInfo.accid)

def handlebar(ContextInfo):
    # 获取当前K线索引
    index = ContextInfo.barpos
    # 获取当前时间
    realtime = ContextInfo.get_bar_timetag(index)
    
    # 仅在最后一根K线运行,避免历史回测重复下单(视需求而定)
    if not ContextInfo.is_last_bar():
        return

    # 1. 定义算法交易参数字典
    # OrderType: 1 代表算法交易
    # MaxOrderCount: 最大下单次数
    # PlaceOrderInterval: 下撤单时间间隔(秒)
    user_param = {
        "OrderType": 1,             # 必须为1,表示算法交易
        "MaxOrderCount": 50,        # 修改最大委托次数为50
        "PlaceOrderInterval": 10,   # 修改下单间隔为10秒
        "PriceType": 5,             # 报价方式:5代表最新价 (数值定义同prType)
        "VolumeType": 0             # 单笔基准量类型:0代表卖1至卖5量之和
    }
    
    # 2. 执行算法下单
    # opType=23 (买入), orderType=1101 (单股单账号)
    # prType=-1 (使用user_param中的报价设置)
    # volume=1000 (总下单量)
    algo_passorder(
        23,                                 # opType: 23-买入
        1101,                               # orderType: 1101-单股单账号
        ContextInfo.accid,                  # accountid
        '600000.SH',                        # orderCode
        -1,                                 # prType: -1 表示使用user_param中的PriceType
        -1,                                 # modelprice: 价格,随行就市填-1
        1000,                               # volume: 下单总量
        "my_algo_strategy",                 # strategyName
        2,                                  # quickTrade: 2-立即下单
        "remark_id",                        # userOrderId
        user_param,                         # userOrderParam: 传入自定义参数字典
        ContextInfo                         # ContextInfo
    )
    
    print("算法交易单已发送,参数:", user_param)

userOrderParam 常用参数字典对照表

您可以根据需要在字典中添加或修改以下键值:

键名 (Key) 说明 常用值/备注
OrderType 交易类型 1:算法交易 (必须设置)
0:普通交易
2:随机量交易
MaxOrderCount 最大下单次数 整数,例如 20, 50, 100
PlaceOrderInterval 下撤单时间间隔 整数 (秒),例如 15
PriceType 报价方式 passorderprType
5: 最新价, 4: 卖1价, 6: 买1价 等
VolumeType 单笔基准量类型 0: 卖1+..+卖5量
1: 卖1+..+卖4量
...
11: 目标剩余量
VolumeRate 单笔下单比率 浮点数 [0-1],例如 0.5 代表 50%
SingleNumMin 单笔下单量最小值 整数
SingleNumMax 单笔下单量最大值 整数
ValidTimeElapse 有效持续时间 整数 (秒)
UseTrigger 是否触价 0: 否, 1: 是
TriggerPrice 触价价格 数值

注意事项

  1. 函数选择:请务必使用 algo_passorder 而不是普通的 passorder。普通 passorder 不支持 userOrderParam 参数。
  2. 参数位置userOrderParamalgo_passorder 的第 11 个参数(在 ContextInfo 之前)。
  3. 智能算法区别:如果您使用的是 VWAP、TWAP 等高级智能算法(如冰山策略),则应使用 smart_algo_passorder 函数,其参数设置方式不同(直接通过函数参数传递 smartAlgoType 等)。上述方法仅适用于 QMT 自带的基础拆单算法。

Q&A

Q: 如果我想修改单笔下单量的最大值和最小值,应该改哪个参数?
A: 在 userOrderParam 字典中,分别设置 SingleNumMax (最大值) 和 SingleNumMin (最小值)。例如:{"SingleNumMin": 100, "SingleNumMax": 500}

Q: algo_passordersmart_algo_passorder 有什么区别?
A: algo_passorder 用于 QMT 客户端内置的基础拆单算法(如按固定间隔、按盘口量拆单)。smart_algo_passorder 用于更高级的策略算法,如 VWAP(成交量加权平均价)、TWAP(时间加权平均价)、冰山算法等,通常需要服务端或特定算法柜台支持。

Q: 为什么我设置了 userOrderParam 但没有生效?
A: 请检查两点:1. 确保 OrderType 键的值设为了 1。2. 确保 algo_passorder 函数的第 5 个参数 prType 设置为了 -1,否则系统可能会优先使用函数参数中的报价类型而非字典中的设置。