数据结构

一、系统概述

本文主要为对接闪策回测系统的终端厂商、策略开发人员以及个人或机构投资者提供帮助指引

二、基本数据结构

2.1 timeval_t - 时间戳

高精度时间戳结构,支持纳秒级分辨率。

字段

类型

说明

sec

int32_t

自Unix(1970-01-01 00:00:00 UTC)以来的秒数

usec

unsigned int (20位)

微秒(0-999999)

nsec

unsigned int (10位)

微秒内的纳秒(0-999)

2.2 instrument_t - 合约标识符

不同市场和产品类型中的唯一标识。

字段

类型

说明

sym

uint32_t

合约符号标识符,合约的唯一数字ID

mkt

mktdest_t

市场目的地(例如:期货市场为 MKT_SHFE、MKT_CZCE、MKT_DCE、MKT_CFFEX;股票市场为 MKT_SHSE、MKT_SZSE)

prod

product_t

产品类型(PROD_STOCK=股票、PROD_FUTURE=期货、PROD_OPTION=期权等)

exp

expiry_t

到期日期(YYYYMMDD格式,仅对期货和期权有效)

strike

float

行权价格(仅对期权有效)

right

right_t

期权类型:RT_PUT(看跌)或 RT_CALL(看涨),仅对期权有效

currency

currency_t

货币类型(默认:CNY)

2.3 book_depth_level_with_num_orders - 订单簿价位

表示订单簿中的单个价格档位及其订单数量信息。

字段

类型

说明

price

double

价格档位

size

int32_t

该价格档位的总数量

num_orders

int32_t

该价格档位的订单数量

2.3 tid_t - 成交编号

委托编号结构,用于唯一标识一个委托。

字段

类型

说明

account

acct_t

委托客户账户ID

orderid

uint32_t

委托编号

2.4 message_hdr_t - 消息头

消息头结构,包含所有消息的公共元数据信息。每条消息都由消息头和消息体组成。

字段

类型

说明

source

uint32_t

消息源标识符

symbol

uint32_t

合约符号标识符

mtype

mtype_t

消息类型(见 mtype_t 枚举)

unused

uint32_t

保留字段(未使用)

time_sent

timeval_t

消息发送时间戳(UTC时间,timezone agnostic)

size

MsgSizeField_t

消息体大小(不包含消息头)

seq

uint32_t

消息序列号(用于检测消息丢失)

endian

uint32_t

字节序标识(固定值 0x01020304)

modifier

uint32_t

修饰符标志位(默认为 0)

注意: time_sent 时间是 UTC 时间,seconds since epoch,timezone agnostic。

2.5 常用枚举类型

SCOMSError - 错误码枚举

枚举值

代码

说明

SCOMS_SUCC

0

操作成功

SCOMS_ERR_UNKNOWN

1

未知错误

SCOMS_ERR_CONNECTION_FAIL

2

连接失败

SCOMS_ERR_UNSUPPORTED

3

操作不支持

SCOMS_ERR_PARAM

4

参数错误

SCOMS_ERR_NO_DATA

5

没有数据

SCOMS_ERR_NOT_LOGIN

6

未登录

mktdest_t - 目标市场

枚举值

代码

说明

MKT_UNKNOWN

0

未知交易所

MKT_SHFE

24

上海期货交易所

MKT_CZCE

27

郑州商品交易所

MKT_DCE

28

大连商品交易所

MKT_CFFEX

67

中国金融期货交易所

MKT_SHSE

80

上海证券交易所

MKT_SZSE

81

深圳证券交易所

MKT_INE

93

上海国际能源交易中心

MKT_GFEX

94

广州期货交易所

MKT_HKEX

95

香港交易所

dir_t - 订单方向

枚举值

代码

说明

BUY

0

买入订单

SELL

1

卖出订单

ETFPUR

2

ETF申购

ETFRED

3

ETF赎回

SHORT

4

卖空

DIR_INVALID

5

无效方向

side_t - 订单方向

枚举值

代码

说明

BID

0

ASK

1

SIDE_INVALID

2

无效

SIDE_BOTH

3

无效方向

product_t - 交易产品类型

枚举值

代码

说明

PROD_STOCK

0

股票

