本文介绍交易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:305
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: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 按位或组合指定:
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)
委托 报单录入请求,所有业务统一报单接口,根据业务类型字段区分不同业务。 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 :
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,
}
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: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提供多种查询接口,均为异步模式:发送查询请求后在对应回调中接收结果。
查询资金
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: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 用于下一次分页查询定位。
查询成交
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) {
}