EFH

盛立极速行情系统(EFH)是以FPGA硬件技术处理交易所原始行情及行情发布的低延迟系统。为对接盛立 EFH 行情服务软件,DolphinDB 开发了 EFH 插件。通过插件可以将上交所和深交所的 Level-2 实时行情接入 DolphinDB。

安装插件

版本要求

  • DolphinDB Server: 2.00.10 及更高版本,支持 Linux x86-64。

安装步骤

  1. 在 DolphinDB 客户端中使用 listRemotePlugins 命令查看插件仓库中的插件信息。

    注意:仅展示当前操作系统和 server 版本支持的插件。若无预期插件,可自行编译(请自行选择对应分支下的插件)或在 DolphinDB 用户社区进行反馈。

    login("admin", "123456")
    listRemotePlugins()
  2. 使用 installPlugin 命令完成插件安装。

    installPlugin("EFH")
  3. 使用 loadPlugin 命令加载插件。

    loadPlugin("EFH")

接口说明

createHandle

语法

createHandle(configPath, handleName, [options])

详情

创建 EFH 句柄。

返回一个 EFH 句柄,用于订阅、取消订阅、连接和关闭。EFH 连接句柄不能重名。

参数

configPath STRING 类型标量,表示 EFH 行情配置文件路径。

警告:如果使用 efvi 模式,且配置的网卡不适配,在 connect 时可能会导致盛立的 SDK crash,在使用前务必确保配置文件中的网卡信息正确。

handleName STRING 类型标量,指定给该 EFH 句柄的名称。

options 一个字典, 类型为 (STRING, BOOL),可选参数。其键支持 "outputRecvTime","outputElapsed"。其中:

  • "outputRecvTime" 表示是否获取插件收到行情数据的时间戳。其指定为 dict (, ) 时,getSchema获取的表结构中将包含插件收到行情数据的时间戳列。
  • "outputElapsed" 表示是否获取 EFH 插件 接收数据处理的时延。其指定为 dict (, ) 时,getSchema获取的表结构中将包含插件收到行情数据的时延列时延的定义:"EFH 回调函数返回数据" 到 "准备写入到共享流表前" 这段时间。

getSchema

语法

getSchema(handle, market, dataType)

详情

获取行情数据的表结构。

返回一个表,包含三列:name,typeString 和 typeInt,分别表示该行情表各个字段的名称,类型名和类型枚举值。可以通过该表来创建具有相同结构的共享流表。

如果在 createHandle中指定了 options,在返回的 schema 中会增加对应的列:

  • 如果指定了 outputRecvTime 为 true,则会增加一个 NANOTIMESTAMP 类型列 receivedTime。
  • 如果指定了 outputElapsed 为 true,则会增加一个 LONG 类型列 perPenetrationTime。

参数

handle createHandle 返回的连接句柄。

market STRING 类型标量,需要订阅的的市场名称,可以为 "EFH_SSE_LEV2" 表示上交所,"EFH_SZE_LEV2" 表示深交所。

dataType STRING 类型标量,表示行情数据类型:

  • 深交所可取以下值:"afterClose","snapshot","order","execution","index","tree","ibrTree","turnover","bondSnapshot","bondOrder","bondExecution"。
  • 上交所可取以下值:"snapshot","order","execution","index","tree","option","bondSnapshot","bondTick"。

subscribe

语法

subscribe(handle, outputTable, market, dataType)

详情

订阅具体的行情数据。

注意: EFH 插件是在连接建立前进行订阅,连接建立后无法进行订阅。

参数

handle createHandle 返回的连接句柄。

outputTable 一个共享流表,作为行情数据输出的目标表。流表的结构必须与 getSchema 返回的结构相同。

market STRING 类型标量,需要订阅的的市场名称,可以为 "EFH_SSE_LEV2" 表示上交所,"EFH_SZE_LEV2" 表示深交所。

