amdQuote

华锐高速行情平台(Archforce Market Data)简称 AMD,是华锐提供的超高可用、超低时延的优质行情服务。DolphinDB 提供了 amdQuote 系列插件用于接收华锐 AMD 的极速行情数据,将实时行情数据便捷地接入 DolphinDB。

amdQuote 系列插件基于华锐提供的 AMD SDK 进行开发,通过实现行情的回调接口获取数据。目前支持实时获取逐笔成交委托、股票债券基金以及期货期权快照等多种品类的数据。目前,DolphinDB 根据 AMD SDK 的不同版本,分别提供以下插件:amdQuote396,amdQuote398,amdQuote401,amdQuote420,amdQuote430。

安装插件

版本要求

DolphinDB Server:2.00.10 及更高版本,支持 Linux x86-64, Linux JIT, Linux ABI。其中,分别支持的 AMD SDK 版本为:

  • Linux X86-64:3.9.6、3.9.8、4.0.1、4.2.0、4.3.0
  • Linux X86-64 ABI=1:3.9.8

在使用插件时请选择低于行情源版本的插件,否则将无法接收数据。比如行情源版本为 4.0.1,则需选择 DolphinDB amdQuote401、amdQuote398 或者 amdQuote396 插件。

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

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

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

    amdQuote 插件目前支持华锐 AMD SDK 3.9.6、3.9.8、4.0.1、4.2.0、4.3.0 版本,需要选择适用于 AMD SDK 版本的插件。

    以适配华锐 AMD SDK 4.0.1 版本的 amdQuote 插件为例:

    installPlugin("amdQuote401")
  3. 使用 loadPlugin 命令加载插件。此处的插件名为 amdQuote+版本号,例如 amdQuote401:

    loadPlugin("amdQuote401")

接口说明

connect

语法

amdQuote::connect(username, password, ips, ports, [options], [dataVersion])

详情

创建一个和 AMD 行情服务器之间的连接,返回一个句柄。

注意:如果当前已有一个 amdQuote 连接并且尚未调用 close 进行关闭,如果再次以完全相同的参数进行调用,则不会重新进行连接,而会直接返回已有连接的 handle。如果参数指定不同,则会报错,无法新建连接。此时如果需要获取已有的 AMD 行情连接句柄需要调用 getHandle 函数。

参数

username STRING 类型标量,AMD 行情服务器的用户名。

**password **STRING 类型标量,AMD 行情服务器的密码。

**ips **STRING 类型向量,AMD 行情服务器 IP 列表,需要和端口列表数量相同。

**ports **为整型向量,AMD 行情服务器端口列表,需要和 IP 列表数量相同。

**options **可选参数。是字典类型,表示扩展参数。当前支持 ReceivedTime, DailyIndex, StartTime, OutputElapsed。 其中:

  • ReceivedTime 表示是否获取插件收到行情数据的时间戳。其指定为 dict(["ReceivedTime"], [true]) 时,getSchema 获取的表结构中将包含插件收到行情数据的时间戳列。

  • DailyIndex 表示是否添加每天按 channel_no 递增的数据列,仅对 order 和 execution 类型的行情数据有效,其他类型该列均为空值。其指定为 dict(["DailyIndex"], [true]) 时,getSchema 获取的表结构中将包含插件收到行情数据的按 channel_no 递增的列。如果订阅的时间超过了 StartTime(默认为 8:40:00.0000),则置为空值。具体 StartTime 的含义见 StartTime 条目。

  • StartTime 表示每天计算的 dailyIndex 起始的时间,默认为 8:40:00.0000 。其指定为 dict(["StartTime"], [true]) 时,如果执行 amdQuote::subscribe 的服务器时间小于 StartTime,则当日的 dailyIndex 都为空值,进入第二天则从头计数,不置为空值。

  • OutputElapsed 表示是否获取 amdQuote 插件接收数据处理的时延。其指定为 dict(["OutputElapsed"], [true]) 时,getSchema 获取的表结构中将包含插件收到行情数据的时延列。

    时延的定义:'amd 回调函数返回数据' 到 '准备开始 transform' 处理,或准备 append 到共享流表前’ 这段时间。

    如果需要启用合并类型 'bondOrderExecution','orderExecution',则 ReceivedTime 和 DailyIndex 必须指定为 true。

dataVersion 可选参数,为 STRING 类型标量,默认为 "ORIGIN"。还可以指定为 "4.0.1",此时,接收数据表的 schema 对齐于华锐 4.0.1 版本 SDK 的字段。当接收 order、bondOrder 或 bondSnapshot 类型数据时,如果指定 dataVersion 为 "4.0.1" 而非 "ORIGIN",在 schema 中会多出一些字段。

注意,版本号不低于 4.0.1 的插件,即 amdQuote401 及以上版本才能 dataVersion="4.0.1"。

subscribe

语法

amdQuote::subscribe(handle, type, outputTable, marketType, [codeList], [transform], [seqCheckMode])

详情

订阅指定市场、行情数据类型和股票列表的行情数据到目标表中。

参数

handle connect 接口返回的句柄。

