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

QMT两融交易教程:如何使用 query_credit_opvolume 异步查询信用账户最大可下单量?

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

问题描述

qmt 两融自动化交易:query_credit_opvolume 最大可下单量异步查询
qmt 如何使用 query_credit_opvolume 查询信用账户最大可买量,并在回调函数中处理返回结果?

解决方案

QMT两融自动化交易:使用 query_credit_opvolume 异步查询最大可下单量

在进行融资融券(两融)自动化交易时,准确获取当前信用账户对目标标的的最大可下单量是风控和仓位管理的关键。QMT 平台提供了异步查询接口 query_credit_opvolume,必须配合回调函数 credit_opvolume_callback 使用。本文将详细介绍其接口定义、参数含义及完整的代码实现。


1. 接口详解

1.1 查询接口:query_credit_opvolume

query_credit_opvolume(accountId, stockCode, opType, prType, price, seq, ContextInfo)
  • accountId: string,查询的两融账号。
  • stockCode: stringlist,需要查询的股票代码。支持单只股票或多只股票(List类型,一次最多查询200只)。
  • opType: int,两融下单类型(同 passorder 的下单类型,如 33 代表信用账号股票买入)。
  • prType: int,报单价格类型(同 passorder 的报价类型,如 11 代表限价单)。
  • price: doublelist,报价。如果 stockCode 为 List 类型,报价也需要为长度相同的 List。
  • seq: int,查询序列号,建议输入唯一值(如时间戳)以便在回调中对应查询结果。
  • ContextInfo: 策略模型全局对象。

注意:本函数从服务器异步查询数据,建议平均查询时间间隔 30s 一次,不可频繁调用。同时只能有一个查询在进行中。

1.2 回调接口:credit_opvolume_callback

def credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
    pass
  • ContextInfo: 策略模型全局对象。
  • accid: string,查询的账号。
  • seq: int,对应 query_credit_opvolume 时输入的查询序列号 seq
  • ret: int,查询结果状态:
    • 1:正常返回
    • -1:正在查询中
    • -2:输入账号非法
    • -3:输入查询参数非法
    • -4:超时等服务器返回报错
  • result: dict,查询到的结果,包含股票代码与对应的最大可下单量。

2. 完整 Python 策略示例

以下是一个完整的 QMT 策略代码,展示了如何在 handlebar 中触发异步查询,并在 credit_opvolume_callback 中接收并处理返回的最大可买量。

#encoding:gbk
import time

def init(ContextInfo):
    # 设定您的两融信用账号
    ContextInfo.accid = '6000000248'
    ContextInfo.set_account(ContextInfo.accid)
    
    # 记录上一次查询时间,避免频繁查询
    ContextInfo.last_query_time = 0

def handlebar(ContextInfo):
    # 仅在最后一根 K 线且盘中实时运行时执行查询
    if not ContextInfo.is_last_bar():
        return
        
    now = time.time()
    # 控制查询频率,每 30 秒最多查询一次
    if now - ContextInfo.last_query_time > 30:
        ContextInfo.last_query_time = now
        
        # 准备查询参数
        stock_list = ['600000.SH', '000001.SZ']
        op_type = 33  # 33: 信用账号股票买入
        pr_type = 11  # 11: 限价单
        prices = [10.0, 20.0]  # 对应股票的限价
        seq_id = int(now)  # 使用当前时间戳作为唯一序列号
        
        print(f"[{time.strftime('%H:%M:%S')}] 发起两融最大可下单量查询, seq: {seq_id}")
        
        # 调用异步查询接口
        query_credit_opvolume(ContextInfo.accid, stock_list, op_type, pr_type, prices, seq_id, ContextInfo)

# 两融最大可下单量查询回调函数(必须与查询接口配合使用)
def credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
    print(f"\n--- 收到两融查询回调 ---")
    print(f"账号: {accid}")
    print(f"序列号 seq: {seq}")
    print(f"返回状态 ret: {ret}")
    
    if ret == 1:
        print("查询成功,最大可下单量结果如下:")
        for stock, volume in result.items():
            print(f"股票: {stock} | 最大可买量: {volume} 股")
    elif ret == -1:
        print("查询正在进行中...")
    elif ret == -2:
        print("错误:输入账号非法!")
    elif ret == -3:
        print("错误:输入查询参数非法!")
    elif ret == -4:
        print("错误:服务器返回报错或查询超时!")
    print("-------------------------\n")

3. 核心注意事项

  1. 频率限制:由于该接口需要向券商服务器实时请求数据,QMT 限制同时只能有一个查询在进行中。请务必在代码中加入时间间隔控制(如上文示例中的 30 秒限制),避免因频繁调用导致接口被拒绝或返回超时。
  2. 实盘/模拟限制:此函数主要用于实盘或连接了券商信用柜台的仿真模拟环境,在纯历史回测模式下无法获取真实的柜台负债与额度数据。
  3. 参数匹配:如果 stockCode 传入的是 list,则 price 也必须是相同长度的 list,否则会触发 ret = -3(参数非法)错误。