EverQuotes

EverQuotes 插件对接中信建投 EverQuotes 行情系统,支持实时行情(RQ)订阅与历史行情(HQ)查询,并分别通过独立的 RQ 句柄与 HQ 句柄进行连接与管理。

EverQuotes 插件的核心能力包括:

  • 实时行情订阅:通过 RQ 连接订阅指定市场、行情类型和证券代码的实时行情。

  • 历史行情查询:通过 HQ 连接按时间区间或指定条数查询历史行情。

  • 结构化写入:根据 SDK 结构体 schema 创建输出表,将实时或历史行情写入 DolphinDB 共享表。

  • 多连接管理:支持创建和维护多个独立的 RQ 与 HQ 连接句柄,实现多路行情的并发接收与资源隔离。

  • 运行状态监控:可查看连接状态、写入统计、队列深度和最近错误信息。

安装插件

版本要求

DolphinDB Server 版本要求:3.00.3、3.00.4、3.00.5、3.00.6 及以上版本。

运行环境要求:Linux x86-64。

安装步骤

  1. 在 DolphinDB 客户端中使用 listRemotePlugins 函数查看可供安装的插件。

login("admin", "123456")
listRemotePlugins()
  1. 使用 installPlugin 函数安装插件。

installPlugin("EverQuotes")
  1. 使用 loadPlugin 函数加载插件。

loadPlugin("EverQuotes")

接口说明

getSchema

语法

EverQuotes::getSchema(name, [option])

详情

返回与指定行情数据结构相同的空表。可以直接使用该表接收行情数据,或者根据该表结构创建流表。实时行情(RQ)与历史行情(HQ)共用相同的表结构定义,无需为实时与历史数据分别建表。

参数

name STRING 类型标量,指定行情结构名。支持的取值请参考上文“支持的行情类型与行情结构名”中的行情结构名列。

option 可选参数,DICTIONARY 类型。key 为 STRING,value 为 BOOL 标量,支持以下配置项:

  • “ReceivedTime”:是否在返回的表末尾追加 receivedTime 列,用于记录插件从 SDK 回调接收到行情数据的时间。

  • “OutputElapsed”:是否在返回的表末尾追加 perPenetrationTime 列,用于记录从接收到行情数据到写入输出表前的耗时,单位为纳秒。

返回值

一张空表。

示例

schema = EverQuotes::getSchema("Trade").schema().colDefs
trades = streamTable(1000000:0, schema.name, schema.typeString)

setOutputTable

语法

EverQuotes::setOutputTable(handle, outputTable, [transform])

详情

为 RQ 或 HQ 句柄绑定输出表字典。订阅实时行情或查询历史行情前,通常需要至少调用一次该接口。

参数

handle RESOURCE 类型,connectRq 或 connectHq 返回的句柄。

outputTable DICTIONARY 类型,key 为 STRING 类型,表示行情结构名,value 为对应输出表。行情结构名的支持范围请参考上文“支持的行情类型与行情结构名”中的行情结构名列。

transform 可选参数,DICTIONARY 类型。用于在数据写入输出表前进行自定义转换(如增删列、改名、字段计算或类型转换)。

  • Key:STRING 类型,对应行情结构名,例如 “Snapshot_L2”。

  • Value:一元函数(Function),其入参为插件解析出的原始行情表,返回值必须是符合目标输出表结构的新表。

返回值

无。

示例

// 一个句柄可以绑定多张结构化输出表;如需转换输出,可同时传入 transform。
schema = EverQuotes::getSchema("Snapshot_L2").schema().colDefs
quotes = streamTable(1000000:0, schema.name, schema.typeString)

tradeSchema = EverQuotes::getSchema("Trade").schema().colDefs
trades = streamTable(1000000:0, tradeSchema.name, tradeSchema.typeString)

// 使用 transform 时,outputTable 和 transform 的 key 都填写原始行情结构名,
// outputTable 的 value 填写转换后的目标表。
def transformSnapshotL2(data){
    return select security_id, market, date, time, last, total_volume_trade from data
}

targetQuotes = streamTable(1000000:0, `security_id`market`date`time`last`total_volume_trade, [STRING, INT, INT, INT, LONG, LONG])