type STRING 类型标量,表示行情的类型,可取以下值:'snapshot'(股票快照), 'execution'(股票逐笔成交), 'order'(股票逐笔委托), 'index'(指数), 'orderQueue'(委托队列), 'fundSnapshot'(基金快照), 'fundExecution'(基金逐笔成交),'fundOrder'(基金逐笔委托),'bondSnapshot'(债券快照),'bondOrder'(债券逐笔委托),'bondExecution'(债券逐笔成交),'orderExecution'(股票基金逐笔委托、逐笔成交合并),'bondOrderExecution'(债券逐笔委托、逐笔成交合并),'option' (期权),'IOPV' ( ETF 基金份额参考净值),'future'(期货)。

注意,通过合并类型 'orderExecution','bondOrderExecution' 获取的行情数据中。第一列 SecurityID 会在末尾加上 '.SZ' 或者 '.SH'。

outputTable 如果 type 的类型不是合并类型 'bondOrderExecution','orderExecution',则表示一个 共享流表 或者 IPC 表对象, 需要在订阅前创建。该表的 schema 需要和获取的行情数据结构一致。可以通过插件提供的 getSchema 函数来获取行情数据的 schema。

如果 type 的类型是合并类型 'bondOrderExecution','orderExecution'。则该参数需要传入一个字典。字典的 key 为整型标量,指代特定的 channel,需要大于 0。字典的 value 为 共享流表、流数据引擎 或 IPC 表。流表的 schema 需要和获取的行情数据结构一致。

marketType 整型标量。表示市场类型。需要和 AMD 中定义的市场类型一致。amdQuote 插件不支持订阅全部市场,因此必须填写具体的市场代码如 101。

codeList 字符串向量,可选。表示股票列表。不传该参数表示订阅所有股票。

transform: 一元函数(其参数是一个表),可选。插入到 DolphinDB 表前对表进行转换,例如替换列。请注意,传入的一元函数中不能存在对 DFS 表的操作,例如:读取或写入 DFS 表,获取 DFS 表的 schema 等。

seqCheckMode 可选,可以为整型标量,也可以为STRING 类型标量,用于控制在数据不连续时插件接收数据的行为。在合并类型 orderExecution, bondOrderExecution 的订阅中生效。

  • seqCheckMode 为 0 或者 'check':代表在数据不连续时,停止接收数据。
  • seqCheckMode 为 1 或者 'ignoreWithLog'(默认值):代表在数据不连续时,继续接收数据,但是会输出序号跳变情况到 info 级别的 log。该选项为默认选项。
  • seqCheckMode 为 2 或者 'ignore':代表在数据不连续时,继续接收数据,且不输出任何 log。

判断是否连续的方式(随着交易所规则改变,该规则也可能发生改变):

  • 上交所:不同标的 order 和 trade 数据的 nBizIndex 共同连续递增。
  • 深交所:不同标的 order 和 trade 数据的 nBizIndex 共同连续递增。

注意

  1. 收到的数据可能已经乘了一定的倍率,插件中未作更多处理。具体字段对应倍率请查询华锐提供的官方文档。
  2. 如果未取消订阅就重新订阅某种类型的行情,该种类前一次订阅的内容会被取消,即只有最后一次订阅生效。

unsubscribe

语法

amdQuote::unsubscribe(handle, type, [marketType], [codeList])

详情

取消对行情数据的订阅。

  • 如果 type 指定为 'all',表示取消所有订阅,此时无需指定 marketTypecodeList
  • 如果 type 指定非 'all' 的值:
    • 只指定 marketType,表示取消 marketType 下的所有订阅。
    • 同时指定 marketTypecodeList,表示只取消对 codeList 的订阅。

参数

handle connect 接口返回的句柄。

type STRING 类型标量,表示行情的类型,可取以下值:'snapshot', 'execution', 'order', 'index', 'orderQueue', 'fundSnapshot', 'fundExecution', 'fundOrder', 'bondSnapshot', 'bondOrder', 'bondExecution','orderExecution','bondOrderExecution','option','IOPV','future' 和 'all'。

marketType 整型标量,表示市场类型,需要和 AMD 中定义的市场类型一致。

codeList 字符串向量,可选,表示股票列表。

close

语法

amdQuote::close(handle)

详情

关闭当前连接。通过 connect 创建连接时,插件会创建线程在内的一些资源。当用户确定不使用行情数据之后需要手动调用 close 接口释放资源。

注意 AMD 提供的 SDK 在连接时会创建一些全局变量,它们在 DolphinDB 插件内无法析构,因此用户需要尽量避免频繁连接,以免内存占用过高导致 DolphinDB 不可用。

参数

handle connect 接口返回的句柄。

getSchema

语法

amdQuote::getSchema(type)

详情

该函数应该在 connect 函数之后调用。获取行情数据的表结构。返回一个表,包含三列:name,type 和 typeInt,分别表示该行情表中字段的名字,字段类型的名称和类型的枚举值。通过该表来创建具有相同结构的共享流表。

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

  • 如果指定了 ReceivedTime 为 true,则会增加一个 NANOTIMESTAMP 类型列 receivedTime 。
  • 如果指定了 DailyIndex 为 true,则会增加一个 LONG 类型列 dailyIndex 。
  • 如果指定了 OutputElapsed 为 true,则会增加一个 LONG 类型列 perPenetrationTime 。

