Xlight API用户手册 v1.6.0.23
Xlight极速柜台接口文档
载入中...
搜索中...
未找到
使用指南

本文介绍交易API的完整业务流程,从初始化、登录、订阅回报、到委托下单、回报处理、查询等。

业务流程概览

典型的交易API使用流程如下:

  1. 创建API实例(x1::XLTTradeApi::create)
  2. 配置参数(x1::XLTTradeConfig)
  3. 初始化(x1::XLTTradeApi::initialize)
  4. 登录(x1::XLTTradeApi::login)
  5. 获取日初资金/持仓(x1::XLTTradeApi::get_init_assets / x1::XLTTradeApi::get_init_positions)
  6. 订阅交易消息(x1::XLTTradeApi::subscribe_trade_message)
  7. 委托/撤单(x1::XLTTradeApi::insert_order / x1::XLTTradeApi::cancel_order)
  8. 在回调中处理回报(x1::XLTTradeSpi)
  9. 按需查询资金/持仓/订单/成交等

创建与初始化

首先创建API实例,然后配置交易参数并初始化。API实例只能创建一次,初始化也只能调用一次。

using namespace x1;
// 1. 创建API实例
XLTTradeApi* api = XLTTradeApi::create();
// 2. 配置参数
config.set_trading_day(20260402); // 设置交易日(必填)
config.set_local_addr( //(必填)设置本地网卡IP地址。生产环境中,trade对应网卡建议为solarflare网卡,solarflare网卡将自动使用ef_vi,以便达到最优的性能,非solarflare网卡则回退到内核sock模式
"172.16.10.155", // agw 连接agw的本地网卡IP,生产环境需为AGW接入网段IP
"172.16.10.155" // trade 连接快速报单的本地网卡IP,生产环境需为快速报单网段IP
);
config.add_agw_addr("192.168.5.64", 7060); // 添加AGW地址(必填,可多次调用)
config.set_order_timeout(10); // 订单超时时间,默认10秒(选填)
// 3. 初始化:传入配置和回调对象
MyTradeSpi spi; // 继承自 XLTTradeSpi 的用户实现类
if (!api->initialize(&config, &spi)) {
xlt_error_info_t err = XLTTradeApi::get_last_error();
// 处理初始化失败
}
接口类
定义 xlt_trade_api.h:305
bool initialize(XLTTradeConfig *trade_config, XLTTradeSpi *trade_spi)
初始化交易,登录之前必须调用此函数,只能初始化一次
定义 xlt_trade_config.h:16
void set_trading_day(uint64_t trading_day)
设置交易日,格式YYYYMMDD,如20230901
定义 xlt_trade_config.h:24
void set_order_timeout(uint16_t timeout)
设置订单超时时间,单位秒,建议不小于10秒
定义 xlt_trade_config.h:46
bool add_agw_addr(const char *ip_addr, uint16_t port)
添加网关地址
bool set_local_addr(const char *agw, const char *trade)
设置本地网卡IP地址
定义 xlt_data_type.h:13
错误信息
定义 xlt_struct.h:18

登录

登录请求为异步操作,调用 x1::XLTTradeApi::login 发起请求后,通过 x1::XLTTradeSpi::on_login 回调获取结果。登录成功后返回 session_id,后续所有接口调用都需要使用此 session_id

uint64_t request_id = 1;
uint16_t client_id = 99; // 委托源标识,详见"关键概念"
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 MyTradeSpi::on_login(uint64_t session_id, uint64_t request_id,
const xlt_error_info_t* error_info) {
if (error_info && error_info->error_code_type != 0) {
// 登录失败,处理错误
return;
}
// 登录成功,保存 session_id,后续接口调用都需要用到
session_id_ = session_id;
}
uint64_t error_code_type
错误类型
定义 xlt_struct.h:19

获取日初数据

登录成功后,可通过同步接口直接获取日初资金和持仓,用于初始化本地状态:

