# 基础功能

# 设置接口信息

set_client_info(client_id, client_ver)

  • 介绍

    设置调用接口信息, 非必调接口

  • 参数

    • client_id: client 的标识
    • client_ver: client 的版本号
  • Example
from futu import *
SysConfig.set_client_info("MyFutuAPI", 0)
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
quote_ctx.close()
1
2
3
4

# 设置协议格式

set_proto_fmt(proto_fmt)

  • 介绍

    设置通讯协议 body 格式, 目前支持 Protobuf|Json 两种格式,默认 ProtoBuf, 非必调接口

  • 参数

    • proto_fmt: 协议格式,参见ProtoFMT
from futu import *
SysConfig.set_proto_fmt(ProtoFMT.Protobuf)
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
quote_ctx.close()
1
2
3
4
  • Example

# 对所有连接设置协议加密

enable_proto_encrypt(is_encrypt)

  • 介绍

    对所有连接的请求和返回内容加密。如需了解协议加密流程,详见 这里

  • 参数

    参数 类型 说明
    is_encrypt bool 是否启用加密
  • Example
    from futu import *
    SysConfig.enable_proto_encrypt(is_encrypt = True)
    SysConfig.set_init_rsa_file("conn_key.txt")   # rsa 私钥文件路径
    quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
    quote_ctx.close()
    
    1
    2
    3
    4
    5

# 设置私钥路径

set_init_rsa_file(file)

  • 介绍

    设置 RSA 私钥文件路径。如需了解协议加密流程,详见 这里

  • 参数

    参数 类型 说明
    file str 私钥文件路径
  • Example

from futu import *
SysConfig.enable_proto_encrypt(is_encrypt = True)
SysConfig.set_init_rsa_file("conn_key.txt")   # rsa 私钥文件路径
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
quote_ctx.close()
1
2
3
4
5

# 设置线程模式

set_all_thread_daemon(all_daemon)

  • 介绍

    是否设置所有内部创建的线程为 daemon 线程。

    • 若设置为 daemon 线程:主线程退出后,则进程也退出。
      例如:使用实时回调接口时,需要自己保证主线程存活,否则主线程退出后,进程也退出,您将不会再接收到推送数据。
    • 若设置为非 daemon 线程:主线程退出后,进程不会退出。
      例如:在创建行情或交易对象后,若不调用 close() 关闭连接,即使主线程退出,进程不会退出。
  • 参数

    参数 类型 说明
    all_daemon bool 是否设置为 daemon 线程
  • Example

from futu import *
SysConfig.set_all_thread_daemon(True)
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
# 不调用 quote_ctx.close(),进程也会退出
1
2
3
4

# 设置回调

set_handler(handler)

  • Example
import time
from futu import *
class OrderBookTest(OrderBookHandlerBase):
    def on_recv_rsp(self, rsp_str):
        ret_code, data = super(OrderBookTest,self).on_recv_rsp(rsp_str)
        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

# 获取连接 ID

get_sync_conn_id()

  • 介绍

    获取连接 ID,连接初始化成功后才会有值

  • 返回

    • conn_id: 连接 ID
  • Example
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
quote_ctx.get_sync_conn_id()
quote_ctx.close() # 结束后记得关闭当条连接,防止连接条数用尽
1
2
3
4

# 事件通知回调

