3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT(迅投量化终端)两融(融资融券)交易中,账户的可下单量受保证金、担保品折算率、已用额度等多重因素动态影响。为了获取精准的最大可下单量,QMT 提供了异步查询接口 query_credit_opvolume() 及其回调函数 credit_opvolume_callback()。
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: 全局策略上下文对象。注意事项:
- 单次最多支持查询 200 只股票。
- 系统同一时间只能进行一个查询,频繁调用或上次未结束时再次发起会导致提前返回。
- 建议平均查询时间间隔在 30s 以上,切勿在
handlebar的每个 tick 中无间隔频繁调用。
credit_opvolume_callback当服务器返回查询结果时自动触发该回调函数。
语法:
def credit_opvolume_callback(ContextInfo, accid, seq, ret, result):
pass
参数详解:
accid: 查询的资金账号。seq: 对应发起查询时传入的 seq 序列号。ret: 返回状态码:
1: 正常返回-1: 正在查询中-2: 输入账号非法-3: 输入查询参数非法-4: 超时或服务器报错result: 查询到的具体结果(字典或列表形式,包含最大可下单量等数据)。以下示例展示了如何在策略中定期发起两融最大可下单量查询,并在回调函数中接收并处理返回结果:
#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}")
credit_opvolume_callback 确认最大可买量后,再调用 passorder 进行开仓,可有效避免因超出可用资金或授权额度而导致的废单。