// 获取日初资金
const xlt_init_asset_info_t* init_assets = api->get_init_assets(session_id);
// 获取日初持仓列表
const XLTInitPositionList* init_positions = api->get_init_positions(session_id);
if (init_positions) {
for (size_t i = 0; i < init_positions->data_count(); ++i) {
const xlt_init_position_info_t* pos = init_positions->get(i);
// 处理每条持仓记录
}
}
只读初始持仓信息列表
定义 xlt_trade_list.h:37
virtual const xlt_init_position_info_t * get(int i) const =0
virtual size_t data_count() const =0
const XLTInitPositionList * get_init_positions(uint64_t session_id, uint64_t trade_token=0)
获取初始持仓信息
const xlt_init_asset_info_t * get_init_assets(uint64_t session_id, uint64_t trade_token=0)
获取初始资产信息
日初资金信息结构体
定义 xlt_trade_struct.h:42
日初持仓结构体
定义 xlt_trade_struct.h:51

订阅交易消息

登录成功后,需要订阅交易消息才能收到回报推送。订阅类型通过 x1::trade_message_type_t 按位或组合指定:

trade_message_type_t msg_type = TradeMessageType::REPORT | TradeMessageType::ORDER_BOOK;
api->subscribe_trade_message(session_id, request_id, msg_type, TradeResumeType::QUICK, 0);
bool subscribe_trade_message(uint64_t session_id, uint64_t request_id, trade_message_type_t trade_message_type, TradeResumeType resume_type, uint64_t start_sequence)
订阅交易数据 每个session_id,仅第一次调用有效。
uint32_t trade_message_type_t
交易消息类型
定义 xlt_trade_data_type.h:97

关于消息类型和订阅方式的详细说明,参见 消息流

委托与撤单

委托下单

填写 x1::xlt_order_insert_info_t 结构体并调用 x1::XLTTradeApi::insert_order

std::strcpy(order.security_code, "000002"); // 证券代码
order.exchange_index = ExchangeIndex::SZ; // 深交所
order.price = 90500; // 委托价格,放大10000倍(即9.05元)
order.quantity = 1000; // 委托数量
order.order_type = OrderType::LIMIT_PRICE; // 限价委托
order.side = Side::BUY; // 买入
order.business_type = BusinessType::CASH; // 现货
uint64_t xid = api->insert_order(session_id, &order);
if (xid == 0) {
// 发送失败,调用 XLTTradeApi::get_last_error() 获取原因
} else {
// 发送成功,xid 为订单标识,后续回报/撤单都通过此 xid 关联
}
uint64_t insert_order(uint64_t session_id, xlt_order_insert_info_t *order, uint64_t trade_token=0)
委托 报单录入请求,所有业务统一报单接口,根据业务类型字段区分不同业务。 Xlight接收订单后,会在报单响应函数on_order_response, on_cancel_response,...
新订单请求数据结构
定义 xlt_trade_struct.h:17
price_t price
价格放大10000倍
定义 xlt_trade_struct.h:19
BusinessType business_type
业务类型
定义 xlt_trade_struct.h:25
char security_code[CONST_STR_SECURITY_CODE_LEN]
证券代码,不带空格,并以'\0'结尾
定义 xlt_trade_struct.h:21
Side side
买卖方向
定义 xlt_trade_struct.h:24
quantity_t quantity
数量
定义 xlt_trade_struct.h:20
ExchangeIndex exchange_index
交易市场
定义 xlt_trade_struct.h:22
OrderType order_type
报单价格类型
定义 xlt_trade_struct.h:23

撤单

填写 x1::xlt_cancel_order_info_t 结构体并调用 x1::XLTTradeApi::cancel_order

cancel.origin_xid = xid; // 填写需要撤销的原订单 xid
uint64_t cancel_xid = api->cancel_order(session_id, &cancel);
if (cancel_xid == 0) {
// 撤单发送失败
}
uint64_t cancel_order(uint64_t session_id, xlt_cancel_order_info_t *cancel_order, uint64_t trade_token=0)
撤单 撤单请求。 如果撤单成功,会在报单响应函数on_cancel_response里返回原单部撤或者全撤的消息, 如果不成功,会在on_order_error_response响应函数中返回错误原因。
撤单请求数据结构
定义 xlt_trade_struct.h:31
uint64_t origin_xid
原始订单标识
定义 xlt_trade_struct.h:33

回报处理