outputTable = dict(STRING, ANY)
outputTable["Snapshot_L2"] = targetQuotes
outputTable["Trade"] = trades

transform = dict(STRING, ANY)
transform["Snapshot_L2"] = transformSnapshotL2

EverQuotes::setOutputTable(rq, outputTable, transform)

getStatus

语法

EverQuotes::getStatus(handle)

详情

返回 RQ 或 HQ 句柄的连接状态、最近状态消息,以及每个输出 schema 的写入状态。

参数

handle RESOURCE 类型,connectRq 或 connectHq 返回的句柄。

返回值

返回一张表,包含以下列:

列名 数据类型 说明
state INT SDK 连接状态码。
schemaName STRING 输出表对应的结构化 schema 名称。
startTime NANOTIMESTAMP 写表队列启动时间。
endTime NANOTIMESTAMP 写表队列停止时间。
firstMsgTime NANOTIMESTAMP 第一条写入消息时间。
lastMsgTime NANOTIMESTAMP 最后一条写入消息时间。
successMsgCount LONG 成功写入的消息数。
failedMsgCount LONG 写入失败或被跳过的消息数。
lastErrMsg STRING 最近一条写表错误信息。
lastFailedTimestamp NANOTIMESTAMP 最近一次写表失败的时间。
queueDepthLimit LONG 写表缓冲队列的最大容量上限(最大队列深度)。
queueDepth LONG 当前写表队列深度。
lastMessage STRING 最近一条连接、日志、路由或写表状态消息。

示例

EverQuotes::getStatus(rq)
EverQuotes::getStatus(hq)

close

语法

EverQuotes::close(handle)

详情

断开行情连接,等待内部待写表数据全部安全写入目标表后,释放并销毁连接句柄。

参数

handle RESOURCE 类型,connectRq 或 connectHq 返回的句柄。

返回值

无。

示例

EverQuotes::close(rq)
EverQuotes::close(hq)

connectRq

语法

EverQuotes::connectRq(host, port, username, password, configFilePath, [handleId], [option])

详情

连接中信建投 EQ 实时行情服务,并返回 RQ 资源句柄。支持配置一个或多个实时行情服务地址;配置多个地址时,SDK 可用于高可用或灾备切换。该句柄用于后续的输出表配置、行情订阅与连接管理。若指定了 handleId,后续也可通过 getRqHandle 根据标识获取该句柄。

参数

当配置多个行情服务地址时,host、port、username、password 必须均为等长向量;即使多个地址使用相同端口或账号密码,也需要显式传入重复值,插件不会自动将标量扩展为向量。

host STRING 类型标量或向量,指定实时行情服务地址。

port 整型标量或向量,指定实时行情服务端口。

username STRING 类型标量或向量,指定登录用户名。

password STRING 类型标量或向量,指定登录密码。

configFilePath STRING 类型标量,EQ SDK 配置目录或配置文件路径。

handleId 可选参数,STRING 类型标量,指定 RQ 连接句柄的唯一标识符(别名)。重复 id 会报错。若省略或传入 NULL 时,插件将自动生成一个 UUID 字符串作为 handleId。

option 可选参数,DICTIONARY 类型。key 为 STRING,value 支持以下配置项:

  • “ReceivedTime”:BOOL 标量,是否在输出表末尾追加 receivedTime 列,用于记录插件从 SDK 回调接收到行情数据的时间。

  • “OutputElapsed”:BOOL 标量,是否在输出表末尾追加 perPenetrationTime 列,用于记录从接收到行情数据到写入输出表前的耗时,单位为纳秒。

  • “ConnectTimeoutMs”:整型标量,连接超时时间,单位为毫秒。默认值为 10000。

返回值

RESOURCE 类型 RQ 句柄。

示例

option = dict(STRING, ANY)
option["ReceivedTime"] = true
option["OutputElapsed"] = true

rq = EverQuotes::connectRq(host, port, username, password, configFilePath, NULL, option)

getRqHandle

语法

EverQuotes::getRqHandle(handleId)

详情

根据 handleId 获取已创建的 RQ 连接句柄。该接口仅用于访问仍处于注册状态且尚未关闭的句柄,不会建立新的实时行情连接。

参数