PROD_FUTURE

1

期货

PROD_OPTION

2

期权

PROD_SWAP

3

互换

PROD_SPREAD

4

价差

PROD_STRATEGY

5

策略

PROD_BOND

6

债券

PROD_WARRANT

7

权证

PROD_UNKNOWN

9

未知产品

PROD_INDEX

10

指数

PROD_EURO_OPTION

11

欧式期权

PROD_CASH

12

现金

PROD_FX

13

外汇

PROD_FORWARD

14

远期

PROD_SYM_ONLY

15

仅符号

PROD_SYM_EXP_ONLY

16

仅符号和到期日

right_t - 期权类型

枚举值

代码

说明

RT_PUT

0

看跌期权

RT_CALL

1

看涨期权

RT_UNKNOWN

2

未知期权

RT_NONE

3

非期权类型

RT_MS_PUT

4

看跌系列期权

RT_MS_CALL

5

看涨系列期权

tif_t - 有效期类型

枚举值

代码

说明

TIF_DAY

3

当日有效

TIF_IMMEDIATE_OR_CANCEL

7

立即成交否则撤销(IOC)

TIF_DO_NOT_SEND

11

不发送到交易所

ostatus_t - 订单状态

枚举值

代码

说明

STAT_NEW

0

订单已创建但未发送

STAT_TRANSIT

1

订单正在发送至交易所

STAT_OPEN

2

订单已被交易所接受

STAT_DONE

4

订单已完成(成交或已撤销)

cxlstatus_t - 撤单状态

枚举值

代码

说明

CXLSTATUS_NONE

0

无撤单请求

CXLSTATUS_PENDING

1

撤单待处理

CXLSTATUS_TRANSIT

2

撤单请求发送中

CXLSTATUS_CONFIRMED

3

撤单已确认

CXLSTATUS_REJECT

4

撤单被拒绝

oreason_t - 订单状态变化原因

基本状态原因:

枚举值

代码

说明

R_NONE

0

无特定原因

R_FILL

1

订单成交

R_CANCEL

2

订单撤销

R_REJECT

3

订单被拒绝

R_MARGIN_REJECT

4

保证金不足被拒绝(不适用于股票)

R_PARTIAL_REJECT

5

部分拒单(不适用于股票)

R_TS_REJECT

6

内部拒单,需查看日志

撤单相关拒单原因 (500-599):

枚举值

代码

说明

R_REJECT_CANCEL_UNKNOWN_ORDER

500

不认识的订单

R_REJECT_CANCEL_ORDER_IS_DONE

501

该订单状态已结束

R_REJECT_CANCEL_ALREADY_CANCELLING

502

该撤单已发送至交易所

R_REJECT_CANCEL_ORDER_IS_IOC

503

是 IOC 类型订单,不可撤单

R_REJECT_CANCEL_NOT_ALLOWED

504

不允许撤单

R_REJECT_CANCEL_ON_EXCHANGE

505

撤单被交易所拒单

交易所拒单原因 (32768-32776):

枚举值

代码

说明

R_REJECT_BY_MARKET_FLAG

32768

交易所拒单

R_REJECT_TODAY_POSITION_OFFSET

32769

平今仓持仓不足

R_REJECT_POSITION_OFFSET

32770

持仓不足

R_REJECT_MKT_NOT_TRADING

32771

闭市拒单

R_REJECT_CONFIRM_SETTLEMENT

32772

尚未确认结算单

R_REJECT_PRICE_LIMITS

32773

价格限制拒单

R_REJECT_NOT_ENOUGH_CAPITAL

32774

资金不足拒单

R_REJECT_MSG_RATE_EXCEEDED

32775

委托流速过快

R_REJECT_NO_OPEN_LIMIT

32776

超出开仓限制

oflag_t - 订单标识

订单标识用于指定订单的特殊属性,特别是期货市场的开平仓标识。

枚举值

代码

说明

OFLAG_NONE

0

无特殊标识

OFLAG_SHFE_MANUAL_OPENCLOSE

65536

手工订单,平仓时需要加上该标识

OFLAG_SHFE_CLOSEPOSITION

131072

平仓,只有上期所区分平今仓和平昨仓,其他交易所都是先开先平

