3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在融资融券(两融)量化交易中,实时掌握账户的最大可下单量对于风控和精确仓位控制至关重要。QMT 平台提供了异步查询机制,通过 query_credit_opvolume 发起查询,并通过 credit_opvolume_callback 接收服务器返回的结果。这种异步设计可以避免阻塞主交易线程,确保策略的高效运行。
query_credit_opvolume用于向服务器发起两融最大可下单量的查询请求。本函数一次最多支持查询 200 只股票。
参数说明:
accountId (str): 查询的两融账号。stockCode (str/list): 需要查询的股票代码,支持单只股票字符串或多只股票列表。opType (int): 两融下单类型(同 passorder 的下单类型,如 33 为信用账号股票买入)。prType (int): 报单价格类型(同 passorder 的报价类型,如 11 为指定价/模型价)。price (float/list): 报价。如果 stockCode 为列表,报价也必须是长度相同的列表。seq (int): 查询序列号,用于在回调中匹配请求,建议使用唯一值(如时间戳)。ContextInfo: 策略运行环境对象。credit_opvolume_callback当服务器返回查询结果时,QMT 框架会自动触发此回调函数。
参数说明:
ContextInfo: 策略模型全局对象。accid (str): 查询的账号。seq (int): 发起查询时传入的序列号 seq。ret (int): 查询结果状态码:
1: 正常返回-1: 正在查询中-2: 输入账号非法-3: 输入查询参数非法-4: 超时等服务器返回报错result (dict): 查询到的结果,包含股票代码与对应的最大可下单量。以下是一个完整的 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})")
handlebar 或高频 Tick 驱动下无间隔调用,否则可能导致接口被限流或返回超时。