handleId STRING 类型标量。指定要获取的 RQ 连接句柄的唯一标识符。该标识需要与调用 connectRq 时传入的 handleId 一致;若连接时未显式指定,可通过 getAllRqHandles 查看插件为该句柄分配的标识。

返回值

RESOURCE 类型 RQ 句柄。

getAllRqHandles

语法

EverQuotes::getAllRqHandles()

详情

获取当前节点中已创建且尚未关闭的所有 RQ 连接句柄及其 handleId。

参数

无。

返回值

字典,key 的类型为 STRING,value 的类型为 ANY。每个 key 为一个 handleId,对应的 value 为 RESOURCE 类型 RQ 句柄。当前节点没有已注册的 RQ 句柄时,返回空字典。

subscribeRq

语法

EverQuotes::subscribeRq(handle, market, quoteType, [code])

详情

通过 RQ 句柄订阅指定的实时行情。调用后,插件将异步接收行情服务端的实时推送,并根据行情结构类型将数据自动分发写入通过 setOutputTable 绑定的目标表中(若配置了数据转换函数,则在转换后写入)。

参数

handle RESOURCE 类型,connectRq 返回的 RQ 句柄。

market STRING 类型标量,指定 SDK 市场标识。

quoteType STRING 类型标量,指定 SDK 行情类型,例如 “tick”、“trade”、“order”。

code 可选参数,STRING 类型标量或向量,指定订阅的一个或多个证券代码。若省略或为空,则默认订阅该市场下的所有证券标的(全市场订阅)。

返回值

无。

示例

EverQuotes::subscribeRq(rq, "szl2", "tick", ["000001", "000002"])

unsubscribeRq

语法

EverQuotes::unsubscribeRq(handle, market, quoteType, [code])

详情

取消实时行情订阅。

参数

handle RESOURCE 类型,connectRq 返回的 RQ 句柄。

market STRING 类型标量,指定 SDK 市场标识。

quoteType STRING 类型标量,指定 SDK 行情类型。

code 可选参数,STRING 类型标量或向量,指定需要取消阅的一个或多个证券代码。

返回值

无。

示例

EverQuotes::unsubscribeRq(rq, "szl2", "tick", ["000001", "000002"])

connectHq

语法

EverQuotes::connectHq(host, port, username, password, configFilePath, [handleId], [option])

详情

连接中信建投 EQ 历史行情服务,并返回 HQ 资源句柄。支持配置一个或多个历史行情服务地址;配置多个地址时,SDK 可用于高可用或灾备切换。该句柄用于后续的输出表配置、历史行情查询与连接管理。若指定了 handleId,后续也可通过 getHqHandle 根据标识获取该句柄。

参数

当配置多个行情服务地址时,host、port、username、password 必须均为等长向量;即使多个地址使用相同端口或账号密码,也需要显式传入重复值,插件不会自动将标量扩展为向量。

host STRING 类型标量或向量,指定历史行情服务地址。

port 整型标量或向量,指定历史行情服务端口。

username STRING 类型标量或向量,登录用户名。

password STRING 类型标量或向量,登录密码。

configFilePath STRING 类型标量,EQ SDK 配置目录或配置文件路径。

handleId 可选参数,STRING 类型标量,指定 HQ 连接句柄的唯一标识符(别名)。重复 id 会报错。若省略或传入 NULL 时,插件将自动生成一个 UUID 字符串作为 handleId。

option 可选参数,DICTIONARY 类型。key 为 STRING,value 支持以下配置项:

  • “ReceivedTime”:BOOL 标量,是否在输出表 schema 末尾追加 receivedTime 列,用于记录插件从 SDK 回调接收到行情数据的时间。

  • “OutputElapsed”:BOOL 标量,是否在输出表 schema 末尾追加 perPenetrationTime 列,用于记录从接收到行情数据到写入输出表前的耗时,单位为纳秒。

  • “ConnectTimeoutMs”:整型标量,连接超时时间,单位为毫秒。默认值为 10000。

返回值

RESOURCE 类型 HQ 句柄。

示例

option = dict(STRING, ANY)
option["OutputElapsed"] = true

hq = EverQuotes::connectHq(host, port, username, password, configFilePath, NULL, option)

