# 订阅反订阅

# subscribe

subscribe(code_list, subtype_list, is_first_push=True, subscribe_push=True, is_detailed_orderbook=False, extended_time=False)

  • 介绍

    订阅注册需要的实时信息,指定股票和订阅的数据类型即可。
    香港市场(含正股、窝轮、牛熊、期权、期货)订阅,需要 LV1 及以上的权限,BMP 权限下不支持订阅。

  • 参数

    参数 类型 说明
    code_list list 需要订阅的股票代码列表
    subtype_list list 需要订阅的数据类型列表
    is_first_push bool 订阅成功之后是否立即推送一次缓存数据
    subscribe_push bool 订阅后是否推送
    is_detailed_orderbook bool 是否订阅详细的摆盘订单明细
    extended_time bool 是否允许美股盘前盘后数据
  • 返回

    参数 类型 说明
    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(['HK.00700'], [SubType.ORDER_BOOK])  # 订阅买卖摆盘类型,OpenD 开始持续收到服务器的推送
time.sleep(15)  #  设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()  # 关闭当条连接,OpenD 会在1分钟后自动取消相应股票相应类型的订阅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • Output
OrderBookTest  {'code': 'HK.00700', 'svr_recv_time_bid': '2020-04-29 10:40:03.147', 'svr_recv_time_ask': '2020-04-29 10:40:03.147', 'Bid': [(416.8, 2600, 11, {}), (416.6, 13100, 17, {}), (416.4, 24600, 17, {}), (416.2, 28000, 13, {}), (416.0, 46900, 30, {}), (415.8, 10900, 7, {}), (415.6, 7100, 9, {}), (415.4, 13300, 3, {}), (415.2, 300, 3, {}), (415.0, 11200, 36, {})], 'Ask': [(417.0, 17600, 31, {}), (417.2, 17800, 24, {}), (417.4, 15300, 10, {}), (417.6, 28800, 17, {}), (417.8, 20700, 11, {}), (418.0, 114200, 155, {}), (418.2, 20600, 19, {}), (418.4, 24100, 28, {}), (418.6, 42700, 45, {}), (418.8, 181900, 76, {})]}
1

# unsubscribe

unsubscribe(code_list, subtype_list, unsubscribe_all=False)

  • 介绍

    取消订阅

  • 参数

    参数 类型 说明
    code_list list 取消订阅的股票代码列表
    subtype_list list 需要订阅的数据类型列表
    unsubscribe_all bool 取消所有订阅
  • 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(['HK.00700'], [SubType.QUOTE, SubType.TICKER], subscribe_push=False)
# 先订阅了 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(['HK.00700'], [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() # 结束后记得关闭当条连接,防止连接条数用尽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • Output
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': ['HK.00700'], 'TICKER': ['HK.00700']}})
unsubscribe successfully!current subscription status: (0, {'total_used': 1, 'remain': 999, 'own_used': 1, 'sub_list': {'TICKER': ['HK.00700']}})
1
2
3

# unsubscribe_all

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(['HK.00700'], [SubType.QUOTE, SubType.TICKER], subscribe_push=False)
# 先订阅了 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()  # 结束后记得关闭当条连接,防止连接条数用尽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • Output
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': ['HK.00700'], 'TICKER': ['HK.00700']}})
unsubscribe all successfully!current subscription status: (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
1
2
3

接口限制

  • 支持多种实时数据类型的订阅,参见 SubType ,每支股票订阅一个类型占用一个额度。
  • 订阅额度规则请参见 订阅额度 & 历史 K 线额度
  • 至少订阅一分钟才可以反订阅。
  • 由于港股 SF 行情摆盘数据量较大,为保证 SF 行情的速度和 Futu OpenD 的处理性能,目前 SF 权限用户仅限同时订阅 50 只证券类产品(含 hkex 的正股、窝轮、牛熊)的摆盘,剩余订阅额度仍可用于订阅其他类型,如:逐笔,买卖经纪等。
  • 港股期权期货在 LV1 权限下,不支持订阅逐笔类型。