OFLAG_SHFE_CLOSEPOSITIONTODAY

262144

平今,如果是 SHFE,平今仓需要用该标识

OFLAG_SHFE_PARK_ORDER

524288

预埋单

OFLAG_SHFE_MATCH_PREVENTION_CANCEL_AGGRESSOR

1048576

自成交保护撤销主动方

OFLAG_HEDGE

4194304

套保标志

使用说明:

  1. 如果要发送股票订单,定义:

    uint32_t oflags = OFLAG_NONE;
    

    Python 中也可直接使用 sc.STOCK_OPEN_CLOSE

  2. 如果要发送开仓订单,定义:

    uint32_t oflags = OFLAG_SHFE_MANUAL_OPENCLOSE;
    

    Python 中也可直接使用 sc.FUTURES_OPEN

  3. 如果要平今仓,定义:

    uint32_t oflags = OFLAG_SHFE_CLOSEPOSITIONTODAY | OFLAG_SHFE_CLOSEPOSITION | OFLAG_SHFE_MANUAL_OPENCLOSE;
    

    Python 中也可直接使用 sc.FUTURES_CLOSE_TODAY

  4. 如果要平仓或平昨仓,定义:

    uint32_t oflags = OFLAG_SHFE_CLOSEPOSITION | OFLAG_SHFE_MANUAL_OPENCLOSE;
    

    Python 中也可直接使用 sc.FUTURES_CLOSE

  5. 对于证券交易,oflags 置为 0

fillflag_t - 成交标识

成交标识用于标识成交的类型,特别是区分开仓、平今、平昨。

枚举值

代码

说明

FILLFLAG_NONE

0

开仓成交(如果对应的委托是开仓标识)

FILLFLAG_SHFE_CLOSE

1

平昨成交

FILLFLAG_SHFE_CLOSETODAY

2

平今成交

判断逻辑:

判断 fill_flags 应遵循如下步骤:

if ( td_fill_new.fill_flags & FILLFLAG_SHFE_CLOSETODAY )
    // 上期所平今
else if( td_fill_new.fill_flags & FILLFLAG_SHFE_CLOSE )
    // 上期所平昨 及 其他交易所平仓
else:
    // 开仓成交

oid_type_t - 订单ID类型

指定撤单时使用的订单ID类型。

枚举值

代码

说明

OID_TYPE_CLIENT

0

orderid 表示客户端订单ID(本连接的 orderid)

OID_TYPE_SYSTEM

1

orderid 表示系统订单ID(system_order_id 或 oms_oid)

OID_TYPE_UNKNOWN

255

未知类型

撤单方式说明:

系统支持 2 种撤单方式:

  1. 使用客户端订单ID撤单(默认): orderid 填入本连接的订单的 orderidoid_type 填入 OID_TYPE_CLIENT

  2. 使用系统订单ID撤单(跨连接撤单): orderid 填入订单的 oms_oidoid_type 填入 OID_TYPE_SYSTEM,这种方式可以实现跨连接撤单

mktstatus_t - 市场状态

市场交易状态标识。

枚举值

代码

说明

MKT_STATUS_BEFORE_TRADING

0

开盘前

MKT_STATUS_NO_TRADING

1

非交易时段

MKT_STATUS_CONTINUOUS

2

连续交易

MKT_STATUS_AUCTIONORDERING

3

集合竞价报单

MKT_STATUS_AUCTIONBALANCE

4

集合竞价价格平衡

MKT_STATUS_AUCTIONMATCH

5

集合竞价撮合

MKT_STATUS_CLOSED

6

收盘

MKT_STATUS_NUM

7

市场状态总数

三、行情数据结构

3.1 msg_sc_snapshot_data - 快照行情

包含期货和证券的快照行情数据,包括订单簿信息。

消息类型: MSG_SC_SNAPSHOT_DATA (308)

字段

类型

说明

prev_close_price

double

前收盘价

prev_settlement_price

double

前结算价(期货)

prev_open_interest

int64_t

前持仓量(期货)

open_price

double

当前交易时段开盘价

high_price

double

当前交易时段最高价

low_price

double

当前交易时段最低价

latest_price

double

最新成交价

bid

book_depth_level_with_num_orders[10]