目前 getSchema 函数返回的个别字段的命名与行情数据中的字段名不同,使用中需要注意:

  • execution、bondExecution 类型对应行情数据的第 9 列字段名为 bidApplSeqNum,而该函数返回的字段名为 bidAppSeqNum。

参数

type STRING 类型标量,表示行情的类型,可取以下值:'snapshot', 'execution', 'order', 'index', 'orderQueue', 'fundSnapshot', 'fundExecution', 'fundOrder', 'bondSnapshot', 'bondOrder','option','IOPV','future' 和 'bondExecution','orderExecution','bondOrderExecution'。

注意 orderExecution 同时包含基金和股票数据。

getStatus

语法

amdQuote::getStatus(handle)

详情

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

列名含义类型
topicName订阅的名称STRING
startTime订阅开始的时间NANOTIMESTAMP
endTime订阅结束的时间NANOTIMESTAMP
firstMsgTime第一条消息收到的时间NANOTIMESTAMP
lastMsgTime最后一条消息收到的时间NANOTIMESTAMP
processedMsgCount已经处理的消息数LONG
lastErrMsg最后一条错误信息STRING
failedMsgCount处理失败的消息数LONG
lastFailedTimestamp最后一条错误消息发生的时间NANOTIMESTAMP

参数

handle connect 接口返回的句柄。

getHandle

语法

amdQuote::getHandle()

详情

获取当前已有的 AMD 连接句柄。如果尚未连接则抛出异常。

getCodeList

语法

amdQuote::getCodeList([market])

详情

获取当前连接下的代码表结构。

AMD SDK 版本为 3.9.6 的 amdQuote396 插件不支持该函数。

参数

market 可选,整型向量,表示需要查询的市场代码所组成的向量。如果不填写将会默认查询上交所与深交所。支持传入 0 即华锐定义的 kNone 市场类型,可以查询所有市场。

getETFCodeList

语法

amdQuote::getETFCodeList([market])

详情

获取当前连接下指定交易所的 ETF 代码表结构。

AMD SDK 版本为 3.9.6 的插件不支持该函数。

参数

market 可选,整型向量,表示需要查询的市场代码。默认值为 market=[101, 102],即上交所与深交所。注意:指定单个市场代码,也必须传入向量,例如:market=[103]。

setLogError

语法

amdQuote::setLogError(flag)

详情

开启或关闭在 log 中输出所有 error 的功能。

如果 flag 设置为 false,则同一 error 只会在第一次出现时输出,以后将不会输出。如果 flag 设置为 true,则每次遇到 error 时,就会在 log 中进行输出(由于 AMD SDK 的重连机制,开启可能导致 log 中出现大量 error 信息)

参数

**flag **布尔类型,表示是否在 log 中输出所有 error。

使用示例

  1. 使用 loadPlugin 加载插件

    loadPlugin("amdQuote401")
  2. 连接 AMD 服务器

    handle = amdQuote::connect(`admin, `123456, [`119.29.65.231], [8031], dict(["ReceivedTime"], [true]))
  3. 获取对应的表结构

    snapshotSchema = getSchema(`snapshot); 
    
    executionSchema = getSchema(`execution);
    
    orderSchema = getSchema(`order);
  4. 创建流数据表

    snapshotTable = streamTable(10000:0, snapshotSchema[`name], snapshotSchema[`type]);
    
    executionTable = streamTable(10000:0, executionSchema[`name], executionSchema[`type]);
    
    orderTable = streamTable(10000:0, orderSchema[`name], orderSchema[`type]);
  5. 共享并持久化流数据表

    enableTableShareAndPersistence(table=snapshotTable, tableName=`snapshot1, cacheSize=10000)
    
    enableTableShareAndPersistence(table=executionTable, tableName=`execution1, cacheSize=10000)
    
    enableTableShareAndPersistence(table=orderTable, tableName=`order1, cacheSize=10000)
  6. 订阅深圳市场全部股票代码

    因为 AMD API 文档中深圳市场的枚举值为 102,所以 subscribemarketType 参数指定为102。

    对应的订阅快照,逐笔成交和逐笔委托的示例为:

    amdQuote::subscribe(handle, `snapshot, snapshot1, 102) 
    
    amdQuote::subscribe(handle, `execution, execution1, 102)
    
    amdQuote::subscribe(handle, `order, order1, 102)
  7. 取消深圳市场的快照订阅

    amdQuote::unsubscribe(handle, `snapshot, 102)  

    取消逐笔成交,逐笔委托,取消全部数据的订阅分别是:

    amdQuote::unsubscribe(handle, `execution, 102) 
    
    amdQuote::unsubscribe(handle, `order, 102) 
    
    amdQuote::unsubscribe(handle, `all, 102)  
  8. 使用完成后,调用接口释放资源

    amdQuote::close(handle)