dataType STRING 类型标量,表示行情数据类型:

  • 深交所可取以下值:"afterClose","snapshot","order","execution","index","tree","ibrTree","turnover","bondSnapshot","bondOrder","bondExecution"。
  • 上交所可取以下值:"snapshot","order","execution","index","tree","option","bondSnapshot","bondTick"。

unsubscribe

语法

unsubscribe(handle, market, dataType)

详情

取消订阅具体的行情数据。

参数

handle createHandle 返回的连接句柄。

market STRING 类型标量,需要订阅的的市场名称,可以为 "EFH_SSE_LEV2" 表示上交所,"EFH_SZE_LEV2" 表示深交所。

dataType STRING 类型标量,表示行情数据类型:

  • 深交所可取以下值:"afterClose","snapshot","order","execution","index","tree","ibrTree","turnover","bondSnapshot","bondOrder","bondExecution"。
  • 上交所可取以下值:"snapshot","order","execution","index","tree","option","bondSnapshot","bondTick"。

connect

语法

connect(handle)

详情

建立与 EFH 行情服务器之间的连接,开始接收行情数据。

参数

handle createHandle 返回的连接句柄。

close

语法

close(handle)

详情

关闭一个 EFH 连接句柄,在 close 之后还可以通过接口 getStatus 查看状态。

参数

handle createHandle 返回的连接句柄

delete

语法

delete(handle)

详情

删除一个 EFH 连接句柄,在 delete 之后将无法再次连接。

参数

handle createHandle 返回的连接句柄

getHandle

语法

getHandle(handleName)

详情

通过句柄名称,获取已经创建的 EFH 句柄。

参数

handleName STRING 类型标量,指定给该 EFH 句柄的名称

getStatus

语法

getStatus(handle)

详情

获取对应 EFH 句柄已订阅数据的状态信息。

返回一个表格,包含各种已订阅数据的状态信息,不包含未订阅过的数据类型

列名含义类型
topicType订阅的名称STRING
channelNoOrderTransaction 分 channel 订阅时的 channel 号INT
startTime订阅开始的时间NANOTIMESTAMP
endTime订阅结束的时间NANOTIMESTAMP
firstMsgTime第一条消息收到的时间NANOTIMESTAMP
lastMsgTime最后一条消息收到的时间NANOTIMESTAMP
processedMsgCount已经处理的消息数LONG
lastErrMsg最后一条错误信息STRING
failedMsgCount处理失败的消息数LONG
lastFailedTimestamp最后一条错误消息发生的时间NANOTIMESTAMP
subscribeInfo该订阅涉及的市场和投资品类型STRING

参数

handle createHandle 返回的连接句柄。

getHandleStatus

语法

getHandleStatus()

详情

获取本节点所有 EFH 句柄的状态信息。

返回一个表格,包含各个 handle 的信息

列名含义类型
handleName创建 handle 时指定的名称STRING
configPath配置文件的路径STRING
createTime创建 handle 的时间DATETIME
startTime建立连接的时间BOOL
endTime关闭连接的时间BOOL

参数

使用示例

// 建立 handle
// 建立 handle
handle = createHandle("config.ini", "handle0", dict(["outputRecvTime", "outputElapsed"], [true, true]));

// 订阅上交所的股票快照
schema = getSchema(handle, `EFH_SSE_LEV2, `snapshot);
snapshot_sh_s = streamTable(10000:0, schema[`name], schema[`typeString]);
share snapshot_sh_s as snapshot_sh_s1;
subscribe(handle, snapshot_sh_s1, "EFH_SSE_LEV2", "snapshot");

// 获取已有的 handle
handle = getHandle("handle0");

// 建立连接
connect(handle)

// 查看订阅状态
getStatus(handle)

// 查看 handle 状态
gethandleStatus(handle)

// 关闭连接
close(handle)

// 取消已有的订阅(非必要)
unsubscribe(handle, "EFH_SSE_LEV2", "snapshot");

// 移除 handle
delete(handle)