本文介绍行情API的完整业务流程,从初始化、登录、订阅行情、到行情数据处理、查询等。
业务流程概览
典型的行情API使用流程如下:
- 创建API实例(x1::XLTQuoteApi::create)
- 配置参数(x1::XLTQuoteConfig)
- 初始化(x1::XLTQuoteApi::initialize)
- 登录(x1::XLTQuoteApi::login)
- 订阅行情(x1::XLTQuoteApi::subscribe_quote)
- 在回调中接收并处理行情数据(x1::XLTQuoteSpi::on_quote)
- 按需查询静态信息 / Level1行情 / 回补逐笔
创建与初始化
首先创建API实例,然后配置参数并初始化。API实例只能创建一次,初始化也只能调用一次。
"172.16.10.155",
"172.16.10.155"
);
MyQuoteSpi spi;
}
bool initialize(XLTQuoteConfig *quote_config, XLTQuoteSpi *quote_spi)
初始化行情,登录之前必须调用此函数,只能初始化一次
API行情配置类 用户需要在调用XLTQuoteApi::initialize方法前,创建此类实例,并设置相应的配置参数,然后将此实例传递给XLTQuoteApi::initialize方法。
定义 xlt_quote_config.h:20
void set_trading_day(uint64_t trading_day)
设置交易日,格式YYYYMMDD,如20230901
定义 xlt_quote_config.h:28
bool add_agw_addr(const char *ip_addr, uint16_t port)
添加网关地址
bool set_local_addr(const char *agw, const char *quote)
设置本地网卡IP地址
登录
登录请求为异步操作,调用 x1::XLTQuoteApi::login 发起请求后,通过 x1::XLTQuoteSpi::on_login 回调获取结果。登录成功后返回 session_id,后续所有接口调用都需要使用此 session_id。
行情API只能登录一次,如果需要重新登录,需要先调用 x1::XLTQuoteApi::logout 登出。
uint64_t request_id = 1;
uint16_t client_id = 1;
const char* account = "88888888888801";
const char* password = "12345678";
const char* pub_key = "XXXXXXXXXXXXXX";
api->
login(request_id, client_id, account, password, pub_key);
bool login(uint64_t request_id, uint16_t client_id, const char *account_name, const char *password, const char *pub_key, const xlt_user_terminal_info_t *info=nullptr)
用户行情登录请求
登录回调处理:
void MyQuoteSpi::on_login(uint64_t session_id, uint64_t request_id,
return;
}
session_id_ = session_id;
}
uint64_t error_code_type
错误类型
定义 xlt_struct.h:19
订阅行情
登录成功后,调用 x1::XLTQuoteApi::subscribe_quote 订阅行情数据。需要配置行情接收线程,每个线程可绑定CPU核心并指定负责接收的行情组播类型。
行情接收线程配置
通过 x1::quote_thread_t 结构体配置每个行情接收线程:
行情组播类型(QuoteMCType)
| 类型 | 说明 |
| XLT_SSE_L1 | Xlight上交所L1行情 |
| XLT_SZSE_L1 | Xlight深交所L1行情 |
| HPF_SSE_L2_STOCK_SNAP | 盛立上交所L2股票快照 |
| HPF_SSE_L2_STOCK_TICK | 盛立上交所L2股票逐笔 |
| HPF_SSE_L2_INDEX | 盛立上交所L2指数快照 |
| HPF_SSE_L2_BOND_SNAP | 盛立上交所L2债券快照 |
| HPF_SSE_L2_BOND_TICK | 盛立上交所L2债券逐笔 |
| HPF_SZSE_L2_STOCK_SNAP | 盛立深交所L2股票快照 |
| HPF_SZSE_L2_STOCK_TICK | 盛立深交所L2股票逐笔 |
| HPF_SZSE_L2_INDEX | 盛立深交所L2指数快照 |
| HPF_SZSE_L2_BOND_SNAP | 盛立深交所L2债券快照 |
| HPF_SZSE_L2_BOND_TICK | 盛立深交所L2债券逐笔 |
订阅示例
quote_threads[0].
mc_types[0] = QuoteMCType::XLT_SSE_L1;
quote_threads[0].
mc_types[1] = QuoteMCType::XLT_SZSE_L1;
quote_threads[1].
mc_types[0] = QuoteMCType::HPF_SSE_L2_STOCK_SNAP;
quote_threads[1].
mc_types[1] = QuoteMCType::HPF_SSE_L2_STOCK_TICK;
quote_threads[1].
mc_types[2] = QuoteMCType::HPF_SSE_L2_INDEX;
quote_threads[1].
mc_types[3] = QuoteMCType::HPF_SSE_L2_BOND_SNAP;
quote_threads[1].
mc_types[4] = QuoteMCType::HPF_SSE_L2_BOND_TICK;
quote_threads[2].
mc_types[0] = QuoteMCType::HPF_SZSE_L2_STOCK_SNAP;
quote_threads[2].
mc_types[1] = QuoteMCType::HPF_SZSE_L2_STOCK_TICK;
quote_threads[2].
mc_types[2] = QuoteMCType::HPF_SZSE_L2_INDEX;
quote_threads[2].
mc_types[3] = QuoteMCType::HPF_SZSE_L2_BOND_SNAP;
quote_threads[2].
mc_types[4] = QuoteMCType::HPF_SZSE_L2_BOND_TICK;
api->
subscribe_quote(session_id, 3, quote_threads, QuoteRxMode::RX_MODE_AUTO);
bool subscribe_quote(uint64_t session_id, uint16_t thread_count, quote_thread_t *quote_threads, QuoteRxMode rx_mode=QuoteRxMode::RX_MODE_AUTO)
订阅行情请求
QuoteMCType mc_types[64]
线程负责接收的行情组播类型列表,每个组播类型对应一条行情组播地址记录
定义 xlt_quote_define.h:31
int cpu_affinity
线程CPU亲和力设置,-1表示不设置亲和力,0表示绑定到CPU0,1表示绑定到CPU1,以此类推
定义 xlt_quote_define.h:28
uint16_t mc_count
线程负责接收的行情组播数量,决定了mc_types列表的长度
定义 xlt_quote_define.h:30
行情接收模式(QuoteRxMode)
| 模式 | 说明 |
| RX_MODE_AUTO | 自动选择,优先使用 ef_vi(Solarflare 网卡),不可用时回退到内核 socket |
| RX_MODE_SOCKET | 强制使用内核 socket 接收 |
| RX_MODE_EFVI | 强制使用 ef_vi 接收(需 Solarflare 网卡) |
行情数据接收与解码
订阅成功后,行情数据通过 x1::XLTQuoteSpi::on_quote 回调推送。回调参数为原始 UDP 包数据,需要使用解码器进行解码。
void MyQuoteSpi::on_quote(
QuoteMCType mc_type,
const void* msg_data, uint32_t msg_len) {
while ((item = decoder.get_next()) != nullptr) {
case QuoteMsgType::SSE_L1_INDEX:
break;
case QuoteMsgType::SSE_L1_SNAPSHOT:
break;
case QuoteMsgType::SZSE_L1_INDEX:
break;
case QuoteMsgType::SZSE_L1_SNAPSHOT:
break;
case QuoteMsgType::SZSE_L1_BOND_SNAPSHOT:
break;
default:
break;
}
}
const EFHQuoteItem* efh_item;
EFHQuoteDecoder efh_decoder(mc_type, msg_data, msg_len);
while ((efh_item = efh_decoder.get_next()) != nullptr) {
}
}
xlight行情解码迭代器
定义 xlt_quote_decoder.h:29
QuoteMCType
定义 xlt_quote_define.h:5
get_next 返回的行情数据项
定义 xlt_quote_decoder.h:16
QuoteMsgType data_type
数据类型,用户根据此字段选择对应结构体解析 data
定义 xlt_quote_decoder.h:17
查询
查询静态行情信息
调用 x1::XLTQuoteApi::query_static_quote_info 查询全量证券静态信息(涨跌停价、最小变动价位、委托数量限制等),结果通过 x1::XLTQuoteSpi::on_query_static_quote_info 回调返回。
bool query_static_quote_info(uint64_t session_id, uint64_t request_id)
查询静态行情信息请求
回调处理:
void MyQuoteSpi::on_query_static_quote_info(uint64_t session_id, uint64_t request_id,
for (
size_t i = 0; i < static_quotes->
data_count(); ++i) {
}
}
只读静态行情信息列表
定义 xlt_quote_list.h:10
virtual const xlt_static_quote_full_info_t * get(int i) const =0
virtual size_t data_count() const =0
股票行情全量静态信息
定义 xlt_quote_struct.h:20
查询Level1行情
查询单个证券的Level1行情:
bool query_level1_quote(uint64_t session_id, uint64_t request_id, ExchangeIndex exchange_index, const char *security_code)
查询level1行情请求
结果通过 x1::XLTQuoteSpi::on_query_level1_quote 回调返回。
查询全量Level1行情:
bool query_all_level1_quote(uint64_t session_id, uint64_t request_id)
查询全量level1行情请求
结果通过 x1::XLTQuoteSpi::on_query_all_level1_quote 回调返回,数据量较大时会分多条消息返回,通过 is_last 参数判断是否接收完毕。
回补Level2逐笔行情
如果发现行情数据缺失(如逐笔序号不连续),可调用 x1::XLTQuoteApi::request_rebuild_tick_quote 请求回补指定通道、指定序号范围的逐笔行情数据。
bool request_rebuild_tick_quote(uint64_t session_id, uint64_t request_id, const xlt_rebuild_tick_quote_req_t *request)
回补level2逐笔行情请求
重建逐笔数据请求结构体
定义 xlt_quote_struct.h:349
ExchangeIndex exchange_index
交易所代码
定义 xlt_quote_struct.h:350
int64_t begin_sequence
起始消息记录号
定义 xlt_quote_struct.h:352
int64_t end_sequence
结束消息记录号
定义 xlt_quote_struct.h:353
int16_t channel_no
频道代码
定义 xlt_quote_struct.h:351
断线处理
当连接断开时,会触发 x1::XLTQuoteSpi::on_disconnect 回调。用户需要在此回调中重新发起登录:
void MyQuoteSpi::on_disconnect(uint64_t session_id) {
}
退订行情
不再需要接收行情数据时,调用 x1::XLTQuoteApi::unsubscribe_quote 退订。退订后API会销毁所有行情接收线程并释放资源。
bool unsubscribe_quote(uint64_t session_id)
退订行情请求