买方订单簿(最多10档)

ask

book_depth_level_with_num_orders[10]

卖方订单簿(最多10档)

volume

int64_t

累计成交量

turnover

double

累计成交额

open_interest

int64_t

当前持仓量(期货)

close_price

double

收盘价

settlement_price

double

结算价(期货)

limit_up

double

涨停价

limit_down

double

跌停价

total_bid_vol

int64_t

所有买方档位的总委托量

total_ask_vol

int64_t

所有卖方档位的总委托量

instr

instrument_t

合约标识符

instr_str

char[32]

合约字符串表示

exch_time

timeval_t

交易所时间戳

trading_day

char[9]

交易日,YYYYMMDD格式

index_seq

uint64_t

消息排序序列号

注意:

  • 除期货快照行情外,此消息中的 index_seq 字段与对应的 msg_sc_snapshot_data_olist 匹配。

3.2 msg_sc_snapshot_data_olist - 快照委托队列数据

快照行情的配套消息,展示特定价格档位的委托队列详情。

消息类型: MSG_SC_SNAPSHOT_DATA_OLIST (309)

字段

类型

说明

bid_olist

int32_t[50]

买方委托队列,每个元素表示一笔委托数量

ask_olist

int32_t[50]

卖方委托队列,每个元素表示一笔委托数量

prices

double[2]

委托队列对应的价格档位 [0]=买方价格,[1]=卖方价格

num_order_queues

int32_t[2]

委托队列中有效条目数量 [0]=买方数量,[1]=卖方数量

instr

instrument_t

合约标识符

instr_str

char[32]

合约字符串表示

exch_time

timeval_t

交易所时间戳

trading_day

char[9]

交易日,YYYYMMDD格式

index_seq

uint64_t

与对应快照消息匹配的序列号

注意:

  • 此消息提供快照中最优买/卖价格的详细委托队列信息。index_seq 字段与对应的 msg_sc_snapshot_data 匹配。

  • 期货快照行情不存在该配套消息。

3.3 msg_sc_market_tbt - 逐笔委托数据

包含逐笔委托(下单和撤单)数据。

消息类型: MSG_SC_MARKET_TBT (310)

字段

类型

说明

order_price

double

委托价格

order_qty

int64_t

委托数量

order_no

int64_t

交易所订单编号

side

dir_t

委托方向(买/卖)

order_type

char

委托类型:’A’=新订单,’D’=撤单

price_type

char

价格类型:’1’=市价,’2’=限价,’U’=最优价

instr

instrument_t

合约标识符

instr_str

char[32]

合约字符串表示

transact_time

timeval_t

交易所交易时间戳

trading_day

char[9]

交易日,YYYYMMDD格式

3.4 msg_sc_tick_tbt - 逐笔成交数据

包含逐笔成交数据。

消息类型: MSG_SC_TICK_TBT (311)

字段

类型

说明

fill_price

double

成交价格

fill_qty

int64_t

成交数量

buy_order_no

int64_t

买方订单编号

sell_order_no

int64_t

卖方订单编号

bs_flag

char

成交方向标志(表示主动方):’B’=买方成交,’S’=卖方成交,’N’=普通成交

instr

instrument_t

合约标识符

instr_str

char[32]

合约字符串表示

transact_time

timeval_t

交易所交易时间戳

trading_day

char[9]

交易日,YYYYMMDD格式

注意:

  • 对于 SZSE 逐笔成交数据,由于交易所源行情中不披露 bs_flag 相关的内容,所以该字段统一为 'N'

3.5 msg_data_kline - K线数据

包含各种时间周期的聚合K线数据。

消息类型: MSG_DATA_KLINE (65550)

字段

类型

说明

instr

instrument_t

合约标识符

bob

timeval_t

K线开始时间戳

eob

timeval_t

K线结束时间戳

period

int32_t

K线周期(秒),例如:60=1分钟,3600=1小时

open

double

该周期开盘价

high

double

该周期最高价

low

double

该周期最低价

close

double

该周期收盘价

vwap

double

成交量加权平均价

volume

int64_t

交易时段开始至今的累计成交量

delta_volume

int64_t

本K线周期内的成交量

open_interest

int64_t

