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

QMT 平台如何使用 query_credit_opvolume 异步查询两融最大可下单量?

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

问题描述



Title: qmt 两融自动化交易:两融最大可下单量查询与异步回调机制

Question: 如何使用 query_credit_opvolume 和 credit_opvolume_callback 异步获取两融最大可下单量?

解决方案

QMT 两融自动化交易:最大可下单量查询与异步回调机制

在融资融券(两融)量化交易中,实时掌握账户的最大可下单量对于风控和精确仓位控制至关重要。QMT 平台提供了异步查询机制,通过 query_credit_opvolume 发起查询,并通过 credit_opvolume_callback 接收服务器返回的结果。这种异步设计可以避免阻塞主交易线程,确保策略的高效运行。


1. 核心接口解析

1.1 查询函数:query_credit_opvolume

用于向服务器发起两融最大可下单量的查询请求。本函数一次最多支持查询 200 只股票

参数说明:

  • accountId (str): 查询的两融账号。
  • stockCode (str/list): 需要查询的股票代码,支持单只股票字符串或多只股票列表。
  • opType (int): 两融下单类型(同 passorder 的下单类型,如 33 为信用账号股票买入)。
  • prType (int): 报单价格类型(同 passorder 的报价类型,如 11 为指定价/模型价)。
  • price (float/list): 报价。如果 stockCode 为列表,报价也必须是长度相同的列表。
  • seq (int): 查询序列号,用于在回调中匹配请求,建议使用唯一值(如时间戳)。
  • ContextInfo: 策略运行环境对象。

1.2 回调函数:credit_opvolume_callback

当服务器返回查询结果时,QMT 框架会自动触发此回调函数。

参数说明:

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

2. 完整 Python 策略示例

以下是一个完整的 QMT 策略示例,展示了如何在 handlebar 中定时发起异步查询,并在回调函数中处理返回的数据:

#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
        seq_id = int(now)
        
        # 待查询的股票列表与对应的限价
        stock_list = ['600000.SH', '000001.SZ']
        price_list = [10.0, 20.0]
        
        print(f"[发起查询] 序列号: {seq_id}, 查询股票: {stock_list}")
        
        # 发起异步查询:下单类型 33 (信用账号股票买入),价格类型 11 (限价)
        query_credit_opvolume(
            ContextInfo.accid, 
            stock_list, 
            33, 
            11, 
            price_list, 
            seq_id, 
            ContextInfo
        )

def credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
    """
    两融最大可下单量查询回调函数
    """
    if ret == 1:
        print(f"[查询成功] 账号: {accid}, 序列号: {seq}")
        for stock, volume in result.items():
            print(f"股票: {stock} | 最大可买数量: {volume} 股")
    else:
        status_map = {
            -1: "正在查询中",
            -2: "输入账号非法",
            -3: "输入查询参数非法",
            -4: "超时或服务器报错"
        }
        err_msg = status_map.get(ret, "未知错误")
        print(f"[查询失败] 账号: {accid}, 序列号: {seq}, 错误状态码: {ret} ({err_msg})")

3. 重要注意事项与最佳实践

  1. 频控限制:该接口需要向券商服务器实时请求数据,建议平均查询时间间隔不低于 30 秒一次,切勿在 handlebar 或高频 Tick 驱动下无间隔调用,否则可能导致接口被限流或返回超时。
  2. 单并发限制:同一时间只能有一个查询任务在进行。如果前一次查询尚未结束(回调未返回),后续的查询请求将会被提前拒绝或返回失败。
  3. 实盘环境生效:此异步查询机制主要用于实盘或模拟盘柜台连接状态。在历史回测模式下,该函数无实际物理柜台支持,无法返回真实的信用额度计算结果。