🚀 AI 一键生成 qmt 策略代码

QMT实盘:解决algo_passorder集合竞价无法委托及上挂2%买入的实现方法

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

algo_passorder函数不能在9:26分提交委托吗?如果想在 26 分上挂 2% 买入怎么办

实盘中,因为想上挂 2% 保证成交,所以使用 algo_passorder,我发现在 9:26 分使用 algo_passorder 函数下单,实际的单子委托是在 30 分以后才委托。但是用 passorder 可以在 9:25-9:30 之间提交委托的。如果想实现在 9:26 分上挂,应该如何处理下单函数呢,期待回复!

解决方案

原因分析:为什么 algo_passorder 在 9:26 委托会延迟到 9:30?

在 QMT 平台中,algo_passorder 是用于提交算法交易(如 TWAP、VWAP、跟量、跟价等)的函数。算法交易单并不是直接发往交易所,而是先提交给券商服务端的算法引擎。由于算法引擎的拆单和执行逻辑通常依赖于市场的连续交易盘口数据,因此绝大多数算法引擎只在连续竞价时段(9:30 - 11:30,13:00 - 14:57)运行

当您在 9:25 - 9:30 之间(即集合竞价结束后的短暂休市期)调用 algo_passorder 时,任务会被算法引擎接收并处于“等待”状态,直到 9:30 连续竞价开始时,引擎才会被激活并开始向交易所实际报单。

相比之下,passorder普通交易委托函数,它将订单直接发送至券商柜台。券商柜台在 9:25 - 9:30 期间是允许接收客户委托的(这些委托会在 9:30 统一进入交易所主机),因此 passorder 可以立即显示为已委托。


解决方案:如何在 9:26 实现上挂 2% 买入?

如果您使用 algo_passorder 仅仅是为了实现“上挂 2% 的价格以保证成交”,而不需要复杂的拆单逻辑,那么完全不需要使用算法交易。您可以通过 passorder 函数配合指定价(prType=11),在代码中自行计算出上挂 2% 的价格并提交委托。

Python 实现代码示例

以下代码展示了如何在 9:26 分获取最新价(或昨收价),计算上挂 2% 的价格,并通过 passorder 提交委托:

#coding:gbk
import datetime

def init(ContextInfo):
    # 设置交易账号
    ContextInfo.set_account('您的资金账号')
    # 设置股票池
    ContextInfo.set_universe(['000001.SZ'])

def handlebar(ContextInfo):
    # 仅在最新一根K线运行
    if not ContextInfo.is_last_bar():
        return
        
    # 获取当前时间
    now_time = datetime.datetime.now().strftime('%H%M%S')
    
    # 限制在 09:26:00 到 09:30:00 之间触发
    if '092600' <= now_time < '093000':
        stock_code = '000001.SZ'
        
        # 获取当前最新价(在9:25-9:30期间,最新价通常为集合竞价产生的开盘价)
        # 如果想基于昨收价上挂,可以取 get_market_data 的 close 历史数据
        market_data = ContextInfo.get_full_tick([stock_code])
        if stock_code in market_data:
            current_price = market_data[stock_code]['lastPrice']
            
            # 计算上挂 2% 的价格
            target_price = current_price * 1.02
            
            # 价格精度处理:A股通常精确到小数点后两位(0.01元)
            target_price = round(target_price, 2)
            
            # 安全校验:确保上挂价格不超过涨停价
            up_stop_price = ContextInfo.get_instrumentdetail(stock_code)['UpStopPrice']
            if target_price > up_stop_price:
                target_price = up_stop_price
                
            # 使用 passorder 提交普通委托
            # opType=23(股票买入), orderType=1101(单股单账号普通股/手), prType=11(指定价)
            # quickTrade=1 (立即触发)
            passorder(23, 1101, ContextInfo.accid, stock_code, 11, target_price, 100, 'PremiumBuy', 1, 'Order_926', ContextInfo)
            
            print(f"[{now_time}] 已按上挂2%价格 {target_price} 提交委托")

核心逻辑解析:

  1. 获取基准价格:使用 get_full_tick 获取 9:25 集合竞价产生的最新价(lastPrice)。
  2. 计算溢价:将获取到的价格乘以 1.02,并使用 round(price, 2) 保留两位小数,符合 A 股最小变动单位。
  3. 涨停价保护:通过 get_instrumentdetail 获取涨停价,防止上挂 2% 后的价格超过涨停价导致废单。
  4. 使用 passorder 指定价下单:将 prType 设置为 11(指定价),并将计算好的 target_price 传入 price 参数中。设置 quickTrade=1 确保信号立即触发。