getHqHandle

语法

EverQuotes::getHqHandle(handleId)

详情

根据 handleId 获取已创建的 HQ 连接句柄。该接口仅用于访问仍处于注册状态且尚未关闭的句柄,不会建立新的历史行情连接。

参数

handleId STRING 类型标量。指定要获取的 HQ 连接句柄的唯一标识符。该标识需要与调用 connectHq 时传入的 handleId 一致;若连接时未显式指定,可通过 getAllHqHandles 或 getStatus 查看插件为该句柄分配的标识。

返回值

RESOURCE 类型 HQ 句柄。

getAllHqHandles

语法

EverQuotes::getAllHqHandles()

详情

获取当前节点中已创建且尚未关闭的所有 HQ 连接句柄及其 handleId。

参数

无。

返回值

字典,key 的类型为 STRING,value 的类型为 ANY。每个 key 为一个 handleId,对应的 value 为 RESOURCE 类型 HQ 句柄。当前节点没有已注册的 HQ 句柄时,返回空字典。

getHqByTimeRange

语法

EverQuotes::getHqByTimeRange(handle, market, quoteType, code, startDate, startTime, endDate, endTime)

详情

按指定时间区间查询历史行情。调用后,插件会等待本次查询返回完成,并将接收到的数据按行情结构类型写入通过 setOutputTable 绑定的目标表中;若配置了数据转换函数,则在转换后写入。函数返回前,插件会确保本次查询接收到的待写表数据已全部写入完成。

参数

handle RESOURCE 类型,connectHq 返回的 HQ 句柄。

market STRING 类型标量,指定 SDK 市场标识。

quoteType STRING 类型标量,指定 SDK 行情类型。

code STRING 类型标量或向量,指定一个或多个证券代码。

startDate 整型标量,开始日期,格式由 SDK 定义,格式为 yyyyMMdd。

startTime 整型标量,开始时间,格式由 SDK 定义,格式为 HHmmssSSS。

endDate 整型标量,结束日期。

endTime 整型标量,结束时间。

返回值

无。

示例

EverQuotes::getHqByTimeRange(hq, "szl2", "tick", ["000001"], 20190211, 100000000, 20190218, 0, -1)

getHqByCount

语法

EverQuotes::getHqByCount(handle, market, quoteType, code, baseDate, baseTime, count, backward)

详情

按指定基准日期、基准时间和条数查询历史行情,并按已绑定输出表字典写入对应表。

参数

handle RESOURCE 类型,connectHq 返回的 HQ 句柄。

market STRING 类型标量,指定 SDK 市场标识。

quoteType STRING 类型标量,指定 SDK 行情类型。

code STRING 类型标量或向量,指定一个或多个证券代码。

baseDate 整型标量,基准日期,通常为 yyyyMMdd。

baseTime 整型标量,基准时间,通常为 HHmmssSSS。

count 整型标量,指定查询条数。

backward BOOL 类型标量,是否向前查询。

返回值

无。

示例

EverQuotes::getHqByCount(hq, "szl2", "tick", ["000001"], 20190211, 100000000, 100, false)

完整示例

以下示例创建 RQ 实时行情连接,订阅深圳 L2 快照行情,并将数据写入共享流数据表。

loadPlugin("EverQuotes")
go

host = "127.0.0.1"
port = 9000
username = "user"
password = "password"
configFilePath = "/path/to/eq/config"

// 创建 RQ 连接。
option = dict(STRING, ANY)
option["ReceivedTime"] = true
option["OutputElapsed"] = true
rq = EverQuotes::connectRq(host, port, username, password, configFilePath, "rq_sz", option)

// 根据插件 schema 创建共享流数据表。
schema = EverQuotes::getSchema("Snapshot_L2", option).schema().colDefs
quotes = streamTable(1000000:0, schema.name, schema.typeString)
share quotes as everQuotesSnapshotL2

// 绑定输出表。
outputTable = dict(STRING, ANY)
outputTable["Snapshot_L2"] = everQuotesSnapshotL2
EverQuotes::setOutputTable(rq, outputTable)

// 订阅实时行情。
EverQuotes::subscribeRq(rq, "szl2", "tick", ["000001", "000002"])