K线结束时的累计持仓量(期货)

delta_open_interest

int64_t

本K线周期内持仓量变化

turnover

double

交易时段开始至今的累计成交额

delta_turnover

double

本K线周期内的成交额

trading_day

char[8]

交易日,YYYYMMDD格式

instr_str

char[32]

合约字符串表示

四、交易数据结构

4.1 msg_oms_order_new - OMS委托下单

消息类型: MSG_OMS_ORDER_NEW (65537)

字段

类型

说明

account

acct_t

交易账户ID

instr

instrument_t

交易合约

dest

mktdest_t

市场目的地

px

double

委托价格(市价单为0)

size

int32_t

委托数量

dir

dir_t

委托方向(买入/卖出/卖空)

orderid

uint32_t

客户端分配的订单ID

tif

tif_t

有效期类型

front_end_id

uint8_t

前端系统ID

timeout

uint32_t

订单超时时间(毫秒)

client_oid

uint32_t

客户订单标识符

oflags

uint32_t

订单标志(位字段,参见 oflag_t 枚举)

cover_flag

cflag_t

备兑标志,用于备兑交易

investor

char[32]

投资者账户标识符

algo_type

char[16]

算法类型(普通订单为空)

algo_args

char[512]

算法参数,JSON或键值对格式

oms_oid

char[64]

OMS分配的唯一订单ID

parent_oms_oid

char[64]

父订单ID(用于算法执行的子订单)

market_price

double

订单提交时的市场价格

4.2 msg_oms_cancel - OMS撤单

消息类型: MSG_OMS_CANCEL (65538)

字段

类型

说明

account

acct_t

交易账户ID

symbol

symbol_t

合约符号标识符

orderid

uint32_t

要撤销的订单ID

size

int32_t

要撤销的数量(0 = 撤销所有剩余量)

oid_type

oid_type_t

订单ID类型(CLIENT 或 SYSTEM)

investor

char[32]

投资者账户标识符

oms_oid

char[64]

要撤销的OMS订单ID

algo_type

char[16]

算法类型(如适用)

4.3 msg_oms_status_change - OMS状态变化

消息类型: MSG_OMS_STATUS_CHANGE (65536)

字段

类型

说明

account

acct_t

交易账户ID

clientid

uint32_t

客户端ID

tradeid

tid_t

成交编号ID

orderid

uint32_t

订单ID

seqnum

uint32_t

序列号

instr

instrument_t

合约

oldstatus

ostatus_t

之前的订单状态

newstatus

ostatus_t

新的订单状态

reason

oreason_t

状态变化原因

cxlstatus

cxlstatus_t

撤单状态

exch_ref

uint64_t

交易所参考编号

exch_time

timeval_t

交易所时间戳

msg_nic_time

timeval_t

网卡接收时间戳

msg_recv_time

timeval_t

系统接收时间戳

risk_begin_time

timeval_t

风控检查开始时间

risk_end_time

timeval_t

风控检查结束时间

vendor_api_begin_time

timeval_t

供应商API调用开始时间

vendor_api_end_time

timeval_t

供应商API调用结束时间

order_send_time

timeval_t

订单发送时间戳

transport_cb_time

timeval_t

传输回调时间戳

select_poll_time

timeval_t

Select/poll 开始时间

select_rdy_time

timeval_t

Select/poll 就绪时间

select_rdy_cnt

uint32_t

Select 就绪计数器

actual_oflags

uint32_t

实际应用的订单标志

reject_text

char[64]

拒绝原因文本(如被拒绝)

filled_size

uint32_t

总成交数量

system_order_id

uint32_t

系统分配的订单ID

session

int32_t

交易会话ID

user

char[16]

用户标识符

gateway

char[32]

网关标识符

investor

char[32]

投资者账户标识符

oms_oid

char[64]

OMS订单ID

parent_oms_oid

char[64]

父OMS订单ID

market_price

double

状态变化时的市场价格

4.4 msg_oms_fill_new - OMS成交

消息类型: MSG_OMS_FILL_NEW (65539)

字段

类型

说明

tradeid

tid_t

成交编号ID

instr

instrument_t

合约

dest

mktdest_t

市场目的地

contra_broker

mktdest_t

对手方券商

