# 订阅 subscribe(code_list, subtype_list, is_first_push=True, subscribe_push=True, is_detailed_orderbook=False, extended_time=False, session=Session.NONE)
介绍
订阅注册需要的实时信息,指定股票和订阅的数据类型即可。
香港市场(含正股、窝轮、牛熊、期权、期货)订阅,需要 LV1 及以上的权限,BMP 权限下不支持订阅。
美股市场(含正股、ETFs)夜盘行情订阅,需要 LV1 及以上的权限,BMP 权限下不支持订阅。
参数
参数 类型 说明 code_list list 需要订阅的股票代码列表 list 中元素类型是 str subtype_list list 需要订阅的数据类型列表 list 中元素类型是 SubType is_first_push bool 订阅成功之后是否立即推送一次缓存数据 True:推送缓存当脚本和 OpenD 之间出现断线重连,重新订阅时若设置为 True,会再次推送断线前的最后一条数据False:不推送缓存。等待服务器的最新推送 subscribe_push bool 订阅后是否推送 订阅后,OpenD 提供了两种取数据的方式,如果您仅使用 获取实时数据 的方式,选择 False 可以节省一部分性能消耗True:推送。如果使用 实时数据回调 的方式,则必须设置为 TrueFalse:不推送。如果仅使用 获取实时数据 的方式,则建议设置为 False is_detailed_orderbook bool 是否订阅详细的摆盘订单明细 仅用于港股 SF 行情权限下订阅港股 ORDER_BOOK 类型 美股美期 LV2 权限下不提供详细摆盘订单明细 extended_time bool 是否允许美股盘前盘后数据 仅用于订阅美股实时 K 线、实时分时、实时逐笔 session Session 美股订阅时段 仅用于订阅美股实时 K 线、实时分时、实时逐笔订阅美股行情不支持入参OVERNIGHT最低OpenD版本:9.2.4207 返回
参数 类型 说明 ret RET_CODE 接口调用结果 err_message NoneType 当 ret == RET_OK 时,返回 None str 当 ret != RET_OK 时,返回错误描述 Example
import time
from futu import *
class OrderBookTest(OrderBookHandlerBase):
def on_recv_rsp(self, rsp_pb):
ret_code, data = super(OrderBookTest,self).on_recv_rsp(rsp_pb)
if ret_code != RET_OK:
print("OrderBookTest: error, msg: %s" % data)
return RET_ERROR, data
print("OrderBookTest ", data) # OrderBookTest 自己的处理逻辑
return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = OrderBookTest()
quote_ctx.set_handler(handler) # 设置实时摆盘回调
quote_ctx.subscribe(['US.AAPL'], [SubType.ORDER_BOOK]) # 订阅买卖摆盘类型,OpenD 开始持续收到服务器的推送
time.sleep(15) # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close() # 关闭当条连接,OpenD 会在1分钟后自动取消相应股票相应类型的订阅
12345678910111213141516Output OrderBookTest {'code': 'US.AAPL', 'name': '苹果', 'svr_recv_time_bid': '2025-04-07 05:00:52.266', 'svr_recv_time_ask': '2025-04-07 05:00:53.973', 'Bid': [(180.2, 15, 3, {}), (180.19, 1, 1, {}), (180.18, 11, 2, {}), (180.14, 200, 1, {}), (180.13, 3, 2, {}), (180.1, 99, 3, {}), (180.05, 3, 1, {}), (180.03, 400, 1, {}), (180.02, 10, 1, {}), (180.01, 100, 1, {}), (180.0, 441, 24, {})], 'Ask': [(180.3, 100, 1, {}), (180.38, 4, 2, {}), (180.4, 100, 1, {}), (180.42, 200, 1, {}), (180.46, 29, 1, {}), (180.5, 1019, 2, {}), (180.6, 1000, 1, {}), (180.8, 2001, 3, {}), (180.84, 15, 2, {}), (181.0, 2036, 4, {}), (181.2, 2000, 2, {}), (181.3, 3, 1, {}), (181.4, 2021, 3, {}), (181.5, 59, 2, {}), (181.79, 9, 1, {}), (181.8, 20, 1, {}), (181.9, 94, 4, {}), (181.98, 20, 1, {}), (182.0, 150, 7, {})]}
12# 取消订阅 unsubscribe(code_list, subtype_list, unsubscribe_all=False)
介绍
取消订阅
参数
参数 类型 说明 code_list list 取消订阅的股票代码列表 list 中元素类型是 str subtype_list list 需要订阅的数据类型列表 list 中元素类型是 SubType unsubscribe_all bool 取消所有订阅 为 True 时忽略其他参数 Return
参数 类型 说明 ret RET_CODE 接口调用结果 err_message NoneType 当 ret == RET_OK, 返回 None str 当 ret != RET_OK, 返回错误描述 Example
from futu import *
import time
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
print('current subscription status :', quote_ctx.query_subscription()) # 查询初始订阅状态
ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.QUOTE, SubType.TICKER], subscribe_push=False, session=Session.ALL)
# 先订阅了AAPL全时段 QUOTE 和 TICKER 两个类型。订阅成功后 OpenD 将持续收到服务器的推送,False 代表暂时不需要推送给脚本
if ret_sub == RET_OK: # 订阅成功
print('subscribe successfully!current subscription status :', quote_ctx.query_subscription()) # 订阅成功后查询订阅状态
time.sleep(60) # 订阅之后至少1分钟才能取消订阅
ret_unsub, err_message_unsub = quote_ctx.unsubscribe(['US.AAPL'], [SubType.QUOTE])
if ret_unsub == RET_OK:
print('unsubscribe successfully!current subscription status:', quote_ctx.query_subscription()) # 取消订阅后查询订阅状态
else:
print('unsubscription failed!', err_message_unsub)
else:
print('subscription failed', err_message)
quote_ctx.close() # 结束后记得关闭当条连接,防止连接条数用尽
123456789101112131415161718Output current subscription status : (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
subscribe successfully!current subscription status : (0, {'total_used': 2, 'remain': 998, 'own_used': 2, 'sub_list': {'QUOTE': ['US.AAPL'], 'TICKER': ['US.AAPL']}})
unsubscribe successfully!current subscription status: (0, {'total_used': 1, 'remain': 999, 'own_used': 1, 'sub_list': {'TICKER': ['US.AAPL']}})
123# 取消所有订阅 unsubscribe_all()
介绍 取消所有订阅
返回
参数 类型 说明 ret RET_CODE 接口调用结果 err_message NoneType 当 ret == RET_OK, 返回 None str 当 ret != RET_OK, 返回错误描述 Example
from futu import *
import time
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
print('current subscription status :', quote_ctx.query_subscription()) # 查询初始订阅状态
ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.QUOTE, SubType.TICKER], subscribe_push=False, session=Session.None)
# 先订阅了AAPL全时段 QUOTE 和 TICKER 两个类型。订阅成功后 OpenD 将持续收到服务器的推送,False 代表暂时不需要推送给脚本
if ret_sub == RET_OK: # 订阅成功
print('subscribe successfully!current subscription status :', quote_ctx.query_subscription()) # 订阅成功后查询订阅状态
time.sleep(60) # 订阅之后至少1分钟才能取消订阅
ret_unsub, err_message_unsub = quote_ctx.unsubscribe_all() # 取消所有订阅
if ret_unsub == RET_OK:
print('unsubscribe all successfully!current subscription status:', quote_ctx.query_subscription()) # 取消订阅后查询订阅状态
else:
print('Failed to cancel all subscriptions!', err_message_unsub)
else:
print('subscription failed', err_message)
quote_ctx.close() # 结束后记得关闭当条连接,防止连接条数用尽
123456789101112131415161718Output current subscription status : (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
subscribe successfully!current subscription status : (0, {'total_used': 2, 'remain': 998, 'own_used': 2, 'sub_list': {'QUOTE': ['US.AAPL'], 'TICKER': ['US.AAPL']}})
unsubscribe all successfully!current subscription status: (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
123