// 查询运行状态。
EverQuotes::getStatus(rq)

// 取消订阅并释放资源。
EverQuotes::unsubscribeRq(rq, "szl2", "tick", ["000001", "000002"])
EverQuotes::close(rq)

以下示例创建 HQ 历史行情连接,按时间区间查询历史行情,并将结果写入共享流数据表。

loadPlugin("EverQuotes")
go

host = "127.0.0.1"
port = 9000
username = "user"
password = "password"
configFilePath = "/path/to/eq/config"

hq = EverQuotes::connectHq(host, port, username, password, configFilePath, "hq_sz")

schema = EverQuotes::getSchema("Snapshot_L2").schema().colDefs
quotes = streamTable(1000000:0, schema.name, schema.typeString)
share quotes as everQuotesHistoryL2

outputTable = dict(STRING, ANY)
outputTable["Snapshot_L2"] = everQuotesHistoryL2
EverQuotes::setOutputTable(hq, outputTable)

EverQuotes::getHqByTimeRange(hq, "szl2", "tick", ["000001"], 20190211, 100000000, 20190218, 0, -1)
EverQuotes::getStatus(hq)
EverQuotes::close(hq)

注意事项

  • RQ 句柄只能传给 RQ 实时行情接口,HQ 句柄只能传给 HQ 历史行情接口。

  • 输出表 schema 必须与 getSchema(name, [option]) 返回的字段与类型完全一致。若在 connectRq / connectHq 中通过 option 开启了额外字段(如 ReceivedTime 或 OutputElapsed),在调用 getSchema 获取建表 schema 时必须传入相同的 option,以确保目标表包含对应的扩展列。

  • 一个连接句柄可同时绑定多种行情类型对应的输出表(如同时绑定快照表、逐笔成交表等)。若收到未配置输出表的行情、未知行情结构或表结构不匹配的数据,插件会跳过写入,并将错误信息与失败计数记录在 getStatus 返回的状态中(如 failedMsgCount、lastErrMsg)。

  • SDK 回调模式由 EQ SDK 配置决定,用户无需在 DolphinDB 接口中设置。无论 SDK 使用 JSON/string 还是 binary 模式,DolphinDB 端的建表、输出表绑定、订阅和查询方式均保持一致。

  • 如果行情数据未写入、写入失败或被跳过,可先调用 getStatus 查看 lastMessage、lastErrMsg、failedMsgCount 等状态字段,再结合 DolphinDB 节点日志定位原因。

  • 使用完连接句柄后,请调用 close 关闭连接。关闭时,插件会先等待内部待写表数据写入完成,再释放连接资源。

附录

支持的行情类型与行情结构名

quoteType 行情结构名 说明
tick Snapshot_L1 Level-1 快照行情。
tick Snapshot_L2 Level-2 快照行情。
index Snapshot_Index 指数行情快照。
tick Snapshot_Future 期货行情快照。
tick Snapshot_Sgex SGEX 市场行情快照。
tick Snapshot_L2_Bond 债券 Level-2 快照行情。
tick Snapshot_L1_Bond 债券 Level-1 快照行情。
tick Snapshot_L2_Hkex 港交所 Level-2 快照行情。
tick Snapshot_Main_Hkex 港交所主推快照行情。
tick Snapshot_Nq 委托队列相关行情。
queue Snapshot_Nqzs 委托队列走势相关行情。
tick Snapshot_Cnsi CNSI 行情快照。
trade Trade 逐笔成交明细。
trade Trade_Bond 债券逐笔成交明细。
order Order 逐笔委托明细。
order Order_Bond 债券逐笔委托明细。
kl1m, kl5m, kl10m, kl15m, kl30m, kl1h, kl1D, kl1W, kl1M, kl1Y Kline K 线行情。
indic Indic_MA 移动平均线指标行情。
code, etff 无 当前没有对应结构化 schema,暂不写表。

其中,行情结构名是插件用于标识不同 EQ SDK 行情数据结构的字符串名称,例如 Snapshot_L2 表示 Level-2 快照行情,Trade 表示逐笔成交行情。getSchema 的 name 参数,以及 setOutputTable 中 outputTable 和 transform 字典的 key,均使用上表中的行情结构名。