本文介绍交易API的完整业务流程,从初始化、登录、订阅回报、到委托下单、回报处理、查询等。
业务流程概览
典型的交易API使用流程如下:
- 创建API实例(x1::XLTTradeApi::create )
- 配置参数(x1::XLTTradeConfig )
- 初始化(x1::XLTTradeApi::initialize )
- 登录(x1::XLTTradeApi::login )
- 获取日初资金/持仓(x1::XLTTradeApi::get_init_assets / x1::XLTTradeApi::get_init_positions )
- 订阅交易消息(x1::XLTTradeApi::subscribe_trade_message )
- 委托/撤单(x1::XLTTradeApi::insert_order / x1::XLTTradeApi::cancel_order )
- 在回调中处理回报(x1::XLTTradeSpi )
- 按需查询资金/持仓/订单/成交等
创建与初始化
首先创建API实例,然后配置交易参数并初始化。API实例只能创建一次,初始化也只能调用一次。
"172.16.10.155",
"172.16.10.155"
);
MyTradeSpi spi;
}
接口类
定义 xlt_trade_api.h:521
bool initialize(XLTTradeConfig *trade_config, XLTTradeSpi *trade_spi)
初始化交易,登录之前必须调用此函数,只能初始化一次
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地址
登录
登录请求为异步操作,调用 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,
return;
}
session_id_ = session_id;
}
uint64_t error_code_type
错误类型
定义 xlt_struct.h:19
获取日初数据
登录成功后,可通过同步接口直接获取日初资金和持仓,用于初始化本地状态:
if (init_positions) {
for (
size_t i = 0; i < init_positions->
data_count(); ++i) {
}
}
只读初始持仓信息列表
定义 xlt_trade_list.h:39
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 按位或组合指定:
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 :
if (xid == 0) {
} else {
}
uint64_t insert_order(uint64_t session_id, xlt_order_insert_info_t *order, uint64_t trade_token=0)
普通委托 常用业务委托接口,当前支持CASH、BOND_MATCH、PLEDGE_STYLE_REPO业务类型。 Xlight接收订单后,会在报单响应函数on_order_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 :
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)
撤单 撤单请求。支持CASH、BOND_MATCH、PLEDGE_STYLE_REPO业务类型。 如果撤单成功,会在报单响应函数on_cancel_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,
}
void MyTradeSpi::on_trade_report(uint64_t session_id,
const xlt_msg_desc_t* msg_desc,
}
void MyTradeSpi::on_cancel_response(uint64_t session_id,
const xlt_msg_desc_t* msg_desc,
}
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,
}
撤单申报成功响应
定义 xlt_trade_struct.h:94
消息推送描述信息
定义 xlt_trade_struct.h:64
订单结束通知
定义 xlt_trade_struct.h:146
申报失败响应(新订单申报失败,撤单失败)
定义 xlt_trade_struct.h:132
新订单申报成功响应
定义 xlt_trade_struct.h:73
成交回报
定义 xlt_trade_struct.h:110
查询
API提供多种查询接口,均为异步模式:发送查询请求后在对应回调中接收结果。
查询资金
bool query_assets(uint64_t session_id, uint64_t request_id, uint64_t account_index=0)
请求查询资产
结果通过 x1::XLTTradeSpi::on_query_assets 回调返回。
查询持仓
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 回调返回。
查询订单
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:366
uint64_t xid
需要查询的委托编号,如果为0则根据后续条件进行查询,如果不为0,则只查询指定订单,忽略后续查询条件
定义 xlt_trade_struct.h:367
结果通过 x1::XLTTradeSpi::on_query_orders 回调返回。
对于大量订单,建议使用分页查询 x1::XLTTradeApi::query_orders_by_page , 回调通过 x1::XLTTradeSpi::on_query_orders_by_page 返回,其中 query_reference 用于下一次分页查询定位。
查询成交
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::XLTTradeApi::query_issue_rights 和 x1::XLTTradeApi::query_allot_rights 使用相同的过滤参数:
uint64_t issue_request_id = next_request_id();
session_id, issue_request_id, "", ExchangeIndex::INIT, 0)) {
}
uint64_t allot_request_id = next_request_id();
session_id, allot_request_id, "000001", ExchangeIndex::SZ,
account_index)) {
}
bool query_allot_rights(uint64_t session_id, uint64_t request_id, const char *security_code, ExchangeIndex exchange_index=ExchangeIndex::INIT, uint64_t account_index=0)
请求查询配股配债额度
bool query_issue_rights(uint64_t session_id, uint64_t request_id, const char *security_code, ExchangeIndex exchange_index=ExchangeIndex::INIT, uint64_t account_index=0)
请求查询新股新债额度
两个查询都是异步接口。true 仅表示请求已发送;结果分别通过 x1::XLTTradeSpi::on_query_issue_rights 和 x1::XLTTradeSpi::on_query_allot_rights 返回。
新股新债查询结果
x1::XLTIssueRightsList 中的每个 x1::xlt_issue_rights_t 表示一只可申购证券:
| 字段 | 说明 |
account_index / exchange_index / security_code | 账号、市场和证券标识 |
issue_type | 1 表示新股,2 表示新债/可转债 |
issue_price | 认购价格,放大 10000 倍 |
min_price / max_price / price_unit | 价格下限、上限和最小价格变动单位,均放大 10000 倍 |
unit | 申购数量单位,委托数量应为该值的整数倍 |
qty_lower_limit / qty_upper_limit | 单笔申购数量下限和上限 |
has_right_avail / right_avail | has_right_avail 为 true 时,right_avail 才是有效的账户权益数量 |
has_tech_avail / tech_avail | has_tech_avail 为 true 时,tech_avail 才是有效的科创板可申购数量 |
布尔标志为 false 时,不应将对应的数量字段当作有效额度。
配股配债查询结果
x1::XLTAllotRightsList 中的每个 x1::xlt_allot_rights_t 包含:
| 字段 | 说明 |
account_index / exchange_index / security_code | 账号、市场和证券标识 |
allotment_price / price_unit | 配股/配债价格和最小价格变动单位,均放大 10000 倍 |
unit | 申购数量单位,委托数量应为该值的整数倍 |
initial_pos_avail | 交易日开始时的初始可配数量 |
current_available | 当前可配数量,委托前风控应使用该字段 |
security_total / security_freeze | 交易日开始时的证券总数和冻结数量 |
分批回调处理
同一个 request_id 可对应多次回调。每次回调只代表当前批次,应迭代列表的 data_count() 条数并累积结果,直到 is_last == true 才结束该查询。空结果时列表指针可为空;回调指针只在当次回调期间使用,需要异步处理时应先拷贝数据。
void MyTradeSpi::on_query_issue_rights(
uint64_t session_id, uint64_t request_id,
if (error_info &&
return;
}
if (rights_list) {
for (
size_t i = 0; i < rights_list->
data_count(); ++i) {
rights_list->
get(
static_cast<int>(i));
}
}
if (is_last) {
}
}
只读新股新债额度报信息列表
定义 xlt_trade_list.h:116
virtual size_t data_count() const =0
virtual const xlt_issue_rights_t * get(int i) const =0
uint64_t error_code
错误代码
定义 xlt_struct.h:20
新股新债权益、额度信息
定义 xlt_trade_struct.h:388
网上发行/配售业务委托
当前 x1::XLTTradeApi::insert_special_order 和 x1::XLTTradeApi::cancel_special_order 支持以下业务:
ISSUE 和 ALLOT 需使用特殊业务接口,不要改用普通 x1::XLTTradeApi::insert_order / x1::XLTTradeApi::cancel_order 流程。以新股新债查询结果构造委托的示例:
return;
}
uint64_t xid =
if (xid == 0) {
}
}
uint64_t insert_special_order(uint64_t session_id, xlt_order_insert_info_t *order, uint64_t trade_token=0)
特殊业务委托 特殊业务报单录入请求,当前支持ISSUE、ALLOT业务类型。
int64_t quantity_t
数量 类型
定义 xlt_data_type.h:27
char security_code[CONST_STR_SECURITY_CODE_LEN]
证券代码,不带空格,并以'\0'结尾,若为空表示查所有
定义 xlt_trade_struct.h:392
ExchangeIndex exchange_index
市场
定义 xlt_trade_struct.h:391
quantity_t unit
申购数量单位;委托数量应为该字段的整数倍
定义 xlt_trade_struct.h:398
price_t issue_price
认购价格,放大 10000 倍
定义 xlt_trade_struct.h:394
quantity_t qty_upper_limit
单笔申购数量上限
定义 xlt_trade_struct.h:399
quantity_t qty_lower_limit
单笔申购数量下限
定义 xlt_trade_struct.h:400
配股配债的构造方式相同,但应使用 xlt_allot_rights_t::allotment_price、unit 和 current_available,并将 business_type 设为 BusinessType::ALLOT。市场规则和柜台实时风控仍是最终判定依据,查询结果仅用于下单前预检。
委托回调和撤单
insert_special_order 返回的非 0 xid 仅表示请求已发送,不表示交易所已接受委托。特殊业务使用独立回调:
这些是消息推送回调,调用特殊业务委托前应已完成 XLTTradeApi::subscribe_trade_message。回调携带 xlt_msg_desc_t,也可通过 sequence 和 is_rebuild 进行断点恢复和去重。
uint64_t cancel_xid =
if (cancel_xid == 0) {
}
uint64_t cancel_special_order(uint64_t session_id, xlt_cancel_order_info_t *cancel_order, uint64_t trade_token=0)
撤单 特殊业务撤单请求。当前支持ISSUE、ALLOT业务类型。
如果已通过 x1::XLTTradeConfig::set_order_seq_self_define 开启自定义订单序号,特殊业务新单和撤单也必须分别填写唯一的 order_sequence。还需注意,不同市场和业务对撤单的支持可能不同,应以当日交易规则及实际回报为准。
断线处理
当连接异常断开时,会触发 x1::XLTTradeSpi::on_disconnect 回调。用户需要在此回调中重新发起登录:
void MyTradeSpi::on_disconnect(uint64_t session_id) {
}
算法母单
用户侧下算法单建议按以下流程进行:
- 登录并完成必要初始化(XLTTradeApi::login_sync 或 XLTTradeApi::login)。
- 提交算法母单创建请求(XLTTradeApi::algo_create)。
- 处理创建响应(XLTTradeSpi::on_algo_create_report),确认母单是否创建成功。
- 接收算法状态推送(XLTTradeSpi::on_algo_state),跟踪母单生命周期。
- 需要撤销时,提交控制请求(XLTTradeApi::algo_control)。
- 处理控制响应(XLTTradeSpi::on_algo_control_report),并持续以状态推送为准更新本地状态。
实践建议:
- 以
xlt_algo_id 作为母单主键管理本地上下文,避免创建/控制并发导致状态错乱。
- 创建成功后,不要仅依赖请求返回值,建议始终以
on_algo_state 作为状态收敛依据。
- 控制请求(撤销)需做幂等处理,重复请求应可安全重试。
篮子母单
篮子母单用于一次创建多个相同 algo_type 的算法母单。篮子使用统一的时间和金额等公共参数,每个母单使用独立的市场、证券代码、数量和厂商算法参数。
| 数据 | 用途 | 关键约束 |
client_basket_id | 用户自定义篮子标识 | 用于请求关联,不代替系统生成的 basket_id |
| x1::xlt_basket_algo_create_params_t | 篮子公共参数 | amount 是每个母单的金额上限,不是整个篮子的总额 |
algo_count | 篮子内母单数 | 最多 3000 个,与 algo_create_params 数组长度一致 |
| x1::xlt_algo_create_params_t 数组 | 逐母单创建参数 | 数组元素与母单一一对应 |
basket_id | 系统生成的篮子标识 | 后续篮子控制和本地状态管理的主键 |
xlt_algo_id | 系统生成的母单标识 | 篮子内每个母单各有一个,可通过 basket_id 归组 |
创建示例:
std::strcpy(basket_params.
start_time,
"09:30:00");
std::strcpy(basket_params.
end_time,
"15:00:00");
basket_params.
amount = 100000000;
constexpr uint32_t algo_count = 3;
const char* security_codes[algo_count] = {"000001", "000002", "000006"};
for (uint32_t i = 0; i < algo_count; ++i) {
std::strcpy(children[i].start_time, "09:30:00");
std::strcpy(children[i].end_time, "15:00:00");
std::strcpy(children[i].security_code, security_codes[i]);
std::strcpy(children[i].params, "{}");
}
session_id, client_basket_id, algo_type, &basket_params,
algo_count, children, trade_token, vendor_account_index);
if (basket_id == 0) {
}
uint64_t basket_algo_create(uint64_t session_id, uint64_t client_basket_id, uint64_t algo_type, xlt_basket_algo_create_params_t *basket_create_params, uint32_t algo_count, xlt_algo_create_params_t *algo_create_params, uint64_t trade_token=0, uint64_t vendor_account_index=0)
用户报篮子单请求
算法母单创建参数
定义 xlt_algo_struct.h:69
bool frozen_position
是否冻结持仓,true表示冻结quantity数量持仓,false表示不冻结;冻结持仓专供算法母单交易,若不需要冻结则填false
定义 xlt_algo_struct.h:76
ExchangeIndex exchange_index
交易市场
定义 xlt_algo_struct.h:72
quantity_t quantity
数量
定义 xlt_algo_struct.h:75
算法篮子母单创建参数
定义 xlt_algo_struct.h:182
amount_t amount
金额,放大10000倍。若设置>0,则限制算法母单的最大可用金额;若设置<=0,则不限制最大可用金额。若为T0算法,表示T0可用资金。在篮子单中,表示篮子中每个母单的amount都取此值!如篮子有10个...
定义 xlt_algo_struct.h:185
char end_time[ALGO_TIME_LEN]
算法母单结束时间,格式为HH:MM:SS,算法母单在该时间之后会停止运行
定义 xlt_algo_struct.h:184
char start_time[ALGO_TIME_LEN]
算法母单开始时间,格式为HH:MM:SS,算法母单在该时间之后才会开始运行
定义 xlt_algo_struct.h:183
basket_algo_create 返回非 0 仅表示请求已成功发送,不表示篮子或其中母单已创建成功。用户应同时处理:
- x1::XLTTradeSpi::on_basket_algo_create_report 返回篮子级创建结果,通过
error_info 判断成功与否。
- x1::XLTTradeSpi::on_algo_create_report 返回每个母单的创建结果。
- x1::XLTTradeSpi::on_algo_state 持续返回每个母单的状态;通过
state->algo_info.basket_id 归并篮子状态。
- 订阅同一账号消息的客户端还可通过 x1::XLTTradeSpi::on_basket_algo_new_create_request 和 x1::XLTTradeSpi::on_algo_new_create_request 同步篮子及逐母单请求。
篮子操作示例:
char params[] = "{}";
session_id, basket_id, client_basket_control_id,
AlgoControlType::ALGO_CONTROL_CANCEL, params, trade_token);
if (basket_control_id == 0) {
}
uint64_t basket_algo_control(uint64_t session_id, uint64_t basket_id, uint64_t client_basket_control_id, AlgoControlType control_type, char *params, uint64_t trade_token=0)
用户操作篮子单请求
basket_algo_control 会将操作应用到篮子内全部母单。返回的 basket_control_id 仅表示篮子操作请求已发送;当前没有独立的篮子操作结果回调,应使用 x1::XLTTradeSpi::on_algo_control_report 和 x1::XLTTradeSpi::on_algo_state 按 basket_id 汇总每个母单的结果。不要因为某一个母单已进入终态就将整个篮子判定为操作完成。