px

double

成交价格

size

uint32_t

成交数量

dir

dir_t

成交方向(买入/卖出)

orderid

uint32_t

关联的订单ID

clientid

uint32_t

客户端ID

left

int32_t

此次成交后的剩余数量

pos

int32_t

此次成交后的当前持仓

exch_time

timeval_t

交易所执行时间戳

liquidity

liquidity_t

流动性标志(ADDED=增加流动性/REMOVED=消耗流动性/NEUTRAL=中性)

fill_flags

int32_t

成交特定标志,遵循 fillflag_t 使用方法

exch_ref

uint64_t

交易所参考编号/成交ID

fee_code

char[8]

费用代码

exch_trade_ref

char[32]

交易所成交参考字符串

session

int32_t

交易会话ID

user

char[16]

用户标识符

gateway

char[32]

网关标识符

investor

char[32]

投资者账户标识符

oms_oid

char[64]

OMS订单ID

parent_oms_oid

char[64]

父OMS订单ID

4.5 msg_oms_cancel_reject - OMS撤单拒绝

消息类型: MSG_OMS_CANCEL_REJECT (65540)

字段

类型

说明

account

acct_t

交易账户ID

symbol

symbol_t

合约符号标识符

orderid

uint32_t

撤单被拒的订单ID

reason

oreason_t

拒绝原因代码

reject_text

char[64]

可读的拒绝原因文本

investor

char[32]

投资者账户标识符

oms_oid

char[64]

OMS订单ID

algo_type

char[16]

算法类型(如适用)

五、重要说明

5.1 消息时序概况

MessageLivecycle

MessageDoneLivecycle

5.1.1 正常成交流程

  1. 发送委托: 发送 msg_oms_order_new 消息

  2. 接收确认: 收到第一条 msg_oms_status_change

    • newstatus: STAT_TRANSIT

    • oldstatus: STAT_NEW

    • 表示订单已被系统接收,正在发往交易所

  3. 交易所确认: 收到第二条 msg_oms_status_change

    • newstatus: STAT_OPEN

    • oldstatus: STAT_TRANSIT

    • 表示订单处于交易所挂单状态

  4. 成交: 收到 msg_oms_fill_new 消息(可能有多条)

    • 包含成交明细信息

    • 可以用 orderid 进行撤单

  5. 完成: 收到最后一条 msg_oms_status_change

    • newstatus: STAT_DONE

    • oldstatus: STAT_OPEN

    • reason: R_FILL(全部成交)或 R_CANCEL(部分成交后撤单)

5.1.2 撤单流程

情况1:订单已到达交易所后撤单
  1. 发送撤单: 发送 msg_oms_cancel 消息

  2. 撤单传输中: 收到第一条 msg_oms_status_change

    • newstatus: STAT_OPEN

    • oldstatus: STAT_OPEN

    • cxlstatus: CXLSTATUS_TRANSIT

    • 表示撤单请求正在发送到交易所

  3. 撤单完成: 收到第二条 msg_oms_status_change

    • newstatus: STAT_DONE

    • oldstatus: STAT_OPEN

    • reason: R_CANCEL

    • cxlstatus: CXLSTATUS_CONFIRMED(成功)或 CXLSTATUS_REJECT(被拒绝)

情况2:订单未到达交易所时撤单
  1. 发送撤单: 发送 msg_oms_cancel 消息

  2. 撤单待处理: 收到第一条 msg_oms_status_change

    • oldstatus: STAT_TRANSIT

    • newstatus: STAT_TRANSIT

    • cxlstatus: CXLSTATUS_PENDING

  3. 撤单传输中: 收到第二条 msg_oms_status_change

    • oldstatus: STAT_TRANSIT

    • newstatus: STAT_OPEN

    • cxlstatus: CXLSTATUS_TRANSIT

  4. 撤单完成: 收到第三条 msg_oms_status_change

    • oldstatus: STAT_OPEN

    • newstatus: STAT_DONE

    • reason: R_CANCEL

    • cxlstatus: CXLSTATUS_CONFIRMEDCXLSTATUS_REJECT

5.2 证券交易特殊说明

5.2.1 订单标志

证券(股票)交易时,oflags 应设置为 0。