🚀 AI 一键生成 qmt 策略代码
立即体验

qmt 信用账户中如何异步查询某只股票的最大可下单量?(附 Python 完整示例)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: qmt 两融交易进阶:查询最大可下单量与回调函数处理

Question: 在 qmt 信用账户中如何异步查询某只股票的最大可买入数量?

解决方案

QMT 信用账户异步查询两融最大可下单量指南

在 QMT(迅投量化终端)两融(融资融券)交易中,账户的可下单量受保证金、担保品折算率、已用额度等多重因素动态影响。为了获取精准的最大可下单量,QMT 提供了异步查询接口 query_credit_opvolume() 及其回调函数 credit_opvolume_callback()


一、核心 API 接口说明

1. 查询函数:query_credit_opvolume

用于向柜台异步发起两融最大可下单量查询。

语法:

query_credit_opvolume(accountId, stockCode, opType, prType, price, seq, ContextInfo)

参数详解:

  • accountId: string,两融资金账号。
  • stockCode: string 或 list,股票代码(如 '600000.SH')或代码列表。
  • opType: int,两融下单类型(如 33: 信用账号股票买入,27: 融资买入,28: 融券卖出,29: 买券还券,31: 卖券还款等)。
  • prType: int,报价价格类型(同 passorder 的 prType,如 11: 指定价,5: 最新价)。
  • price: float 或 list,报价价格。若 stockCode 为列表,price 需为相同长度的列表。
  • seq: int,查询序列号,建议使用时间戳或递增唯一值以便在回调中识别结果。
  • ContextInfo: 全局策略上下文对象。

注意事项:

  1. 单次最多支持查询 200 只股票。
  2. 系统同一时间只能进行一个查询,频繁调用或上次未结束时再次发起会导致提前返回。
  3. 建议平均查询时间间隔在 30s 以上,切勿在 handlebar 的每个 tick 中无间隔频繁调用。

2. 回调函数:credit_opvolume_callback

当服务器返回查询结果时自动触发该回调函数。

语法:

def credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
    pass

参数详解:

  • accid: 查询的资金账号。
  • seq: 对应发起查询时传入的 seq 序列号。
  • ret: 返回状态码:
    • 1: 正常返回
    • -1: 正在查询中
    • -2: 输入账号非法
    • -3: 输入查询参数非法
    • -4: 超时或服务器报错
  • result: 查询到的具体结果(字典或列表形式,包含最大可下单量等数据)。

二、完整 Python 策略代码示例

以下示例展示了如何在策略中定期发起两融最大可下单量查询,并在回调函数中接收并处理返回结果:

#encoding:gbk
import time

def init(ContextInfo):
    # 设定两融资金账号
    ContextInfo.accid = '6000000248'
    ContextInfo.set_account(ContextInfo.accid)
    
    # 标记上次查询时间
    ContextInfo.last_query_time = 0

def handlebar(ContextInfo):
    now = time.time()
    
    # 控制查询频率:每 30 秒查询一次,避免频繁请求被限制
    if now - ContextInfo.last_query_time > 30:
        ContextInfo.last_query_time = now
        
        # 示例 1:单股查询(担保品买入 600000.SH,限价 10 元)
        seq1 = int(now)
        query_credit_opvolume(ContextInfo.accid, '600000.SH', 33, 11, 10.0, seq1, ContextInfo)
        print(f"发起单股查询,序号 seq: {seq1}")
        
        # 示例 2:多股批量查询
        # seq2 = int(now) + 1
        # stocks = ['600000.SH', '000001.SZ']
        # prices = [10.0, 20.0]
        # query_credit_opvolume(ContextInfo.accid, stocks, 33, 11, prices, seq2, ContextInfo)

def credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
    """
    两融最大可下单量查询回调函数
    """
    if ret == 1:
        print(f"[查询成功] 账号: {accid}, 序号: {seq}")
        print(f"查询结果: {result}")
        # 用户可根据 result 中的最大可下单量,后续配合 passorder() 进行下单交易
    else:
        print(f"[查询失败] 错误码 ret: {ret}, 序号: {seq}")

三、实践最佳示例建议

  1. 配合 passorder 交易:在 credit_opvolume_callback 确认最大可买量后,再调用 passorder 进行开仓,可有效避免因超出可用资金或授权额度而导致的废单。
  2. 控制请求频率:由于两融最大可下单量需要向券商服务端柜台实时计算查询,请务必建立时间间隔机制(建议 30 秒及以上),不要在每个行情推送时直接调用。