SysNotifyHandlerBase

  • 介绍

    通知 OpenD 一些重要消息,类似连接断开等

  • 协议 ID

    1003

  • 返回

    参数 类型 说明
    ret RET_CODE 接口调用结果
    data tuple 当 ret == RET_OK 时,返回 事件通知数据
    str 当 ret != RET_OK,返回错误描述
    • 事件通知数据 的格式如下:


      参数 类型 说明
      notify_type SysNotifyType 通知类型
      sub_type ProgramStatusType 子类型。当 notify_type == SysNotifyType.PROGRAM_STATUS 时,sub_type 返回程序状态类型
      GtwEventType 子类型。当 notify_type == SysNotifyType.GTW_EVENT 时,sub_type 返回 OpenD 事件通知类型
      0 当 notify_type != SysNotifyType.PROGRAM_STATUS 且 notify_type != SysNotifyType.GTW_EVENT 时,sub_type 返回 0
      msg dict 事件信息。当 notify_type == SysNotifyType.CONN_STATUS 时,msg 返回 连接状态事件信息 字典
      事件信息。当 notify_type == SysNotifyType.QOT_RIGHT 时,msg 返回 行情权限事件信息 字典

      • 连接状态事件信息 字典结构如下(连接状态类型为 bool,True 表示连接正常,False 表示连接断开):
        {
            'qot_logined': bool1, 
            'trd_logined': bool2,
        }
        
        1
        2
        3
        4
      • 行情权限事件信息 字典结构如下(点击了解 行情权限):
        {
            'hk_qot_right': value1,
            'hk_option_qot_right': value2,
            'hk_future_qot_right': value3,
            'us_qot_right': value4,
            'us_option_qot_right': value5,
            'us_future_qot_right': value6,  // 已废弃
            'cn_qot_right': value7,
        	'us_index_qot_right': value8,
        	'us_otc_qot_right': value9,
        	'sg_future_qot_right': value10,
        	'jp_future_qot_right': value11,
        	'us_future_qot_right_cme': value12,
        	'us_future_qot_right_cbot': value13,
        	'us_future_qot_right_nymex': value14,
        	'us_future_qot_right_comex': value15,
        	'us_future_qot_right_cboe': value16,
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
  • Example
import time
from futu import *


class SysNotifyTest(SysNotifyHandlerBase):
    def on_recv_rsp(self, rsp_str):
        ret_code, data = super(SysNotifyTest, self).on_recv_rsp(rsp_str)
        notify_type, sub_type, msg = data
        if ret_code != RET_OK:
            logger.debug("SysNotifyTest: error, msg: {}".format(msg))
            return RET_ERROR, data
        if notify_type == SysNotifyType.GTW_EVENT:  # OpenD 事件通知
            print("GTW_EVENT, type: {} msg: {}".format(sub_type, msg))
        elif notify_type == SysNotifyType.PROGRAM_STATUS:  # 程序状态变化通知
            print("PROGRAM_STATUS, type: {} msg: {}".format(sub_type, msg))
        elif notify_type == SysNotifyType.CONN_STATUS:  ## 连接状态变化通知
            print("CONN_STATUS, qot: {}".format(msg['qot_logined']))
            print("CONN_STATUS, trd: {}".format(msg['trd_logined']))
        elif notify_type == SysNotifyType.QOT_RIGHT:  # 行情权限变化通知
            print("QOT_RIGHT, hk: {}".format(msg['hk_qot_right']))
            print("QOT_RIGHT, hk_option: {}".format(msg['hk_option_qot_right']))
            print("QOT_RIGHT, hk_future: {}".format(msg['hk_future_qot_right']))
            print("QOT_RIGHT, us: {}".format(msg['us_qot_right']))
            print("QOT_RIGHT, us_option: {}".format(msg['us_option_qot_right']))
            print("QOT_RIGHT, cn: {}".format(msg['cn_qot_right']))
			print("QOT_RIGHT, us_index: {}".format(msg['us_index_qot_right']))
			print("QOT_RIGHT, us_otc: {}".format(msg['us_otc_qot_right']))
			print("QOT_RIGHT, sg_future: {}".format(msg['sg_future_qot_right']))
			print("QOT_RIGHT, jp_future: {}".format(msg['jp_future_qot_right']))
            print("QOT_RIGHT, us_future_cme: {}".format(msg['us_future_qot_right_cme']))
            print("QOT_RIGHT, us_future_cbot: {}".format(msg['us_future_qot_right_cbot']))
            print("QOT_RIGHT, us_future_nymex: {}".format(msg['us_future_qot_right_nymex']))
            print("QOT_RIGHT, us_future_comex: {}".format(msg['us_future_qot_right_comex']))
            print("QOT_RIGHT, us_future_cboe: {}".format(msg['us_future_qot_right_cboe']))
        return RET_OK, data


quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = SysNotifyTest()
quote_ctx.set_handler(handler)  # 设置回调
time.sleep(15)  # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()  # 结束后记得关闭当条连接,防止连接条数用尽`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42