问题描述
返回值
int:订阅号,用于反订阅
如果没有反订阅,是不是值是多少就是订阅了多少个标的?
比如,返回的是1000,就是订阅了1000个股票?
解决方案
不是的。subscribe_quote 返回的 int 值并不代表你当前订阅了多少个标的。
1. 返回值的真实含义:订阅号(subId)
subscribe_quote 返回的整数是一个订阅号(subId),你可以把它理解为这次订阅操作的“订单号”或“任务ID”。
这个 ID 是系统为了唯一标识你这一次的订阅请求而生成的。它的主要作用只有一个:当你不再需要这些数据时,将这个 ID 传给 unsubscribe_quote(subId) 函数来进行反订阅(取消订阅)。
因此,如果返回的是 1000,它仅仅意味着系统分配给这次订阅请求的编号是 1000,绝对不代表你已经订阅了 1000 个股票。
2. 如何正确获取当前订阅了多少个标的?
如果你想知道当前策略到底订阅了哪些标的、总共有多少个,你应该使用 QMT 提供的另一个专门的 API:ContextInfo.get_all_subscription()。
用法示例:
def handlebar(ContextInfo):
# 获取当前所有的行情订阅信息
sub_data = ContextInfo.get_all_subscription()
# 打印订阅信息字典
print(sub_data)
# 获取订阅的标的数量
sub_count = len(sub_data)
print(f"当前共订阅了 {sub_count} 个标的")
get_all_subscription() 会返回一个字典(dict),里面包含了当前所有生效的订阅信息(包括合约代码、周期、除权方式等)。通过计算这个字典的长度(len()),你就可以准确知道当前订阅了多少个标的。