本文档介绍xlt_api的核心概念。
委托源(client_id)
client_id 是客户端标识ID,取值范围[0, 255],在登录时指定。
在本次登录session中进行的委托以及回报,系统都将打上此client_id标记,用于用户进行委托隔离。
例如,用户可以使用不同的client_id来区分不同的策略或客户端:
using namespace x1;
api->
login(request_id, 1, account_name, password, pub_key);
api->
login(request_id, 2, account_name, password, pub_key);
uint64_t xid_1 = api->
insert_order(session_id_s1, &order_info_1);
uint64_t xid_2 = api->
insert_order(session_id_s2, &order_info_2);
virtual bool login(uint64_t request_id, uint16_t client_id, const char *account_name, const char *password, const char *pub_key)=0
用户登请求
virtual uint64_t insert_order(uint64_t session_id, xlt_order_insert_info_t *order, uint64_t algo_mid=0)=0
委托
新订单请求数据结构
定义 xlt_trade_struct.h:17
后续的回报以及订单信息将带回此client_id:
订单序号(order_sequence)
默认情况下,API会自动生成订单序号,用户无需关心订单序号的生成规则。
若用户启用自定义订单序号: config.set_order_seq_self_define(true) 见 配置API ,则用户在每次下单时,必须在 x1::xlt_order_insert_info_t 或 x1::xlt_cancel_order_info_t 结构体中指定 order_sequence 字段。
用户可以通过xid获取对应订单序号
using namespace x1;
uint64_t xid = api->
insert_order(session_id, &order_insert_info);
uint64_t cancel_xid = api->
cancel_order(session_id, &cancel_order_info);
virtual uint64_t cancel_order(uint64_t session_id, xlt_cancel_order_info_t *cancel_order, uint64_t algo_mid=0)=0
撤单
static uint64_t get_order_sequence(uint64_t xid)
根据订单ID获取订单序列号
撤单请求数据结构
定义 xlt_trade_struct.h:31
uint64_t order_sequence
订单序号,当API配置中开启自定义模式时,由用户填写,session内不能重复,否则由系统生成,取值范围[1, 2^20-1]。
定义 xlt_trade_struct.h:32
uint64_t order_sequence
订单序号,当API配置中开启自定义模式时,由用户填写,session内不能重复,否则由系统生成,取值范围[1, 2^20-1]。
定义 xlt_trade_struct.h:18
重要注意事项 :
- 启用自定义订单序号后,用户必须确保每次下单时,
order_sequence 字段值唯一,否则可能导致重单,重单将没有任何响应
order_sequence 字段取值范围[1, 2^20-1]
- 启用自定义订单序号后,建议委托和撤单使用不同的订单序号分段,以便管理委托和撤单,例如委托使用1~500000,撤单使用500001~1000000
请求标识(request_id)
request_id 用于用户在异步回调中定位对应的请求。
当XLTApi接口使用到request_id时,不对request_id做任何验证及业务假设,在回调中原样返回给用户。
用户可以根据实际业务场景自定义request_id,例如使用递增的序号、时间戳等:
using namespace x1;
uint64_t next_request_id() {
static std::atomic<uint64_t> counter(0);
return ++counter;
}
uint64_t request_id = next_request_id();
api->
login(request_id, client_id, account_name, password, pub_key);
回报消息序号(sequence)
sequence 柜台对交易消息进行全局唯一递增的编号,用于用户恢复数据时续传定位。
注意订阅回报数据指定sequence,柜台会从sequence的下一个sequence开始推送。
using namespace x1;
uint64_t last_sequence;
api->
subscribe_report(global_session_id, TradeResumeType::SPECIFY, last_sequence);
virtual bool subscribe_report(uint64_t session_id, TradeResumeType resume_type, uint64_t start_sequence)=0
请求推送交易数据 每个session_id,仅第一次调用有效。
需要注意的是,回报消息sequence可能为0,此时表示快速返回交易所回报。故恢复数据断点续传时,需要根据 report_id 进行去重。
以下消息中包含sequence字段。
回报消息唯一标识(report_id)
回报消息唯一标识为report_id, 32个字节长度, 非字符串
在单个API生命周期中,API回调会保证相同report_id只回调一次,但是在异常恢复情况下,用户重拉回报需要自行与本地持久化的回报根据此report_id进行去重。
若本地没有持久化,建议重启进程时从头开始拉取回报:
以下消息中包含report_id字段。
订单超时
订单超时 是指在指定时间内未收到订单的成交回报或状态更新时触发的通知。
订单超时不代表委托失败,需要用户自行查询确认订单状态。
可以通过 x1::XLTApiConfig::set_order_timeout() 设置订单超时时间(单位:秒)。
当订单超时时,会触发 x1::XLTTradeSpi::on_order_timeout() 回调:
void MyTradeSpi::on_order_timeout(uint64_t session_id, uint64_t xid) override {
}
如果订单超时,用户可以选择调用 x1::XLTApi::resend_order_request() 接口重发订单。
重发订单,如果柜台已经处理第一次请求,重发上来的订单xid一样,会被识别为重复订单,重复订单将不会有任何响应。
请求超时
请求超时 是指查询请求在指定时间内没有收到任何响应时触发的通知。
可以通过 x1::XLTApiConfig::set_request_timeout() 设置请求超时时间(单位:秒)。
当请求超时时,会触发 x1::XLTTradeSpi::on_request_timeout() 回调:
void MyTradeSpi::on_request_timeout(uint64_t session_id, uint64_t request_id) override {
}
断线通知
当与服务器的连接异常断开时,会触发 x1::XLTTradeSpi::on_disconnect() 回调:
void MyTradeSpi::on_disconnect(uint64_t session_id) override {
}
注意:断线后需要重新调用 x1::XLTApi::login() 方法建立连接并登录。
分页查询
对于数据量较大的查询(如订单查询),API支持分页查询。
分页查询使用 x1::XLTApi::query_orders_by_page() 方法:
uint64_t request_id = next_request_id();
virtual bool query_orders_by_page(uint64_t session_id, uint64_t request_id, const xlt_query_by_page_param_t *page_query_param, uint64_t algo_mid=0)=0
分页请求查询报单
分页查询请求参数
定义 xlt_data_type.h:194
uint64_t req_count
分页查询条数,若填写小于1的值,则默认查询1条
定义 xlt_data_type.h:195
uint64_t reference
上一次收到的查询结果中带回来的索引,如果是从头查询,请置0
定义 xlt_data_type.h:196
查询结果通过 x1::XLTTradeSpi::on_query_orders_by_page() 回调返回,回调中包含 query_reference 字段,用于下一次分页查询:
void MyTradeSpi::on_query_orders_by_page(
uint64_t session_id, uint64_t request_id,
uint64_t req_count, uint64_t rsp_count,
uint64_t query_reference, bool is_last,
if (is_last && rsp_count == req_count) {
}
}
错误信息
定义 xlt_data_type.h:173
订单信息结构体
定义 xlt_trade_struct.h:114