委托/撤单发送成功后,交易系统会通过 x1::XLTTradeSpi 的推送回调返回结果。回调在独立的推送线程中触发(参见 线程模型 ),用户需要注意线程安全。

典型的回报处理流程:

// 申报成功
void MyTradeSpi::on_order_response(uint64_t session_id, const xlt_msg_desc_t* msg_desc,
const xlt_order_response_t* rsp) {
// 订单已被交易所接受,更新本地订单状态
}
// 成交回报
void MyTradeSpi::on_trade_report(uint64_t session_id, const xlt_msg_desc_t* msg_desc,
const xlt_trade_report_t* rpt) {
// 订单发生成交,更新本地成交记录、资金、持仓
}
// 撤单成功
void MyTradeSpi::on_cancel_response(uint64_t session_id, const xlt_msg_desc_t* msg_desc,
const xlt_cancel_response_t* rsp) {
// 撤单成功,更新本地订单状态
}
// 委托失败(拒单/废单/撤单失败)
void MyTradeSpi::on_order_error_response(uint64_t session_id, const xlt_msg_desc_t* msg_desc,
// 处理委托或撤单失败
}
// 订单结束(终结状态:全成/全撤/废单等)
void MyTradeSpi::on_order_end(uint64_t session_id, const xlt_msg_desc_t* msg_desc,
const xlt_order_end_t* end) {
// 订单生命周期结束
}
撤单申报成功响应
定义 xlt_trade_struct.h:93
消息推送描述信息
定义 xlt_trade_struct.h:64
订单结束通知
定义 xlt_trade_struct.h:139
申报失败响应(新订单申报失败,撤单失败)
定义 xlt_trade_struct.h:126
新订单申报成功响应
定义 xlt_trade_struct.h:73
成交回报
定义 xlt_trade_struct.h:108

查询

API提供多种查询接口,均为异步模式:发送查询请求后在对应回调中接收结果。

查询资金

api->query_assets(session_id, request_id);
bool query_assets(uint64_t session_id, uint64_t request_id, uint64_t account_index=0)
请求查询资产

结果通过 x1::XLTTradeSpi::on_query_assets 回调返回。

查询持仓

// 查询全部持仓
api->query_positions(session_id, request_id, "");
// 查询指定证券持仓
api->query_positions(session_id, request_id, "000002", ExchangeIndex::SZ);
bool query_positions(uint64_t session_id, uint64_t request_id, const char *security_code, ExchangeIndex exchange_index=ExchangeIndex::INIT, uint64_t account_index=0)
请求查询投资者持仓

结果通过 x1::XLTTradeSpi::on_query_positions 回调返回。

查询订单

// 条件查询
param.xid = 0; // 为0则按后续条件查询
api->query_orders(session_id, request_id, &param);
bool query_orders(uint64_t session_id, uint64_t request_id, const xlt_order_query_param_t *order_query_param, uint64_t account_index=0)
请求查询订单
订单查询请求-条件查询
定义 xlt_trade_struct.h:358
uint64_t xid
需要查询的委托编号,如果为0则根据后续条件进行查询,如果不为0,则只查询指定订单,忽略后续查询条件
定义 xlt_trade_struct.h:359

结果通过 x1::XLTTradeSpi::on_query_orders 回调返回。

对于大量订单,建议使用分页查询 x1::XLTTradeApi::query_orders_by_page , 回调通过 x1::XLTTradeSpi::on_query_orders_by_page 返回,其中 query_reference 用于下一次分页查询定位。

查询成交

// 查询所有成交,xid填0
api->query_trades(session_id, request_id, 0);
// 查询指定订单的成交
api->query_trades(session_id, request_id, xid);
bool query_trades(uint64_t session_id, uint64_t request_id, uint64_t xid, uint64_t account_index=0)
请求查询成交回报

结果通过 x1::XLTTradeSpi::on_query_trades 回调返回。

断线处理

当连接异常断开时,会触发 x1::XLTTradeSpi::on_disconnect 回调。用户需要在此回调中重新发起登录:

void MyTradeSpi::on_disconnect(uint64_t session_id) {
// 连接断开,需要重新调用 login() 建立连接
}