3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行融资融券(两融)自动化交易时,准确获取当前信用账户对目标标的的最大可下单量是风控和仓位管理的关键。QMT 平台提供了异步查询接口 query_credit_opvolume,必须配合回调函数 credit_opvolume_callback 使用。本文将详细介绍其接口定义、参数含义及完整的代码实现。
query_credit_opvolumequery_credit_opvolume(accountId, stockCode, opType, prType, price, seq, ContextInfo)
string,查询的两融账号。string 或 list,需要查询的股票代码。支持单只股票或多只股票(List类型,一次最多查询200只)。int,两融下单类型(同 passorder 的下单类型,如 33 代表信用账号股票买入)。int,报单价格类型(同 passorder 的报价类型,如 11 代表限价单)。double 或 list,报价。如果 stockCode 为 List 类型,报价也需要为长度相同的 List。int,查询序列号,建议输入唯一值(如时间戳)以便在回调中对应查询结果。注意:本函数从服务器异步查询数据,建议平均查询时间间隔 30s 一次,不可频繁调用。同时只能有一个查询在进行中。
credit_opvolume_callbackdef credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
pass
string,查询的账号。int,对应 query_credit_opvolume 时输入的查询序列号 seq。int,查询结果状态:
1:正常返回-1:正在查询中-2:输入账号非法-3:输入查询参数非法-4:超时等服务器返回报错dict,查询到的结果,包含股票代码与对应的最大可下单量。以下是一个完整的 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")
stockCode 传入的是 list,则 price 也必须是相同长度的 list,否则会触发 ret = -3(参数非法)错误。