# 基础功能

# 设置接口信息

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
  • Example

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

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

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 线程。 默认情况下,行情和交易的 context 连接上 FutuOpenD 后,如果不调用 close,即使主线程退出,进程也不会退出。 因此,如果行情和交易的 context 设置了接收数据推送,并且也设置了 daemon 线程,则要自己保证主线程存活,否则进程将退出,也就不会再收到推送数据了。

  • 参数

    • all_daemon: 是否所有内部线程都是 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)

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

  • 介绍

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

  • 协议 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 返回 FutuOpenD 事件通知类型
      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,
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
  • 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):  # FutuOpenD 事件通知
            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, us_future: {}".format(msg['us_future_qot_right']))
            print("QOT_RIGHT, cn: {}".format(msg['cn_qot_right']))
        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