diff --git a/XTP_API_20231222_2.2.39.3/bin/include/algo_api_struct.h b/XTP_API_20231222_2.2.39.3/bin/include/algo_api_struct.h index 012e0a1..405ddca 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/algo_api_struct.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/algo_api_struct.h @@ -1,96 +1,96 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file algo_api_struct.h -///@brief 定义业务公共数据结构 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_ALGO_API_STRUCT_H_ -#define _XTP_ALGO_API_STRUCT_H_ - -#include "algo_data_type.h" -#include "xtp_api_struct_common.h" - -#pragma pack(8) - -///策略信息结构体 -typedef struct XTPStrategyInfoStruct -{ - uint16_t m_strategy_type; ///< 策略类型 - XTPStrategyStateType m_strategy_state; ///< 策略状态 - uint64_t m_client_strategy_id; ///< 客户策略id - uint64_t m_xtp_strategy_id; ///< xtp策略id -} XTPStrategyInfoStruct; - -///策略中指定证券信息结构体 -typedef struct XTPStrategySymbolInfoStruct -{ - XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - XTP_MARKET_TYPE m_market; ///< 市场 -} XTPStrategySymbolInfo; - -///策略状态结构体 -typedef struct XTPStrategyStateReportStruct -{ - XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 - int64_t m_strategy_qty; ///< 策略总量 - int64_t m_strategy_ordered_qty; ///< 策略已委托数量 - int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 - int64_t m_strategy_execution_qty; ///< 策略已成交数量 - int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) - double m_strategy_asset; ///< 策略总金额 - double m_strategy_ordered_asset; ///< 策略已委托金额 - double m_strategy_execution_asset; ///< 策略已成交金额 - double m_strategy_execution_price; ///< 策略执行价格 - double m_strategy_market_price; ///< 策略市场价 - double m_strategy_price_diff; ///< 策略执行价差 - double m_strategy_asset_diff; ///< 策略执行绩效(T0资金预净收入) - XTPRI m_error_info; ///< 错误信息 -} XTPStrategyStateReport; - -///指定策略指定证券的请求结构体 -typedef struct XTPStrategySymbolReqStruct -{ - uint64_t m_xtp_strategy_id; ///< xtp策略id - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - XTP_MARKET_TYPE m_market; ///< 市场 -} XTPStrategySymbolReq; - -///策略中指定证券的算法执行状态结构体 -typedef struct XTPStrategySymbolStateReportStruct -{ - XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - XTP_MARKET_TYPE m_market; ///< 市场 - XTP_SIDE_TYPE m_side; ///< 买卖方向,=0时为T0单 - int64_t m_strategy_qty; ///< 策略总量 - int64_t m_strategy_ordered_qty; ///< 策略已委托数量 - int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 - int64_t m_strategy_execution_qty; ///< 策略已成交数量 - int64_t m_strategy_buy_qty; ///< 策略已买入数量(T0) - int64_t m_strategy_sell_qty; ///< 策略已卖出数量(T0) - int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) - double m_strategy_asset; ///< 策略总金额 - double m_strategy_ordered_asset; ///< 策略已委托金额 - double m_strategy_execution_asset; ///< 策略已成交金额 - double m_strategy_buy_asset; ///< 策略买入金额(T0) - double m_strategy_sell_asset; ///< 策略卖出金额(TO) - double m_strategy_unclosed_asset; ///< 策略未平仓金额(T0) - double m_strategy_asset_diff; ///< 策略毛收益增强金额(T0) - double m_strategy_execution_price; ///< 策略执行价格 - double m_strategy_market_price; ///< 策略市场价 - double m_strategy_price_diff; ///< 策略执行价差(T0时为毛增强收益率) - XTPRI m_error_info; ///< 错误信息 -} XTPStrategySymbolStateReport; - -///推荐算法结构体 -typedef struct XTPStrategyRecommendationInfoStruct -{ - uint16_t m_strategy_type; ///< 策略类型 - XTP_MARKET_TYPE m_market; ///< 交易市场 - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - char m_reserved[64]; ///< 保留域 -} XTPStrategyRecommendationInfo; - -#pragma pack() - -#endif //_XTP_ALGO_API_STRUCT_H_ +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file algo_api_struct.h +///@brief 定义业务公共数据结构 +///////////////////////////////////////////////////////////////////////// +#ifndef _XTP_ALGO_API_STRUCT_H_ +#define _XTP_ALGO_API_STRUCT_H_ + +#include "algo_data_type.h" +#include "xtp_api_struct_common.h" + +#pragma pack(8) + +///策略信息结构体 +typedef struct XTPStrategyInfoStruct +{ + uint16_t m_strategy_type; ///< 策略类型 + XTPStrategyStateType m_strategy_state; ///< 策略状态 + uint64_t m_client_strategy_id; ///< 客户策略id + uint64_t m_xtp_strategy_id; ///< xtp策略id +} XTPStrategyInfoStruct; + +///策略中指定证券信息结构体 +typedef struct XTPStrategySymbolInfoStruct +{ + XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 市场 +} XTPStrategySymbolInfo; + +///策略状态结构体 +typedef struct XTPStrategyStateReportStruct +{ + XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 + int64_t m_strategy_qty; ///< 策略总量 + int64_t m_strategy_ordered_qty; ///< 策略已委托数量 + int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 + int64_t m_strategy_execution_qty; ///< 策略已成交数量 + int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) + double m_strategy_asset; ///< 策略总金额 + double m_strategy_ordered_asset; ///< 策略已委托金额 + double m_strategy_execution_asset; ///< 策略已成交金额 + double m_strategy_execution_price; ///< 策略执行价格 + double m_strategy_market_price; ///< 策略市场价 + double m_strategy_price_diff; ///< 策略执行价差 + double m_strategy_asset_diff; ///< 策略执行绩效(T0资金预净收入) + XTPRI m_error_info; ///< 错误信息 +} XTPStrategyStateReport; + +///指定策略指定证券的请求结构体 +typedef struct XTPStrategySymbolReqStruct +{ + uint64_t m_xtp_strategy_id; ///< xtp策略id + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 市场 +} XTPStrategySymbolReq; + +///策略中指定证券的算法执行状态结构体 +typedef struct XTPStrategySymbolStateReportStruct +{ + XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 市场 + XTP_SIDE_TYPE m_side; ///< 买卖方向,=0时为T0单 + int64_t m_strategy_qty; ///< 策略总量 + int64_t m_strategy_ordered_qty; ///< 策略已委托数量 + int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 + int64_t m_strategy_execution_qty; ///< 策略已成交数量 + int64_t m_strategy_buy_qty; ///< 策略已买入数量(T0) + int64_t m_strategy_sell_qty; ///< 策略已卖出数量(T0) + int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) + double m_strategy_asset; ///< 策略总金额 + double m_strategy_ordered_asset; ///< 策略已委托金额 + double m_strategy_execution_asset; ///< 策略已成交金额 + double m_strategy_buy_asset; ///< 策略买入金额(T0) + double m_strategy_sell_asset; ///< 策略卖出金额(TO) + double m_strategy_unclosed_asset; ///< 策略未平仓金额(T0) + double m_strategy_asset_diff; ///< 策略毛收益增强金额(T0) + double m_strategy_execution_price; ///< 策略执行价格 + double m_strategy_market_price; ///< 策略市场价 + double m_strategy_price_diff; ///< 策略执行价差(T0时为毛增强收益率) + XTPRI m_error_info; ///< 错误信息 +} XTPStrategySymbolStateReport; + +///推荐算法结构体 +typedef struct XTPStrategyRecommendationInfoStruct +{ + uint16_t m_strategy_type; ///< 策略类型 + XTP_MARKET_TYPE m_market; ///< 交易市场 + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + char m_reserved[64]; ///< 保留域 +} XTPStrategyRecommendationInfo; + +#pragma pack() + +#endif //_XTP_ALGO_API_STRUCT_H_ diff --git a/XTP_API_20231222_2.2.39.3/bin/include/algo_data_type.h b/XTP_API_20231222_2.2.39.3/bin/include/algo_data_type.h index 91a709e..f2922c9 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/algo_data_type.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/algo_data_type.h @@ -1,31 +1,31 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file algo_data_type.h -///@brief 定义业务公共数据结构 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_ALGO_DATA_TYPE_H_ -#define _XTP_ALGO_DATA_TYPE_H_ - -///@brief XTPStrategyStateType策略状态类型 -typedef uint8_t XTPStrategyStateType; - -///创建中 -#define XTP_STRATEGY_STATE_CREATING 0 -///已创建 -#define XTP_STRATEGY_STATE_CREATED 1 -///开始执行中 -#define XTP_STRATEGY_STATE_STARTING 2 -///已执行 -#define XTP_STRATEGY_STATE_STARTED 3 -///停止中 -#define XTP_STRATEGY_STATE_STOPPING 4 -///已停止 -#define XTP_STRATEGY_STATE_STOPPED 5 -///销毁中 -#define XTP_STRATEGY_STATE_DESTROYING 6 -///已销毁 -#define XTP_STRATEGY_STATE_DESTROYED 7 -///发生错误 -#define XTP_STRATEGY_STATE_ERROR 8 - -#endif //_XTP_ALGO_DATA_TYPE_H_ +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file algo_data_type.h +///@brief 定义业务公共数据结构 +///////////////////////////////////////////////////////////////////////// +#ifndef _XTP_ALGO_DATA_TYPE_H_ +#define _XTP_ALGO_DATA_TYPE_H_ + +///@brief XTPStrategyStateType策略状态类型 +typedef uint8_t XTPStrategyStateType; + +///创建中 +#define XTP_STRATEGY_STATE_CREATING 0 +///已创建 +#define XTP_STRATEGY_STATE_CREATED 1 +///开始执行中 +#define XTP_STRATEGY_STATE_STARTING 2 +///已执行 +#define XTP_STRATEGY_STATE_STARTED 3 +///停止中 +#define XTP_STRATEGY_STATE_STOPPING 4 +///已停止 +#define XTP_STRATEGY_STATE_STOPPED 5 +///销毁中 +#define XTP_STRATEGY_STATE_DESTROYING 6 +///已销毁 +#define XTP_STRATEGY_STATE_DESTROYED 7 +///发生错误 +#define XTP_STRATEGY_STATE_ERROR 8 + +#endif //_XTP_ALGO_DATA_TYPE_H_ diff --git a/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_fund_struct.h b/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_fund_struct.h index eb7748a..c685a70 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_fund_struct.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_fund_struct.h @@ -1,73 +1,73 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xoms_api_fund_struct.h -///@brief 定义资金划拨相关结构体类型 -///////////////////////////////////////////////////////////////////////// -#ifndef XOMS_API_FUND_STRUCT_H_ -#define XOMS_API_FUND_STRUCT_H_ - -#include "xtp_api_data_type.h" -#include "xoms_api_struct.h" -#include "xtp_api_struct_common.h" - -#pragma pack(8) - -/// 用户资金账户的密码字符串长度 -#define XTP_ACCOUNT_PASSWORD_LEN 64 - -///////////////////////////////////////////////////////////////////////// -///用户资金请求 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferReq -{ - ///资金内转编号,无需用户填写,类似于xtp_id - uint64_t serial_id; - ///资金账户代码 - char fund_account[XTP_ACCOUNT_NAME_LEN]; - ///资金账户密码 - char password[XTP_ACCOUNT_PASSWORD_LEN]; - ///金额 - double amount; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - -}; - -///////////////////////////////////////////////////////////////////////// -///用户资金划转请求的响应-复用资金通知结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferAck ; - -///////////////////////////////////////////////////////////////////////// -///用户资金查询请求结构体 -///////////////////////////////////////////////////////////////////////// -struct XTPFundQueryReq -{ - ///资金账户代码 - char fund_account[XTP_ACCOUNT_NAME_LEN]; - ///资金账户密码 - char password[XTP_ACCOUNT_PASSWORD_LEN]; - ///查询类型 - XTP_FUND_QUERY_TYPE query_type; - ///预留字段,用户无需填写 - uint64_t unknown[4]; - -}; - -///////////////////////////////////////////////////////////////////////// -///用户资金查询响应结构体 -///////////////////////////////////////////////////////////////////////// -struct XTPFundQueryRsp -{ - ///金额 - double amount; - ///查询类型 - XTP_FUND_QUERY_TYPE query_type; - ///预留字段,用户无需填写 - uint64_t unknown[4]; - -}; - -#pragma pack() - +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xoms_api_fund_struct.h +///@brief 定义资金划拨相关结构体类型 +///////////////////////////////////////////////////////////////////////// +#ifndef XOMS_API_FUND_STRUCT_H_ +#define XOMS_API_FUND_STRUCT_H_ + +#include "xtp_api_data_type.h" +#include "xoms_api_struct.h" +#include "xtp_api_struct_common.h" + +#pragma pack(8) + +/// 用户资金账户的密码字符串长度 +#define XTP_ACCOUNT_PASSWORD_LEN 64 + +///////////////////////////////////////////////////////////////////////// +///用户资金请求 +///////////////////////////////////////////////////////////////////////// +struct XTPFundTransferReq +{ + ///资金内转编号,无需用户填写,类似于xtp_id + uint64_t serial_id; + ///资金账户代码 + char fund_account[XTP_ACCOUNT_NAME_LEN]; + ///资金账户密码 + char password[XTP_ACCOUNT_PASSWORD_LEN]; + ///金额 + double amount; + ///内转类型 + XTP_FUND_TRANSFER_TYPE transfer_type; + +}; + +///////////////////////////////////////////////////////////////////////// +///用户资金划转请求的响应-复用资金通知结构体 +///////////////////////////////////////////////////////////////////////// +typedef struct XTPFundTransferNotice XTPFundTransferAck ; + +///////////////////////////////////////////////////////////////////////// +///用户资金查询请求结构体 +///////////////////////////////////////////////////////////////////////// +struct XTPFundQueryReq +{ + ///资金账户代码 + char fund_account[XTP_ACCOUNT_NAME_LEN]; + ///资金账户密码 + char password[XTP_ACCOUNT_PASSWORD_LEN]; + ///查询类型 + XTP_FUND_QUERY_TYPE query_type; + ///预留字段,用户无需填写 + uint64_t unknown[4]; + +}; + +///////////////////////////////////////////////////////////////////////// +///用户资金查询响应结构体 +///////////////////////////////////////////////////////////////////////// +struct XTPFundQueryRsp +{ + ///金额 + double amount; + ///查询类型 + XTP_FUND_QUERY_TYPE query_type; + ///预留字段,用户无需填写 + uint64_t unknown[4]; + +}; + +#pragma pack() + #endif \ No newline at end of file diff --git a/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_struct.h b/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_struct.h index cce9389..b37f48c 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_struct.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/xoms_api_struct.h @@ -1,1338 +1,1338 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xoms_api_struct.h -///@brief 定义交易类相关数据结构 -///////////////////////////////////////////////////////////////////////// -#ifndef _XOMS_API_STRUCT_H_ -#define _XOMS_API_STRUCT_H_ - -#include "xtp_api_data_type.h" -#include "stddef.h" -#include "xtp_api_struct_common.h" - -#pragma pack(8) - -//=====================客户端接口定义================================= -///新订单请求 -struct XTPOrderInsertInfo -{ - ///XTP系统订单ID,无需用户填写,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用,由客户自定义 - uint32_t order_client_id; - ///合约代码 客户端请求不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///价格 - double price; - ///止损价(保留字段) - double stop_price; - ///数量(股票单位为股,逆回购单位为张) - int64_t quantity; - ///报单价格 - XTP_PRICE_TYPE price_type; - union{ - ///32位字段,用来兼容老版本api,用户无需关心 - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - }; - - -///撤单失败响应消息 -struct XTPOrderCancelInfo -{ - ///撤单XTPID - uint64_t order_cancel_xtp_id; - ///原始订单XTPID - uint64_t order_xtp_id; -}; - - -///报单响应结构体 -struct XTPOrderInfo -{ - ///XTP系统订单ID,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用,用户自定义 - uint32_t order_client_id; - ///报单操作引用,用户自定义(暂未使用) - uint32_t order_cancel_client_id; - ///撤单在XTP系统中的id,在XTP系统中唯一 - uint64_t order_cancel_xtp_id; - ///合约代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///价格 - double price; - ///数量,此订单的报单数量 - int64_t quantity; - ///报单价格条件 - XTP_PRICE_TYPE price_type; - union{ - ///32位字段,用来兼容老版本api,用户无需关心 - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志,期权用户关注字段,其余用户填0即可 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - ///今成交数量,为此订单累计成交数量 - int64_t qty_traded; - ///剩余数量,当撤单成功时,表示撤单数量 - int64_t qty_left; - ///委托时间,格式为YYYYMMDDHHMMSSsss - int64_t insert_time; - ///最后修改时间,格式为YYYYMMDDHHMMSSsss - int64_t update_time; - ///撤销时间,格式为YYYYMMDDHHMMSSsss - int64_t cancel_time; - ///成交金额,为此订单的成交总金额 - double trade_amount; - ///本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - char order_local_id[XTP_LOCAL_ORDER_LEN]; - ///报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - XTP_ORDER_STATUS_TYPE order_status; - ///报单提交状态,OMS内部使用,用户可用此字段来区分撤单和报单 - XTP_ORDER_SUBMIT_STATUS_TYPE order_submit_status; - ///报单类型 - TXTPOrderTypeType order_type; -}; - - - -///报单响应结构体,新版本 -struct XTPOrderInfoEx -{ - ///XTP系统订单ID,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用,用户自定义 - uint32_t order_client_id; - ///报单操作引用,用户自定义(暂未使用) - uint32_t order_cancel_client_id; - ///撤单在XTP系统中的id,在XTP系统中唯一 - uint64_t order_cancel_xtp_id; - ///合约代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///价格 - double price; - ///数量,此订单的报单数量 - int64_t quantity; - ///报单价格条件 - XTP_PRICE_TYPE price_type; - union{ - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - ///今成交数量,为此订单累计成交数量 - int64_t qty_traded; - ///剩余数量,当撤单成功时,表示撤单数量 - int64_t qty_left; - ///委托时间,格式为YYYYMMDDHHMMSSsss - int64_t insert_time; - ///最后修改时间,格式为YYYYMMDDHHMMSSsss - int64_t update_time; - ///撤销时间,格式为YYYYMMDDHHMMSSsss - int64_t cancel_time; - ///成交金额,为此订单的成交总金额 - double trade_amount; - ///本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - char order_local_id[XTP_LOCAL_ORDER_LEN]; - ///报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - XTP_ORDER_STATUS_TYPE order_status; - ///报单提交状态,OMS内部使用,用户无需关心 - XTP_ORDER_SUBMIT_STATUS_TYPE order_submit_status; - ///报单类型 - TXTPOrderTypeType order_type; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///订单的错误信息 - XTPRI order_err_t; - ///保留字段 - uint64_t unknown[2]; -}; - - - -///报单成交结构体 -struct XTPTradeReport -{ - ///XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用 - uint32_t order_client_id; - ///合约代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留。 - uint64_t local_order_id; - ///成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 - char exec_id[XTP_EXEC_ID_LEN]; - ///价格,此次成交的价格 - double price; - ///数量,此次成交的数量,不是累计数量 - int64_t quantity; - ///成交时间,格式为YYYYMMDDHHMMSSsss - int64_t trade_time; - ///成交金额,此次成交的总金额 = price*quantity - double trade_amount; - ///成交序号 --回报记录号,对于单个账户来说,深交所每个平台(不同交易品种)唯一,上交所唯一,对于多账户来说,不唯一 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_type; - union{ - ///32位字段,用来兼容老版本api,用户无需关心 - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - ///交易所交易员代码 - char branch_pbu[XTP_BRANCH_PBU_LEN]; -}; - - -////////////////////////////////////////////////////////////////////////// -///报单查询 -////////////////////////////////////////////////////////////////////////// -///报单查询请求-条件查询 -struct XTPQueryOrderReq -{ - ///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报 - char ticker[XTP_TICKER_LEN]; - ///格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点 - int64_t begin_time; - ///格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - int64_t end_time; -}; - -///报单查询响应结构体 -typedef struct XTPOrderInfo XTPQueryOrderRsp; - - -///查询订单请求-分页查询 -struct XTPQueryOrderByPageReq -{ - ///需要查询的订单条数 - int64_t req_count; - ///上一次收到的查询订单结果中带回来的索引,如果是从头查询,请置0 - int64_t reference; - ///保留字段 - int64_t reserved; -}; - -////////////////////////////////////////////////////////////////////////// -///成交回报查询 -////////////////////////////////////////////////////////////////////////// -///查询成交报告请求-根据执行编号查询(保留字段) -struct XTPQueryReportByExecIdReq -{ - ///XTP订单系统ID - uint64_t order_xtp_id; - ///成交执行编号 - char exec_id[XTP_EXEC_ID_LEN]; -}; - -///查询成交回报请求-查询条件 -struct XTPQueryTraderReq -{ - ///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报 - char ticker[XTP_TICKER_LEN]; - ///开始时间,格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点 - int64_t begin_time; - ///结束时间,格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - int64_t end_time; -}; - -///成交回报查询响应结构体 -typedef struct XTPTradeReport XTPQueryTradeRsp; - -///查询成交回报请求-分页查询 -struct XTPQueryTraderByPageReq -{ - ///需要查询的成交回报条数 - int64_t req_count; - ///上一次收到的查询成交回报结果中带回来的索引,如果是从头查询,请置0 - int64_t reference; - ///保留字段 - int64_t reserved; -}; - -////////////////////////////////////////////////////////////////////////// -///账户资金查询响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryAssetRsp -{ - ///总资产(现货账户/期权账户参考公式:总资产 = 可用资金 + 证券资产(目前为0)+ 预扣的资金),(信用账户参考公式:总资产 = 可用资金 + 融券卖出所得资金余额 + 证券资产+ 预扣的资金) - double total_asset; - ///可用资金 - double buying_power; - ///证券资产(保留字段,目前为0) - double security_asset; - ///累计买入成交证券占用资金(仅限现货账户/期权账户,信用账户暂不可用) - double fund_buy_amount; - ///累计买入成交交易费用(仅限现货账户/期权账户,信用账户暂不可用) - double fund_buy_fee; - ///累计卖出成交证券所得资金(仅限现货账户/期权账户,信用账户暂不可用) - double fund_sell_amount; - ///累计卖出成交交易费用(仅限现货账户/期权账户,信用账户暂不可用) - double fund_sell_fee; - ///XTP系统预扣的资金(包括买卖股票时预扣的交易资金+预扣手续费) - double withholding_amount; - ///账户类型 - XTP_ACCOUNT_TYPE account_type; - - ///冻结的保证金(仅限期权账户) - double frozen_margin; - ///行权冻结资金(仅限期权账户) - double frozen_exec_cash; - ///行权费用(仅限期权账户) - double frozen_exec_fee; - ///垫付资金(仅限期权账户) - double pay_later; - ///预垫付资金(仅限期权账户) - double preadva_pay; - ///昨日余额(仅限期权账户) - double orig_banlance; - ///当前余额(仅限期权账户) - double banlance; - ///当天出入金(仅限期权账户) - double deposit_withdraw; - ///当日交易资金轧差(仅限期权账户) - double trade_netting; - ///资金资产(仅限期权账户) - double captial_asset; - - ///强锁资金(仅限期权账户) - double force_freeze_amount; - ///可取资金(仅限期权账户) - double preferred_amount; - - // 信用业务新增字段开始(数量1) - ///融券卖出所得资金余额(仅限信用账户,只能用于买券还券) - double repay_stock_aval_banlance; - - // 信用业务新增字段结束(数量1) - - ///累计订单流量费 - double fund_order_data_charges; - ///累计撤单流量费 - double fund_cancel_data_charges; - //流量费统计新增字段结束(数量2) - - ///交易所实时风险度(仅限期权账户,后续服务器版本支持,目前为0) - double exchange_cur_risk_degree; - ///公司实时风险度(仅限期权账户,后续服务器版本支持,目前为0) - double company_cur_risk_degree; - //风险度新增字段结束(数量2) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1 - 2 - 2]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况请求结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStkPositionReq -{ - ///证券代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStkPositionRsp -{ - ///证券代码 - char ticker[XTP_TICKER_LEN]; - ///证券名称 - char ticker_name[XTP_TICKER_NAME_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///总持仓 - int64_t total_qty; - ///可卖持仓 - int64_t sellable_qty; - ///持仓成本 - double avg_price; - ///浮动盈亏(保留字段) - double unrealized_pnl; - ///昨日持仓 - int64_t yesterday_position; - ///今日申购赎回数量(申购和赎回数量不可能同时存在,因此可以共用一个字段) - int64_t purchase_redeemable_qty; - - //以下为期权用户关心字段 - /// 持仓方向 - XTP_POSITION_DIRECTION_TYPE position_direction; - ///持仓类型(此字段所有账户都可能用到,可以用来区分股份是否为配售) - XTP_POSITION_SECURITY_TYPE position_security_type; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - //以下为现货用户关心字段 - ///盈亏成本价 - double profit_price; - ///买入成本 - double buy_cost; - ///盈亏成本 - double profit_cost; - - ///持仓市值(此字段目前只有期权账户有值,其他类型账户为0) - double market_value; - ///义务仓占用保证金(此字段目前只有期权账户有值,其他类型账户为0) - double margin; - - ///昨日买入成本 - double last_buy_cost; - ///昨日盈亏成本 - double last_profit_cost; - - ///(保留字段) - uint64_t unknown[50 - 13]; -}; - -///////////////////////////////////////////////////////////////////////// -///用户展期请求的通知 -///////////////////////////////////////////////////////////////////////// -struct XTPCreditDebtExtendNotice -{ - uint64_t xtpid; /// -#include "xtp_api_data_type.h" - -#pragma pack(8) - -///指定的合约 -typedef struct XTPSpecificTickerStruct -{ - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息)例如"600000",不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; -} XTPST; - -///股票、基金 等额外数据 -struct XTPMarketDataStockExData { - ///委托买入总量(SH,SZ) - int64_t total_bid_qty; - ///委托卖出总量(SH,SZ) - int64_t total_ask_qty; - ///加权平均委买价格(SH,SZ) - double ma_bid_price; - ///加权平均委卖价格(SH,SZ) - double ma_ask_price; - ///债券加权平均委买价格(SH) - double ma_bond_bid_price; - ///债券加权平均委卖价格(SH) - double ma_bond_ask_price; - ///债券到期收益率(SH) - double yield_to_maturity; - ///基金实时参考净值(SH,SZ) - double iopv; - ///ETF申购笔数(SH) - int32_t etf_buy_count; - ///ETF赎回笔数(SH) - int32_t etf_sell_count; - ///ETF申购数量(SH) - double etf_buy_qty; - ///ETF申购金额(SH) - double etf_buy_money; - ///ETF赎回数量(SH) - double etf_sell_qty; - ///ETF赎回金额(SH) - double etf_sell_money; - ///权证执行的总数量(SH) - double total_warrant_exec_qty; - ///权证跌停价格(元)(SH) - double warrant_lower_price; - ///权证涨停价格(元)(SH) - double warrant_upper_price; - ///买入撤单笔数(SH) - int32_t cancel_buy_count; - ///卖出撤单笔数(SH) - int32_t cancel_sell_count; - ///买入撤单数量(SH) - double cancel_buy_qty; - ///卖出撤单数量(SH) - double cancel_sell_qty; - ///买入撤单金额(SH) - double cancel_buy_money; - ///卖出撤单金额(SH) - double cancel_sell_money; - ///买入总笔数(SH) - int64_t total_buy_count; - ///卖出总笔数(SH) - int64_t total_sell_count; - ///买入委托成交最大等待时间(SH) - int32_t duration_after_buy; - ///卖出委托成交最大等待时间(SH) - int32_t duration_after_sell; - ///买方委托价位数(SH) - int32_t num_bid_orders; - ///卖方委托价位数(SH) - int32_t num_ask_orders; - - ///基金T-1日净值(SZ) - double pre_iopv; - ///预留 - int64_t r1; - ///预留 - int64_t r2; -}; - -///债券额外数据 -struct XTPMarketDataBondExData { - ///委托买入总量(SH,SZ) - int64_t total_bid_qty; - ///委托卖出总量(SH,SZ) - int64_t total_ask_qty; - ///加权平均委买价格(SZ) - double ma_bid_price; - ///加权平均委卖价格(SZ) - double ma_ask_price; - ///债券加权平均委买价格(SH) - double ma_bond_bid_price; - ///债券加权平均委卖价格(SH) - double ma_bond_ask_price; - ///债券到期收益率(SH) - double yield_to_maturity; - ///匹配成交最近价(SZ) - double match_lastpx; - ///债券加权平均价格(SH) - double ma_bond_price; - ///匹配成交成交量(SZ) - int64_t match_qty; - ///匹配成交成交金额(SZ) - double match_turnover; - ///预留 - double r4; - ///预留 - double r5; - ///预留 - double r6; - ///预留 - double r7; - ///预留 - double r8; - ///买入撤单笔数(SH) - int32_t cancel_buy_count; - ///卖出撤单笔数(SH) - int32_t cancel_sell_count; - ///买入撤单数量(SH) - double cancel_buy_qty; - ///卖出撤单数量(SH) - double cancel_sell_qty; - ///买入撤单金额(SH) - double cancel_buy_money; - ///卖出撤单金额(SH) - double cancel_sell_money; - ///买入总笔数(SH) - int64_t total_buy_count; - ///卖出总笔数(SH) - int64_t total_sell_count; - ///买入委托成交最大等待时间(SH) - int32_t duration_after_buy; - ///卖出委托成交最大等待时间(SH) - int32_t duration_after_sell; - ///买方委托价位数(SH) - int32_t num_bid_orders; - ///卖方委托价位数(SH) - int32_t num_ask_orders; - ///时段(SHL2),L1快照数据没有此字段,具体字段说明参阅《上海新债券Level2行情说明.doc》文档 - char instrument_status[8]; -}; - -/// 期权额外数据 -struct XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -///////////////////////////////////////////////////////////////////////// -///@brief XTP_MARKETDATA_TYPE是行情快照数据类型,2.2.32以前版本所用 -///////////////////////////////////////////////////////////////////////// -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///////////////////////////////////////////////////////////////////////// -///@brief XTP_MARKETDATA_TYPE_V2是行情快照数据类型,2.2.32版本新增字段 -///////////////////////////////////////////////////////////////////////// -enum XTP_MARKETDATA_TYPE_V2 { - XTP_MARKETDATA_V2_INDEX = 0, // 指数 - XTP_MARKETDATA_V2_OPTION = 1, // 期权 - XTP_MARKETDATA_V2_ACTUAL = 2, // 现货(股票/基金等) - XTP_MARKETDATA_V2_BOND = 3, // 债券 -}; - -///行情 -typedef struct XTPMarketDataStruct -{ - // 代码 - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - - // 价格 - ///最新价 - double last_price; - ///昨收盘 - double pre_close_price; - ///今开盘 - double open_price; - ///最高价 - double high_price; - ///最低价 - double low_price; - ///今收盘 - double close_price; - - // 期权数据 - ///昨日持仓量(张)(目前未填写) - int64_t pre_total_long_positon; - ///持仓量(张) - int64_t total_long_positon; - ///昨日结算价(SH) - double pre_settl_price; - ///今日结算价(SH) - double settl_price; - - // 涨跌停 - ///涨停价 - double upper_limit_price; - ///跌停价 - double lower_limit_price; - ///预留 - double pre_delta; - ///预留 - double curr_delta; - - /// 时间类,格式为YYYYMMDDHHMMSSsss - int64_t data_time; - - // 量额数据 - ///数量,为总成交量(单位股,与交易所一致) - int64_t qty; - ///成交金额,为总成交金额(单位元,与交易所一致) - double turnover; - ///预留(无意义) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明,参阅《XTP API常见问题.doc》文档 - char ticker_status[8]; - - //对于新三板行情来说,以下结构和字段均无效 - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - XTPMarketDataBondExData bond; - } ; - ///决定了union是哪种数据类型 (2.2.32版本以前所用字段,仅为了保持兼容,不建议使用该字段) - XTP_MARKETDATA_TYPE data_type; - ///决定了union是哪种数据类型(2.2.32版本新增字段,更详细区分了行情快照数据类型) - XTP_MARKETDATA_TYPE_V2 data_type_v2; -} XTPMD; - -///IOPV信息 -struct IOPV { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - /// 时间 - int64_t data_time; - /// iopv值 - double iopv; -}; - -///股票行情静态信息 -typedef struct XTPQuoteStaticInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - /// 合约名称 - char ticker_name[XTP_TICKER_NAME_LEN]; - /// 合约类型 - XTP_TICKER_TYPE ticker_type; - ///昨收盘 - double pre_close_price; - ///涨停板价 - double upper_limit_price; - ///跌停板价 - double lower_limit_price; - ///最小变动价位 - double price_tick; - /// 合约最小交易量(买) - int32_t buy_qty_unit; - /// 合约最小交易量(卖) - int32_t sell_qty_unit; -} XTPQSI; - - -///订单薄 -typedef struct OrderBookStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - - ///最新价 - double last_price; - ///数量,为总成交量 - int64_t qty; - ///成交金额,为总成交金额 - double turnover; - ///成交笔数 - int64_t trades_count; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - /// 时间类 - int64_t data_time; -} XTPOB; - -////////////////////////////////// 逐笔数据 - - -///逐笔委托 -struct XTPTickByTickEntrust { - ///频道代码 - int32_t channel_no; - ///SH: 委托序号(委托单独编号, 同一channel_no内连续) - ///SZ: 委托序号(委托成交统一编号, 同一channel_no内连续) - int64_t seq; - ///委托价格 - double price; - ///SH: 剩余委托数量(balance) - ///SZ: 委托数量 - int64_t qty; - ///SH: 'B':买; 'S':卖 - ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///SH: 'A': 增加; 'D': 删除 - ///SZ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; - ///SH: 原始订单号 - ///SZ: 无意义 - int64_t order_no; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///SH: 成交序号(成交单独编号, 同一channel_no内连续) - ///SZ: 成交序号(委托成交统一编号, 同一channel_no内连续) - int64_t seq; - ///成交价格 - double price; - ///成交量 - int64_t qty; - ///成交金额(仅适用上交所) - double money; - ///买方订单号 - int64_t bid_no; - ///卖方订单号 - int64_t ask_no; - /// SH: 内外盘标识('B':主动买; 'S':主动卖; 'N':未知) - /// SZ: 成交标识('4':撤; 'F':成交) - char trade_flag; -}; - -///逐笔状态订单 -struct XTPTickByTickStatus { - ///频道代码 - int32_t channel_no; - ///同一channel_no内连续 - int64_t seq; - ///状态信息 - char flag[8]; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - /// SH: 业务序号(委托成交统一编号,同一个channel_no内连续,此seq区别于联合体内的seq,channel_no等同于联合体内的channel_no) - /// SZ: 无意义 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - XTPTickByTickStatus state; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -///股票行情全量静态信息 -typedef struct XTPQuoteFullInfo { - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char ticker[XTP_TICKER_LEN]; ///<证券代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 - XTP_SECURITY_TYPE security_type; ///<合约详细类型 - XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 - bool is_registration; ///<是否注册制(仅适用创业板股票,创新企业股票及存托凭证) - bool is_VIE; ///<是否具有协议控制架构(仅适用创业板股票,创新企业股票及存托凭证) - bool is_noprofit; ///<是否尚未盈利(仅适用创业板股票,创新企业股票及存托凭证) - bool is_weighted_voting_rights; ///<是否存在投票权差异(仅适用创业板股票,创新企业股票及存托凭证) - bool is_have_price_limit; ///<是否有涨跌幅限制(注:不提供具体幅度,可通过涨跌停价和昨收价来计算幅度) - double upper_limit_price; ///<涨停价(仅在有涨跌幅限制时有效) - double lower_limit_price; ///<跌停价(仅在有涨跌幅限制时有效) - double pre_close_price; ///<昨收价 - double price_tick; ///<价格最小变动价位 - int32_t bid_qty_upper_limit; ///<限价买委托数量上限 - int32_t bid_qty_lower_limit; ///<限价买委托数量下限 - int32_t bid_qty_unit; ///<限价买数量单位 - int32_t ask_qty_upper_limit; ///<限价卖委托数量上限 - int32_t ask_qty_lower_limit; ///<限价卖委托数量下限 - int32_t ask_qty_unit; ///<限价卖数量单位 - int32_t market_bid_qty_upper_limit; ///<市价买委托数量上限 - int32_t market_bid_qty_lower_limit; ///<市价买委托数量下限 - int32_t market_bid_qty_unit; ///<市价买数量单位 - int32_t market_ask_qty_upper_limit; ///<市价卖委托数量上限 - int32_t market_ask_qty_lower_limit; ///<市价卖委托数量上限 - int32_t market_ask_qty_unit; ///<市价卖数量单位 - XTP_SECURITY_STATUS security_status; ///<证券状态 - uint32_t unknown1; ///<保留字段 - uint64_t unknown[3]; ///<保留字段 - -}XTPQFI; - -///新三板全量静态信息 -typedef struct XTPQuoteNQFullInfo { - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char ticker[XTP_TICKER_LEN]; ///<证券代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 - XTP_SECURITY_TYPE security_type; ///<合约详细类型,目前均为255 - XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 - char ticker_abbr_en[XTP_TICKER_NAME_LEN]; ///<英文简称 - char base_ticker[XTP_TICKER_LEN]; ///<基础证券 - char industry_type[6]; ///<行业种类 - char currency_type[3]; ///<货币种类 - int32_t trade_unit; ///<交易单位 - int32_t hang_out_date; ///<挂牌日期 - int32_t value_date; ///<起息日期 - int32_t maturity_date; ///<到期日 - int32_t per_limit_vol; ///<每笔限量 - int32_t buy_vol_unit; ///<买数量单位 - int32_t sell_vol_unit; ///<卖数量单位 - int32_t mini_declared_vol; ///<最小申报数量 - int32_t limit_price_attr; ///<限价参数性质 - int32_t market_maker_quantity; ///<做市商数量 - double price_gear; ///<价格档位 - double first_limit_trans; ///<首笔交易限价参数 - double subsequent_limit_trans; ///<后续交易限价参数 - double limit_upper_price; ///<涨停价格 - double limit_lower_price; ///<跌停价格 - double block_trade_upper; ///<大宗交易价格上限(预留,默认0) - double block_trade_lower; ///<大宗交易价格下限(预留,默认0) - double convert_into_ration; ///<折合比例 - XTP_TRADE_STATUS trade_status : 8; ///<交易状态 - XTP_SECURITY_LEVEL security_level : 8; ///<证券级别 - XTP_TRADE_TYPE trade_type : 8; ///<交易类型 - XTP_SUSPEND_FLAG suspend_flag : 8; ///<停牌标志 - XTP_EX_DIVIDEND_FLAG ex_dividend_flag : 8; ///<除权除息标志 - XTP_SECURITY_LAYER_TYPE layer_type : 8; ///<分层信息 - int32_t reserved1 : 16; ///<保留字段 - char trade_places[3]; ///<交易场所 预留 - char is_rzbd; ///<是否融资标的 Y是 N否 - char is_rqbd; ///<是否融券标的 Y是 N否 - char is_drrz; ///<是否当日可融资 Y是 N否 - char is_drrq; ///<是否当日可融券 Y是 N否 - char reserved; ///<保留字段 - uint64_t unknown[3]; ///<保留字段 -}XTPNQFI; - - -#pragma pack() - -#endif +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xquote_api_struct.h +///@brief 定义行情类相关数据结构 +///////////////////////////////////////////////////////////////////////// +#ifndef _XQUOTE_API_STRUCT_H_ +#define _XQUOTE_API_STRUCT_H_ + +#include +#include "xtp_api_data_type.h" + +#pragma pack(8) + +///指定的合约 +typedef struct XTPSpecificTickerStruct +{ + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息)例如"600000",不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; +} XTPST; + +///股票、基金 等额外数据 +struct XTPMarketDataStockExData { + ///委托买入总量(SH,SZ) + int64_t total_bid_qty; + ///委托卖出总量(SH,SZ) + int64_t total_ask_qty; + ///加权平均委买价格(SH,SZ) + double ma_bid_price; + ///加权平均委卖价格(SH,SZ) + double ma_ask_price; + ///债券加权平均委买价格(SH) + double ma_bond_bid_price; + ///债券加权平均委卖价格(SH) + double ma_bond_ask_price; + ///债券到期收益率(SH) + double yield_to_maturity; + ///基金实时参考净值(SH,SZ) + double iopv; + ///ETF申购笔数(SH) + int32_t etf_buy_count; + ///ETF赎回笔数(SH) + int32_t etf_sell_count; + ///ETF申购数量(SH) + double etf_buy_qty; + ///ETF申购金额(SH) + double etf_buy_money; + ///ETF赎回数量(SH) + double etf_sell_qty; + ///ETF赎回金额(SH) + double etf_sell_money; + ///权证执行的总数量(SH) + double total_warrant_exec_qty; + ///权证跌停价格(元)(SH) + double warrant_lower_price; + ///权证涨停价格(元)(SH) + double warrant_upper_price; + ///买入撤单笔数(SH) + int32_t cancel_buy_count; + ///卖出撤单笔数(SH) + int32_t cancel_sell_count; + ///买入撤单数量(SH) + double cancel_buy_qty; + ///卖出撤单数量(SH) + double cancel_sell_qty; + ///买入撤单金额(SH) + double cancel_buy_money; + ///卖出撤单金额(SH) + double cancel_sell_money; + ///买入总笔数(SH) + int64_t total_buy_count; + ///卖出总笔数(SH) + int64_t total_sell_count; + ///买入委托成交最大等待时间(SH) + int32_t duration_after_buy; + ///卖出委托成交最大等待时间(SH) + int32_t duration_after_sell; + ///买方委托价位数(SH) + int32_t num_bid_orders; + ///卖方委托价位数(SH) + int32_t num_ask_orders; + + ///基金T-1日净值(SZ) + double pre_iopv; + ///预留 + int64_t r1; + ///预留 + int64_t r2; +}; + +///债券额外数据 +struct XTPMarketDataBondExData { + ///委托买入总量(SH,SZ) + int64_t total_bid_qty; + ///委托卖出总量(SH,SZ) + int64_t total_ask_qty; + ///加权平均委买价格(SZ) + double ma_bid_price; + ///加权平均委卖价格(SZ) + double ma_ask_price; + ///债券加权平均委买价格(SH) + double ma_bond_bid_price; + ///债券加权平均委卖价格(SH) + double ma_bond_ask_price; + ///债券到期收益率(SH) + double yield_to_maturity; + ///匹配成交最近价(SZ) + double match_lastpx; + ///债券加权平均价格(SH) + double ma_bond_price; + ///匹配成交成交量(SZ) + int64_t match_qty; + ///匹配成交成交金额(SZ) + double match_turnover; + ///预留 + double r4; + ///预留 + double r5; + ///预留 + double r6; + ///预留 + double r7; + ///预留 + double r8; + ///买入撤单笔数(SH) + int32_t cancel_buy_count; + ///卖出撤单笔数(SH) + int32_t cancel_sell_count; + ///买入撤单数量(SH) + double cancel_buy_qty; + ///卖出撤单数量(SH) + double cancel_sell_qty; + ///买入撤单金额(SH) + double cancel_buy_money; + ///卖出撤单金额(SH) + double cancel_sell_money; + ///买入总笔数(SH) + int64_t total_buy_count; + ///卖出总笔数(SH) + int64_t total_sell_count; + ///买入委托成交最大等待时间(SH) + int32_t duration_after_buy; + ///卖出委托成交最大等待时间(SH) + int32_t duration_after_sell; + ///买方委托价位数(SH) + int32_t num_bid_orders; + ///卖方委托价位数(SH) + int32_t num_ask_orders; + ///时段(SHL2),L1快照数据没有此字段,具体字段说明参阅《上海新债券Level2行情说明.doc》文档 + char instrument_status[8]; +}; + +/// 期权额外数据 +struct XTPMarketDataOptionExData { + ///波段性中断参考价(SH) + double auction_price; + ///波段性中断集合竞价虚拟匹配量(SH) + int64_t auction_qty; + ///最近询价时间(SH) + int64_t last_enquiry_time; +}; + +///////////////////////////////////////////////////////////////////////// +///@brief XTP_MARKETDATA_TYPE是行情快照数据类型,2.2.32以前版本所用 +///////////////////////////////////////////////////////////////////////// +enum XTP_MARKETDATA_TYPE { + XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) + XTP_MARKETDATA_OPTION = 1, // 期权 +}; + +///////////////////////////////////////////////////////////////////////// +///@brief XTP_MARKETDATA_TYPE_V2是行情快照数据类型,2.2.32版本新增字段 +///////////////////////////////////////////////////////////////////////// +enum XTP_MARKETDATA_TYPE_V2 { + XTP_MARKETDATA_V2_INDEX = 0, // 指数 + XTP_MARKETDATA_V2_OPTION = 1, // 期权 + XTP_MARKETDATA_V2_ACTUAL = 2, // 现货(股票/基金等) + XTP_MARKETDATA_V2_BOND = 3, // 债券 +}; + +///行情 +typedef struct XTPMarketDataStruct +{ + // 代码 + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + + // 价格 + ///最新价 + double last_price; + ///昨收盘 + double pre_close_price; + ///今开盘 + double open_price; + ///最高价 + double high_price; + ///最低价 + double low_price; + ///今收盘 + double close_price; + + // 期权数据 + ///昨日持仓量(张)(目前未填写) + int64_t pre_total_long_positon; + ///持仓量(张) + int64_t total_long_positon; + ///昨日结算价(SH) + double pre_settl_price; + ///今日结算价(SH) + double settl_price; + + // 涨跌停 + ///涨停价 + double upper_limit_price; + ///跌停价 + double lower_limit_price; + ///预留 + double pre_delta; + ///预留 + double curr_delta; + + /// 时间类,格式为YYYYMMDDHHMMSSsss + int64_t data_time; + + // 量额数据 + ///数量,为总成交量(单位股,与交易所一致) + int64_t qty; + ///成交金额,为总成交金额(单位元,与交易所一致) + double turnover; + ///预留(无意义) + double avg_price; + + // 买卖盘 + ///十档申买价 + double bid[10]; + ///十档申卖价 + double ask[10]; + ///十档申买量 + int64_t bid_qty[10]; + ///十档申卖量 + int64_t ask_qty[10]; + + // 额外数据 + ///成交笔数 + int64_t trades_count; + ///当前交易状态说明,参阅《XTP API常见问题.doc》文档 + char ticker_status[8]; + + //对于新三板行情来说,以下结构和字段均无效 + ///数据 + union { + XTPMarketDataStockExData stk; + XTPMarketDataOptionExData opt; + XTPMarketDataBondExData bond; + } ; + ///决定了union是哪种数据类型 (2.2.32版本以前所用字段,仅为了保持兼容,不建议使用该字段) + XTP_MARKETDATA_TYPE data_type; + ///决定了union是哪种数据类型(2.2.32版本新增字段,更详细区分了行情快照数据类型) + XTP_MARKETDATA_TYPE_V2 data_type_v2; +} XTPMD; + +///IOPV信息 +struct IOPV { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 时间 + int64_t data_time; + /// iopv值 + double iopv; +}; + +///股票行情静态信息 +typedef struct XTPQuoteStaticInfo { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 合约名称 + char ticker_name[XTP_TICKER_NAME_LEN]; + /// 合约类型 + XTP_TICKER_TYPE ticker_type; + ///昨收盘 + double pre_close_price; + ///涨停板价 + double upper_limit_price; + ///跌停板价 + double lower_limit_price; + ///最小变动价位 + double price_tick; + /// 合约最小交易量(买) + int32_t buy_qty_unit; + /// 合约最小交易量(卖) + int32_t sell_qty_unit; +} XTPQSI; + + +///订单薄 +typedef struct OrderBookStruct { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + + ///最新价 + double last_price; + ///数量,为总成交量 + int64_t qty; + ///成交金额,为总成交金额 + double turnover; + ///成交笔数 + int64_t trades_count; + + // 买卖盘 + ///十档申买价 + double bid[10]; + ///十档申卖价 + double ask[10]; + ///十档申买量 + int64_t bid_qty[10]; + ///十档申卖量 + int64_t ask_qty[10]; + /// 时间类 + int64_t data_time; +} XTPOB; + +////////////////////////////////// 逐笔数据 + + +///逐笔委托 +struct XTPTickByTickEntrust { + ///频道代码 + int32_t channel_no; + ///SH: 委托序号(委托单独编号, 同一channel_no内连续) + ///SZ: 委托序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///委托价格 + double price; + ///SH: 剩余委托数量(balance) + ///SZ: 委托数量 + int64_t qty; + ///SH: 'B':买; 'S':卖 + ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 + char side; + ///SH: 'A': 增加; 'D': 删除 + ///SZ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 + char ord_type; + ///SH: 原始订单号 + ///SZ: 无意义 + int64_t order_no; +}; + +///逐笔成交 +struct XTPTickByTickTrade { + ///频道代码 + int32_t channel_no; + ///SH: 成交序号(成交单独编号, 同一channel_no内连续) + ///SZ: 成交序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///成交价格 + double price; + ///成交量 + int64_t qty; + ///成交金额(仅适用上交所) + double money; + ///买方订单号 + int64_t bid_no; + ///卖方订单号 + int64_t ask_no; + /// SH: 内外盘标识('B':主动买; 'S':主动卖; 'N':未知) + /// SZ: 成交标识('4':撤; 'F':成交) + char trade_flag; +}; + +///逐笔状态订单 +struct XTPTickByTickStatus { + ///频道代码 + int32_t channel_no; + ///同一channel_no内连续 + int64_t seq; + ///状态信息 + char flag[8]; +}; + +///逐笔数据信息 +typedef struct XTPTickByTickStruct { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// SH: 业务序号(委托成交统一编号,同一个channel_no内连续,此seq区别于联合体内的seq,channel_no等同于联合体内的channel_no) + /// SZ: 无意义 + int64_t seq; + ///委托时间 or 成交时间 + int64_t data_time; + ///委托 or 成交 + XTP_TBT_TYPE type; + + union { + XTPTickByTickEntrust entrust; + XTPTickByTickTrade trade; + XTPTickByTickStatus state; + }; +} XTPTBT; + + +///供查询的最新信息 +typedef struct XTPTickerPriceInfo { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + ///最新价 + double last_price; +} XTPTPI; + +///股票行情全量静态信息 +typedef struct XTPQuoteFullInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + XTP_SECURITY_TYPE security_type; ///<合约详细类型 + XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 + bool is_registration; ///<是否注册制(仅适用创业板股票,创新企业股票及存托凭证) + bool is_VIE; ///<是否具有协议控制架构(仅适用创业板股票,创新企业股票及存托凭证) + bool is_noprofit; ///<是否尚未盈利(仅适用创业板股票,创新企业股票及存托凭证) + bool is_weighted_voting_rights; ///<是否存在投票权差异(仅适用创业板股票,创新企业股票及存托凭证) + bool is_have_price_limit; ///<是否有涨跌幅限制(注:不提供具体幅度,可通过涨跌停价和昨收价来计算幅度) + double upper_limit_price; ///<涨停价(仅在有涨跌幅限制时有效) + double lower_limit_price; ///<跌停价(仅在有涨跌幅限制时有效) + double pre_close_price; ///<昨收价 + double price_tick; ///<价格最小变动价位 + int32_t bid_qty_upper_limit; ///<限价买委托数量上限 + int32_t bid_qty_lower_limit; ///<限价买委托数量下限 + int32_t bid_qty_unit; ///<限价买数量单位 + int32_t ask_qty_upper_limit; ///<限价卖委托数量上限 + int32_t ask_qty_lower_limit; ///<限价卖委托数量下限 + int32_t ask_qty_unit; ///<限价卖数量单位 + int32_t market_bid_qty_upper_limit; ///<市价买委托数量上限 + int32_t market_bid_qty_lower_limit; ///<市价买委托数量下限 + int32_t market_bid_qty_unit; ///<市价买数量单位 + int32_t market_ask_qty_upper_limit; ///<市价卖委托数量上限 + int32_t market_ask_qty_lower_limit; ///<市价卖委托数量上限 + int32_t market_ask_qty_unit; ///<市价卖数量单位 + XTP_SECURITY_STATUS security_status; ///<证券状态 + uint32_t unknown1; ///<保留字段 + uint64_t unknown[3]; ///<保留字段 + +}XTPQFI; + +///新三板全量静态信息 +typedef struct XTPQuoteNQFullInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + XTP_SECURITY_TYPE security_type; ///<合约详细类型,目前均为255 + XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 + char ticker_abbr_en[XTP_TICKER_NAME_LEN]; ///<英文简称 + char base_ticker[XTP_TICKER_LEN]; ///<基础证券 + char industry_type[6]; ///<行业种类 + char currency_type[3]; ///<货币种类 + int32_t trade_unit; ///<交易单位 + int32_t hang_out_date; ///<挂牌日期 + int32_t value_date; ///<起息日期 + int32_t maturity_date; ///<到期日 + int32_t per_limit_vol; ///<每笔限量 + int32_t buy_vol_unit; ///<买数量单位 + int32_t sell_vol_unit; ///<卖数量单位 + int32_t mini_declared_vol; ///<最小申报数量 + int32_t limit_price_attr; ///<限价参数性质 + int32_t market_maker_quantity; ///<做市商数量 + double price_gear; ///<价格档位 + double first_limit_trans; ///<首笔交易限价参数 + double subsequent_limit_trans; ///<后续交易限价参数 + double limit_upper_price; ///<涨停价格 + double limit_lower_price; ///<跌停价格 + double block_trade_upper; ///<大宗交易价格上限(预留,默认0) + double block_trade_lower; ///<大宗交易价格下限(预留,默认0) + double convert_into_ration; ///<折合比例 + XTP_TRADE_STATUS trade_status : 8; ///<交易状态 + XTP_SECURITY_LEVEL security_level : 8; ///<证券级别 + XTP_TRADE_TYPE trade_type : 8; ///<交易类型 + XTP_SUSPEND_FLAG suspend_flag : 8; ///<停牌标志 + XTP_EX_DIVIDEND_FLAG ex_dividend_flag : 8; ///<除权除息标志 + XTP_SECURITY_LAYER_TYPE layer_type : 8; ///<分层信息 + int32_t reserved1 : 16; ///<保留字段 + char trade_places[3]; ///<交易场所 预留 + char is_rzbd; ///<是否融资标的 Y是 N否 + char is_rqbd; ///<是否融券标的 Y是 N否 + char is_drrz; ///<是否当日可融资 Y是 N否 + char is_drrq; ///<是否当日可融券 Y是 N否 + char reserved; ///<保留字段 + uint64_t unknown[3]; ///<保留字段 +}XTPNQFI; + + +#pragma pack() + +#endif diff --git a/XTP_API_20231222_2.2.39.3/bin/include/xtp_api_data_type.h b/XTP_API_20231222_2.2.39.3/bin/include/xtp_api_data_type.h index c49b0d1..7407997 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/xtp_api_data_type.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/xtp_api_data_type.h @@ -1,739 +1,739 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 每个PBU最多被10个TGW使用。 -#define MAX_TGW_CNT_PER_PBU 10 - -/// 存放版本号的字符串长度 -#define XTP_VERSION_LEN 16 -/// 版本号类型 -typedef char XTPVersionType[XTP_VERSION_LEN]; -/// 可交易日字符串长度 -#define XTP_TRADING_DAY_LEN 9 -/// 存放证券代码的字符串长度 -#define XTP_TICKER_LEN 16 -/// 存放证券名称的字符串长度 -#define XTP_TICKER_NAME_LEN 64 -/// 本地报单编号的字符串长度 -#define XTP_LOCAL_ORDER_LEN 11 -/// 交易所单号的字符串长度 -#define XTP_ORDER_EXCH_LEN 17 -/// 成交执行编号的字符串长度 -#define XTP_EXEC_ID_LEN 18 -/// 交易所交易员代码字符串长度 -#define XTP_BRANCH_PBU_LEN 7 -/// 用户资金账户的字符串长度 -#define XTP_ACCOUNT_NAME_LEN 16 -/// 信用业务合约负债编号长度 -#define XTP_CREDIT_DEBT_ID_LEN 33 -/// IP地址的字符串长度 -#define XTP_INET_ADDRESS_STR_LEN 64 -/// MAC地址的字符串长度 -#define XTP_MAC_ADDRESS_LEN 16 -/// 硬盘序列号的字符串长度 -#define XTP_HARDDISK_SN_LEN 24 -/// MacOS系统序列号的字符串长度 -#define XTP_MACOS_SNO_LEN 21 - -/// 期权组合策略最多腿数 -#define XTP_STRATEGE_LEG_NUM 4 -/// 期权组合策略代码字符串长度 -#define XTP_STRATEGY_ID_LEN 10 -/// 期权组合策略名称字符串长度 -#define XTP_STRATEGY_NAME_LEN 32 -/// 期权组合策略组合编码字符串长度 -#define XTP_SECONDARY_ORDER_ID_LEN 18 - -/// 期权合约可支持的组合策略列表字符串长度 -#define XTP_CNTRT_COMB_STRA_LIST_LEN 2048 - -/// 期权行权合并最多成分合约数量 -#define XTP_COMBINED_EXECUTION_LEG_NUM 2 - -///////////////////////////////////////////////////////////////////////// -///@brief XTP_LOG_LEVEL是日志输出级别类型 -///////////////////////////////////////////////////////////////////////// -typedef enum XTP_LOG_LEVEL { - XTP_LOG_LEVEL_FATAL, ///<严重错误级别 - XTP_LOG_LEVEL_ERROR, ///<错误级别 - XTP_LOG_LEVEL_WARNING, ///<警告级别 - XTP_LOG_LEVEL_INFO, /// -#endif - -#include "xtp_api_data_type.h" - -#pragma pack(8) - -///错误信息的字符串长度 -#define XTP_ERR_MSG_LEN 124 -///响应信息 -typedef struct XTPRspInfoStruct -{ - ///错误代码 - int32_t error_id; - ///错误信息 - char error_msg[XTP_ERR_MSG_LEN]; -} XTPRI; - -#pragma pack() - -#endif // !_XTP_API_STRUCT_COMMON_H_ +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xtp_api_struct_common.h +///@brief 定义业务公共数据结构 +///////////////////////////////////////////////////////////////////////// + +#ifndef _XTP_API_STRUCT_COMMON_H_ +#define _XTP_API_STRUCT_COMMON_H_ + +#if defined(_MSC_VER) && _MSC_VER<1600 +typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; +#else +#include +#endif + +#include "xtp_api_data_type.h" + +#pragma pack(8) + +///错误信息的字符串长度 +#define XTP_ERR_MSG_LEN 124 +///响应信息 +typedef struct XTPRspInfoStruct +{ + ///错误代码 + int32_t error_id; + ///错误信息 + char error_msg[XTP_ERR_MSG_LEN]; +} XTPRI; + +#pragma pack() + +#endif // !_XTP_API_STRUCT_COMMON_H_ diff --git a/XTP_API_20231222_2.2.39.3/bin/include/xtp_quote_api.h b/XTP_API_20231222_2.2.39.3/bin/include/xtp_quote_api.h index 79829ce..ef1890a 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/xtp_quote_api.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/xtp_quote_api.h @@ -1,528 +1,528 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_quote_api.h -///@brief 定义行情订阅客户端接口 -///////////////////////////////////////////////////////////////////////// - -#ifndef _XTP_QUOTE_API_H_ -#define _XTP_QUOTE_API_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "xtp_api_struct.h" - -#if defined(ISLIB) && defined(WIN32) -#ifdef LIB_MD_API_EXPORT -#define MD_API_EXPORT __declspec(dllexport) -#else -#define MD_API_EXPORT __declspec(dllimport) -#endif -#else -#define MD_API_EXPORT -#endif - -/*! -* \class XTP::API::QuoteSpi -* -* \brief 行情回调类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - class QuoteSpi - { - public: - - ///当客户端与行情后台通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。可以在此函数中调用Login重新登录。注意用户重新登录后,需要重新订阅行情 - virtual void OnDisconnected(int reason) {}; - - - ///错误应答 - ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 - virtual void OnError(XTPRI *error_info) {}; - - ///逐笔丢包应答 - ///@param begin_seq 当逐笔出现丢包时,丢包区间下限(可能与上限一致) - ///@param end_seq 当逐笔出现丢包时,丢包区间上限(可能与下限一致) - ///@remark 此函数只有在逐笔发生丢包时才会有调用,如果丢包的上下限一致,表示仅丢失了一个包,注意此包仅为数据包,包含1个或者多个逐笔数据 - virtual void OnTickByTickLossRange(int begin_seq, int end_seq) {}; - - ///订阅行情应答,包括股票、指数和期权 - ///@param ticker 详细的合约订阅情况 - ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///退订行情应答,包括股票、指数和期权 - ///@param ticker 详细的合约取消订阅情况 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///深度行情通知,包含买一卖一队列 - ///@param market_data 行情数据 - ///@param bid1_qty 买一队列数据 - ///@param bid1_count 买一队列的有效委托笔数,即bid1_qty数组的长度,最大为50 - ///@param max_bid1_count 买一队列总委托笔数 - ///@param ask1_qty 卖一队列数据 - ///@param ask1_count 卖一队列的有效委托笔数,即ask1_qty数组的长度,最大为50 - ///@param max_ask1_count 卖一队列总委托笔数 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) {}; - - /// ETF的IOPV通知 - /// @param iopv ETF的参考单位基金净值数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnETFIOPVData(IOPV *iopv) {}; - - ///订阅行情订单簿应答,包括股票、债券 - ///@param ticker 详细的合约订阅情况 - ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///退订行情订单簿应答,包括股票、债券 - ///@param ticker 详细的合约取消订阅情况 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///行情订单簿通知,包括股票、债券 - ///@param order_book 行情订单簿数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnOrderBook(XTPOB *order_book) {}; - - ///订阅逐笔行情应答,包括股票、债券 - ///@param ticker 详细的合约订阅情况 - ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///退订逐笔行情应答,包括股票、债券 - ///@param ticker 详细的合约取消订阅情况 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///逐笔行情通知,包括股票、债券 - ///@param tbt_data 逐笔行情数据,包括逐笔委托和逐笔成交,此为共用结构体,需要根据type来区分是逐笔委托还是逐笔成交,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnTickByTick(XTPTBT *tbt_data) {}; - - ///订阅全市场的股票行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的股票行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的股票行情订单簿应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的股票行情订单簿应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的股票逐笔行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的股票逐笔行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - - ///查询合约部分静态信息的应答 - ///@param ticker_info 合约部分静态信息 - ///@param error_info 查询合约部分静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询合约部分静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///查询合约的最新价格信息应答 - ///@param ticker_info 合约的最新价格信息 - ///@param error_info 查询合约的最新价格信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///订阅全市场的期权行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的期权行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的期权行情订单簿应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的期权行情订单簿应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的期权逐笔行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的期权逐笔行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///查询沪深2市合约完整静态信息的应答 - ///@param ticker_info 合约完整静态信息 - ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryAllTickersFullInfo(XTPQFI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///查询新三板合约完整静态信息的应答 - ///@param ticker_info 合约完整静态信息 - ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///当客户端与回补行情服务器通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。回补服务器会在无消息交互后会定时断线,请注意仅在需要回补数据时才保持连接,无回补需求时,无需登陆。 - virtual void OnRebuildQuoteServerDisconnected(int reason) {}; - - ///请求回补指定频道的逐笔行情的总体结果应答 - ///@param rebuild_result 当回补结束时被调用,如果回补结果失败,则msg参数表示失败原因 - ///@remark 需要快速返回,仅在回补数据发送结束后调用,如果请求数据太多,一次性无法回补完,那么rebuild_result.result_code = XTP_REBUILD_RET_PARTLY,此时需要根据回补结果继续发起回补数据请求 - virtual void OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) {}; - - ///回补的逐笔行情数据 - ///@param tbt_data 回补的逐笔行情数据 - ///@remark 需要快速返回,此函数调用与OnTickByTick不在一个线程内,会在OnRequestRebuildQuote()之前回调 - virtual void OnRebuildTickByTick(XTPTBT *tbt_data) {}; - - ///回补的快照行情数据 - ///@param md_data 回补的快照行情数据 - ///@remark 需要快速返回,此函数调用与OnDepthMarketData不在一个线程内,会在OnRequestRebuildQuote()之前回调 - virtual void OnRebuildMarketData(XTPMD *md_data) {}; - - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility push(default) -#endif -#endif - -/*! -* \class XTP::API::QuoteApi -* -* \brief 行情订阅接口类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - class MD_API_EXPORT QuoteApi - { - public: - ///创建QuoteApi - ///@param client_id (必须输入)用于区分同一用户的不同客户端,由用户自定义 - ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个有可写权限的真实存在的路径,如果路径不存在的话,可能会因为写冲突而造成断线 - ///@param log_level 日志输出级别 - ///@return 创建出的UserApi - ///@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接 - static QuoteApi *CreateQuoteApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level=XTP_LOG_LEVEL_DEBUG); - - ///删除接口对象本身 - ///@remark 不再使用本接口对象时,调用该函数删除接口对象 - virtual void Release() = 0; - - - ///获取当前交易日 - ///@return 获取到的交易日 - ///@remark 只有登录成功后,才能得到正确的交易日 - virtual const char *GetTradingDay() = 0; - - ///获取API的发行版本号 - ///@return 返回api发行版本号 - virtual const char* GetApiVersion() = 0; - - ///获取API的系统错误 - ///@return 返回的错误信息,可以在Login、Logout、订阅、取消订阅失败时调用,获取失败的原因 - ///@remark 可以在调用api接口失败时调用,例如login失败时 - virtual XTPRI *GetApiLastError() = 0; - - ///设置采用UDP方式连接时的单个队列接收缓冲区大小,目前可能最大使用4个缓冲区队列 - ///@remark 需要在Login之前调用,默认大小和最小设置均为64MB。此缓存大小单位为MB,请输入2的次方数,例如128MB请输入128。 - virtual void SetUDPBufferSize(uint32_t buff_size) = 0; - - - ///注册回调接口 - ///@param spi 派生自回调接口类的实例,请在登录之前设定 - virtual void RegisterSpi(QuoteSpi *spi) = 0; - - ///设置心跳检测时间间隔,单位为秒 - ///@param interval 心跳检测时间间隔,单位为秒 - ///@remark 此函数必须在Login之前调用 - virtual void SetHeartBeatInterval(uint32_t interval) = 0; - - ///使用UDP接收行情时,设置接收行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPRecvThreadAffinityArray函数 - ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu - ///@remark 此版本不建议使用,请替换使用SetUDPRecvThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPRecvThreadAffinityArray一起使用时,仅第一个被调用的生效 - virtual void SetUDPRecvThreadAffinity(int32_t cpu_no) = 0; - - ///使用UDP接收行情时,设置接收行情线程绑定的cpu集合 - ///@param cpu_no_array 设置绑定的cpu集合数组 - ///@param count cpu集合数组长度 - ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 - virtual void SetUDPRecvThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; - - ///使用UDP接收行情时,设置解析行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPParseThreadAffinityArray函数 - ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu - ///@remark 此版本不建议使用,请替换使用SetUDPParseThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPParseThreadAffinityArray一起使用时,仅第一个被调用的生效 - virtual void SetUDPParseThreadAffinity(int32_t cpu_no) = 0; - - ///使用UDP接收行情时,设置解析行情线程绑定的cpu集合 - ///@param cpu_no_array 设置绑定的cpu集合数组 - ///@param count cpu集合数组长度 - ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 - virtual void SetUDPParseThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; - - ///设定UDP收行情时是否输出异步日志 - ///@param flag 是否输出标识,默认为true,如果不想输出“udpseq”开头的异步日志,请设置此参数为false - ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 - virtual void SetUDPSeqLogOutPutFlag(bool flag = true) = 0; - - ///订阅行情,包括股票、指数、期权、债券等。 - ///@return 订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 - virtual int SubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///退订行情,包括股票、指数、期权、债券等。 - ///@return 取消订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情接口配套使用 - virtual int UnSubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///订阅行情订单簿,包括股票、债券等。(新三板暂不支持) - ///@return 订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情(仅支持深交所) - virtual int SubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///退订行情订单簿,包括股票、债券等。(新三板暂不支持) - ///@return 取消订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情订单簿接口配套使用 - virtual int UnSubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///订阅逐笔行情,包括股票、债券等。(新三板暂不支持) - ///@return 订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 - virtual int SubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///退订逐笔行情,包括股票、债券等。(新三板暂不支持) - ///@return 取消订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅逐笔行情接口配套使用 - virtual int UnSubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///订阅全市场的股票、债券、指数等行情 - ///@return 订阅全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订行情接口配套使用 - virtual int SubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的股票、债券、指数等行情 - ///@return 退订全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场行情接口配套使用 - virtual int UnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的股票、债券等行情订单簿(新三板暂不支持) - ///@return 订阅全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订行情订单簿接口配套使用 - virtual int SubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的股票、债券等行情订单簿(新三板暂不支持) - ///@return 退订全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场行情订单簿接口配套使用 - virtual int UnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的股票、债券等逐笔行情(新三板暂不支持) - ///@return 订阅全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订逐笔行情接口配套使用 - virtual int SubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的股票、债券等逐笔行情(新三板暂不支持) - ///@return 退订全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场逐笔行情接口配套使用 - virtual int UnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///用户登录请求 - ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 - ///@param ip 服务器ip地址,类似“127.0.0.1” - ///@param port 服务器端口号 - ///@param user 登陆用户名 - ///@param password 登陆密码 - ///@param sock_type “1”代表TCP,“2”代表UDP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取沪深2市当前交易日合约部分静态信息 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 - virtual int QueryAllTickers(XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///获取合约的最新价格信息 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要查询的合约个数 - ///@param exchange_id 交易所代码 - virtual int QueryTickersPriceInfo(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///获取所有合约的最新价格信息 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - virtual int QueryAllTickersPriceInfo() = 0; - - ///订阅全市场的期权行情(目前暂无此数据) - ///@return 订阅全市期权场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订期权行情接口配套使用 - virtual int SubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的期权行情(目前暂无此数据) - ///@return 退订全市场期权行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场期权行情接口配套使用 - virtual int UnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的期权行情订单簿(目前暂无此数据) - ///@return 订阅全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订期权行情订单簿接口配套使用 - virtual int SubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的期权行情订单簿(目前暂无此数据) - ///@return 退订全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场期权行情订单簿接口配套使用 - virtual int UnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的期权逐笔行情(目前暂无此数据) - ///@return 订阅全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订期权逐笔行情接口配套使用 - virtual int SubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的期权逐笔行情(目前暂无此数据) - ///@return 退订全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///获取沪深2市所有合约的详细静态信息,包括指数等非可交易的,不包括新三板 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 - virtual int QueryAllTickersFullInfo(XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///获取新三板所有合约的详细静态信息,包括指数等非可交易的 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - virtual int QueryAllNQTickersFullInfo() = 0; - - ///用户登录回补服务器请求 - ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 - ///@param ip 服务器ip地址,类似“127.0.0.1” - ///@param port 服务器端口号 - ///@param user 登陆用户名 - ///@param password 登陆密码 - ///@param sock_type “1”代表TCP,“2”代表UDP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接。回补服务器会在无消息交互后定时断线,请注意仅在需要回补数据时才保持连接,回补完成后请及时logout - virtual int LoginToRebuildQuoteServer(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - ///登出回补服务器请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int LogoutFromRebuildQuoteServer() = 0; - - ///请求回补指定行情,包括快照和逐笔 - ///@return 请求回补指定频道的逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param rebuild_param 指定回补的参数信息,注意一次性回补最多1000个数据,超过1000需要分批次请求,一次只能指定一种类型的数据 - ///@remark 仅在逐笔行情丢包时或者确实快照行情时使用,回补的行情数据将从OnRebuildTickByTick或者OnRebuildMarketData()接口回调提供,与订阅的行情数据不在同一个线程内 - virtual int RequestRebuildQuote(XTPQuoteRebuildReq* rebuild_param) = 0; - - - protected: - ~QuoteApi() {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xtp_quote_api.h +///@brief 定义行情订阅客户端接口 +///////////////////////////////////////////////////////////////////////// + +#ifndef _XTP_QUOTE_API_H_ +#define _XTP_QUOTE_API_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "xtp_api_struct.h" + +#if defined(ISLIB) && defined(WIN32) +#ifdef LIB_MD_API_EXPORT +#define MD_API_EXPORT __declspec(dllexport) +#else +#define MD_API_EXPORT __declspec(dllimport) +#endif +#else +#define MD_API_EXPORT +#endif + +/*! +* \class XTP::API::QuoteSpi +* +* \brief 行情回调类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + class QuoteSpi + { + public: + + ///当客户端与行情后台通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。可以在此函数中调用Login重新登录。注意用户重新登录后,需要重新订阅行情 + virtual void OnDisconnected(int reason) {}; + + + ///错误应答 + ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 + virtual void OnError(XTPRI *error_info) {}; + + ///逐笔丢包应答 + ///@param begin_seq 当逐笔出现丢包时,丢包区间下限(可能与上限一致) + ///@param end_seq 当逐笔出现丢包时,丢包区间上限(可能与下限一致) + ///@remark 此函数只有在逐笔发生丢包时才会有调用,如果丢包的上下限一致,表示仅丢失了一个包,注意此包仅为数据包,包含1个或者多个逐笔数据 + virtual void OnTickByTickLossRange(int begin_seq, int end_seq) {}; + + ///订阅行情应答,包括股票、指数和期权 + ///@param ticker 详细的合约订阅情况 + ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///退订行情应答,包括股票、指数和期权 + ///@param ticker 详细的合约取消订阅情况 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///深度行情通知,包含买一卖一队列 + ///@param market_data 行情数据 + ///@param bid1_qty 买一队列数据 + ///@param bid1_count 买一队列的有效委托笔数,即bid1_qty数组的长度,最大为50 + ///@param max_bid1_count 买一队列总委托笔数 + ///@param ask1_qty 卖一队列数据 + ///@param ask1_count 卖一队列的有效委托笔数,即ask1_qty数组的长度,最大为50 + ///@param max_ask1_count 卖一队列总委托笔数 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) {}; + + /// ETF的IOPV通知 + /// @param iopv ETF的参考单位基金净值数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnETFIOPVData(IOPV *iopv) {}; + + ///订阅行情订单簿应答,包括股票、债券 + ///@param ticker 详细的合约订阅情况 + ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///退订行情订单簿应答,包括股票、债券 + ///@param ticker 详细的合约取消订阅情况 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///行情订单簿通知,包括股票、债券 + ///@param order_book 行情订单簿数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnOrderBook(XTPOB *order_book) {}; + + ///订阅逐笔行情应答,包括股票、债券 + ///@param ticker 详细的合约订阅情况 + ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///退订逐笔行情应答,包括股票、债券 + ///@param ticker 详细的合约取消订阅情况 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///逐笔行情通知,包括股票、债券 + ///@param tbt_data 逐笔行情数据,包括逐笔委托和逐笔成交,此为共用结构体,需要根据type来区分是逐笔委托还是逐笔成交,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnTickByTick(XTPTBT *tbt_data) {}; + + ///订阅全市场的股票行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的股票行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的股票行情订单簿应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的股票行情订单簿应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的股票逐笔行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的股票逐笔行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + + ///查询合约部分静态信息的应答 + ///@param ticker_info 合约部分静态信息 + ///@param error_info 查询合约部分静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询合约部分静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///查询合约的最新价格信息应答 + ///@param ticker_info 合约的最新价格信息 + ///@param error_info 查询合约的最新价格信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///订阅全市场的期权行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的期权行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的期权行情订单簿应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的期权行情订单簿应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的期权逐笔行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的期权逐笔行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///查询沪深2市合约完整静态信息的应答 + ///@param ticker_info 合约完整静态信息 + ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryAllTickersFullInfo(XTPQFI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///查询新三板合约完整静态信息的应答 + ///@param ticker_info 合约完整静态信息 + ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///当客户端与回补行情服务器通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。回补服务器会在无消息交互后会定时断线,请注意仅在需要回补数据时才保持连接,无回补需求时,无需登陆。 + virtual void OnRebuildQuoteServerDisconnected(int reason) {}; + + ///请求回补指定频道的逐笔行情的总体结果应答 + ///@param rebuild_result 当回补结束时被调用,如果回补结果失败,则msg参数表示失败原因 + ///@remark 需要快速返回,仅在回补数据发送结束后调用,如果请求数据太多,一次性无法回补完,那么rebuild_result.result_code = XTP_REBUILD_RET_PARTLY,此时需要根据回补结果继续发起回补数据请求 + virtual void OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) {}; + + ///回补的逐笔行情数据 + ///@param tbt_data 回补的逐笔行情数据 + ///@remark 需要快速返回,此函数调用与OnTickByTick不在一个线程内,会在OnRequestRebuildQuote()之前回调 + virtual void OnRebuildTickByTick(XTPTBT *tbt_data) {}; + + ///回补的快照行情数据 + ///@param md_data 回补的快照行情数据 + ///@remark 需要快速返回,此函数调用与OnDepthMarketData不在一个线程内,会在OnRequestRebuildQuote()之前回调 + virtual void OnRebuildMarketData(XTPMD *md_data) {}; + + }; + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility push(default) +#endif +#endif + +/*! +* \class XTP::API::QuoteApi +* +* \brief 行情订阅接口类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + class MD_API_EXPORT QuoteApi + { + public: + ///创建QuoteApi + ///@param client_id (必须输入)用于区分同一用户的不同客户端,由用户自定义 + ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个有可写权限的真实存在的路径,如果路径不存在的话,可能会因为写冲突而造成断线 + ///@param log_level 日志输出级别 + ///@return 创建出的UserApi + ///@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接 + static QuoteApi *CreateQuoteApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level=XTP_LOG_LEVEL_DEBUG); + + ///删除接口对象本身 + ///@remark 不再使用本接口对象时,调用该函数删除接口对象 + virtual void Release() = 0; + + + ///获取当前交易日 + ///@return 获取到的交易日 + ///@remark 只有登录成功后,才能得到正确的交易日 + virtual const char *GetTradingDay() = 0; + + ///获取API的发行版本号 + ///@return 返回api发行版本号 + virtual const char* GetApiVersion() = 0; + + ///获取API的系统错误 + ///@return 返回的错误信息,可以在Login、Logout、订阅、取消订阅失败时调用,获取失败的原因 + ///@remark 可以在调用api接口失败时调用,例如login失败时 + virtual XTPRI *GetApiLastError() = 0; + + ///设置采用UDP方式连接时的单个队列接收缓冲区大小,目前可能最大使用4个缓冲区队列 + ///@remark 需要在Login之前调用,默认大小和最小设置均为64MB。此缓存大小单位为MB,请输入2的次方数,例如128MB请输入128。 + virtual void SetUDPBufferSize(uint32_t buff_size) = 0; + + + ///注册回调接口 + ///@param spi 派生自回调接口类的实例,请在登录之前设定 + virtual void RegisterSpi(QuoteSpi *spi) = 0; + + ///设置心跳检测时间间隔,单位为秒 + ///@param interval 心跳检测时间间隔,单位为秒 + ///@remark 此函数必须在Login之前调用 + virtual void SetHeartBeatInterval(uint32_t interval) = 0; + + ///使用UDP接收行情时,设置接收行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPRecvThreadAffinityArray函数 + ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu + ///@remark 此版本不建议使用,请替换使用SetUDPRecvThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPRecvThreadAffinityArray一起使用时,仅第一个被调用的生效 + virtual void SetUDPRecvThreadAffinity(int32_t cpu_no) = 0; + + ///使用UDP接收行情时,设置接收行情线程绑定的cpu集合 + ///@param cpu_no_array 设置绑定的cpu集合数组 + ///@param count cpu集合数组长度 + ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 + virtual void SetUDPRecvThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; + + ///使用UDP接收行情时,设置解析行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPParseThreadAffinityArray函数 + ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu + ///@remark 此版本不建议使用,请替换使用SetUDPParseThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPParseThreadAffinityArray一起使用时,仅第一个被调用的生效 + virtual void SetUDPParseThreadAffinity(int32_t cpu_no) = 0; + + ///使用UDP接收行情时,设置解析行情线程绑定的cpu集合 + ///@param cpu_no_array 设置绑定的cpu集合数组 + ///@param count cpu集合数组长度 + ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 + virtual void SetUDPParseThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; + + ///设定UDP收行情时是否输出异步日志 + ///@param flag 是否输出标识,默认为true,如果不想输出“udpseq”开头的异步日志,请设置此参数为false + ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 + virtual void SetUDPSeqLogOutPutFlag(bool flag = true) = 0; + + ///订阅行情,包括股票、指数、期权、债券等。 + ///@return 订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 + virtual int SubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///退订行情,包括股票、指数、期权、债券等。 + ///@return 取消订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情接口配套使用 + virtual int UnSubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///订阅行情订单簿,包括股票、债券等。(新三板暂不支持) + ///@return 订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情(仅支持深交所) + virtual int SubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///退订行情订单簿,包括股票、债券等。(新三板暂不支持) + ///@return 取消订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情订单簿接口配套使用 + virtual int UnSubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///订阅逐笔行情,包括股票、债券等。(新三板暂不支持) + ///@return 订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 + virtual int SubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///退订逐笔行情,包括股票、债券等。(新三板暂不支持) + ///@return 取消订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅逐笔行情接口配套使用 + virtual int UnSubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///订阅全市场的股票、债券、指数等行情 + ///@return 订阅全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订行情接口配套使用 + virtual int SubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的股票、债券、指数等行情 + ///@return 退订全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场行情接口配套使用 + virtual int UnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的股票、债券等行情订单簿(新三板暂不支持) + ///@return 订阅全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订行情订单簿接口配套使用 + virtual int SubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的股票、债券等行情订单簿(新三板暂不支持) + ///@return 退订全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场行情订单簿接口配套使用 + virtual int UnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的股票、债券等逐笔行情(新三板暂不支持) + ///@return 订阅全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订逐笔行情接口配套使用 + virtual int SubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的股票、债券等逐笔行情(新三板暂不支持) + ///@return 退订全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场逐笔行情接口配套使用 + virtual int UnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///用户登录请求 + ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 + ///@param ip 服务器ip地址,类似“127.0.0.1” + ///@param port 服务器端口号 + ///@param user 登陆用户名 + ///@param password 登陆密码 + ///@param sock_type “1”代表TCP,“2”代表UDP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 + virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + + ///登出请求 + ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 + virtual int Logout() = 0; + + ///获取沪深2市当前交易日合约部分静态信息 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 + virtual int QueryAllTickers(XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///获取合约的最新价格信息 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要查询的合约个数 + ///@param exchange_id 交易所代码 + virtual int QueryTickersPriceInfo(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///获取所有合约的最新价格信息 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + virtual int QueryAllTickersPriceInfo() = 0; + + ///订阅全市场的期权行情(目前暂无此数据) + ///@return 订阅全市期权场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订期权行情接口配套使用 + virtual int SubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的期权行情(目前暂无此数据) + ///@return 退订全市场期权行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场期权行情接口配套使用 + virtual int UnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的期权行情订单簿(目前暂无此数据) + ///@return 订阅全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订期权行情订单簿接口配套使用 + virtual int SubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的期权行情订单簿(目前暂无此数据) + ///@return 退订全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场期权行情订单簿接口配套使用 + virtual int UnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的期权逐笔行情(目前暂无此数据) + ///@return 订阅全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订期权逐笔行情接口配套使用 + virtual int SubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的期权逐笔行情(目前暂无此数据) + ///@return 退订全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 + virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///获取沪深2市所有合约的详细静态信息,包括指数等非可交易的,不包括新三板 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 + virtual int QueryAllTickersFullInfo(XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///获取新三板所有合约的详细静态信息,包括指数等非可交易的 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + virtual int QueryAllNQTickersFullInfo() = 0; + + ///用户登录回补服务器请求 + ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 + ///@param ip 服务器ip地址,类似“127.0.0.1” + ///@param port 服务器端口号 + ///@param user 登陆用户名 + ///@param password 登陆密码 + ///@param sock_type “1”代表TCP,“2”代表UDP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接。回补服务器会在无消息交互后定时断线,请注意仅在需要回补数据时才保持连接,回补完成后请及时logout + virtual int LoginToRebuildQuoteServer(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + ///登出回补服务器请求 + ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 + virtual int LogoutFromRebuildQuoteServer() = 0; + + ///请求回补指定行情,包括快照和逐笔 + ///@return 请求回补指定频道的逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param rebuild_param 指定回补的参数信息,注意一次性回补最多1000个数据,超过1000需要分批次请求,一次只能指定一种类型的数据 + ///@remark 仅在逐笔行情丢包时或者确实快照行情时使用,回补的行情数据将从OnRebuildTickByTick或者OnRebuildMarketData()接口回调提供,与订阅的行情数据不在同一个线程内 + virtual int RequestRebuildQuote(XTPQuoteRebuildReq* rebuild_param) = 0; + + + protected: + ~QuoteApi() {}; + }; + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif diff --git a/XTP_API_20231222_2.2.39.3/bin/include/xtp_trader_api.h b/XTP_API_20231222_2.2.39.3/bin/include/xtp_trader_api.h index f8f5b69..6b301cf 100644 --- a/XTP_API_20231222_2.2.39.3/bin/include/xtp_trader_api.h +++ b/XTP_API_20231222_2.2.39.3/bin/include/xtp_trader_api.h @@ -1,1189 +1,1189 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_trader_api.h -///@brief 定义客户端交易接口 -///////////////////////////////////////////////////////////////////////// - -#ifndef _XTP_TRADER_API_H_ -#define _XTP_TRADER_API_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "xtp_api_struct.h" -#include "algo_api_struct.h" - -#if defined(ISLIB) && defined(WIN32) -#ifdef LIB_TRADER_API_EXPORT -#define TRADER_API_EXPORT __declspec(dllexport) -#else -#define TRADER_API_EXPORT __declspec(dllimport) -#endif -#else -#define TRADER_API_EXPORT -#endif - -/*! -* \class XTP::API::TraderSpi -* -* \brief 交易接口响应类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - - class TraderSpi - { - public: - - ///当客户端的某个连接与交易后台通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 用户主动调用logout导致的断线,不会触发此函数。api不会自动重连,当断线发生时,请用户自行选择后续操作,可以在此函数中调用Login重新登录,并更新session_id,此时用户收到的数据跟断线之前是连续的 - virtual void OnDisconnected(uint64_t session_id, int reason) {}; - - ///错误应答 - ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 - virtual void OnError(XTPRI *error_info) {}; - - ///请求查询用户在本节点上可交易市场的响应 - ///@param trade_location 查询到的交易市场信息,按位来看,从低位开始数,第0位表示沪市,即如果(trade_location&0x01) == 0x01,代表可交易沪市,第1位表示深市,即如果(trade_location&0x02) == 0x02,表示可交易深市,如果第0位和第1位均是1,即(trade_location&(0x01|0x02)) == 0x03,就表示可交易沪深2个市场 - ///@param error_info 查询可交易市场发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此查询只会有一个结果 - virtual void OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///报单通知 - ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 - ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 - virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; - - ///成交通知 - ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 - virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) {}; - - ///撤单出错响应 - ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id - ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此响应只会在撤单发生错误时被回调 - virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询报单响应-新版本接口 - ///@param order_info 查询到的一个报单信息 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询报单响应-新版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询成交响应 - ///@param trade_info 查询到的一个成交回报 - ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询成交响应 - ///@param trade_info 查询到的一个成交信息 - ///@param req_count 分页请求的最大数量 - ///@param trade_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询投资者持仓响应 - ///@param position 查询到的一只股票的持仓情况 - ///@param error_info 查询账户持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询资金账户响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param asset 查询到的资金账户情况 - ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询分级基金信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 查询到的分级基金情况 - ///@param error_info 查询分级基金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询资金划拨订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_transfer_info 查询到的资金账户情况 - ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///资金划拨通知 - ///@param fund_transfer_info 资金划拨通知的具体信息,用户可以通过fund_transfer_info.serial_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 资金划拨订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当资金划拨方向为一号两中心节点之间划拨,且error_info.error_id=11000384时,error_info.error_msg中含有对方结点中可用于划拨的资金(以整数为准),用户需解析后进行stringToInt的转化,可据此填写合适的资金,再次发起划拨请求 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当资金划拨订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的资金划拨通知。 - virtual void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询其他节点可用资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 查询到的其他节点可用资金情况 - ///@param error_info 查询其他节点可用资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///请求查询ETF清单文件的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param etf_info 查询到的ETF清单文件情况 - ///@param error_info 查询ETF清单文件发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询ETF股票篮的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param etf_component_info 查询到的ETF合约的相关成分股信息 - ///@param error_info 查询ETF股票篮发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询今日新股申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param ipo_info 查询到的今日新股申购的一只股票信息 - ///@param error_info 查询今日新股申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询用户新股申购额度信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param quota_info 查询到的用户某个市场的今日新股申购额度信息 - ///@param error_info 查查询用户新股申购额度信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询今日可转债申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param ipo_info 查询到的今日可转债申购的一只可转债信息 - ///@param error_info 查询今日可转债申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询用户可转债转股信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param swap_stock_info 查询到某条可转债转股信息 - ///@param error_info 查查询可转债转股信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权合约的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param option_info 查询到的期权合约情况 - ///@param error_info 查询期权合约发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///融资融券业务中现金直接还款的响应 - ///@param cash_repay_info 现金直接还款通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 现金还款发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; - - ///融资融券业务中现金还息的响应 - ///@param cash_repay_info 现金还息通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 现金还息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询融资融券业务中的现金直接还款报单的响应 - ///@param cash_repay_info 查询到的某一笔现金直接还款通知的具体信息 - ///@param error_info 查询现金直接报单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo *cash_repay_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询信用账户额外信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 查询到的信用账户额外信息情况 - ///@param error_info 查询信用账户额外信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditFundInfo(XTPCrdFundInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///请求查询信用账户负债信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param debt_info 查询到的信用账户合约负债情况 - ///@param error_info 查询信用账户负债信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditDebtInfo(XTPCrdDebtInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询信用账户指定证券负债未还信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param debt_info 查询到的信用账户指定证券负债未还信息情况 - ///@param error_info 查询信用账户指定证券负债未还信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询信用账户待还资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param remain_amount 查询到的信用账户待还资金 - ///@param error_info 查询信用账户待还资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///请求查询信用账户可融券头寸信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param assign_info 查询到的信用账户可融券头寸信息 - ///@param error_info 查询信用账户可融券头寸信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo *assign_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///融资融券业务中请求查询指定余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param stock_info 查询到的余券信息 - ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///融资融券业务中请求查询余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param stock_info 查询到的余券信息 - ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id, bool is_last) {}; - - ///融资融券业务中负债合约展期的通知 - ///@param debt_extend_info 负债合约展期通知的具体信息,用户可以通过debt_extend_info.xtpid来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 负债合约展期订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当负债合约展期订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的负债合约展期通知。 - virtual void OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, uint64_t session_id) {}; - - ///查询融资融券业务中负债合约展期订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param debt_extend_info 查询到的负债合约展期情况 - ///@param error_info 查询负债合约展期发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当error_info.error_id=11000350时,表明没有记录,当为其他非0值时,表明合约发生拒单时的错误原因 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///查询融资融券业务中信用账户附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 信用账户附加信息 - ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///查询融资融券业务中信用账户指定证券的附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 信用账户指定证券的附加信息 - ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///期权组合策略报单通知 - ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 - ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 - virtual void OnOptionCombinedOrderEvent(XTPOptCombOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; - - ///期权组合策略成交通知 - ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 - virtual void OnOptionCombinedTradeEvent(XTPOptCombTradeReport *trade_info, uint64_t session_id) {}; - - ///期权组合策略撤单出错响应 - ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id - ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此响应只会在撤单发生错误时被回调 - virtual void OnCancelOptionCombinedOrderError(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询期权组合策略报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略报单响应-新版本接口 - ///@param order_info 查询到的一个报单 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询期权组合策略报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询期权组合策略报单响应-新版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略成交响应 - ///@param trade_info 查询到的一个成交回报 - ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询期权组合策略成交响应 - ///@param trade_info 查询到的一个成交信息 - ///@param req_count 分页请求的最大数量 - ///@param trade_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略持仓响应 - ///@param position_info 查询到的一个持仓信息 - ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略信息响应 - ///@param strategy_info 查询到的一个组合策略信息 - ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp *strategy_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///查询期权行权合并头寸的响应 - ///@param position_info 查询到的一个行权合并头寸信息 - ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///algo业务中查询策略列表的响应 - ///@param strategy_info 策略具体信息 - ///@param strategy_param 此策略中包含的参数,如果error_info.error_id为0时,有意义 - ///@param error_info 查询查询策略列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; - - ///algo业务中策略运行时策略状态通知 - ///@param strategy_state 用户策略运行情况的状态通知 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state, uint64_t session_id) {}; - - ///algo业务中用户建立算法通道的消息响应 - ///@param user 用户名 - ///@param error_info 建立算法通道发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误,即算法通道成功 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 算法通道建立成功后,才能对用户创建策略等操作,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立 - virtual void OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id) {}; - - ///algo业务中报送策略单的响应 - ///@param strategy_info 用户报送的策略单的具体信息 - ///@param error_info 报送策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; - - ///algo业务中撤销策略单的响应 - ///@param strategy_info 用户撤销的策略单的具体信息 - ///@param error_info 撤销策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; - - ///当客户端与AlgoBus通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@remark 请不要堵塞此线程,否则会影响algo的登录,与Algo之间的连接,断线后会自动重连,用户无需做其他操作 - virtual void OnAlgoDisconnected(int reason) {}; - - ///当客户端与AlgoBus断线后重新连接时,该方法被调用,仅在断线重连成功后会被调用。 - virtual void OnAlgoConnected() {}; - - ///algo业务中策略运行时策略指定证券执行状态通知 - ///@param strategy_symbol_state 用户策略指定证券运行情况的状态通知 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) {}; - - ///algo业务中报送母单创建时的推送消息(包括其他客户端创建的母单) - ///@param strategy_info 策略具体信息 - ///@param strategy_param 此策略中包含的参数 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id) {}; - - ///algo业务中算法推荐的响应 - ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,与请求一致,如果此参数为true,那么请以返回的strategy_param为准 - ///@param recommendation_info 推荐算法的具体信息,当basket_flag=true时,此结构体中的market和ticker将没有意义,此时请以strategy_param为准 - ///@param strategy_param 算法参数,可直接用来创建母单,如果error_info.error_id为0时,有意义 - ///@param error_info 请求推荐算法发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; - - ///algo业务中修改已有策略单的响应 - ///@param strategy_info 用户修改后策略单的具体信息 - ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility push(default) -#endif -#endif - -/*! -* \class XTP::API::TraderApi -* -* \brief 交易接口类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - - class TRADER_API_EXPORT TraderApi - { - public: - ///创建TraderApi - ///@param client_id (必须输入)客户端id,用于区分同一用户的不同客户端,由用户自定义,普通用户必须使用1-99之间的数值 - ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个真实存在的有可写权限的路径 - ///@param log_level 日志输出级别 - ///@return 创建出的UserApi - ///@remark 只能创建一次,如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接。系统不支持过夜,请确保每天开盘前重新启动 - static TraderApi *CreateTraderApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level = XTP_LOG_LEVEL_DEBUG); - - ///删除接口对象本身 - ///@remark 不再使用本接口对象时,调用该函数删除接口对象 - virtual void Release() = 0; - - ///获取当前交易日 - ///@return 获取到的交易日 - ///@remark 只有登录成功后,才能得到正确的交易日 - virtual const char *GetTradingDay() = 0; - - ///注册回调接口 - ///@param spi 派生自回调接口类的实例,请在登录之前设定 - virtual void RegisterSpi(TraderSpi *spi) = 0; - - ///获取API的系统错误 - ///@return 返回的错误信息,可以在Login、InsertOrder、CancelOrder返回值为0时调用,获取失败的原因 - ///@remark 可以在调用api接口失败时调用,例如login失败时 - virtual XTPRI *GetApiLastError() = 0; - - ///获取API的发行版本号 - ///@return 返回api发行版本号 - virtual const char* GetApiVersion() = 0; - - ///通过报单在xtp系统中的ID获取下单的客户端id - ///@return 返回客户端id,可以用此方法过滤自己下的订单 - ///@param order_xtp_id 报单在xtp系统中的ID - ///@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 - virtual uint8_t GetClientIDByXTPID(uint64_t order_xtp_id) = 0; - - ///通过报单在xtp系统中的ID获取相关资金账户名 - ///@return 返回资金账户名 - ///@param order_xtp_id 报单在xtp系统中的ID - ///@remark 只有资金账户登录成功后,才能得到正确的信息 - virtual const char* GetAccountByXTPID(uint64_t order_xtp_id) = 0; - - ///订阅公共流。 - ///@param resume_type 公共流(订单响应、成交回报)重传方式 - /// XTP_TERT_RESTART:从本交易日开始重传 - /// XTP_TERT_RESUME:(保留字段,此方式暂未支持)从上次收到的续传 - /// XTP_TERT_QUICK:只传送登录后公共流的内容 - ///@remark 该方法要在Login方法前调用。若不调用则不会收到公共流的数据。注意在用户断线后,如果不登出就login(),公共流订阅方式不会起作用。用户只会收到断线后的所有消息。如果先logout()再login(),那么公共流订阅方式会起作用,用户收到的数据会根据用户的选择方式而定。 - virtual void SubscribePublicTopic(XTP_TE_RESUME_TYPE resume_type) = 0; - - ///设置软件开发版本号 - ///@param version 用户开发软件版本号,非api发行版本号,长度不超过15位,以'\0'结尾 - ///@remark 此函数必须在Login之前调用,标识的是客户端版本号,而不是API的版本号,由用户自定义 - virtual void SetSoftwareVersion(const char* version) = 0; - - ///设置软件开发Key - ///@param key 用户开发软件Key,用户申请开户时给予,以'\0'结尾 - ///@remark 此函数必须在Login之前调用 - virtual void SetSoftwareKey(const char* key) = 0; - - ///设置心跳检测时间间隔,单位为秒 - ///@param interval 心跳检测时间间隔,单位为秒 - ///@remark 此函数必须在Login之前调用 - virtual void SetHeartBeatInterval(uint32_t interval) = 0; - - ///用户登录请求 - ///@return session_id表明此资金账号登录是否成功,“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,非“0”表示登录成功,此时需要记录下这个返回值session_id,与登录的资金账户对应 - ///@param ip 服务器地址,类似“127.0.0.1” - ///@param port 服务器端口号 - ///@param user 登录用户名 - ///@param password 登录密码 - ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api可支持多个账户连接,但是同一个账户同一个client_id只能有一个session连接,后面的登录在前一个session存续期间,无法连接 - virtual uint64_t Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,“-1”表示登出失败 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual int Logout(uint64_t session_id) = 0; - - ///服务器是否重启过 - ///@return “true”表示重启过,“false”表示没有重启过 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数必须在Login之后调用 - virtual bool IsServerRestart(uint64_t session_id) = 0; - - ///修改已登录用户的硬件信息,仅限授权系统使用 - ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param info 需要修改成的用户硬件信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数必须在Login之后调用,且仅限授权系统使用,一般客户无需使用 - virtual int ModifyUserTerminalInfo(const XTPUserTerminalInfoReq* info, uint64_t session_id) = 0; - - ///查询用户在本节点上的可交易市场类型 - ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数必须在Login之后调用,对应的响应函数是OnQueryAccountTradeMarket() - virtual int QueryAccountTradeMarket(uint64_t session_id, int request_id) = 0; - - ///为用户获取一个新的订单XTPID,用于报单 - ///@return 生成的订单XTPID,非“0”表示获取成功,“0”表示获取失败,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数必须在Login之后调用,通过这个函数获取的order_xtp_id仅用于对应的用户报单,如果设置错误,将会导致下单失败 - virtual uint64_t GetANewOrderXTPID(uint64_t session_id) = 0; - - ///报单录入请求 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOrder(XTPOrderInsertInfo *order, uint64_t session_id) = 0; - - ///已经提前设置order_xtp_id的报单录入请求,与GetANewOrderXTPID()配合使用 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOrderExtra(XTPOrderInsertInfo *order, uint64_t session_id) = 0; - - ///报单操作请求 - ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order_xtp_id 需要撤销的委托单在XTP系统中的ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 如果撤单成功,会在报单响应函数OnOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 - virtual uint64_t CancelOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; - - ///根据报单ID请求查询报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOrders(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询未完结报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryUnfinishedOrders(uint64_t session_id, int request_id) = 0; - - ///分页请求查询报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOrdersByPage(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///根据报单ID请求查询报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOrdersEx(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询未完结报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; - - ///分页请求查询报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOrdersByPageEx(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///根据委托编号请求查询相关成交 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数查询出的结果可能对应多个查询结果响应 - virtual int QueryTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询已成交 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryTrades(XTPQueryTraderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询成交回报 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryTradesByPage(const XTPQueryTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询投资者持仓 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param ticker 需要查询持仓的合约代码,可以为NULL,表示查询全市场,如果不为NULL,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓 - ///@param market 需要查询持仓的合约所在市场,默认为0,仅在合约代码不为NULL的时候,才会使用。market不指定或者为非0的其他非有效值情况下,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓。如果想正确查询指定持仓,请指定market - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id, XTP_MARKET_TYPE market = XTP_MKT_INIT) = 0; - - ///请求查询资产 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryAsset(uint64_t session_id, int request_id) = 0; - - ///请求查询分级基金 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的分级基金筛选条件,其中母基金代码可以为空,则默认所有存在的母基金,如果不为空,请不带空格,并以'\0'结尾,其中交易市场不能为空 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数查询出的结果可能对应多个查询结果响应 - virtual int QueryStructuredFund(XTPQueryStructuredFundInfoReq *query_param, uint64_t session_id, int request_id) = 0; - - ///资金划拨请求 - ///@return 资金划拨订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param fund_transfer 资金划拨的请求信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数支持一号两中心节点之间的资金划拨,注意资金划拨的方向。 - virtual uint64_t FundTransfer(XTPFundTransferReq *fund_transfer, uint64_t session_id) = 0; - - ///请求查询资金划拨 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的资金划拨订单筛选条件,其中serial_id可以为0,则默认所有资金划拨订单,如果不为0,则请求特定的资金划拨订单 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryFundTransfer(XTPQueryFundTransferLogReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询其他节点可用资金 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 查询时需要提供的信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOtherServerFund(XTPFundQueryReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询ETF清单文件 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的ETF清单文件的筛选条件,其中合约代码可以为空,则默认所有存在的ETF合约代码,market字段也可以为初始值,则默认所有市场的ETF合约 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryETF(XTPQueryETFBaseReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询ETF股票篮 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询股票篮的的ETF合约,其中合约代码不可以为空,market字段也必须指定 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryETFTickerBasket(XTPQueryETFComponentReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询今日新股申购信息列表 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryIPOInfoList(uint64_t session_id, int request_id) = 0; - - ///请求查询用户新股申购额度信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryIPOQuotaInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询今日可转债申购信息列表 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryBondIPOInfoList(uint64_t session_id, int request_id) = 0; - - ///请求查询可转债转股的基本信息 - ///@return 查询是否发送成功,“0”表示发送成功,非“0”表示发送出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的可转债转股信息的筛选条件,可以为NULL(为NULL表示查询所有的可转债转股信息),此参数中合约代码可以为空字符串,如果为空字符串,则查询所有可转债转股信息,如果不为空字符串,请不带空格,并以'\0'结尾,且必须与market匹配 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryBondSwapStockInfo(XTPQueryBondSwapStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询期权合约 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的期权合约的筛选条件,可以为NULL(为NULL表示查询所有的期权合约) - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionAuctionInfo(XTPQueryOptionAuctionInfoReq *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中现金直接还款请求 - ///@return 现金直接还款订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param amount 现金还款的金额 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditCashRepay(double amount, uint64_t session_id) = 0; - - ///融资融券业务中现金还指定负债合约息费请求 - ///@return 现金还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param debt_id 指定的负债合约编号 - ///@param amount 现金还息的金额 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditCashRepayDebtInterestFee(const char* debt_id, double amount, uint64_t session_id) = 0; - - ///融资融券业务中卖券还指定负债合约息费请求 - ///@return 卖券还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order 卖券的报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 - ///@param debt_id 指定的负债合约编号 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditSellStockRepayDebtInterestFee(XTPOrderInsertInfo* order, const char* debt_id, uint64_t session_id) = 0; - - ///请求查询融资融券业务中的现金直接还款报单 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditCashRepayInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户特有信息,除资金账户以外的信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditFundInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户负债合约信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditDebtInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询指定证券负债未还信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的指定证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditTickerDebtInfo(XTPClientQueryCrdDebtStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户待还资金信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditAssetDebtInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户可融券头寸信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中请求查询指定证券的余券 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的余券信息,不可以为空,需要明确指定 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法中用户必须提供了证券代码和所在市场 - virtual int QueryCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中请求查询余券 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的余券信息。若填入市场和股票代码,返回单支股票信息;若市场代码为空,股票代码非空,是无效查询,会在SPI中返回错误;若市场和股票代码均为空,返回全市场信息;若市场代码非空,股票代码为空,返回单市场信息。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中请求负债合约展期 - ///@return 负债合约展期订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param debt_extend 负债合约展期的请求信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditExtendDebtDate(XTPCreditDebtExtendReq *debt_extend, uint64_t session_id) = 0; - - ///融资融券业务中请求查询负债合约展期 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param xtp_id 需要查询的负债合约展期订单筛选条件,xtp_id可以为0,则默认所有负债合约展期订单,如果不为0,则请求特定的负债合约展期订单 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditExtendDebtDateOrders(uint64_t xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询融资融券业务中账戶的附加信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditFundExtraInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询融资融券业务中账戶指定证券的附加信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要指定的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditPositionExtraInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///期权组合策略报单录入请求 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOptionCombinedOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOptionCombinedOrder(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; - - ///已经提前设置order_xtp_id的期权组合策略报单录入请求,与GetANewOrderXTPID()配合使用 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOptionCombinedOrderExtra(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; - - ///期权组合策略报单撤单请求 - ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order_xtp_id 需要撤销的期权组合策略委托单在XTP系统中的ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 如果撤单成功,会在报单响应函数OnOptionCombinedOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 - virtual uint64_t CancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; - - ///请求查询期权组合策略未完结报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id) = 0; - - ///根据报单ID请求查询期权组合策略报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOptionCombinedOrders(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询期权组合策略报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOptionCombinedOrdersByPage(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略未完结报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; - - ///根据报单ID请求查询期权组合策略报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOptionCombinedOrdersEx(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询期权组合策略报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOptionCombinedOrdersByPageEx(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///根据期权组合策略委托编号请求查询相关成交 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数查询出的结果可能对应多个查询结果响应 - virtual int QueryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略的成交回报 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOptionCombinedTrades(const XTPQueryOptCombTraderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询期权组合策略成交回报 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOptionCombinedTradesByPage(const XTPQueryOptCombTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询投资者期权组合策略持仓 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询持仓的筛选条件,其中组合策略代码可以初始化为空,表示查询所有,如果不为空,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能导致查询不到所需的持仓 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 - virtual int QueryOptionCombinedPosition(const XTPQueryOptCombPositionReq* query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法仅支持精确查询,不支持模糊查询 - virtual int QueryOptionCombinedStrategyInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询期权行权合并头寸 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的行权合并的筛选条件,其中market为0会默认查询全市场,成分合约代码可以初始化为空,如果不为空,请不带空格,并以'\0'结尾,注意所有填写的条件都会进行匹配 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法可能对应多条响应消息 - virtual int QueryOptionCombinedExecPosition(const XTPQueryOptCombExecPosReq* query_param, uint64_t session_id, int request_id) = 0; - - ///用户登录algo服务器请求 - ///@return 表明此资金账号登录是否成功,非“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,“0”表示登录成功 - ///@param ip algo服务器地址,类似“127.0.0.1” - ///@param port algo服务器端口号 - ///@param user 登录用户名 - ///@param password 登录密码 - ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只需调用一次,所有用户共用即可 - virtual int LoginALGO(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - ///algo业务中查询用户策略请求 - ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param strategy_type 需要查询的策略类型,可填0 - ///@param client_strategy_id 需要查询的策略用户自定义id,可填0 - ///@param xtp_strategy_id 需要查询的策略在xtp系统中的id,如果指定,就一定按指定查询,如果填0,则按其他筛选条件查询 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark xtp_strategy_id条件的优先级最高,只有当xtp_strategy_id为0时,其他条件才生效,此条请求可能对应多条回应消息 - virtual int QueryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id) = 0; - - ///用户请求使用algo服务器建立算法通道 - ///@return 表明此资金账号建立算法通道请求消息发送是否成功,非“0”表示发送失败,可以调用GetApiLastError()来获取错误代码,“0”表示发送成功 - ///@param oms_ip oms服务器地址,类似“127.0.0.1”,非algo服务器地址 - ///@param oms_port oms服务器端口号,非algo服务器端口号 - ///@param user 登录用户名 - ///@param password 登录密码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数为异步方式,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立,在使用算法前,请先建立算法通道 - virtual int ALGOUserEstablishChannel(const char* oms_ip, int oms_port, const char* user, const char* password, uint64_t session_id) = 0; - - ///algo业务中用户报算法单请求 - ///@return 算法报单请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param strategy_type 需要创建的策略类型 - ///@param client_strategy_id 用户自定义id,帮助用户定位 - ///@param strategy_param 策略参数 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 仅能在用户建立算法通道后使用,算法单的异步通知 - virtual int InsertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, char* strategy_param, uint64_t session_id) = 0; - - ///algo业务中用户撤销算法单请求 - ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param cancel_flag 是否需要算法去处理已下的算法子单标志,true-交给算法自行处理,包括撤单、平仓等,算法处理完成后会通知客户;false-立即停止算法母单的执行,此时算法平台会对已下的子单做撤单操作,其余的平仓等操作需要客户自己处理 - ///@param xtp_strategy_id 需要撤销的算法单在xtp algobus系统中的id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 仅能在用户建立算法通道后调用 - virtual int CancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id) = 0; - - ///获取算法单的母单ID - ///@return 返回算法单的母单ID,如果返回为0表示不是算法单 - ///@param order_xtp_id 算法单对应的xtp id - ///@param order_client_id 算法单对应的自定义ID,不可随意填写 - ///@remark 返回为0表示,不是算法单,如果传入的参数不对的话,可能会得不到正确结果,此函数调用不依赖于是否登录 - virtual uint64_t GetAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id) = 0; - - ///algo业务中请求推荐算法 - ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,true-打包 - ///@param basket_param 需要算法推荐的证券列表,为json字串,具体格式参考说明文档或咨询运营人员 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此条请求可能对应多条回应消息,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 - virtual int StrategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id) = 0; - - ///algo业务中修改已有的算法单 - ///@return 算法单修改请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param xtp_strategy_id xtp算法单策略ID - ///@param strategy_param 修改后的策略参数 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 - virtual int ModifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id) = 0; - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xtp_trader_api.h +///@brief 定义客户端交易接口 +///////////////////////////////////////////////////////////////////////// + +#ifndef _XTP_TRADER_API_H_ +#define _XTP_TRADER_API_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "xtp_api_struct.h" +#include "algo_api_struct.h" + +#if defined(ISLIB) && defined(WIN32) +#ifdef LIB_TRADER_API_EXPORT +#define TRADER_API_EXPORT __declspec(dllexport) +#else +#define TRADER_API_EXPORT __declspec(dllimport) +#endif +#else +#define TRADER_API_EXPORT +#endif + +/*! +* \class XTP::API::TraderSpi +* +* \brief 交易接口响应类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + + class TraderSpi + { + public: + + ///当客户端的某个连接与交易后台通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 用户主动调用logout导致的断线,不会触发此函数。api不会自动重连,当断线发生时,请用户自行选择后续操作,可以在此函数中调用Login重新登录,并更新session_id,此时用户收到的数据跟断线之前是连续的 + virtual void OnDisconnected(uint64_t session_id, int reason) {}; + + ///错误应答 + ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 + virtual void OnError(XTPRI *error_info) {}; + + ///请求查询用户在本节点上可交易市场的响应 + ///@param trade_location 查询到的交易市场信息,按位来看,从低位开始数,第0位表示沪市,即如果(trade_location&0x01) == 0x01,代表可交易沪市,第1位表示深市,即如果(trade_location&0x02) == 0x02,表示可交易深市,如果第0位和第1位均是1,即(trade_location&(0x01|0x02)) == 0x03,就表示可交易沪深2个市场 + ///@param error_info 查询可交易市场发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此查询只会有一个结果 + virtual void OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///报单通知 + ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 + ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 + virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; + + ///成交通知 + ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 + virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) {}; + + ///撤单出错响应 + ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id + ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此响应只会在撤单发生错误时被回调 + virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询报单响应-新版本接口 + ///@param order_info 查询到的一个报单信息 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询报单响应-新版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询成交响应 + ///@param trade_info 查询到的一个成交回报 + ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询成交响应 + ///@param trade_info 查询到的一个成交信息 + ///@param req_count 分页请求的最大数量 + ///@param trade_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询投资者持仓响应 + ///@param position 查询到的一只股票的持仓情况 + ///@param error_info 查询账户持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询资金账户响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param asset 查询到的资金账户情况 + ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询分级基金信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 查询到的分级基金情况 + ///@param error_info 查询分级基金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询资金划拨订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_transfer_info 查询到的资金账户情况 + ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///资金划拨通知 + ///@param fund_transfer_info 资金划拨通知的具体信息,用户可以通过fund_transfer_info.serial_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 资金划拨订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当资金划拨方向为一号两中心节点之间划拨,且error_info.error_id=11000384时,error_info.error_msg中含有对方结点中可用于划拨的资金(以整数为准),用户需解析后进行stringToInt的转化,可据此填写合适的资金,再次发起划拨请求 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当资金划拨订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的资金划拨通知。 + virtual void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询其他节点可用资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 查询到的其他节点可用资金情况 + ///@param error_info 查询其他节点可用资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///请求查询ETF清单文件的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param etf_info 查询到的ETF清单文件情况 + ///@param error_info 查询ETF清单文件发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询ETF股票篮的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param etf_component_info 查询到的ETF合约的相关成分股信息 + ///@param error_info 查询ETF股票篮发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询今日新股申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param ipo_info 查询到的今日新股申购的一只股票信息 + ///@param error_info 查询今日新股申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询用户新股申购额度信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param quota_info 查询到的用户某个市场的今日新股申购额度信息 + ///@param error_info 查查询用户新股申购额度信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询今日可转债申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param ipo_info 查询到的今日可转债申购的一只可转债信息 + ///@param error_info 查询今日可转债申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询用户可转债转股信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param swap_stock_info 查询到某条可转债转股信息 + ///@param error_info 查查询可转债转股信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权合约的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param option_info 查询到的期权合约情况 + ///@param error_info 查询期权合约发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///融资融券业务中现金直接还款的响应 + ///@param cash_repay_info 现金直接还款通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 现金还款发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; + + ///融资融券业务中现金还息的响应 + ///@param cash_repay_info 现金还息通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 现金还息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询融资融券业务中的现金直接还款报单的响应 + ///@param cash_repay_info 查询到的某一笔现金直接还款通知的具体信息 + ///@param error_info 查询现金直接报单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo *cash_repay_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询信用账户额外信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 查询到的信用账户额外信息情况 + ///@param error_info 查询信用账户额外信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditFundInfo(XTPCrdFundInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///请求查询信用账户负债信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param debt_info 查询到的信用账户合约负债情况 + ///@param error_info 查询信用账户负债信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditDebtInfo(XTPCrdDebtInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询信用账户指定证券负债未还信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param debt_info 查询到的信用账户指定证券负债未还信息情况 + ///@param error_info 查询信用账户指定证券负债未还信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询信用账户待还资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param remain_amount 查询到的信用账户待还资金 + ///@param error_info 查询信用账户待还资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///请求查询信用账户可融券头寸信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param assign_info 查询到的信用账户可融券头寸信息 + ///@param error_info 查询信用账户可融券头寸信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo *assign_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///融资融券业务中请求查询指定余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param stock_info 查询到的余券信息 + ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///融资融券业务中请求查询余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param stock_info 查询到的余券信息 + ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id, bool is_last) {}; + + ///融资融券业务中负债合约展期的通知 + ///@param debt_extend_info 负债合约展期通知的具体信息,用户可以通过debt_extend_info.xtpid来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 负债合约展期订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当负债合约展期订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的负债合约展期通知。 + virtual void OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, uint64_t session_id) {}; + + ///查询融资融券业务中负债合约展期订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param debt_extend_info 查询到的负债合约展期情况 + ///@param error_info 查询负债合约展期发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当error_info.error_id=11000350时,表明没有记录,当为其他非0值时,表明合约发生拒单时的错误原因 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///查询融资融券业务中信用账户附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 信用账户附加信息 + ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///查询融资融券业务中信用账户指定证券的附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 信用账户指定证券的附加信息 + ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///期权组合策略报单通知 + ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 + ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 + virtual void OnOptionCombinedOrderEvent(XTPOptCombOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; + + ///期权组合策略成交通知 + ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 + virtual void OnOptionCombinedTradeEvent(XTPOptCombTradeReport *trade_info, uint64_t session_id) {}; + + ///期权组合策略撤单出错响应 + ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id + ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此响应只会在撤单发生错误时被回调 + virtual void OnCancelOptionCombinedOrderError(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询期权组合策略报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略报单响应-新版本接口 + ///@param order_info 查询到的一个报单 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询期权组合策略报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询期权组合策略报单响应-新版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略成交响应 + ///@param trade_info 查询到的一个成交回报 + ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询期权组合策略成交响应 + ///@param trade_info 查询到的一个成交信息 + ///@param req_count 分页请求的最大数量 + ///@param trade_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略持仓响应 + ///@param position_info 查询到的一个持仓信息 + ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略信息响应 + ///@param strategy_info 查询到的一个组合策略信息 + ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp *strategy_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///查询期权行权合并头寸的响应 + ///@param position_info 查询到的一个行权合并头寸信息 + ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///algo业务中查询策略列表的响应 + ///@param strategy_info 策略具体信息 + ///@param strategy_param 此策略中包含的参数,如果error_info.error_id为0时,有意义 + ///@param error_info 查询查询策略列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; + + ///algo业务中策略运行时策略状态通知 + ///@param strategy_state 用户策略运行情况的状态通知 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state, uint64_t session_id) {}; + + ///algo业务中用户建立算法通道的消息响应 + ///@param user 用户名 + ///@param error_info 建立算法通道发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误,即算法通道成功 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 算法通道建立成功后,才能对用户创建策略等操作,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立 + virtual void OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id) {}; + + ///algo业务中报送策略单的响应 + ///@param strategy_info 用户报送的策略单的具体信息 + ///@param error_info 报送策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; + + ///algo业务中撤销策略单的响应 + ///@param strategy_info 用户撤销的策略单的具体信息 + ///@param error_info 撤销策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; + + ///当客户端与AlgoBus通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@remark 请不要堵塞此线程,否则会影响algo的登录,与Algo之间的连接,断线后会自动重连,用户无需做其他操作 + virtual void OnAlgoDisconnected(int reason) {}; + + ///当客户端与AlgoBus断线后重新连接时,该方法被调用,仅在断线重连成功后会被调用。 + virtual void OnAlgoConnected() {}; + + ///algo业务中策略运行时策略指定证券执行状态通知 + ///@param strategy_symbol_state 用户策略指定证券运行情况的状态通知 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) {}; + + ///algo业务中报送母单创建时的推送消息(包括其他客户端创建的母单) + ///@param strategy_info 策略具体信息 + ///@param strategy_param 此策略中包含的参数 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id) {}; + + ///algo业务中算法推荐的响应 + ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,与请求一致,如果此参数为true,那么请以返回的strategy_param为准 + ///@param recommendation_info 推荐算法的具体信息,当basket_flag=true时,此结构体中的market和ticker将没有意义,此时请以strategy_param为准 + ///@param strategy_param 算法参数,可直接用来创建母单,如果error_info.error_id为0时,有意义 + ///@param error_info 请求推荐算法发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; + + ///algo业务中修改已有策略单的响应 + ///@param strategy_info 用户修改后策略单的具体信息 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; + }; + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility push(default) +#endif +#endif + +/*! +* \class XTP::API::TraderApi +* +* \brief 交易接口类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + + class TRADER_API_EXPORT TraderApi + { + public: + ///创建TraderApi + ///@param client_id (必须输入)客户端id,用于区分同一用户的不同客户端,由用户自定义,普通用户必须使用1-99之间的数值 + ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个真实存在的有可写权限的路径 + ///@param log_level 日志输出级别 + ///@return 创建出的UserApi + ///@remark 只能创建一次,如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接。系统不支持过夜,请确保每天开盘前重新启动 + static TraderApi *CreateTraderApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level = XTP_LOG_LEVEL_DEBUG); + + ///删除接口对象本身 + ///@remark 不再使用本接口对象时,调用该函数删除接口对象 + virtual void Release() = 0; + + ///获取当前交易日 + ///@return 获取到的交易日 + ///@remark 只有登录成功后,才能得到正确的交易日 + virtual const char *GetTradingDay() = 0; + + ///注册回调接口 + ///@param spi 派生自回调接口类的实例,请在登录之前设定 + virtual void RegisterSpi(TraderSpi *spi) = 0; + + ///获取API的系统错误 + ///@return 返回的错误信息,可以在Login、InsertOrder、CancelOrder返回值为0时调用,获取失败的原因 + ///@remark 可以在调用api接口失败时调用,例如login失败时 + virtual XTPRI *GetApiLastError() = 0; + + ///获取API的发行版本号 + ///@return 返回api发行版本号 + virtual const char* GetApiVersion() = 0; + + ///通过报单在xtp系统中的ID获取下单的客户端id + ///@return 返回客户端id,可以用此方法过滤自己下的订单 + ///@param order_xtp_id 报单在xtp系统中的ID + ///@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 + virtual uint8_t GetClientIDByXTPID(uint64_t order_xtp_id) = 0; + + ///通过报单在xtp系统中的ID获取相关资金账户名 + ///@return 返回资金账户名 + ///@param order_xtp_id 报单在xtp系统中的ID + ///@remark 只有资金账户登录成功后,才能得到正确的信息 + virtual const char* GetAccountByXTPID(uint64_t order_xtp_id) = 0; + + ///订阅公共流。 + ///@param resume_type 公共流(订单响应、成交回报)重传方式 + /// XTP_TERT_RESTART:从本交易日开始重传 + /// XTP_TERT_RESUME:(保留字段,此方式暂未支持)从上次收到的续传 + /// XTP_TERT_QUICK:只传送登录后公共流的内容 + ///@remark 该方法要在Login方法前调用。若不调用则不会收到公共流的数据。注意在用户断线后,如果不登出就login(),公共流订阅方式不会起作用。用户只会收到断线后的所有消息。如果先logout()再login(),那么公共流订阅方式会起作用,用户收到的数据会根据用户的选择方式而定。 + virtual void SubscribePublicTopic(XTP_TE_RESUME_TYPE resume_type) = 0; + + ///设置软件开发版本号 + ///@param version 用户开发软件版本号,非api发行版本号,长度不超过15位,以'\0'结尾 + ///@remark 此函数必须在Login之前调用,标识的是客户端版本号,而不是API的版本号,由用户自定义 + virtual void SetSoftwareVersion(const char* version) = 0; + + ///设置软件开发Key + ///@param key 用户开发软件Key,用户申请开户时给予,以'\0'结尾 + ///@remark 此函数必须在Login之前调用 + virtual void SetSoftwareKey(const char* key) = 0; + + ///设置心跳检测时间间隔,单位为秒 + ///@param interval 心跳检测时间间隔,单位为秒 + ///@remark 此函数必须在Login之前调用 + virtual void SetHeartBeatInterval(uint32_t interval) = 0; + + ///用户登录请求 + ///@return session_id表明此资金账号登录是否成功,“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,非“0”表示登录成功,此时需要记录下这个返回值session_id,与登录的资金账户对应 + ///@param ip 服务器地址,类似“127.0.0.1” + ///@param port 服务器端口号 + ///@param user 登录用户名 + ///@param password 登录密码 + ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api可支持多个账户连接,但是同一个账户同一个client_id只能有一个session连接,后面的登录在前一个session存续期间,无法连接 + virtual uint64_t Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + + ///登出请求 + ///@return 登出是否成功,“0”表示登出成功,“-1”表示登出失败 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual int Logout(uint64_t session_id) = 0; + + ///服务器是否重启过 + ///@return “true”表示重启过,“false”表示没有重启过 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数必须在Login之后调用 + virtual bool IsServerRestart(uint64_t session_id) = 0; + + ///修改已登录用户的硬件信息,仅限授权系统使用 + ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param info 需要修改成的用户硬件信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数必须在Login之后调用,且仅限授权系统使用,一般客户无需使用 + virtual int ModifyUserTerminalInfo(const XTPUserTerminalInfoReq* info, uint64_t session_id) = 0; + + ///查询用户在本节点上的可交易市场类型 + ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数必须在Login之后调用,对应的响应函数是OnQueryAccountTradeMarket() + virtual int QueryAccountTradeMarket(uint64_t session_id, int request_id) = 0; + + ///为用户获取一个新的订单XTPID,用于报单 + ///@return 生成的订单XTPID,非“0”表示获取成功,“0”表示获取失败,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数必须在Login之后调用,通过这个函数获取的order_xtp_id仅用于对应的用户报单,如果设置错误,将会导致下单失败 + virtual uint64_t GetANewOrderXTPID(uint64_t session_id) = 0; + + ///报单录入请求 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOrder(XTPOrderInsertInfo *order, uint64_t session_id) = 0; + + ///已经提前设置order_xtp_id的报单录入请求,与GetANewOrderXTPID()配合使用 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOrderExtra(XTPOrderInsertInfo *order, uint64_t session_id) = 0; + + ///报单操作请求 + ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order_xtp_id 需要撤销的委托单在XTP系统中的ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 如果撤单成功,会在报单响应函数OnOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 + virtual uint64_t CancelOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; + + ///根据报单ID请求查询报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOrders(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询未完结报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryUnfinishedOrders(uint64_t session_id, int request_id) = 0; + + ///分页请求查询报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOrdersByPage(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///根据报单ID请求查询报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOrdersEx(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询未完结报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; + + ///分页请求查询报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOrdersByPageEx(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///根据委托编号请求查询相关成交 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数查询出的结果可能对应多个查询结果响应 + virtual int QueryTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询已成交 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryTrades(XTPQueryTraderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询成交回报 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryTradesByPage(const XTPQueryTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询投资者持仓 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param ticker 需要查询持仓的合约代码,可以为NULL,表示查询全市场,如果不为NULL,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓 + ///@param market 需要查询持仓的合约所在市场,默认为0,仅在合约代码不为NULL的时候,才会使用。market不指定或者为非0的其他非有效值情况下,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓。如果想正确查询指定持仓,请指定market + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 + virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id, XTP_MARKET_TYPE market = XTP_MKT_INIT) = 0; + + ///请求查询资产 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryAsset(uint64_t session_id, int request_id) = 0; + + ///请求查询分级基金 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的分级基金筛选条件,其中母基金代码可以为空,则默认所有存在的母基金,如果不为空,请不带空格,并以'\0'结尾,其中交易市场不能为空 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数查询出的结果可能对应多个查询结果响应 + virtual int QueryStructuredFund(XTPQueryStructuredFundInfoReq *query_param, uint64_t session_id, int request_id) = 0; + + ///资金划拨请求 + ///@return 资金划拨订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param fund_transfer 资金划拨的请求信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数支持一号两中心节点之间的资金划拨,注意资金划拨的方向。 + virtual uint64_t FundTransfer(XTPFundTransferReq *fund_transfer, uint64_t session_id) = 0; + + ///请求查询资金划拨 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的资金划拨订单筛选条件,其中serial_id可以为0,则默认所有资金划拨订单,如果不为0,则请求特定的资金划拨订单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryFundTransfer(XTPQueryFundTransferLogReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询其他节点可用资金 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 查询时需要提供的信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOtherServerFund(XTPFundQueryReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询ETF清单文件 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的ETF清单文件的筛选条件,其中合约代码可以为空,则默认所有存在的ETF合约代码,market字段也可以为初始值,则默认所有市场的ETF合约 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryETF(XTPQueryETFBaseReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询ETF股票篮 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询股票篮的的ETF合约,其中合约代码不可以为空,market字段也必须指定 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryETFTickerBasket(XTPQueryETFComponentReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询今日新股申购信息列表 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryIPOInfoList(uint64_t session_id, int request_id) = 0; + + ///请求查询用户新股申购额度信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryIPOQuotaInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询今日可转债申购信息列表 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryBondIPOInfoList(uint64_t session_id, int request_id) = 0; + + ///请求查询可转债转股的基本信息 + ///@return 查询是否发送成功,“0”表示发送成功,非“0”表示发送出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的可转债转股信息的筛选条件,可以为NULL(为NULL表示查询所有的可转债转股信息),此参数中合约代码可以为空字符串,如果为空字符串,则查询所有可转债转股信息,如果不为空字符串,请不带空格,并以'\0'结尾,且必须与market匹配 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryBondSwapStockInfo(XTPQueryBondSwapStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询期权合约 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的期权合约的筛选条件,可以为NULL(为NULL表示查询所有的期权合约) + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionAuctionInfo(XTPQueryOptionAuctionInfoReq *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中现金直接还款请求 + ///@return 现金直接还款订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param amount 现金还款的金额 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditCashRepay(double amount, uint64_t session_id) = 0; + + ///融资融券业务中现金还指定负债合约息费请求 + ///@return 现金还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param debt_id 指定的负债合约编号 + ///@param amount 现金还息的金额 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditCashRepayDebtInterestFee(const char* debt_id, double amount, uint64_t session_id) = 0; + + ///融资融券业务中卖券还指定负债合约息费请求 + ///@return 卖券还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order 卖券的报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 + ///@param debt_id 指定的负债合约编号 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditSellStockRepayDebtInterestFee(XTPOrderInsertInfo* order, const char* debt_id, uint64_t session_id) = 0; + + ///请求查询融资融券业务中的现金直接还款报单 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditCashRepayInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户特有信息,除资金账户以外的信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditFundInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户负债合约信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditDebtInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询指定证券负债未还信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的指定证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditTickerDebtInfo(XTPClientQueryCrdDebtStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户待还资金信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditAssetDebtInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户可融券头寸信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中请求查询指定证券的余券 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的余券信息,不可以为空,需要明确指定 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法中用户必须提供了证券代码和所在市场 + virtual int QueryCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中请求查询余券 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的余券信息。若填入市场和股票代码,返回单支股票信息;若市场代码为空,股票代码非空,是无效查询,会在SPI中返回错误;若市场和股票代码均为空,返回全市场信息;若市场代码非空,股票代码为空,返回单市场信息。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中请求负债合约展期 + ///@return 负债合约展期订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param debt_extend 负债合约展期的请求信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditExtendDebtDate(XTPCreditDebtExtendReq *debt_extend, uint64_t session_id) = 0; + + ///融资融券业务中请求查询负债合约展期 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_id 需要查询的负债合约展期订单筛选条件,xtp_id可以为0,则默认所有负债合约展期订单,如果不为0,则请求特定的负债合约展期订单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditExtendDebtDateOrders(uint64_t xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询融资融券业务中账戶的附加信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditFundExtraInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询融资融券业务中账戶指定证券的附加信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要指定的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditPositionExtraInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///期权组合策略报单录入请求 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOptionCombinedOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOptionCombinedOrder(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; + + ///已经提前设置order_xtp_id的期权组合策略报单录入请求,与GetANewOrderXTPID()配合使用 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOptionCombinedOrderExtra(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; + + ///期权组合策略报单撤单请求 + ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order_xtp_id 需要撤销的期权组合策略委托单在XTP系统中的ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 如果撤单成功,会在报单响应函数OnOptionCombinedOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 + virtual uint64_t CancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; + + ///请求查询期权组合策略未完结报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id) = 0; + + ///根据报单ID请求查询期权组合策略报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOptionCombinedOrders(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询期权组合策略报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOptionCombinedOrdersByPage(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略未完结报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; + + ///根据报单ID请求查询期权组合策略报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOptionCombinedOrdersEx(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询期权组合策略报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOptionCombinedOrdersByPageEx(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///根据期权组合策略委托编号请求查询相关成交 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数查询出的结果可能对应多个查询结果响应 + virtual int QueryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略的成交回报 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOptionCombinedTrades(const XTPQueryOptCombTraderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询期权组合策略成交回报 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOptionCombinedTradesByPage(const XTPQueryOptCombTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询投资者期权组合策略持仓 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询持仓的筛选条件,其中组合策略代码可以初始化为空,表示查询所有,如果不为空,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能导致查询不到所需的持仓 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 + virtual int QueryOptionCombinedPosition(const XTPQueryOptCombPositionReq* query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法仅支持精确查询,不支持模糊查询 + virtual int QueryOptionCombinedStrategyInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询期权行权合并头寸 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的行权合并的筛选条件,其中market为0会默认查询全市场,成分合约代码可以初始化为空,如果不为空,请不带空格,并以'\0'结尾,注意所有填写的条件都会进行匹配 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法可能对应多条响应消息 + virtual int QueryOptionCombinedExecPosition(const XTPQueryOptCombExecPosReq* query_param, uint64_t session_id, int request_id) = 0; + + ///用户登录algo服务器请求 + ///@return 表明此资金账号登录是否成功,非“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,“0”表示登录成功 + ///@param ip algo服务器地址,类似“127.0.0.1” + ///@param port algo服务器端口号 + ///@param user 登录用户名 + ///@param password 登录密码 + ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只需调用一次,所有用户共用即可 + virtual int LoginALGO(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + ///algo业务中查询用户策略请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param strategy_type 需要查询的策略类型,可填0 + ///@param client_strategy_id 需要查询的策略用户自定义id,可填0 + ///@param xtp_strategy_id 需要查询的策略在xtp系统中的id,如果指定,就一定按指定查询,如果填0,则按其他筛选条件查询 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark xtp_strategy_id条件的优先级最高,只有当xtp_strategy_id为0时,其他条件才生效,此条请求可能对应多条回应消息 + virtual int QueryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id) = 0; + + ///用户请求使用algo服务器建立算法通道 + ///@return 表明此资金账号建立算法通道请求消息发送是否成功,非“0”表示发送失败,可以调用GetApiLastError()来获取错误代码,“0”表示发送成功 + ///@param oms_ip oms服务器地址,类似“127.0.0.1”,非algo服务器地址 + ///@param oms_port oms服务器端口号,非algo服务器端口号 + ///@param user 登录用户名 + ///@param password 登录密码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数为异步方式,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立,在使用算法前,请先建立算法通道 + virtual int ALGOUserEstablishChannel(const char* oms_ip, int oms_port, const char* user, const char* password, uint64_t session_id) = 0; + + ///algo业务中用户报算法单请求 + ///@return 算法报单请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param strategy_type 需要创建的策略类型 + ///@param client_strategy_id 用户自定义id,帮助用户定位 + ///@param strategy_param 策略参数 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 仅能在用户建立算法通道后使用,算法单的异步通知 + virtual int InsertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, char* strategy_param, uint64_t session_id) = 0; + + ///algo业务中用户撤销算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param cancel_flag 是否需要算法去处理已下的算法子单标志,true-交给算法自行处理,包括撤单、平仓等,算法处理完成后会通知客户;false-立即停止算法母单的执行,此时算法平台会对已下的子单做撤单操作,其余的平仓等操作需要客户自己处理 + ///@param xtp_strategy_id 需要撤销的算法单在xtp algobus系统中的id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 仅能在用户建立算法通道后调用 + virtual int CancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id) = 0; + + ///获取算法单的母单ID + ///@return 返回算法单的母单ID,如果返回为0表示不是算法单 + ///@param order_xtp_id 算法单对应的xtp id + ///@param order_client_id 算法单对应的自定义ID,不可随意填写 + ///@remark 返回为0表示,不是算法单,如果传入的参数不对的话,可能会得不到正确结果,此函数调用不依赖于是否登录 + virtual uint64_t GetAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id) = 0; + + ///algo业务中请求推荐算法 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,true-打包 + ///@param basket_param 需要算法推荐的证券列表,为json字串,具体格式参考说明文档或咨询运营人员 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此条请求可能对应多条回应消息,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int StrategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id) = 0; + + ///algo业务中修改已有的算法单 + ///@return 算法单修改请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param strategy_param 修改后的策略参数 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int ModifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id) = 0; + + protected: + ~TraderApi() {}; + }; + + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif diff --git "a/doc/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" "b/doc/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" index 10dc093..862ded7 100644 Binary files "a/doc/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" and "b/doc/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" differ diff --git a/source/Windows/xtp_api_python3_2.2.39.3/CMakeLists.txt b/source/Windows/xtp_api_python3_2.2.39.3/CMakeLists.txt index 7e03c1a..7c10892 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/CMakeLists.txt +++ b/source/Windows/xtp_api_python3_2.2.39.3/CMakeLists.txt @@ -1,130 +1,130 @@ -cmake_minimum_required(VERSION 2.8) -project(vn_xtp_api) - -# 设置使用的编译器 -set(CMAKE_BUILD_TYPE "Release") -if (CMAKE_COMPILER_IS_GNUC OR CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11") -endif () - -# 设置输出目录 -set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) -set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) - -# 使用64位编译 -option(USE_64BITS "comiple 64bits" ON) -if (USE_64BITS) - add_definitions(-DUSE_64BITS) -endif() - -# 设置C++ API源文件的所在目录 -set(XTPAPI_PATH ) -if (WIN32) - set(XTPAPI_PATH xtpapi) -elseif (UNIX) - message("Under unix: " ${CMAKE_SIZEOF_VOID_P}) - if (CMAKE_SIZEOF_VOID_P MATCHES "8") - set(XTPAPI_PATH xtpapi) - endif() -endif() - -include_directories(${XTPAPI_PATH}) - - -set(XTPAPI_MD_LIBRARY ) -set(XTPAPI_TD_LIBRARY ) - -# 链接C++ API库文件 -if (WIN32) -find_library(XTPAPI_MD_LIBRARY - NAMES xtpquoteapi.lib - PATHS ${CMAKE_CURRENT_SOURCE_DIR}/xtpapi/) -find_library(XTPAPI_TD_LIBRARY - NAMES xtptraderapi.lib - PATHS ${CMAKE_CURRENT_SOURCE_DIR}/xtpapi/) -elseif (UNIX) -find_library(XTPAPI_MD_LIBRARY - NAMES libxtpquoteapi.so - PATHS ${XTPAPI_PATH}) -find_library(XTPAPI_TD_LIBRARY - NAMES libxtptraderapi.so - PATHS ${XTPAPI_PATH}) -endif() - -# 设置Python所在的目录 -set(PYTHON_LIBRARY ) -if (WIN32) - set(PYTHON_INCLUDE_PATH D:/MyThird/Python39/include) - link_directories(D:/MyThird/Python39/libs) - include_directories(${PYTHON_INCLUDE_PATH}) -elseif(UNIX) - set(PYTHON_LIBRARY /usr/local/python3/lib/) - set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.9/) - - include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda /python3用的是python3.9没有用Anaconda -set(BOOST_ROOT ) -if (WIN32) - set(BOOST_ROOT D:/MyThird/boost_1_80_0) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 - link_directories(D:/MyThird/boost_1_80_0/stage/lib) - include_directories(${BOOST_ROOT}) -elseif(UNIX) - set(Boost_USE_MULTITHREADED ON) - set(BOOST_ROOT /usr/local/boost_1_80_0/) - find_package(Boost 1.80.0 COMPONENTS python39 thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 - if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) - endif() -endif() - -# 设置编译源文件 -set (vnxtpquote ) -set (vnxtptrader ) - -option(BUILD_XTP_MD "build xtp md" ON) -if (BUILD_XTP_MD) - add_definitions(-BUILD_XTP_MD) - set(XTP_MD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote) - include_directories(${XTP_MD_PATH}) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/vnxtpquote.cpp) - add_library(vnxtpquote SHARED ${VN_XTP_MD_SOURCE}) -endif() -option(BUILD_XTP_TD "build xtp td" ON) -if (BUILD_XTP_TD) - add_definitions(-BUILD_XTP_TD) - set(XTP_TD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/) - include_directories(${XTP_TD_PATH}) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader.cpp) - add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) -endif() - -# 去掉生成的so文件名中前缀的lib -set_target_properties(vnxtpquote PROPERTIES PREFIX "") - -# 链接生成.so文件 -if (WIN32) - target_link_libraries(vnxtpquote ${XTPAPI_MD_LIBRARY}) -elseif(UNIX) - target_link_libraries(vnxtpquote ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_MD_LIBRARY}) -endif() -# 将生成的dll文件后缀名修改为pyd(仅在windows下) -set(MD_DLL ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.dll) -if (EXISTS ${MD_DLL}) - file(RENAME ${MD_DLL} ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.pyd) -endif() - -# 和上面的MD相同 -set_target_properties(vnxtptrader PROPERTIES PREFIX "") -if (WIN32) - target_link_libraries(vnxtptrader ${XTPAPI_TD_LIBRARY}) -elseif(UNIX) - target_link_libraries(vnxtptrader ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_TD_LIBRARY}) -endif() - -set(TD_DLL ${LIBRARY_OUTPUT_PATH}/Release/vnxtptrader.dll) -if (EXISTS ${TD_DLL}) - file(RENAME ${TD_DLL} ${LIBRARY_OUTPUT_PATH}/Release/vnxtptrader.pyd) -endif() +cmake_minimum_required(VERSION 2.8) +project(vn_xtp_api) + +# 设置使用的编译器 +set(CMAKE_BUILD_TYPE "Release") +if (CMAKE_COMPILER_IS_GNUC OR CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11") +endif () + +# 设置输出目录 +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) +set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) + +# 使用64位编译 +option(USE_64BITS "comiple 64bits" ON) +if (USE_64BITS) + add_definitions(-DUSE_64BITS) +endif() + +# 设置C++ API源文件的所在目录 +set(XTPAPI_PATH ) +if (WIN32) + set(XTPAPI_PATH xtpapi) +elseif (UNIX) + message("Under unix: " ${CMAKE_SIZEOF_VOID_P}) + if (CMAKE_SIZEOF_VOID_P MATCHES "8") + set(XTPAPI_PATH xtpapi) + endif() +endif() + +include_directories(${XTPAPI_PATH}) + + +set(XTPAPI_MD_LIBRARY ) +set(XTPAPI_TD_LIBRARY ) + +# 链接C++ API库文件 +if (WIN32) +find_library(XTPAPI_MD_LIBRARY + NAMES xtpquoteapi.lib + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/xtpapi/) +find_library(XTPAPI_TD_LIBRARY + NAMES xtptraderapi.lib + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/xtpapi/) +elseif (UNIX) +find_library(XTPAPI_MD_LIBRARY + NAMES libxtpquoteapi.so + PATHS ${XTPAPI_PATH}) +find_library(XTPAPI_TD_LIBRARY + NAMES libxtptraderapi.so + PATHS ${XTPAPI_PATH}) +endif() + +# 设置Python所在的目录 +set(PYTHON_LIBRARY ) +if (WIN32) + set(PYTHON_INCLUDE_PATH D:/MyThird/Python39/include) + link_directories(D:/MyThird/Python39/libs) + include_directories(${PYTHON_INCLUDE_PATH}) +elseif(UNIX) + set(PYTHON_LIBRARY /usr/local/python3/lib/) + set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.9/) + + include_directories(${PYTHON_INCLUDE_PATH}) +endif() + +# 链接boost库,anaconda /python3用的是python3.9没有用Anaconda +set(BOOST_ROOT ) +if (WIN32) + set(BOOST_ROOT D:/MyThird/boost_1_80_0) + set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 + link_directories(D:/MyThird/boost_1_80_0/stage/lib) + include_directories(${BOOST_ROOT}) +elseif(UNIX) + set(Boost_USE_MULTITHREADED ON) + set(BOOST_ROOT /usr/local/boost_1_80_0/) + find_package(Boost 1.80.0 COMPONENTS python39 thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + endif() +endif() + +# 设置编译源文件 +set (vnxtpquote ) +set (vnxtptrader ) + +option(BUILD_XTP_MD "build xtp md" ON) +if (BUILD_XTP_MD) + add_definitions(-BUILD_XTP_MD) + set(XTP_MD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote) + include_directories(${XTP_MD_PATH}) + set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/vnxtpquote.cpp) + add_library(vnxtpquote SHARED ${VN_XTP_MD_SOURCE}) +endif() +option(BUILD_XTP_TD "build xtp td" ON) +if (BUILD_XTP_TD) + add_definitions(-BUILD_XTP_TD) + set(XTP_TD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/) + include_directories(${XTP_TD_PATH}) + set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader.cpp) + add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) +endif() + +# 去掉生成的so文件名中前缀的lib +set_target_properties(vnxtpquote PROPERTIES PREFIX "") + +# 链接生成.so文件 +if (WIN32) + target_link_libraries(vnxtpquote ${XTPAPI_MD_LIBRARY}) +elseif(UNIX) + target_link_libraries(vnxtpquote ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_MD_LIBRARY}) +endif() +# 将生成的dll文件后缀名修改为pyd(仅在windows下) +set(MD_DLL ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.dll) +if (EXISTS ${MD_DLL}) + file(RENAME ${MD_DLL} ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.pyd) +endif() + +# 和上面的MD相同 +set_target_properties(vnxtptrader PROPERTIES PREFIX "") +if (WIN32) + target_link_libraries(vnxtptrader ${XTPAPI_TD_LIBRARY}) +elseif(UNIX) + target_link_libraries(vnxtptrader ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_TD_LIBRARY}) +endif() + +set(TD_DLL ${LIBRARY_OUTPUT_PATH}/Release/vnxtptrader.dll) +if (EXISTS ${TD_DLL}) + file(RENAME ${TD_DLL} ${LIBRARY_OUTPUT_PATH}/Release/vnxtptrader.pyd) +endif() diff --git a/source/Windows/xtp_api_python3_2.2.39.3/README.md b/source/Windows/xtp_api_python3_2.2.39.3/README.md index 8f7ceab..09d06bd 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/README.md +++ b/source/Windows/xtp_api_python3_2.2.39.3/README.md @@ -1,23 +1,23 @@ -中泰证券量化交易平台XTP PYTHON API接口 - -本项目是中泰证券XTP极速交易PYTHON接口的开源实现,供客户在量化交易中使用PYTHON接口快速接入XTP系统。中泰证券XTP是为股票交易而生的极速交易系统,为投资者提供极速交易、极速行情、Level2行情。 - -目前xtp系统最新的api版本为2.2.38.1,支持win、linux平台运行 - -请先到中泰证券xtp官方网站申请测试账号 https://xtp.zts.com.cn 及测试环境的连接ip、端口等信息 - -API参考官方C++版本的接口文档 https://xtp.zts.com.cn/doc/api/xtpDoc - -由于python版本api封装使用的vs2010,如果未安装vs环境,运行时会提示ImportError:DLL load failed。需要根据python的位数选择对应的运行库,32位的选x86,64位选x64,执行程序参考文件包vs2010运行库 -x86系统的vs2010运行库:vcredist_x86.exe -x64系统的vs2010运行库:vcredist_x64.exe - -##事项说明: - -1.当前xtp的python api封装支持win7系统、win10系统和Linux系统,在bin目录下Linux文件夹中有python3封装库,Windows文件夹中有64位的python3封装库。test文件夹下包含行情和交易的测试脚本。 - -2.当前bin目录下编译时python3使用的python3.9.13版本,如果直接使用当前的封装库,请注意使用的python版本是否为3.9系列。在Windows下如果您使用的python版本和我们编译时使用的版本不一致,会导致调用python封装库失败。 - -3.如果您需要按自己的python版本编译封装库,可以使用source目录下的代码,根据自己的python的版本,及该python版本对应的编译后的boost库,自行编译所需的python封装库。(具体过程在doc文件夹下有编译过程文档,source文件夹下有源码,包括Linux和Windows下编译的python3封装库)。 - +中泰证券量化交易平台XTP PYTHON API接口 + +本项目是中泰证券XTP极速交易PYTHON接口的开源实现,供客户在量化交易中使用PYTHON接口快速接入XTP系统。中泰证券XTP是为股票交易而生的极速交易系统,为投资者提供极速交易、极速行情、Level2行情。 + +目前xtp系统最新的api版本为2.2.38.1,支持win、linux平台运行 + +请先到中泰证券xtp官方网站申请测试账号 https://xtp.zts.com.cn 及测试环境的连接ip、端口等信息 + +API参考官方C++版本的接口文档 https://xtp.zts.com.cn/doc/api/xtpDoc + +由于python版本api封装使用的vs2010,如果未安装vs环境,运行时会提示ImportError:DLL load failed。需要根据python的位数选择对应的运行库,32位的选x86,64位选x64,执行程序参考文件包vs2010运行库 +x86系统的vs2010运行库:vcredist_x86.exe +x64系统的vs2010运行库:vcredist_x64.exe + +##事项说明: + +1.当前xtp的python api封装支持win7系统、win10系统和Linux系统,在bin目录下Linux文件夹中有python3封装库,Windows文件夹中有64位的python3封装库。test文件夹下包含行情和交易的测试脚本。 + +2.当前bin目录下编译时python3使用的python3.9.13版本,如果直接使用当前的封装库,请注意使用的python版本是否为3.9系列。在Windows下如果您使用的python版本和我们编译时使用的版本不一致,会导致调用python封装库失败。 + +3.如果您需要按自己的python版本编译封装库,可以使用source目录下的代码,根据自己的python的版本,及该python版本对应的编译后的boost库,自行编译所需的python封装库。(具体过程在doc文件夹下有编译过程文档,source文件夹下有源码,包括Linux和Windows下编译的python3封装库)。 + 4.XTP_API_20231031_2.2.38.1文件夹下存放最新的xtp系统的api,当前python封装库分别包含行情和交易库,python封装后的接口与当前xtp系统api的所有接口都保持一致,只有方法名有所区别,python封装后的接口方法名首字母小写,而xtp系统api的方法名首字母大写。因此所有封装后的python接口方法使用和功能都可以参见xtp系统api的接口方法。请在xtp_quote_api.h、xtp_trader_api.h两个头文件中了解各个接口的使用及功能。 \ No newline at end of file diff --git a/source/Windows/xtp_api_python3_2.2.39.3/build.sh b/source/Windows/xtp_api_python3_2.2.39.3/build.sh index df67efc..def7731 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/build.sh +++ b/source/Windows/xtp_api_python3_2.2.39.3/build.sh @@ -1,14 +1,14 @@ -#!/bin/bash - -set -e -BUILDDIR=build -rm -rf $BUILDDIR -if [ ! -f $BUILDDIR ]; then - mkdir -p $BUILDDIR -fi -pushd $BUILDDIR -cmake .. -make VERBOSE=1 -j 1 -cp `pwd`/lib/vnxtpquote.so ../ -cp `pwd`/lib/vnxtptrader.so ../ -popd +#!/bin/bash + +set -e +BUILDDIR=build +rm -rf $BUILDDIR +if [ ! -f $BUILDDIR ]; then + mkdir -p $BUILDDIR +fi +pushd $BUILDDIR +cmake .. +make VERBOSE=1 -j 1 +cp `pwd`/lib/vnxtpquote.so ../ +cp `pwd`/lib/vnxtptrader.so ../ +popd diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/ReadMe.txt b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/ReadMe.txt index 0838bff..414798d 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/ReadMe.txt +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/ReadMe.txt @@ -1,48 +1,48 @@ -======================================================================== - DYNAMIC LINK LIBRARY : vnxtpquote Project Overview -======================================================================== - -AppWizard has created this vnxtpquote DLL for you. - -This file contains a summary of what you will find in each of the files that -make up your vnxtpquote application. - - -vnxtpquote.vcxproj - This is the main project file for VC++ projects generated using an Application Wizard. - It contains information about the version of Visual C++ that generated the file, and - information about the platforms, configurations, and project features selected with the - Application Wizard. - -vnxtpquote.vcxproj.filters - This is the filters file for VC++ projects generated using an Application Wizard. - It contains information about the association between the files in your project - and the filters. This association is used in the IDE to show grouping of files with - similar extensions under a specific node (for e.g. ".cpp" files are associated with the - "Source Files" filter). - -vnxtpquote.cpp - This is the main DLL source file. - - When created, this DLL does not export any symbols. As a result, it - will not produce a .lib file when it is built. If you wish this project - to be a project dependency of some other project, you will either need to - add code to export some symbols from the DLL so that an export library - will be produced, or you can set the Ignore Input Library property to Yes - on the General propert page of the Linker folder in the project's Property - Pages dialog box. - -///////////////////////////////////////////////////////////////////////////// -Other standard files: - -StdAfx.h, StdAfx.cpp - These files are used to build a precompiled header (PCH) file - named vnxtpquote.pch and a precompiled types file named StdAfx.obj. - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -AppWizard uses "TODO:" comments to indicate parts of the source code you -should add to or customize. - -///////////////////////////////////////////////////////////////////////////// +======================================================================== + DYNAMIC LINK LIBRARY : vnxtpquote Project Overview +======================================================================== + +AppWizard has created this vnxtpquote DLL for you. + +This file contains a summary of what you will find in each of the files that +make up your vnxtpquote application. + + +vnxtpquote.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +vnxtpquote.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +vnxtpquote.cpp + This is the main DLL source file. + + When created, this DLL does not export any symbols. As a result, it + will not produce a .lib file when it is built. If you wish this project + to be a project dependency of some other project, you will either need to + add code to export some symbols from the DLL so that an export library + will be produced, or you can set the Ignore Input Library property to Yes + on the General propert page of the Linker folder in the project's Property + Pages dialog box. + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named vnxtpquote.pch and a precompiled types file named StdAfx.obj. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/dllmain.cpp b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/dllmain.cpp index 69b5891..8a4edd3 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/dllmain.cpp +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/dllmain.cpp @@ -1,19 +1,19 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "stdafx.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.cpp b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.cpp index 926d762..0749ca4 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.cpp +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.cpp @@ -1,8 +1,8 @@ -// stdafx.cpp : source file that includes just the standard includes -// vnxtpquote.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +// stdafx.cpp : source file that includes just the standard includes +// vnxtpquote.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.h b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.h index f3a0737..677e68a 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/stdafx.h @@ -1,16 +1,16 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files: -#include - - - -// TODO: reference additional headers your program requires here +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + + + +// TODO: reference additional headers your program requires here diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/targetver.h b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/targetver.h index 87c0086..90e767b 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/targetver.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/targetver.h @@ -1,8 +1,8 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.cpp b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.cpp index 1616eb0..0bc77aa 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.cpp +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.cpp @@ -1,2830 +1,2830 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtpquote.h" - -///------------------------------------------------------------------------------------- -///PythonC++תõĺ -///------------------------------------------------------------------------------------- - -void getInt(dict d, string key, int *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -}; - -void getDouble(dict d, string key, double *value) -{ - if (d.has_key(key)) - { - object o = d[key]; - extract x(o); - if (x.check()) - { - *value = x(); - } - } -}; - -void getInt64(dict d, string key, int64_t *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -}; - -void getInt16(dict d, string key, int16_t *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -} - -void getStr(dict d, string key, char *value) -{ - if (d.has_key(key)) - { - object o = d[key]; - extract x(o); - if (x.check()) - { - string s = x(); - const char *buffer = s.c_str(); - //ַָ븳ֵʹstrcpy_s, vs2013ʹstrcpyͨ - //+1ӦΪC++ַĽβţرȷ1 -#ifdef _MSC_VER //WIN32 - strcpy_s(value, strlen(buffer) + 1, buffer); -#elif __GNUC__ - strncpy(value, buffer, strlen(buffer) + 1); -#endif - } - } -}; - -void getChar(dict d, string key, char *value) -{ - if (d.has_key(key)) - { - object o = d[key]; - extract x(o); - if (x.check()) - { - string s = x(); - const char *buffer = s.c_str(); - *value = *buffer; - } - } -}; - -string addEndingChar(char *value){ - string endStr = value; - return endStr; -} - -///------------------------------------------------------------------------------------- -///C++Ļصݱ浽 -///------------------------------------------------------------------------------------- - -void QuoteApi::OnDisconnected(int reason) -{ - Task* task = new Task(); - task->task_name = ONDISCONNECTED; - task->task_id = reason; - this->task_queue.push(task); -}; - -void QuoteApi::OnError(XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONERROR; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - this->task_queue.push(task); -}; - -void QuoteApi::OnTickByTickLossRange(int begin_seq, int end_seq) -{ - Task* task = new Task(); - task->task_name = ONTICKBYTICKLOSSRANGE; - task->task_id = begin_seq; - task->task_one_counts = end_seq; - this->task_queue.push(task); -}; - -void QuoteApi::OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONSUBMARKETDATA; - - if (ticker) - { - XTPST *task_data = new XTPST(); - *task_data = *ticker; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONUNSUBMARKETDATA; - - if (ticker) - { - XTPST *task_data = new XTPST(); - *task_data = *ticker; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) -{ - Task* task = new Task(); - task->task_name = ONDEPTHMARKETDATA; - - if (market_data) - { - XTPMD *task_data = new XTPMD(); - *task_data = *market_data; - task->task_data = task_data; - } - - if (bid1_qty && bid1_count>0) - { - int64_t *task_data_one = new int64_t[bid1_count]; - for (int i=0;itask_data_one = task_data_one; - } - task->task_one_counts = bid1_count; - task->task_one_all_counts = max_bid1_count; - if (ask1_qty && ask1_count>0) - { - int64_t *task_data_two = new int64_t[ask1_count]; - for (int i=0;itask_data_two = task_data_two; - } - task->task_two_counts = ask1_count; - task->task_two_all_counts =max_ask1_count; - - this->task_queue.push(task); -}; - -void QuoteApi::OnETFIOPVData(IOPV *iopv) -{ - Task* task = new Task(); - task->task_name = ONETFIOPVDATA; - - if (iopv) - { - IOPV *task_data = new IOPV(); - *task_data = *iopv; - task->task_data = task_data; - } - - this->task_queue.push(task); -}; - -void QuoteApi::OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONSUBORDERBOOK; - - if (ticker) - { - XTPST *task_data = new XTPST(); - *task_data = *ticker; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONUNSUBORDERBOOK; - - if (ticker) - { - XTPST *task_data = new XTPST(); - *task_data = *ticker; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnOrderBook(XTPOB *order_book) -{ - Task* task = new Task(); - task->task_name = ONORDERBOOK; - - if (order_book) - { - XTPOB *task_data = new XTPOB(); - *task_data = *order_book; - task->task_data = task_data; - } - this->task_queue.push(task); -}; - -void QuoteApi::OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONSUBTICKBYTICK; - - if (ticker) - { - XTPST *task_data = new XTPST(); - *task_data = *ticker; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONUNSUBTICKBYTICK; - - if (ticker) - { - XTPST *task_data = new XTPST(); - *task_data = *ticker; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnTickByTick(XTPTBT *tbt_data) -{ - Task* task = new Task(); - task->task_name = ONTICKBYTICK; - - if (tbt_data) - { - XTPTBT *task_data = new XTPTBT(); - *task_data = *tbt_data; - task->task_data = task_data; - } - - this->task_queue.push(task); -}; - -void QuoteApi::OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONSUBSCRIBEALLMARKETDATA; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLMARKETDATA; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONSUBSCRIBEALLORDERBOOK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - - -void QuoteApi::OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLORDERBOOK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - - -void QuoteApi::OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONSUBSCRIBEALLTICKBYTICK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLTICKBYTICK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONQUERYALLTICKERS; - - if (ticker_info) - { - XTPQSI *task_data = new XTPQSI(); - *task_data = *ticker_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - -void QuoteApi::OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONQUERYTICKERSPRICEINFO; - - if (ticker_info) - { - XTPTPI *task_data = new XTPTPI(); - *task_data = *ticker_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -}; - - -void QuoteApi::OnQueryAllTickersFullInfo(XTPQFI * ticker_info, XTPRI * error_info, bool is_last) { - - Task* task = new Task(); - task->task_name = ONQUERYALLTICKERSFULLINFO; - - if (ticker_info) - { - XTPQFI *task_data = new XTPQFI(); - *task_data = *ticker_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -} - -void QuoteApi::OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last) -{ - Task* task = new Task(); - task->task_name = ONQUERYALLNQTICKERSFULLINFO; - - if (ticker_info) - { - XTPNQFI *task_data = new XTPNQFI(); - *task_data = *ticker_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_last = is_last; - this->task_queue.push(task); -} - -void QuoteApi::OnRebuildQuoteServerDisconnected(int reason) -{ - Task* task = new Task(); - task->task_name = ONREBUILDQUOTESERVERDISCONNECTED; - - task->task_id = reason; - this->task_queue.push(task); -} - -void QuoteApi::OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) -{ - Task* task = new Task(); - task->task_name = ONREQUESTREBUILDQUOTE; - if (rebuild_result) - { - XTPQuoteRebuildResultRsp* task_data = new XTPQuoteRebuildResultRsp(); - *task_data = *rebuild_result; - task->task_data = task_data; - } - this->task_queue.push(task); -} - -void QuoteApi::OnRebuildTickByTick(XTPTBT *tbt_data) -{ - Task* task = new Task(); - task->task_name = ONREBUILDTICKBYTICK; - - if (tbt_data) - { - XTPTBT *task_data = new XTPTBT(); - *task_data = *tbt_data; - task->task_data = task_data; - } - - this->task_queue.push(task); -} - -void QuoteApi::OnRebuildMarketData(XTPMD *md_data) -{ - Task* task = new Task(); - task->task_name = ONREBUILDMARKETDATA; - if (md_data) - { - XTPMD *task_data = new XTPMD(); - *task_data = *md_data; - task->task_data = task_data; - } - this->task_queue.push(task); -} - - -void QuoteApi::OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONSUBSCRIBEALLOPTIONMARKETDATA; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLOPTIONMARKETDATA; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONSUBSCRIBEALLOPTIONORDERBOOK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLOPTIONORDERBOOK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONSUBSCRIBEALLOPTIONTICKBYTICK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; - -void QuoteApi::OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLOPTIONTICKBYTICK; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->exchange_id = exchage_id; - this->task_queue.push(task); -}; -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪpython󣬽 -///------------------------------------------------------------------------------------- - -void QuoteApi::processTask() -{ - while (1) - { - Task* task = this->task_queue.wait_and_pop(); - - switch (task->task_name) - { - case ONDISCONNECTED: - { - this->processDisconnected(task); - break; - } - - case ONERROR: - { - this->processError(task); - break; - } - - case ONSUBMARKETDATA: - { - this->processSubMarketData(task); - break; - } - - case ONUNSUBMARKETDATA: - { - this->processUnSubMarketData(task); - break; - } - - case ONDEPTHMARKETDATA: - { - this->processDepthMarketData(task); - break; - } - - case ONSUBORDERBOOK: - { - this->processSubOrderBook(task); - break; - } - - case ONUNSUBORDERBOOK: - { - this->processUnSubOrderBook(task); - break; - } - - case ONORDERBOOK: - { - this->processOrderBook(task); - break; - } - - case ONSUBTICKBYTICK: - { - this->processSubTickByTick(task); - break; - } - - case ONUNSUBTICKBYTICK: - { - this->processUnSubTickByTick(task); - break; - } - - case ONTICKBYTICK: - { - this->processTickByTick(task); - break; - } - - case ONSUBSCRIBEALLMARKETDATA: - { - this->processSubscribeAllMarketData(task); - break; - } - - case ONUNSUBSCRIBEALLMARKETDATA: - { - this->processUnSubscribeAllMarketData(task); - break; - } - - case ONSUBSCRIBEALLORDERBOOK: - { - this->processSubscribeAllOrderBook(task); - break; - } - - case ONUNSUBSCRIBEALLORDERBOOK: - { - this->processUnSubscribeAllOrderBook(task); - break; - } - - case ONSUBSCRIBEALLTICKBYTICK: - { - this->processSubscribeAllTickByTick(task); - break; - } - - case ONUNSUBSCRIBEALLTICKBYTICK: - { - this->processUnSubscribeAllTickByTick(task); - break; - } - - case ONQUERYALLTICKERS: - { - this->processQueryAllTickers(task); - break; - } - - case ONQUERYTICKERSPRICEINFO: - { - this->processQueryTickersPriceInfo(task); - break; - } - - - - case ONSUBSCRIBEALLOPTIONMARKETDATA: - { - this->processSubscribeAllOptionMarketData(task); - break; - } - case ONUNSUBSCRIBEALLOPTIONMARKETDATA: - { - this->processUnSubscribeAllOptionMarketData(task); - break; - } - case ONSUBSCRIBEALLOPTIONORDERBOOK: - { - this->processSubscribeAllOptionOrderBook(task); - break; - } - case ONUNSUBSCRIBEALLOPTIONORDERBOOK: - { - this->processUnSubscribeAllOptionOrderBook(task); - break; - } - case ONSUBSCRIBEALLOPTIONTICKBYTICK: - { - this->processSubscribeAllOptionTickByTick(task); - break; - } - case ONUNSUBSCRIBEALLOPTIONTICKBYTICK: - { - this->processUnSubscribeAllOptionTickByTick(task); - break; - } - case ONQUERYALLTICKERSFULLINFO: { - this->processQueryAllTickersFullInfo(task); - break; - } - case ONREBUILDQUOTESERVERDISCONNECTED: - { - this->processRebuildQuoteServerDisconnected(task); - break; - } - case ONREQUESTREBUILDQUOTE: - { - this->processRequestRebuildQuote(task); - break; - } - case ONREBUILDTICKBYTICK: - { - this->processRebuildTickByTick(task); - break; - } - case ONREBUILDMARKETDATA: - { - this->processRebuildMarketData(task); - break; - } - case ONQUERYALLNQTICKERSFULLINFO: - { - this->processQueryAllNQTickersFullInfo(task); - break; - } - - case ONTICKBYTICKLOSSRANGE: - { - this->processTickByTickLossRange(task); - break; - } - - case ONETFIOPVDATA: - { - this->processETFIOPVData(task); - break; - } - }; - } -}; - - - -void QuoteApi::processDisconnected(Task *task) -{ - PyLock lock; - this->onDisconnected(task->task_id); - delete task; -}; - -void QuoteApi::processError(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*) task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onError(error); - delete task; -}; - -void QuoteApi::processTickByTickLossRange(Task *task) -{ - PyLock lock; - this->onTickByTickLossRange(task->task_id, task->task_one_counts); - delete task; -}; - -void QuoteApi::processSubMarketData(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPST *task_data = (XTPST*) task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*) task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubMarketData(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processUnSubMarketData(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPST *task_data = (XTPST*) task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*) task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubMarketData(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processDepthMarketData(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPMD *task_data = (XTPMD*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["last_price"] = task_data->last_price; - data["pre_close_price"] = task_data->pre_close_price; - data["open_price"] = task_data->open_price; - data["high_price"] = task_data->high_price; - data["low_price"] = task_data->low_price; - data["close_price"] = task_data->close_price; - - data["pre_total_long_positon"] = task_data->pre_total_long_positon; - data["total_long_positon"] = task_data->total_long_positon; - data["pre_settl_price"] = task_data->pre_settl_price; - data["settl_price"] = task_data->settl_price; - - data["upper_limit_price"] = task_data->upper_limit_price; - data["lower_limit_price"] = task_data->lower_limit_price; - data["pre_delta"] = task_data->pre_delta; - data["curr_delta"] = task_data->curr_delta; - - data["data_time"] = task_data->data_time; - - data["qty"] = task_data->qty; - data["turnover"] = task_data->turnover; - data["avg_price"] = task_data->avg_price; - - data["trades_count"] = task_data->trades_count; - char str_ticker_status[9] = {"\0"}; -#ifdef _MSC_VER //WIN32 - strncpy(str_ticker_status, task_data->ticker_status,sizeof(task_data->ticker_status)); -#elif __GNUC__ - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#endif - data["ticker_status"] = addEndingChar(str_ticker_status); - - boost::python::list ask; - boost::python::list bid; - boost::python::list ask_qty; - boost::python::list bid_qty; - - for (int i = 0; i < 10; i++) - { - ask.append(task_data->ask[i]); - bid.append(task_data->bid[i]); - ask_qty.append(task_data->ask_qty[i]); - bid_qty.append(task_data->bid_qty[i]); - } - - data["ask"] = ask; - data["bid"] = bid; - data["bid_qty"] = bid_qty; - data["ask_qty"] = ask_qty; - - data["data_type"] = (int)task_data->data_type; - data["data_type_v2"] = (int)task_data->data_type_v2; - if (task_data->data_type_v2 == XTP_MARKETDATA_V2_ACTUAL){ - data["total_bid_qty"] = task_data->stk.total_bid_qty; - data["total_ask_qty"] = task_data->stk.total_ask_qty; - data["ma_bid_price"] = task_data->stk.ma_bid_price; - data["ma_ask_price"] = task_data->stk.ma_ask_price; - data["ma_bond_bid_price"] = task_data->stk.ma_bond_bid_price; - data["ma_bond_ask_price"] = task_data->stk.ma_bond_ask_price; - data["yield_to_maturity"] = task_data->stk.yield_to_maturity; - data["iopv"] = task_data->stk.iopv; - data["etf_buy_count"] = task_data->stk.etf_buy_count; - data["etf_sell_count"] = task_data->stk.etf_sell_count; - data["etf_buy_qty"] = task_data->stk.etf_buy_qty; - data["etf_buy_money"] = task_data->stk.etf_buy_money; - data["etf_sell_qty"] = task_data->stk.etf_sell_qty; - data["etf_sell_money"] = task_data->stk.etf_sell_money; - data["total_warrant_exec_qty"] = task_data->stk.total_warrant_exec_qty; - data["warrant_lower_price"] = task_data->stk.warrant_lower_price; - data["warrant_upper_price"] = task_data->stk.warrant_upper_price; - data["cancel_buy_count"] = task_data->stk.cancel_buy_count; - data["cancel_sell_count"] = task_data->stk.cancel_sell_count; - data["cancel_buy_qty"] = task_data->stk.cancel_buy_qty; - data["cancel_sell_qty"] = task_data->stk.cancel_sell_qty; - data["cancel_buy_money"] = task_data->stk.cancel_buy_money; - data["cancel_sell_money"] = task_data->stk.cancel_sell_money; - data["total_buy_count"] = task_data->stk.total_buy_count; - data["total_sell_count"] = task_data->stk.total_sell_count; - data["duration_after_buy"] = task_data->stk.duration_after_buy; - data["duration_after_sell"] = task_data->stk.duration_after_sell; - data["num_bid_orders"] = task_data->stk.num_bid_orders; - data["num_ask_orders"] = task_data->stk.num_ask_orders; - data["pre_iopv"] = task_data->stk.pre_iopv; - data["r1"] = task_data->stk.r1; - data["r2"] = task_data->stk.r2; - }else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_OPTION){ - data["auction_price"] = task_data->opt.auction_price; - data["auction_qty"] = task_data->opt.auction_qty; - data["last_enquiry_time"] = task_data->opt.last_enquiry_time; - } - else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_BOND) - { - data["total_bid_qty"] = task_data->bond.total_bid_qty; - data["total_ask_qty"] = task_data->bond.total_ask_qty; - data["ma_bid_price"] = task_data->bond.ma_bid_price; - data["ma_ask_price"] = task_data->bond.ma_ask_price; - data["ma_bond_bid_price"] = task_data->bond.ma_bond_bid_price; - data["ma_bond_ask_price"] = task_data->bond.ma_bond_ask_price; - data["yield_to_maturity"] = task_data->bond.yield_to_maturity; - data["match_lastpx"] = task_data->bond.match_lastpx; - data["ma_bond_price"] = task_data->bond.ma_bond_price; - data["match_qty"] = task_data->bond.match_qty; - data["match_turnover"] = task_data->bond.match_turnover; - data["r4"] = task_data->bond.r4; - data["r5"] = task_data->bond.r5; - data["r6"] = task_data->bond.r6; - data["r7"] = task_data->bond.r7; - data["r8"] = task_data->bond.r8; - data["cancel_buy_count"] = task_data->bond.cancel_buy_count; - data["cancel_sell_count"] = task_data->bond.cancel_sell_count; - data["cancel_buy_qty"] = task_data->bond.cancel_buy_qty; - data["cancel_sell_qty"] = task_data->bond.cancel_sell_qty; - data["cancel_buy_money"] = task_data->bond.cancel_buy_money; - data["cancel_sell_money"] = task_data->bond.cancel_sell_money; - data["total_buy_count"] = task_data->bond.total_buy_count; - data["total_sell_count"] = task_data->bond.total_sell_count; - data["duration_after_buy"] = task_data->bond.duration_after_buy; - data["duration_after_sell"] = task_data->bond.duration_after_sell; - data["num_bid_orders"] = task_data->bond.num_bid_orders; - data["num_ask_orders"] = task_data->bond.num_ask_orders; - data["instrument_status"] = addEndingChar(task_data->bond.instrument_status); - } - - //data["r4"] = task_data->r4; - - delete task->task_data; - } - boost::python::list bid1_qty_list; - if (task->task_data_one && task->task_one_counts>0) - { - for (int i=0;itask_one_counts;i++) - { - int64_t *bid1_qty = (int64_t *)task->task_data_one+i; - bid1_qty_list.append(*bid1_qty); - } - delete[] task->task_data_one; - } - int bid1_count= task->task_one_counts; - int max_bid1_count= task->task_one_all_counts; - - boost::python::list ask1_qty_list; - if (task->task_data_two && task->task_two_counts>0) - { - for (int i=0;itask_two_counts;i++) - { - int64_t *ask1_qty = (int64_t *)task->task_data_two+i; - ask1_qty_list.append(*ask1_qty); - } - delete[] task->task_data_two; - } - int ask1_count= task->task_two_counts; - int max_ask1_count= task->task_two_all_counts; - this->onDepthMarketData(data,bid1_qty_list,bid1_count,max_bid1_count,ask1_qty_list,ask1_count,max_ask1_count); - delete task; -}; - -void QuoteApi::processETFIOPVData(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - IOPV *task_data = (IOPV*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["data_time"] = task_data->data_time; - data["iopv"] = task_data->iopv; - delete task->task_data; - } - - this->onETFIOPVData(data); - delete task; -}; - -void QuoteApi::processSubOrderBook(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPST *task_data = (XTPST*) task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*) task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubOrderBook(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processUnSubOrderBook(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPST *task_data = (XTPST*) task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*) task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubOrderBook(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processOrderBook(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPOB *task_data = (XTPOB*) task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["data_time"] = task_data->data_time; - - data["last_price"] = task_data->last_price; - data["qty"] = task_data->qty; - data["turnover"] = task_data->turnover; - data["trades_count"] = task_data->trades_count; - - boost::python::list ask; - boost::python::list bid; - boost::python::list ask_qty; - boost::python::list bid_qty; - - for (int i = 0; i < 10; i++) - { - ask.append(task_data->ask[i]); - bid.append(task_data->bid[i]); - ask_qty.append(task_data->ask_qty[i]); - bid_qty.append(task_data->bid_qty[i]); - } - - data["ask"] = ask; - data["bid"] = bid; - data["bid_qty"] = bid_qty; - data["ask_qty"] = ask_qty; - delete task->task_data; - } - - this->onOrderBook(data); - delete task; -}; - -void QuoteApi::processSubTickByTick(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPST *task_data = (XTPST*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubTickByTick(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processUnSubTickByTick(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPST *task_data = (XTPST*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubTickByTick(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processTickByTick(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPTBT *task_data = (XTPTBT*)task->task_data; - - - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["struct_seq"] = task_data->seq; - data["data_time"] = task_data->data_time; - data["type"] = (int)task_data->type; - - if (task_data->type == XTP_TBT_ENTRUST) - { - data["channel_no"] = task_data->entrust.channel_no; - data["seq"] = task_data->entrust.seq; - data["price"] = task_data->entrust.price; - data["qty"] = task_data->entrust.qty; - data["side"] = task_data->entrust.side; - data["ord_type"] = task_data->entrust.ord_type; - data["order_no"] = task_data->entrust.order_no; - } - else if(task_data->type == XTP_TBT_TRADE) - { - data["channel_no"] = task_data->trade.channel_no; - data["seq"] = task_data->trade.seq; - data["price"] = task_data->trade.price; - data["qty"] = task_data->trade.qty; - data["money"] = task_data->trade.money; - data["bid_no"] = task_data->trade.bid_no; - data["ask_no"] = task_data->trade.ask_no; - data["trade_flag"] = task_data->trade.trade_flag; - } - else - { - data["channel_no"] = task_data->state.channel_no; - data["seq"] = task_data->state.seq; - data["flag"] = addEndingChar(task_data->state.flag); - } - - delete task->task_data; - } - - this->onTickByTick(data); - delete task; -}; - -void QuoteApi::processSubscribeAllMarketData(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - this->onSubscribeAllMarketData(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processUnSubscribeAllMarketData(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubscribeAllMarketData(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processSubscribeAllOrderBook(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubscribeAllOrderBook(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processUnSubscribeAllOrderBook(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubscribeAllOrderBook(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processSubscribeAllTickByTick(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubscribeAllTickByTick(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processUnSubscribeAllTickByTick(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubscribeAllTickByTick(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processQueryAllTickers(Task *task) -{ - PyLock lock; - - //ֶ޸ - dict data; - if (task->task_data) - { - XTPQSI *task_data = (XTPQSI*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["ticker_type"] = (int)task_data->ticker_type; - data["pre_close_price"] = task_data->pre_close_price; - data["upper_limit_price"] = task_data->upper_limit_price; - data["lower_limit_price"] = task_data->lower_limit_price; - data["price_tick"] = task_data->price_tick; - data["buy_qty_unit"] = task_data->buy_qty_unit; - data["sell_qty_unit"] = task_data->sell_qty_unit; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*) task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryAllTickers(data, error, task->task_last); - delete task; -}; - -void QuoteApi::processQueryTickersPriceInfo(Task *task) -{ - PyLock lock; - - //ֶ޸ - dict data; - if (task->task_data) - { - XTPTPI *task_data = (XTPTPI*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["last_price"] = task_data->last_price; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryTickersPriceInfo(data, error, task->task_last); - delete task; -}; - - - - - -void QuoteApi::processSubscribeAllOptionMarketData(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubscribeAllOptionMarketData(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processUnSubscribeAllOptionMarketData(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubscribeAllOptionMarketData(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processSubscribeAllOptionOrderBook(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubscribeAllOptionOrderBook(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processUnSubscribeAllOptionOrderBook(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubscribeAllOptionOrderBook(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processSubscribeAllOptionTickByTick(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onSubscribeAllOptionTickByTick(task->exchange_id,error); - delete task; -}; - -void QuoteApi::processUnSubscribeAllOptionTickByTick(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onUnSubscribeAllOptionTickByTick(task->exchange_id,error); - delete task; -}; - - -void QuoteApi::processQueryAllTickersFullInfo(Task* task) { - PyLock lock; - - dict data; - if (task->task_data) - { - XTPQFI *task_data = (XTPQFI*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["security_type"] = (int)task_data->security_type; - data["ticker_qualification_class"] = (int)task_data->ticker_qualification_class; - data["is_registration"] = task_data->is_registration; - data["is_VIE"] = task_data->is_VIE; - data["is_noprofit"] = task_data->is_noprofit; - data["is_weighted_voting_rights"] = task_data->is_weighted_voting_rights; - data["is_have_price_limit"] = task_data->is_have_price_limit; - data["upper_limit_price"] = task_data->upper_limit_price; - data["lower_limit_price"] = task_data->lower_limit_price; - data["pre_close_price"] = task_data->pre_close_price; - data["price_tick"] = task_data->price_tick; - data["bid_qty_upper_limit"] = task_data->bid_qty_upper_limit; - data["bid_qty_lower_limit"] = task_data->bid_qty_lower_limit; - data["bid_qty_unit"] = task_data->bid_qty_unit; - data["ask_qty_upper_limit"] = task_data->ask_qty_upper_limit; - data["ask_qty_lower_limit"] = task_data->ask_qty_lower_limit; - data["ask_qty_unit"] = task_data->ask_qty_unit; - data["market_bid_qty_upper_limit"] = task_data->market_bid_qty_upper_limit; - data["market_bid_qty_lower_limit"] = task_data->market_bid_qty_lower_limit; - data["market_bid_qty_unit"] = task_data->market_bid_qty_unit; - data["market_ask_qty_upper_limit"] = task_data->market_ask_qty_upper_limit; - data["market_ask_qty_lower_limit"] = task_data->market_ask_qty_lower_limit; - data["market_ask_qty_unit"] = task_data->market_ask_qty_unit; - data["security_status"] = (int)task_data->security_status; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryAllTickersFullInfo(data, error, task->task_last); - - delete task; -} - -void QuoteApi::processQueryAllNQTickersFullInfo(Task* task) { - PyLock lock; - - dict data; - if (task->task_data) - { - XTPNQFI *task_data = (XTPNQFI*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["security_type"] = (int)task_data->security_type; - data["ticker_qualification_class"] = (int)task_data->ticker_qualification_class; - data["ticker_abbr_en"] = addEndingChar(task_data->ticker_abbr_en); - data["base_ticker"] = addEndingChar(task_data->base_ticker); - data["industry_type"] = addEndingChar(task_data->industry_type); - data["currency_type"] = addEndingChar(task_data->currency_type); - data["trade_unit"] = task_data->trade_unit; - data["hang_out_date"] = task_data->hang_out_date; - data["value_date"] = task_data->value_date; - data["maturity_date"] = task_data->maturity_date; - data["per_limit_vol"] = task_data->per_limit_vol; - data["buy_vol_unit"] = task_data->buy_vol_unit; - data["sell_vol_unit"] = task_data->sell_vol_unit; - data["mini_declared_vol"] = task_data->mini_declared_vol; - data["limit_price_attr"] = task_data->limit_price_attr; - data["market_maker_quantity"] = task_data->market_maker_quantity; - data["price_gear"] = task_data->price_gear; - data["first_limit_trans"] = task_data->first_limit_trans; - data["subsequent_limit_trans"] = task_data->subsequent_limit_trans; - data["limit_upper_price"] = task_data->limit_upper_price; - data["limit_lower_price"] = task_data->limit_lower_price; - data["block_trade_upper"] = task_data->block_trade_upper; - data["block_trade_lower"] = task_data->block_trade_lower; - data["convert_into_ration"] = task_data->convert_into_ration; - data["trade_status"] = (int)task_data->trade_status; - data["security_level"] = (int)task_data->security_level; - data["trade_type"] = (int)task_data->trade_type; - data["suspend_flag"] = (int)task_data->suspend_flag; - data["ex_dividend_flag"] = (int)task_data->ex_dividend_flag; - data["layer_type"] = (int)task_data->layer_type; - data["reserved1"] = task_data->reserved1; - data["trade_places"] = addEndingChar(task_data->trade_places); - data["is_rzbd"] = task_data->is_rzbd; - data["is_rqbd"] = task_data->is_rqbd; - data["is_drrz"] = task_data->is_drrz; - data["is_drrq"] = task_data->is_drrq; - data["reserved"] = task_data->reserved; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryAllNQTickersFullInfo(data, error, task->task_last); - - delete task; -} - -void QuoteApi::processRebuildQuoteServerDisconnected(Task *task) -{ - PyLock lock; - this->onRebuildQuoteServerDisconnected(task->task_id); - delete task; -} - -void QuoteApi::processRequestRebuildQuote(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQuoteRebuildResultRsp* task_data = (XTPQuoteRebuildResultRsp*)task->task_data; - data["request_id"] = task_data->request_id; - data["exchange_id"] = (int)task_data->exchange_id; - data["size"] = task_data->size; - data["channel_number"] = task_data->channel_number; - data["begin"] = task_data->begin; - data["end"] = task_data->end; - data["result_code"] = (int)task_data->result_code; - data["msg"] = addEndingChar(task_data->msg); - delete task->task_data; - } - this->onRequestRebuildQuote(data); - delete task; -} - -void QuoteApi::processRebuildTickByTick(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPTBT *task_data = (XTPTBT*)task->task_data; - - - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["struct_seq"] = task_data->seq; - data["data_time"] = task_data->data_time; - data["type"] = (int)task_data->type; - - if (task_data->type == XTP_TBT_ENTRUST) - { - data["channel_no"] = task_data->entrust.channel_no; - data["seq"] = task_data->entrust.seq; - data["price"] = task_data->entrust.price; - data["qty"] = task_data->entrust.qty; - data["side"] = task_data->entrust.side; - data["ord_type"] = task_data->entrust.ord_type; - data["order_no"] = task_data->entrust.order_no; - } - else if (task_data->type == XTP_TBT_TRADE) - { - data["channel_no"] = task_data->trade.channel_no; - data["seq"] = task_data->trade.seq; - data["price"] = task_data->trade.price; - data["qty"] = task_data->trade.qty; - data["money"] = task_data->trade.money; - data["bid_no"] = task_data->trade.bid_no; - data["ask_no"] = task_data->trade.ask_no; - data["trade_flag"] = task_data->trade.trade_flag; - } - else - { - data["channel_no"] = task_data->state.channel_no; - data["seq"] = task_data->state.seq; - data["flag"] = addEndingChar(task_data->state.flag); - } - - delete task->task_data; - } - - this->onRebuildTickByTick(data); - delete task; -} - -void QuoteApi::processRebuildMarketData(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPMD *task_data = (XTPMD*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["last_price"] = task_data->last_price; - data["pre_close_price"] = task_data->pre_close_price; - data["open_price"] = task_data->open_price; - data["high_price"] = task_data->high_price; - data["low_price"] = task_data->low_price; - data["close_price"] = task_data->close_price; - - data["pre_total_long_positon"] = task_data->pre_total_long_positon; - data["total_long_positon"] = task_data->total_long_positon; - data["pre_settl_price"] = task_data->pre_settl_price; - data["settl_price"] = task_data->settl_price; - - data["upper_limit_price"] = task_data->upper_limit_price; - data["lower_limit_price"] = task_data->lower_limit_price; - data["pre_delta"] = task_data->pre_delta; - data["curr_delta"] = task_data->curr_delta; - - data["data_time"] = task_data->data_time; - - data["qty"] = task_data->qty; - data["turnover"] = task_data->turnover; - data["avg_price"] = task_data->avg_price; - - data["trades_count"] = task_data->trades_count; - char str_ticker_status[9] = { "\0" }; -#ifdef _MSC_VER //WIN32 - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#elif __GNUC__ - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#endif - data["ticker_status"] = addEndingChar(str_ticker_status); - - boost::python::list ask; - boost::python::list bid; - boost::python::list ask_qty; - boost::python::list bid_qty; - - for (int i = 0; i < 10; i++) - { - ask.append(task_data->ask[i]); - bid.append(task_data->bid[i]); - ask_qty.append(task_data->ask_qty[i]); - bid_qty.append(task_data->bid_qty[i]); - } - - data["ask"] = ask; - data["bid"] = bid; - data["bid_qty"] = bid_qty; - data["ask_qty"] = ask_qty; - - data["data_type"] = (int)task_data->data_type; - data["data_type_v2"] = (int)task_data->data_type_v2; - if (task_data->data_type_v2 == XTP_MARKETDATA_V2_ACTUAL) { - data["total_bid_qty"] = task_data->stk.total_bid_qty; - data["total_ask_qty"] = task_data->stk.total_ask_qty; - data["ma_bid_price"] = task_data->stk.ma_bid_price; - data["ma_ask_price"] = task_data->stk.ma_ask_price; - data["ma_bond_bid_price"] = task_data->stk.ma_bond_bid_price; - data["ma_bond_ask_price"] = task_data->stk.ma_bond_ask_price; - data["yield_to_maturity"] = task_data->stk.yield_to_maturity; - data["iopv"] = task_data->stk.iopv; - data["etf_buy_count"] = task_data->stk.etf_buy_count; - data["etf_sell_count"] = task_data->stk.etf_sell_count; - data["etf_buy_qty"] = task_data->stk.etf_buy_qty; - data["etf_buy_money"] = task_data->stk.etf_buy_money; - data["etf_sell_qty"] = task_data->stk.etf_sell_qty; - data["etf_sell_money"] = task_data->stk.etf_sell_money; - data["total_warrant_exec_qty"] = task_data->stk.total_warrant_exec_qty; - data["warrant_lower_price"] = task_data->stk.warrant_lower_price; - data["warrant_upper_price"] = task_data->stk.warrant_upper_price; - data["cancel_buy_count"] = task_data->stk.cancel_buy_count; - data["cancel_sell_count"] = task_data->stk.cancel_sell_count; - data["cancel_buy_qty"] = task_data->stk.cancel_buy_qty; - data["cancel_sell_qty"] = task_data->stk.cancel_sell_qty; - data["cancel_buy_money"] = task_data->stk.cancel_buy_money; - data["cancel_sell_money"] = task_data->stk.cancel_sell_money; - data["total_buy_count"] = task_data->stk.total_buy_count; - data["total_sell_count"] = task_data->stk.total_sell_count; - data["duration_after_buy"] = task_data->stk.duration_after_buy; - data["duration_after_sell"] = task_data->stk.duration_after_sell; - data["num_bid_orders"] = task_data->stk.num_bid_orders; - data["num_ask_orders"] = task_data->stk.num_ask_orders; - data["pre_iopv"] = task_data->stk.pre_iopv; - data["r1"] = task_data->stk.r1; - data["r2"] = task_data->stk.r2; - } - else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_OPTION) { - data["auction_price"] = task_data->opt.auction_price; - data["auction_qty"] = task_data->opt.auction_qty; - data["last_enquiry_time"] = task_data->opt.last_enquiry_time; - } - else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_BOND) - { - data["total_bid_qty"] = task_data->bond.total_bid_qty; - data["total_ask_qty"] = task_data->bond.total_ask_qty; - data["ma_bid_price"] = task_data->bond.ma_bid_price; - data["ma_ask_price"] = task_data->bond.ma_ask_price; - data["ma_bond_bid_price"] = task_data->bond.ma_bond_bid_price; - data["ma_bond_ask_price"] = task_data->bond.ma_bond_ask_price; - data["yield_to_maturity"] = task_data->bond.yield_to_maturity; - data["match_lastpx"] = task_data->bond.match_lastpx; - data["ma_bond_price"] = task_data->bond.ma_bond_price; - data["match_qty"] = task_data->bond.match_qty; - data["match_turnover"] = task_data->bond.match_turnover; - data["r4"] = task_data->bond.r4; - data["r5"] = task_data->bond.r5; - data["r6"] = task_data->bond.r6; - data["r7"] = task_data->bond.r7; - data["r8"] = task_data->bond.r8; - data["cancel_buy_count"] = task_data->bond.cancel_buy_count; - data["cancel_sell_count"] = task_data->bond.cancel_sell_count; - data["cancel_buy_qty"] = task_data->bond.cancel_buy_qty; - data["cancel_sell_qty"] = task_data->bond.cancel_sell_qty; - data["cancel_buy_money"] = task_data->bond.cancel_buy_money; - data["cancel_sell_money"] = task_data->bond.cancel_sell_money; - data["total_buy_count"] = task_data->bond.total_buy_count; - data["total_sell_count"] = task_data->bond.total_sell_count; - data["duration_after_buy"] = task_data->bond.duration_after_buy; - data["duration_after_sell"] = task_data->bond.duration_after_sell; - data["num_bid_orders"] = task_data->bond.num_bid_orders; - data["num_ask_orders"] = task_data->bond.num_ask_orders; - data["instrument_status"] = addEndingChar(task_data->bond.instrument_status); - } - - //data["r4"] = task_data->r4; - - delete task->task_data; - } - - this->onRebuildMarketData(data); - delete task; -} - - -///------------------------------------------------------------------------------------- -/// -///------------------------------------------------------------------------------------- - -void QuoteApi::createQuoteApi(int clientid, string path, int log_level) -{ - this->api = XTP::API::QuoteApi::CreateQuoteApi(clientid, path.c_str(),(XTP_LOG_LEVEL)log_level); - this->api->RegisterSpi(this); -}; - -void QuoteApi::release() -{ - this->api->Release(); -}; - -int QuoteApi::exit() -{ - //úԭAPIûУڰȫ˳APIãԭjoinƺ̫ȶ - this->api->RegisterSpi(NULL); - this->api->Release(); - this->api = NULL; - return 1; -}; - -string QuoteApi::getTradingDay() -{ - string ret =""; - const char* p = this->api->GetTradingDay(); - if (p == NULL) - ret = "NULL"; - else - ret = p; - return ret; -}; - -string QuoteApi::getApiVersion() -{ - string ret =""; - const char* p = this->api->GetApiVersion(); - if (p == NULL) - ret = "NULL"; - else - ret = p; - return ret; -}; - -dict QuoteApi::getApiLastError() -{ - XTPRI *error = this->api->GetApiLastError(); - dict err; - if(error == NULL) - return err; - - err["error_id"] = error->error_id; - err["error_msg"] = error->error_msg; - - return err; -}; - -void QuoteApi::setUDPBufferSize(int size) -{ - this->api->SetUDPBufferSize(size); -}; - -void QuoteApi::setHeartBeatInterval(int interval) -{ - this->api->SetHeartBeatInterval(interval); -}; - -void QuoteApi::setUDPRecvThreadAffinity(int32_t cpu_no) -{ - this->api->SetUDPRecvThreadAffinity(cpu_no); -}; - -void QuoteApi::setUDPRecvThreadAffinityArray(boost::python::list tickerList,int count) -{ - int listLength = boost::python::len(tickerList); - if(listLength <= 0) - return; - int32_t *myreqList = new int32_t[listLength]; - for(int i=0;iapi->SetUDPRecvThreadAffinityArray(myreqList, count); - - delete[] myreqList; - myreqList = NULL; -}; - -void QuoteApi::setUDPParseThreadAffinity(int32_t cpu_no) -{ - this->api->SetUDPParseThreadAffinity(cpu_no); -}; - -void QuoteApi::setUDPParseThreadAffinityArray(boost::python::list tickerList,int count) -{ - int listLength = boost::python::len(tickerList); - if(listLength <= 0) - return; - int32_t *myreqList = new int32_t[listLength]; - for(int i=0;iapi->SetUDPParseThreadAffinityArray(myreqList, count); - - delete[] myreqList; - myreqList = NULL; -}; - -void QuoteApi::setUDPSeqLogOutPutFlag(bool flag) -{ - this->api->SetUDPSeqLogOutPutFlag(flag); -}; - -int QuoteApi::subscribeMarketData(boost::python::list tickerList,int count, int exchange) -{ - int listLength = boost::python::len(tickerList); - if(listLength <= 0) - return -1; - char **myreqList = new char *[listLength]; - for(int i=0;iapi->SubscribeMarketData(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - for(int i=0;iapi->UnSubscribeMarketData(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - for(int i=0;iapi->SubscribeOrderBook(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - for(int i=0;iapi->UnSubscribeOrderBook(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - for(int i=0;iapi->SubscribeTickByTick(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - for(int i=0;iapi->UnSubscribeTickByTick(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - for(int i=0;iapi->SubscribeAllMarketData((XTP_EXCHANGE_TYPE)exchange); -}; - -int QuoteApi::unSubscribeAllMarketData(int exchange) -{ - return this->api->UnSubscribeAllMarketData((XTP_EXCHANGE_TYPE)exchange); -}; - -int QuoteApi::subscribeAllOrderBook(int exchange) -{ - return this->api->SubscribeAllOrderBook((XTP_EXCHANGE_TYPE)exchange); -}; - -int QuoteApi::unSubscribeAllOrderBook(int exchange) -{ - return this->api->UnSubscribeAllOrderBook((XTP_EXCHANGE_TYPE)exchange); -}; - -int QuoteApi::subscribeAllTickByTick(int exchange) -{ - return this->api->SubscribeAllTickByTick((XTP_EXCHANGE_TYPE)exchange); -}; - -int QuoteApi::unSubscribeAllTickByTick(int exchange) -{ - return this->api->UnSubscribeAllTickByTick((XTP_EXCHANGE_TYPE)exchange); -}; - -int QuoteApi::login(string ip, int port, string user, string password, int socktype,string local_ip) -{ - int i = this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype,local_ip.c_str()); - return i; -}; - -int QuoteApi::logout() -{ - int i = this->api->Logout(); - return i; -}; - -int QuoteApi::queryAllTickers(int exchange) -{ - int i = this->api->QueryAllTickers((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::queryTickersPriceInfo(boost::python::list tickerList,int count, int exchange) -{ - int listLength = boost::python::len(tickerList); - if(listLength <= 0) - return -1; - //printf("listLength:%d\n",listLength); - char **myreqList = new char *[listLength]; - for(int i=0;iapi->QueryTickersPriceInfo(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); - //printf("return i:%d\n",i); - for(int i=0;iapi->QueryAllTickersPriceInfo(); - return i; -} - -int QuoteApi::queryAllTickersFullInfo(int exchange) { - int i =this->api->QueryAllTickersFullInfo((XTP_EXCHANGE_TYPE) exchange); - return i; -} - -int QuoteApi::queryAllNQTickersFullInfo() - { - return this->api->QueryAllNQTickersFullInfo(); -} - -int QuoteApi::subscribeAllOptionMarketData(int exchange) -{ - int i = this->api->SubscribeAllOptionMarketData((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::unSubscribeAllOptionMarketData(int exchange) -{ - int i = this->api->UnSubscribeAllOptionMarketData((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::subscribeAllOptionOrderBook(int exchange) -{ - int i = this->api->SubscribeAllOptionOrderBook((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::unSubscribeAllOptionOrderBook(int exchange) -{ - int i = this->api->UnSubscribeAllOptionOrderBook((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::subscribeAllOptionTickByTick(int exchange) -{ - int i = this->api->SubscribeAllOptionTickByTick((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::unSubscribeAllOptionTickByTick(int exchange) -{ - int i = this->api->UnSubscribeAllOptionTickByTick((XTP_EXCHANGE_TYPE)exchange); - return i; -}; - -int QuoteApi::loginToRebuildQuoteServer(string ip, int port, string user, string password, int sock_type, string local_ip) -{ - int i = this->api->LoginToRebuildQuoteServer(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)sock_type, local_ip.c_str()); - return i; -} - -int QuoteApi::logoutFromRebuildQuoteServer() -{ - int i = this->api->LogoutFromRebuildQuoteServer(); - return i; -} - -int QuoteApi::requestRebuildQuote(dict req) -{ - XTPQuoteRebuildReq myreq = XTPQuoteRebuildReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - getInt(req, "request_id", &myreq.request_id); - int data_type; - int exchange_id; - int channel_number; - getInt(req, "data_type", &data_type); - getInt(req, "exchange_id", &exchange_id); - getInt16(req, "channel_number", &myreq.channel_number); - getInt64(req, "begin", &myreq.begin); - getInt64(req, "end", &myreq.end); - - myreq.data_type = (XTP_QUOTE_REBUILD_DATA_TYPE)data_type; - myreq.exchange_id = (XTP_EXCHANGE_TYPE)exchange_id; - - int ret = api->RequestRebuildQuote(&myreq); - - return ret; -} - -///------------------------------------------------------------------------------------- -///Boost.Pythonװ -///------------------------------------------------------------------------------------- - -struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > -{ - virtual void onDisconnected(int reason) - { - try - { - this->get_override("onDisconnected")(reason); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onError(dict data) - { - try - { - this->get_override("onError")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onTickByTickLossRange(int begin_seq, int end_seq) - { - try - { - this->get_override("onTickByTickLossRange")(begin_seq, end_seq); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubMarketData(dict data, dict error, bool last) - { - try - { - this->get_override("onSubMarketData")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubMarketData(dict data, dict error, bool last) - { - try - { - this->get_override("onUnSubMarketData")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onDepthMarketData(dict data,boost::python::list bid1_qty_list,int bid1_count,int max_bid1_count,boost::python::list ask1_qty_list,int ask1_count,int max_ask1_count) - { - try - { - this->get_override("onDepthMarketData")(data,bid1_qty_list,bid1_count,max_bid1_count,ask1_qty_list,ask1_count,max_ask1_count); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onETFIOPVData(dict data) - { - try - { - this->get_override("onETFIOPVData")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubOrderBook(dict data, dict error, bool last) - { - try - { - this->get_override("onSubOrderBook")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubOrderBook(dict data, dict error, bool last) - { - try - { - this->get_override("onUnSubOrderBook")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onOrderBook(dict data) - { - try - { - this->get_override("onOrderBook")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubTickByTick(dict data, dict error, bool last) - { - try - { - this->get_override("onSubTickByTick")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubTickByTick(dict data, dict error, bool last) - { - try - { - this->get_override("onUnSubTickByTick")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onTickByTick(dict data) - { - try - { - this->get_override("onTickByTick")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubscribeAllMarketData(int exchange_id,dict data) - { - try - { - this->get_override("onSubscribeAllMarketData")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubscribeAllMarketData(int exchange_id,dict data) - { - try - { - this->get_override("onUnSubscribeAllMarketData")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubscribeAllOrderBook(int exchange_id,dict data) - { - try - { - this->get_override("onSubscribeAllOrderBook")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubscribeAllOrderBook(int exchange_id,dict data) - { - try - { - this->get_override("onUnSubscribeAllOrderBook")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubscribeAllTickByTick(int exchange_id,dict data) - { - try - { - this->get_override("onSubscribeAllTickByTick")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubscribeAllTickByTick(int exchange_id,dict data) - { - try - { - this->get_override("onUnSubscribeAllTickByTick")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryAllTickers(dict data, dict error, bool last) - { - try - { - this->get_override("onQueryAllTickers")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryTickersPriceInfo(dict data, dict error, bool last) - { - try - { - this->get_override("onQueryTickersPriceInfo")(data, error, last); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - - - - - virtual void onSubscribeAllOptionMarketData(int exchange_id,dict data) - { - try - { - this->get_override("onSubscribeAllOptionMarketData")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubscribeAllOptionMarketData(int exchange_id,dict data) - { - try - { - this->get_override("onUnSubscribeAllOptionMarketData")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onSubscribeAllOptionOrderBook(int exchange_id,dict data) - { - try - { - this->get_override("onSubscribeAllOptionOrderBook")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubscribeAllOptionOrderBook(int exchange_id,dict data) - { - try - { - this->get_override("onUnSubscribeAllOptionOrderBook")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - virtual void onSubscribeAllOptionTickByTick(int exchange_id,dict data) - { - try - { - this->get_override("onSubscribeAllOptionTickByTick")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onUnSubscribeAllOptionTickByTick(int exchange_id,dict data) - { - try - { - this->get_override("onUnSubscribeAllOptionTickByTick")(exchange_id,data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryAllTickersFullInfo(dict data, dict error, bool last) { - PyLock lock; - - try { - this->get_override("onQueryAllTickersFullInfo")(data, error, last); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryAllNQTickersFullInfo(dict data, dict error, bool last) { - PyLock lock; - - try { - this->get_override("onQueryAllNQTickersFullInfo")(data, error, last); - } - catch (error_already_set const &) { - PyErr_Print(); - } - } - - virtual void onRebuildQuoteServerDisconnected(int reason) - { - try - { - this->get_override("onRebuildQuoteServerDisconnected")(reason); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - } - - virtual void onRequestRebuildQuote(dict data) - { - try - { - this->get_override("onRequestRebuildQuote")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - } - - virtual void onRebuildTickByTick(dict data) - { - try - { - this->get_override("onRebuildTickByTick")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - } - - virtual void onRebuildMarketData(dict data) - { - try - { - this->get_override("onRebuildMarketData")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - } -}; - - - - -BOOST_PYTHON_MODULE(vnxtpquote) -{ - //PyEval_InitThreads(); //ʱУ֤ȴGIL - Py_Initialize(); - - class_("QuoteApi") - .def("createQuoteApi", &QuoteApiWrap::createQuoteApi) - .def("release", &QuoteApiWrap::release) - .def("exit", &QuoteApiWrap::exit) - .def("getTradingDay", &QuoteApiWrap::getTradingDay) - .def("getApiVersion", &QuoteApiWrap::getApiVersion) - .def("getApiLastError", &QuoteApiWrap::getApiLastError) - .def("setUDPBufferSize", &QuoteApiWrap::setUDPBufferSize) - .def("setHeartBeatInterval", &QuoteApiWrap::setHeartBeatInterval) - .def("setUDPRecvThreadAffinity", &QuoteApiWrap::setUDPRecvThreadAffinity) - .def("setUDPRecvThreadAffinityArray", &QuoteApiWrap::setUDPRecvThreadAffinityArray) - .def("setUDPParseThreadAffinity", &QuoteApiWrap::setUDPParseThreadAffinity) - .def("setUDPParseThreadAffinityArray", &QuoteApiWrap::setUDPParseThreadAffinityArray) - .def("setUDPSeqLogOutPutFlag", &QuoteApiWrap::setUDPSeqLogOutPutFlag) - .def("subscribeMarketData", &QuoteApiWrap::subscribeMarketData) - .def("unSubscribeMarketData", &QuoteApiWrap::unSubscribeMarketData) - .def("subscribeOrderBook", &QuoteApiWrap::subscribeOrderBook) - .def("unSubscribeOrderBook", &QuoteApiWrap::unSubscribeOrderBook) - .def("subscribeTickByTick", &QuoteApiWrap::subscribeTickByTick) - .def("unSubscribeTickByTick", &QuoteApiWrap::unSubscribeTickByTick) - .def("subscribeAllMarketData", &QuoteApiWrap::subscribeAllMarketData) - .def("unSubscribeAllMarketData", &QuoteApiWrap::unSubscribeAllMarketData) - .def("subscribeAllOrderBook", &QuoteApiWrap::subscribeAllOrderBook) - .def("unSubscribeAllOrderBook", &QuoteApiWrap::unSubscribeAllOrderBook) - .def("subscribeAllTickByTick", &QuoteApiWrap::subscribeAllTickByTick) - .def("unSubscribeAllTickByTick", &QuoteApiWrap::unSubscribeAllTickByTick) - .def("login", &QuoteApiWrap::login) - .def("logout", &QuoteApiWrap::logout) - .def("queryAllTickers", &QuoteApiWrap::queryAllTickers) - .def("queryTickersPriceInfo", &QuoteApiWrap::queryTickersPriceInfo) - .def("queryAllTickersPriceInfo", &QuoteApiWrap::queryAllTickersPriceInfo) - .def("queryAllTickersFullInfo", &QuoteApiWrap::queryAllTickersFullInfo) - .def("queryAllNQTickersFullInfo", &QuoteApiWrap::queryAllNQTickersFullInfo) - .def("subscribeAllOptionMarketData", &QuoteApiWrap::subscribeAllOptionMarketData) - .def("unSubscribeAllOptionMarketData", &QuoteApiWrap::unSubscribeAllOptionMarketData) - .def("subscribeAllOptionOrderBook", &QuoteApiWrap::subscribeAllOptionOrderBook) - .def("unSubscribeAllOptionOrderBook", &QuoteApiWrap::unSubscribeAllOptionOrderBook) - .def("subscribeAllOptionTickByTick", &QuoteApiWrap::subscribeAllOptionTickByTick) - .def("unSubscribeAllOptionTickByTick", &QuoteApiWrap::unSubscribeAllOptionTickByTick) - .def("loginToRebuildQuoteServer", &QuoteApiWrap::loginToRebuildQuoteServer) - .def("requestRebuildQuote", &QuoteApiWrap::requestRebuildQuote) - .def("logoutFromRebuildQuoteServer", &QuoteApiWrap::logoutFromRebuildQuoteServer) - - - .def("onDisconnected", pure_virtual(&QuoteApiWrap::onDisconnected)) - .def("onError", pure_virtual(&QuoteApiWrap::onError)) - .def("onTickByTickLossRange", pure_virtual(&QuoteApiWrap::onTickByTickLossRange)) - .def("onSubMarketData", pure_virtual(&QuoteApiWrap::onSubMarketData)) - .def("onUnSubMarketData", pure_virtual(&QuoteApiWrap::onUnSubMarketData)) - .def("onDepthMarketData", pure_virtual(&QuoteApiWrap::onDepthMarketData)) - .def("onETFIOPVData", pure_virtual(&QuoteApiWrap::onETFIOPVData)) - .def("onSubOrderBook", pure_virtual(&QuoteApiWrap::onSubOrderBook)) - .def("onUnSubOrderBook", pure_virtual(&QuoteApiWrap::onUnSubOrderBook)) - .def("onOrderBook", pure_virtual(&QuoteApiWrap::onOrderBook)) - .def("onSubTickByTick", pure_virtual(&QuoteApiWrap::onSubTickByTick)) - .def("onUnSubTickByTick", pure_virtual(&QuoteApiWrap::onUnSubTickByTick)) - .def("onTickByTick", pure_virtual(&QuoteApiWrap::onTickByTick)) - .def("onSubscribeAllMarketData", pure_virtual(&QuoteApiWrap::onSubscribeAllMarketData)) - .def("onUnSubscribeAllMarketData", pure_virtual(&QuoteApiWrap::onUnSubscribeAllMarketData)) - .def("onSubscribeAllOrderBook", pure_virtual(&QuoteApiWrap::onSubscribeAllOrderBook)) - .def("onUnSubscribeAllOrderBook", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOrderBook)) - .def("onSubscribeAllTickByTick", pure_virtual(&QuoteApiWrap::onSubscribeAllTickByTick)) - .def("onUnSubscribeAllTickByTick", pure_virtual(&QuoteApiWrap::onUnSubscribeAllTickByTick)) - .def("onQueryAllTickers", pure_virtual(&QuoteApiWrap::onQueryAllTickers)) - .def("onQueryTickersPriceInfo", pure_virtual(&QuoteApiWrap::onQueryTickersPriceInfo)) - .def("onQueryAllTickersFullInfo", &QuoteApiWrap::onQueryAllTickersFullInfo) - .def("onQueryAllNQTickersFullInfo", &QuoteApiWrap::onQueryAllNQTickersFullInfo) - .def("onRebuildQuoteServerDisconnected", &QuoteApiWrap::onRebuildQuoteServerDisconnected) - .def("onRequestRebuildQuote", &QuoteApiWrap::onRequestRebuildQuote) - .def("onRebuildTickByTick", &QuoteApiWrap::onRebuildTickByTick) - .def("onRebuildMarketData", &QuoteApiWrap::onRebuildMarketData) - - .def("onSubscribeAllOptionMarketData", pure_virtual(&QuoteApiWrap::onSubscribeAllOptionMarketData)) - .def("onUnSubscribeAllOptionMarketData", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOptionMarketData)) - .def("onSubscribeAllOptionOrderBook", pure_virtual(&QuoteApiWrap::onSubscribeAllOptionOrderBook)) - .def("onUnSubscribeAllOptionOrderBook", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOptionOrderBook)) - .def("onSubscribeAllOptionTickByTick", pure_virtual(&QuoteApiWrap::onSubscribeAllOptionTickByTick)) - .def("onUnSubscribeAllOptionTickByTick", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOptionTickByTick)) - ; -}; +// vnctpmd.cpp : DLL Ӧóĵ +// +//#include "stdafx.h" +#include "vnxtpquote.h" + +///------------------------------------------------------------------------------------- +///PythonC++תõĺ +///------------------------------------------------------------------------------------- + +void getInt(dict d, string key, int *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +}; + +void getDouble(dict d, string key, double *value) +{ + if (d.has_key(key)) + { + object o = d[key]; + extract x(o); + if (x.check()) + { + *value = x(); + } + } +}; + +void getInt64(dict d, string key, int64_t *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +}; + +void getInt16(dict d, string key, int16_t *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +} + +void getStr(dict d, string key, char *value) +{ + if (d.has_key(key)) + { + object o = d[key]; + extract x(o); + if (x.check()) + { + string s = x(); + const char *buffer = s.c_str(); + //ַָ븳ֵʹstrcpy_s, vs2013ʹstrcpyͨ + //+1ӦΪC++ַĽβţرȷ1 +#ifdef _MSC_VER //WIN32 + strcpy_s(value, strlen(buffer) + 1, buffer); +#elif __GNUC__ + strncpy(value, buffer, strlen(buffer) + 1); +#endif + } + } +}; + +void getChar(dict d, string key, char *value) +{ + if (d.has_key(key)) + { + object o = d[key]; + extract x(o); + if (x.check()) + { + string s = x(); + const char *buffer = s.c_str(); + *value = *buffer; + } + } +}; + +string addEndingChar(char *value){ + string endStr = value; + return endStr; +} + +///------------------------------------------------------------------------------------- +///C++Ļصݱ浽 +///------------------------------------------------------------------------------------- + +void QuoteApi::OnDisconnected(int reason) +{ + Task* task = new Task(); + task->task_name = ONDISCONNECTED; + task->task_id = reason; + this->task_queue.push(task); +}; + +void QuoteApi::OnError(XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONERROR; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + this->task_queue.push(task); +}; + +void QuoteApi::OnTickByTickLossRange(int begin_seq, int end_seq) +{ + Task* task = new Task(); + task->task_name = ONTICKBYTICKLOSSRANGE; + task->task_id = begin_seq; + task->task_one_counts = end_seq; + this->task_queue.push(task); +}; + +void QuoteApi::OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONSUBMARKETDATA; + + if (ticker) + { + XTPST *task_data = new XTPST(); + *task_data = *ticker; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONUNSUBMARKETDATA; + + if (ticker) + { + XTPST *task_data = new XTPST(); + *task_data = *ticker; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) +{ + Task* task = new Task(); + task->task_name = ONDEPTHMARKETDATA; + + if (market_data) + { + XTPMD *task_data = new XTPMD(); + *task_data = *market_data; + task->task_data = task_data; + } + + if (bid1_qty && bid1_count>0) + { + int64_t *task_data_one = new int64_t[bid1_count]; + for (int i=0;itask_data_one = task_data_one; + } + task->task_one_counts = bid1_count; + task->task_one_all_counts = max_bid1_count; + if (ask1_qty && ask1_count>0) + { + int64_t *task_data_two = new int64_t[ask1_count]; + for (int i=0;itask_data_two = task_data_two; + } + task->task_two_counts = ask1_count; + task->task_two_all_counts =max_ask1_count; + + this->task_queue.push(task); +}; + +void QuoteApi::OnETFIOPVData(IOPV *iopv) +{ + Task* task = new Task(); + task->task_name = ONETFIOPVDATA; + + if (iopv) + { + IOPV *task_data = new IOPV(); + *task_data = *iopv; + task->task_data = task_data; + } + + this->task_queue.push(task); +}; + +void QuoteApi::OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONSUBORDERBOOK; + + if (ticker) + { + XTPST *task_data = new XTPST(); + *task_data = *ticker; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONUNSUBORDERBOOK; + + if (ticker) + { + XTPST *task_data = new XTPST(); + *task_data = *ticker; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnOrderBook(XTPOB *order_book) +{ + Task* task = new Task(); + task->task_name = ONORDERBOOK; + + if (order_book) + { + XTPOB *task_data = new XTPOB(); + *task_data = *order_book; + task->task_data = task_data; + } + this->task_queue.push(task); +}; + +void QuoteApi::OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONSUBTICKBYTICK; + + if (ticker) + { + XTPST *task_data = new XTPST(); + *task_data = *ticker; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONUNSUBTICKBYTICK; + + if (ticker) + { + XTPST *task_data = new XTPST(); + *task_data = *ticker; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnTickByTick(XTPTBT *tbt_data) +{ + Task* task = new Task(); + task->task_name = ONTICKBYTICK; + + if (tbt_data) + { + XTPTBT *task_data = new XTPTBT(); + *task_data = *tbt_data; + task->task_data = task_data; + } + + this->task_queue.push(task); +}; + +void QuoteApi::OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONSUBSCRIBEALLMARKETDATA; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONUNSUBSCRIBEALLMARKETDATA; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONSUBSCRIBEALLORDERBOOK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + + +void QuoteApi::OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONUNSUBSCRIBEALLORDERBOOK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + + +void QuoteApi::OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONSUBSCRIBEALLTICKBYTICK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONUNSUBSCRIBEALLTICKBYTICK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONQUERYALLTICKERS; + + if (ticker_info) + { + XTPQSI *task_data = new XTPQSI(); + *task_data = *ticker_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + +void QuoteApi::OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONQUERYTICKERSPRICEINFO; + + if (ticker_info) + { + XTPTPI *task_data = new XTPTPI(); + *task_data = *ticker_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +}; + + +void QuoteApi::OnQueryAllTickersFullInfo(XTPQFI * ticker_info, XTPRI * error_info, bool is_last) { + + Task* task = new Task(); + task->task_name = ONQUERYALLTICKERSFULLINFO; + + if (ticker_info) + { + XTPQFI *task_data = new XTPQFI(); + *task_data = *ticker_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +} + +void QuoteApi::OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last) +{ + Task* task = new Task(); + task->task_name = ONQUERYALLNQTICKERSFULLINFO; + + if (ticker_info) + { + XTPNQFI *task_data = new XTPNQFI(); + *task_data = *ticker_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_last = is_last; + this->task_queue.push(task); +} + +void QuoteApi::OnRebuildQuoteServerDisconnected(int reason) +{ + Task* task = new Task(); + task->task_name = ONREBUILDQUOTESERVERDISCONNECTED; + + task->task_id = reason; + this->task_queue.push(task); +} + +void QuoteApi::OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) +{ + Task* task = new Task(); + task->task_name = ONREQUESTREBUILDQUOTE; + if (rebuild_result) + { + XTPQuoteRebuildResultRsp* task_data = new XTPQuoteRebuildResultRsp(); + *task_data = *rebuild_result; + task->task_data = task_data; + } + this->task_queue.push(task); +} + +void QuoteApi::OnRebuildTickByTick(XTPTBT *tbt_data) +{ + Task* task = new Task(); + task->task_name = ONREBUILDTICKBYTICK; + + if (tbt_data) + { + XTPTBT *task_data = new XTPTBT(); + *task_data = *tbt_data; + task->task_data = task_data; + } + + this->task_queue.push(task); +} + +void QuoteApi::OnRebuildMarketData(XTPMD *md_data) +{ + Task* task = new Task(); + task->task_name = ONREBUILDMARKETDATA; + if (md_data) + { + XTPMD *task_data = new XTPMD(); + *task_data = *md_data; + task->task_data = task_data; + } + this->task_queue.push(task); +} + + +void QuoteApi::OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONSUBSCRIBEALLOPTIONMARKETDATA; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONUNSUBSCRIBEALLOPTIONMARKETDATA; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONSUBSCRIBEALLOPTIONORDERBOOK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONUNSUBSCRIBEALLOPTIONORDERBOOK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONSUBSCRIBEALLOPTIONTICKBYTICK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; + +void QuoteApi::OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONUNSUBSCRIBEALLOPTIONTICKBYTICK; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->exchange_id = exchage_id; + this->task_queue.push(task); +}; +///------------------------------------------------------------------------------------- +///̴߳ӶȡݣתΪpython󣬽 +///------------------------------------------------------------------------------------- + +void QuoteApi::processTask() +{ + while (1) + { + Task* task = this->task_queue.wait_and_pop(); + + switch (task->task_name) + { + case ONDISCONNECTED: + { + this->processDisconnected(task); + break; + } + + case ONERROR: + { + this->processError(task); + break; + } + + case ONSUBMARKETDATA: + { + this->processSubMarketData(task); + break; + } + + case ONUNSUBMARKETDATA: + { + this->processUnSubMarketData(task); + break; + } + + case ONDEPTHMARKETDATA: + { + this->processDepthMarketData(task); + break; + } + + case ONSUBORDERBOOK: + { + this->processSubOrderBook(task); + break; + } + + case ONUNSUBORDERBOOK: + { + this->processUnSubOrderBook(task); + break; + } + + case ONORDERBOOK: + { + this->processOrderBook(task); + break; + } + + case ONSUBTICKBYTICK: + { + this->processSubTickByTick(task); + break; + } + + case ONUNSUBTICKBYTICK: + { + this->processUnSubTickByTick(task); + break; + } + + case ONTICKBYTICK: + { + this->processTickByTick(task); + break; + } + + case ONSUBSCRIBEALLMARKETDATA: + { + this->processSubscribeAllMarketData(task); + break; + } + + case ONUNSUBSCRIBEALLMARKETDATA: + { + this->processUnSubscribeAllMarketData(task); + break; + } + + case ONSUBSCRIBEALLORDERBOOK: + { + this->processSubscribeAllOrderBook(task); + break; + } + + case ONUNSUBSCRIBEALLORDERBOOK: + { + this->processUnSubscribeAllOrderBook(task); + break; + } + + case ONSUBSCRIBEALLTICKBYTICK: + { + this->processSubscribeAllTickByTick(task); + break; + } + + case ONUNSUBSCRIBEALLTICKBYTICK: + { + this->processUnSubscribeAllTickByTick(task); + break; + } + + case ONQUERYALLTICKERS: + { + this->processQueryAllTickers(task); + break; + } + + case ONQUERYTICKERSPRICEINFO: + { + this->processQueryTickersPriceInfo(task); + break; + } + + + + case ONSUBSCRIBEALLOPTIONMARKETDATA: + { + this->processSubscribeAllOptionMarketData(task); + break; + } + case ONUNSUBSCRIBEALLOPTIONMARKETDATA: + { + this->processUnSubscribeAllOptionMarketData(task); + break; + } + case ONSUBSCRIBEALLOPTIONORDERBOOK: + { + this->processSubscribeAllOptionOrderBook(task); + break; + } + case ONUNSUBSCRIBEALLOPTIONORDERBOOK: + { + this->processUnSubscribeAllOptionOrderBook(task); + break; + } + case ONSUBSCRIBEALLOPTIONTICKBYTICK: + { + this->processSubscribeAllOptionTickByTick(task); + break; + } + case ONUNSUBSCRIBEALLOPTIONTICKBYTICK: + { + this->processUnSubscribeAllOptionTickByTick(task); + break; + } + case ONQUERYALLTICKERSFULLINFO: { + this->processQueryAllTickersFullInfo(task); + break; + } + case ONREBUILDQUOTESERVERDISCONNECTED: + { + this->processRebuildQuoteServerDisconnected(task); + break; + } + case ONREQUESTREBUILDQUOTE: + { + this->processRequestRebuildQuote(task); + break; + } + case ONREBUILDTICKBYTICK: + { + this->processRebuildTickByTick(task); + break; + } + case ONREBUILDMARKETDATA: + { + this->processRebuildMarketData(task); + break; + } + case ONQUERYALLNQTICKERSFULLINFO: + { + this->processQueryAllNQTickersFullInfo(task); + break; + } + + case ONTICKBYTICKLOSSRANGE: + { + this->processTickByTickLossRange(task); + break; + } + + case ONETFIOPVDATA: + { + this->processETFIOPVData(task); + break; + } + }; + } +}; + + + +void QuoteApi::processDisconnected(Task *task) +{ + PyLock lock; + this->onDisconnected(task->task_id); + delete task; +}; + +void QuoteApi::processError(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*) task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onError(error); + delete task; +}; + +void QuoteApi::processTickByTickLossRange(Task *task) +{ + PyLock lock; + this->onTickByTickLossRange(task->task_id, task->task_one_counts); + delete task; +}; + +void QuoteApi::processSubMarketData(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPST *task_data = (XTPST*) task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*) task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubMarketData(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processUnSubMarketData(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPST *task_data = (XTPST*) task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*) task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubMarketData(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processDepthMarketData(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPMD *task_data = (XTPMD*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["last_price"] = task_data->last_price; + data["pre_close_price"] = task_data->pre_close_price; + data["open_price"] = task_data->open_price; + data["high_price"] = task_data->high_price; + data["low_price"] = task_data->low_price; + data["close_price"] = task_data->close_price; + + data["pre_total_long_positon"] = task_data->pre_total_long_positon; + data["total_long_positon"] = task_data->total_long_positon; + data["pre_settl_price"] = task_data->pre_settl_price; + data["settl_price"] = task_data->settl_price; + + data["upper_limit_price"] = task_data->upper_limit_price; + data["lower_limit_price"] = task_data->lower_limit_price; + data["pre_delta"] = task_data->pre_delta; + data["curr_delta"] = task_data->curr_delta; + + data["data_time"] = task_data->data_time; + + data["qty"] = task_data->qty; + data["turnover"] = task_data->turnover; + data["avg_price"] = task_data->avg_price; + + data["trades_count"] = task_data->trades_count; + char str_ticker_status[9] = {"\0"}; +#ifdef _MSC_VER //WIN32 + strncpy(str_ticker_status, task_data->ticker_status,sizeof(task_data->ticker_status)); +#elif __GNUC__ + strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); +#endif + data["ticker_status"] = addEndingChar(str_ticker_status); + + boost::python::list ask; + boost::python::list bid; + boost::python::list ask_qty; + boost::python::list bid_qty; + + for (int i = 0; i < 10; i++) + { + ask.append(task_data->ask[i]); + bid.append(task_data->bid[i]); + ask_qty.append(task_data->ask_qty[i]); + bid_qty.append(task_data->bid_qty[i]); + } + + data["ask"] = ask; + data["bid"] = bid; + data["bid_qty"] = bid_qty; + data["ask_qty"] = ask_qty; + + data["data_type"] = (int)task_data->data_type; + data["data_type_v2"] = (int)task_data->data_type_v2; + if (task_data->data_type_v2 == XTP_MARKETDATA_V2_ACTUAL){ + data["total_bid_qty"] = task_data->stk.total_bid_qty; + data["total_ask_qty"] = task_data->stk.total_ask_qty; + data["ma_bid_price"] = task_data->stk.ma_bid_price; + data["ma_ask_price"] = task_data->stk.ma_ask_price; + data["ma_bond_bid_price"] = task_data->stk.ma_bond_bid_price; + data["ma_bond_ask_price"] = task_data->stk.ma_bond_ask_price; + data["yield_to_maturity"] = task_data->stk.yield_to_maturity; + data["iopv"] = task_data->stk.iopv; + data["etf_buy_count"] = task_data->stk.etf_buy_count; + data["etf_sell_count"] = task_data->stk.etf_sell_count; + data["etf_buy_qty"] = task_data->stk.etf_buy_qty; + data["etf_buy_money"] = task_data->stk.etf_buy_money; + data["etf_sell_qty"] = task_data->stk.etf_sell_qty; + data["etf_sell_money"] = task_data->stk.etf_sell_money; + data["total_warrant_exec_qty"] = task_data->stk.total_warrant_exec_qty; + data["warrant_lower_price"] = task_data->stk.warrant_lower_price; + data["warrant_upper_price"] = task_data->stk.warrant_upper_price; + data["cancel_buy_count"] = task_data->stk.cancel_buy_count; + data["cancel_sell_count"] = task_data->stk.cancel_sell_count; + data["cancel_buy_qty"] = task_data->stk.cancel_buy_qty; + data["cancel_sell_qty"] = task_data->stk.cancel_sell_qty; + data["cancel_buy_money"] = task_data->stk.cancel_buy_money; + data["cancel_sell_money"] = task_data->stk.cancel_sell_money; + data["total_buy_count"] = task_data->stk.total_buy_count; + data["total_sell_count"] = task_data->stk.total_sell_count; + data["duration_after_buy"] = task_data->stk.duration_after_buy; + data["duration_after_sell"] = task_data->stk.duration_after_sell; + data["num_bid_orders"] = task_data->stk.num_bid_orders; + data["num_ask_orders"] = task_data->stk.num_ask_orders; + data["pre_iopv"] = task_data->stk.pre_iopv; + data["r1"] = task_data->stk.r1; + data["r2"] = task_data->stk.r2; + }else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_OPTION){ + data["auction_price"] = task_data->opt.auction_price; + data["auction_qty"] = task_data->opt.auction_qty; + data["last_enquiry_time"] = task_data->opt.last_enquiry_time; + } + else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_BOND) + { + data["total_bid_qty"] = task_data->bond.total_bid_qty; + data["total_ask_qty"] = task_data->bond.total_ask_qty; + data["ma_bid_price"] = task_data->bond.ma_bid_price; + data["ma_ask_price"] = task_data->bond.ma_ask_price; + data["ma_bond_bid_price"] = task_data->bond.ma_bond_bid_price; + data["ma_bond_ask_price"] = task_data->bond.ma_bond_ask_price; + data["yield_to_maturity"] = task_data->bond.yield_to_maturity; + data["match_lastpx"] = task_data->bond.match_lastpx; + data["ma_bond_price"] = task_data->bond.ma_bond_price; + data["match_qty"] = task_data->bond.match_qty; + data["match_turnover"] = task_data->bond.match_turnover; + data["r4"] = task_data->bond.r4; + data["r5"] = task_data->bond.r5; + data["r6"] = task_data->bond.r6; + data["r7"] = task_data->bond.r7; + data["r8"] = task_data->bond.r8; + data["cancel_buy_count"] = task_data->bond.cancel_buy_count; + data["cancel_sell_count"] = task_data->bond.cancel_sell_count; + data["cancel_buy_qty"] = task_data->bond.cancel_buy_qty; + data["cancel_sell_qty"] = task_data->bond.cancel_sell_qty; + data["cancel_buy_money"] = task_data->bond.cancel_buy_money; + data["cancel_sell_money"] = task_data->bond.cancel_sell_money; + data["total_buy_count"] = task_data->bond.total_buy_count; + data["total_sell_count"] = task_data->bond.total_sell_count; + data["duration_after_buy"] = task_data->bond.duration_after_buy; + data["duration_after_sell"] = task_data->bond.duration_after_sell; + data["num_bid_orders"] = task_data->bond.num_bid_orders; + data["num_ask_orders"] = task_data->bond.num_ask_orders; + data["instrument_status"] = addEndingChar(task_data->bond.instrument_status); + } + + //data["r4"] = task_data->r4; + + delete task->task_data; + } + boost::python::list bid1_qty_list; + if (task->task_data_one && task->task_one_counts>0) + { + for (int i=0;itask_one_counts;i++) + { + int64_t *bid1_qty = (int64_t *)task->task_data_one+i; + bid1_qty_list.append(*bid1_qty); + } + delete[] task->task_data_one; + } + int bid1_count= task->task_one_counts; + int max_bid1_count= task->task_one_all_counts; + + boost::python::list ask1_qty_list; + if (task->task_data_two && task->task_two_counts>0) + { + for (int i=0;itask_two_counts;i++) + { + int64_t *ask1_qty = (int64_t *)task->task_data_two+i; + ask1_qty_list.append(*ask1_qty); + } + delete[] task->task_data_two; + } + int ask1_count= task->task_two_counts; + int max_ask1_count= task->task_two_all_counts; + this->onDepthMarketData(data,bid1_qty_list,bid1_count,max_bid1_count,ask1_qty_list,ask1_count,max_ask1_count); + delete task; +}; + +void QuoteApi::processETFIOPVData(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + IOPV *task_data = (IOPV*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["data_time"] = task_data->data_time; + data["iopv"] = task_data->iopv; + delete task->task_data; + } + + this->onETFIOPVData(data); + delete task; +}; + +void QuoteApi::processSubOrderBook(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPST *task_data = (XTPST*) task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*) task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubOrderBook(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processUnSubOrderBook(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPST *task_data = (XTPST*) task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*) task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubOrderBook(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processOrderBook(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPOB *task_data = (XTPOB*) task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["data_time"] = task_data->data_time; + + data["last_price"] = task_data->last_price; + data["qty"] = task_data->qty; + data["turnover"] = task_data->turnover; + data["trades_count"] = task_data->trades_count; + + boost::python::list ask; + boost::python::list bid; + boost::python::list ask_qty; + boost::python::list bid_qty; + + for (int i = 0; i < 10; i++) + { + ask.append(task_data->ask[i]); + bid.append(task_data->bid[i]); + ask_qty.append(task_data->ask_qty[i]); + bid_qty.append(task_data->bid_qty[i]); + } + + data["ask"] = ask; + data["bid"] = bid; + data["bid_qty"] = bid_qty; + data["ask_qty"] = ask_qty; + delete task->task_data; + } + + this->onOrderBook(data); + delete task; +}; + +void QuoteApi::processSubTickByTick(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPST *task_data = (XTPST*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubTickByTick(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processUnSubTickByTick(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPST *task_data = (XTPST*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubTickByTick(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processTickByTick(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPTBT *task_data = (XTPTBT*)task->task_data; + + + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["struct_seq"] = task_data->seq; + data["data_time"] = task_data->data_time; + data["type"] = (int)task_data->type; + + if (task_data->type == XTP_TBT_ENTRUST) + { + data["channel_no"] = task_data->entrust.channel_no; + data["seq"] = task_data->entrust.seq; + data["price"] = task_data->entrust.price; + data["qty"] = task_data->entrust.qty; + data["side"] = task_data->entrust.side; + data["ord_type"] = task_data->entrust.ord_type; + data["order_no"] = task_data->entrust.order_no; + } + else if(task_data->type == XTP_TBT_TRADE) + { + data["channel_no"] = task_data->trade.channel_no; + data["seq"] = task_data->trade.seq; + data["price"] = task_data->trade.price; + data["qty"] = task_data->trade.qty; + data["money"] = task_data->trade.money; + data["bid_no"] = task_data->trade.bid_no; + data["ask_no"] = task_data->trade.ask_no; + data["trade_flag"] = task_data->trade.trade_flag; + } + else + { + data["channel_no"] = task_data->state.channel_no; + data["seq"] = task_data->state.seq; + data["flag"] = addEndingChar(task_data->state.flag); + } + + delete task->task_data; + } + + this->onTickByTick(data); + delete task; +}; + +void QuoteApi::processSubscribeAllMarketData(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + this->onSubscribeAllMarketData(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processUnSubscribeAllMarketData(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubscribeAllMarketData(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processSubscribeAllOrderBook(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubscribeAllOrderBook(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processUnSubscribeAllOrderBook(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubscribeAllOrderBook(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processSubscribeAllTickByTick(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubscribeAllTickByTick(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processUnSubscribeAllTickByTick(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubscribeAllTickByTick(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processQueryAllTickers(Task *task) +{ + PyLock lock; + + //ֶ޸ + dict data; + if (task->task_data) + { + XTPQSI *task_data = (XTPQSI*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["ticker_type"] = (int)task_data->ticker_type; + data["pre_close_price"] = task_data->pre_close_price; + data["upper_limit_price"] = task_data->upper_limit_price; + data["lower_limit_price"] = task_data->lower_limit_price; + data["price_tick"] = task_data->price_tick; + data["buy_qty_unit"] = task_data->buy_qty_unit; + data["sell_qty_unit"] = task_data->sell_qty_unit; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*) task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryAllTickers(data, error, task->task_last); + delete task; +}; + +void QuoteApi::processQueryTickersPriceInfo(Task *task) +{ + PyLock lock; + + //ֶ޸ + dict data; + if (task->task_data) + { + XTPTPI *task_data = (XTPTPI*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["last_price"] = task_data->last_price; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryTickersPriceInfo(data, error, task->task_last); + delete task; +}; + + + + + +void QuoteApi::processSubscribeAllOptionMarketData(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubscribeAllOptionMarketData(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processUnSubscribeAllOptionMarketData(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubscribeAllOptionMarketData(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processSubscribeAllOptionOrderBook(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubscribeAllOptionOrderBook(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processUnSubscribeAllOptionOrderBook(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubscribeAllOptionOrderBook(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processSubscribeAllOptionTickByTick(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onSubscribeAllOptionTickByTick(task->exchange_id,error); + delete task; +}; + +void QuoteApi::processUnSubscribeAllOptionTickByTick(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onUnSubscribeAllOptionTickByTick(task->exchange_id,error); + delete task; +}; + + +void QuoteApi::processQueryAllTickersFullInfo(Task* task) { + PyLock lock; + + dict data; + if (task->task_data) + { + XTPQFI *task_data = (XTPQFI*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["security_type"] = (int)task_data->security_type; + data["ticker_qualification_class"] = (int)task_data->ticker_qualification_class; + data["is_registration"] = task_data->is_registration; + data["is_VIE"] = task_data->is_VIE; + data["is_noprofit"] = task_data->is_noprofit; + data["is_weighted_voting_rights"] = task_data->is_weighted_voting_rights; + data["is_have_price_limit"] = task_data->is_have_price_limit; + data["upper_limit_price"] = task_data->upper_limit_price; + data["lower_limit_price"] = task_data->lower_limit_price; + data["pre_close_price"] = task_data->pre_close_price; + data["price_tick"] = task_data->price_tick; + data["bid_qty_upper_limit"] = task_data->bid_qty_upper_limit; + data["bid_qty_lower_limit"] = task_data->bid_qty_lower_limit; + data["bid_qty_unit"] = task_data->bid_qty_unit; + data["ask_qty_upper_limit"] = task_data->ask_qty_upper_limit; + data["ask_qty_lower_limit"] = task_data->ask_qty_lower_limit; + data["ask_qty_unit"] = task_data->ask_qty_unit; + data["market_bid_qty_upper_limit"] = task_data->market_bid_qty_upper_limit; + data["market_bid_qty_lower_limit"] = task_data->market_bid_qty_lower_limit; + data["market_bid_qty_unit"] = task_data->market_bid_qty_unit; + data["market_ask_qty_upper_limit"] = task_data->market_ask_qty_upper_limit; + data["market_ask_qty_lower_limit"] = task_data->market_ask_qty_lower_limit; + data["market_ask_qty_unit"] = task_data->market_ask_qty_unit; + data["security_status"] = (int)task_data->security_status; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryAllTickersFullInfo(data, error, task->task_last); + + delete task; +} + +void QuoteApi::processQueryAllNQTickersFullInfo(Task* task) { + PyLock lock; + + dict data; + if (task->task_data) + { + XTPNQFI *task_data = (XTPNQFI*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["security_type"] = (int)task_data->security_type; + data["ticker_qualification_class"] = (int)task_data->ticker_qualification_class; + data["ticker_abbr_en"] = addEndingChar(task_data->ticker_abbr_en); + data["base_ticker"] = addEndingChar(task_data->base_ticker); + data["industry_type"] = addEndingChar(task_data->industry_type); + data["currency_type"] = addEndingChar(task_data->currency_type); + data["trade_unit"] = task_data->trade_unit; + data["hang_out_date"] = task_data->hang_out_date; + data["value_date"] = task_data->value_date; + data["maturity_date"] = task_data->maturity_date; + data["per_limit_vol"] = task_data->per_limit_vol; + data["buy_vol_unit"] = task_data->buy_vol_unit; + data["sell_vol_unit"] = task_data->sell_vol_unit; + data["mini_declared_vol"] = task_data->mini_declared_vol; + data["limit_price_attr"] = task_data->limit_price_attr; + data["market_maker_quantity"] = task_data->market_maker_quantity; + data["price_gear"] = task_data->price_gear; + data["first_limit_trans"] = task_data->first_limit_trans; + data["subsequent_limit_trans"] = task_data->subsequent_limit_trans; + data["limit_upper_price"] = task_data->limit_upper_price; + data["limit_lower_price"] = task_data->limit_lower_price; + data["block_trade_upper"] = task_data->block_trade_upper; + data["block_trade_lower"] = task_data->block_trade_lower; + data["convert_into_ration"] = task_data->convert_into_ration; + data["trade_status"] = (int)task_data->trade_status; + data["security_level"] = (int)task_data->security_level; + data["trade_type"] = (int)task_data->trade_type; + data["suspend_flag"] = (int)task_data->suspend_flag; + data["ex_dividend_flag"] = (int)task_data->ex_dividend_flag; + data["layer_type"] = (int)task_data->layer_type; + data["reserved1"] = task_data->reserved1; + data["trade_places"] = addEndingChar(task_data->trade_places); + data["is_rzbd"] = task_data->is_rzbd; + data["is_rqbd"] = task_data->is_rqbd; + data["is_drrz"] = task_data->is_drrz; + data["is_drrq"] = task_data->is_drrq; + data["reserved"] = task_data->reserved; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryAllNQTickersFullInfo(data, error, task->task_last); + + delete task; +} + +void QuoteApi::processRebuildQuoteServerDisconnected(Task *task) +{ + PyLock lock; + this->onRebuildQuoteServerDisconnected(task->task_id); + delete task; +} + +void QuoteApi::processRequestRebuildQuote(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQuoteRebuildResultRsp* task_data = (XTPQuoteRebuildResultRsp*)task->task_data; + data["request_id"] = task_data->request_id; + data["exchange_id"] = (int)task_data->exchange_id; + data["size"] = task_data->size; + data["channel_number"] = task_data->channel_number; + data["begin"] = task_data->begin; + data["end"] = task_data->end; + data["result_code"] = (int)task_data->result_code; + data["msg"] = addEndingChar(task_data->msg); + delete task->task_data; + } + this->onRequestRebuildQuote(data); + delete task; +} + +void QuoteApi::processRebuildTickByTick(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPTBT *task_data = (XTPTBT*)task->task_data; + + + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["struct_seq"] = task_data->seq; + data["data_time"] = task_data->data_time; + data["type"] = (int)task_data->type; + + if (task_data->type == XTP_TBT_ENTRUST) + { + data["channel_no"] = task_data->entrust.channel_no; + data["seq"] = task_data->entrust.seq; + data["price"] = task_data->entrust.price; + data["qty"] = task_data->entrust.qty; + data["side"] = task_data->entrust.side; + data["ord_type"] = task_data->entrust.ord_type; + data["order_no"] = task_data->entrust.order_no; + } + else if (task_data->type == XTP_TBT_TRADE) + { + data["channel_no"] = task_data->trade.channel_no; + data["seq"] = task_data->trade.seq; + data["price"] = task_data->trade.price; + data["qty"] = task_data->trade.qty; + data["money"] = task_data->trade.money; + data["bid_no"] = task_data->trade.bid_no; + data["ask_no"] = task_data->trade.ask_no; + data["trade_flag"] = task_data->trade.trade_flag; + } + else + { + data["channel_no"] = task_data->state.channel_no; + data["seq"] = task_data->state.seq; + data["flag"] = addEndingChar(task_data->state.flag); + } + + delete task->task_data; + } + + this->onRebuildTickByTick(data); + delete task; +} + +void QuoteApi::processRebuildMarketData(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPMD *task_data = (XTPMD*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["last_price"] = task_data->last_price; + data["pre_close_price"] = task_data->pre_close_price; + data["open_price"] = task_data->open_price; + data["high_price"] = task_data->high_price; + data["low_price"] = task_data->low_price; + data["close_price"] = task_data->close_price; + + data["pre_total_long_positon"] = task_data->pre_total_long_positon; + data["total_long_positon"] = task_data->total_long_positon; + data["pre_settl_price"] = task_data->pre_settl_price; + data["settl_price"] = task_data->settl_price; + + data["upper_limit_price"] = task_data->upper_limit_price; + data["lower_limit_price"] = task_data->lower_limit_price; + data["pre_delta"] = task_data->pre_delta; + data["curr_delta"] = task_data->curr_delta; + + data["data_time"] = task_data->data_time; + + data["qty"] = task_data->qty; + data["turnover"] = task_data->turnover; + data["avg_price"] = task_data->avg_price; + + data["trades_count"] = task_data->trades_count; + char str_ticker_status[9] = { "\0" }; +#ifdef _MSC_VER //WIN32 + strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); +#elif __GNUC__ + strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); +#endif + data["ticker_status"] = addEndingChar(str_ticker_status); + + boost::python::list ask; + boost::python::list bid; + boost::python::list ask_qty; + boost::python::list bid_qty; + + for (int i = 0; i < 10; i++) + { + ask.append(task_data->ask[i]); + bid.append(task_data->bid[i]); + ask_qty.append(task_data->ask_qty[i]); + bid_qty.append(task_data->bid_qty[i]); + } + + data["ask"] = ask; + data["bid"] = bid; + data["bid_qty"] = bid_qty; + data["ask_qty"] = ask_qty; + + data["data_type"] = (int)task_data->data_type; + data["data_type_v2"] = (int)task_data->data_type_v2; + if (task_data->data_type_v2 == XTP_MARKETDATA_V2_ACTUAL) { + data["total_bid_qty"] = task_data->stk.total_bid_qty; + data["total_ask_qty"] = task_data->stk.total_ask_qty; + data["ma_bid_price"] = task_data->stk.ma_bid_price; + data["ma_ask_price"] = task_data->stk.ma_ask_price; + data["ma_bond_bid_price"] = task_data->stk.ma_bond_bid_price; + data["ma_bond_ask_price"] = task_data->stk.ma_bond_ask_price; + data["yield_to_maturity"] = task_data->stk.yield_to_maturity; + data["iopv"] = task_data->stk.iopv; + data["etf_buy_count"] = task_data->stk.etf_buy_count; + data["etf_sell_count"] = task_data->stk.etf_sell_count; + data["etf_buy_qty"] = task_data->stk.etf_buy_qty; + data["etf_buy_money"] = task_data->stk.etf_buy_money; + data["etf_sell_qty"] = task_data->stk.etf_sell_qty; + data["etf_sell_money"] = task_data->stk.etf_sell_money; + data["total_warrant_exec_qty"] = task_data->stk.total_warrant_exec_qty; + data["warrant_lower_price"] = task_data->stk.warrant_lower_price; + data["warrant_upper_price"] = task_data->stk.warrant_upper_price; + data["cancel_buy_count"] = task_data->stk.cancel_buy_count; + data["cancel_sell_count"] = task_data->stk.cancel_sell_count; + data["cancel_buy_qty"] = task_data->stk.cancel_buy_qty; + data["cancel_sell_qty"] = task_data->stk.cancel_sell_qty; + data["cancel_buy_money"] = task_data->stk.cancel_buy_money; + data["cancel_sell_money"] = task_data->stk.cancel_sell_money; + data["total_buy_count"] = task_data->stk.total_buy_count; + data["total_sell_count"] = task_data->stk.total_sell_count; + data["duration_after_buy"] = task_data->stk.duration_after_buy; + data["duration_after_sell"] = task_data->stk.duration_after_sell; + data["num_bid_orders"] = task_data->stk.num_bid_orders; + data["num_ask_orders"] = task_data->stk.num_ask_orders; + data["pre_iopv"] = task_data->stk.pre_iopv; + data["r1"] = task_data->stk.r1; + data["r2"] = task_data->stk.r2; + } + else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_OPTION) { + data["auction_price"] = task_data->opt.auction_price; + data["auction_qty"] = task_data->opt.auction_qty; + data["last_enquiry_time"] = task_data->opt.last_enquiry_time; + } + else if (task_data->data_type_v2 == XTP_MARKETDATA_V2_BOND) + { + data["total_bid_qty"] = task_data->bond.total_bid_qty; + data["total_ask_qty"] = task_data->bond.total_ask_qty; + data["ma_bid_price"] = task_data->bond.ma_bid_price; + data["ma_ask_price"] = task_data->bond.ma_ask_price; + data["ma_bond_bid_price"] = task_data->bond.ma_bond_bid_price; + data["ma_bond_ask_price"] = task_data->bond.ma_bond_ask_price; + data["yield_to_maturity"] = task_data->bond.yield_to_maturity; + data["match_lastpx"] = task_data->bond.match_lastpx; + data["ma_bond_price"] = task_data->bond.ma_bond_price; + data["match_qty"] = task_data->bond.match_qty; + data["match_turnover"] = task_data->bond.match_turnover; + data["r4"] = task_data->bond.r4; + data["r5"] = task_data->bond.r5; + data["r6"] = task_data->bond.r6; + data["r7"] = task_data->bond.r7; + data["r8"] = task_data->bond.r8; + data["cancel_buy_count"] = task_data->bond.cancel_buy_count; + data["cancel_sell_count"] = task_data->bond.cancel_sell_count; + data["cancel_buy_qty"] = task_data->bond.cancel_buy_qty; + data["cancel_sell_qty"] = task_data->bond.cancel_sell_qty; + data["cancel_buy_money"] = task_data->bond.cancel_buy_money; + data["cancel_sell_money"] = task_data->bond.cancel_sell_money; + data["total_buy_count"] = task_data->bond.total_buy_count; + data["total_sell_count"] = task_data->bond.total_sell_count; + data["duration_after_buy"] = task_data->bond.duration_after_buy; + data["duration_after_sell"] = task_data->bond.duration_after_sell; + data["num_bid_orders"] = task_data->bond.num_bid_orders; + data["num_ask_orders"] = task_data->bond.num_ask_orders; + data["instrument_status"] = addEndingChar(task_data->bond.instrument_status); + } + + //data["r4"] = task_data->r4; + + delete task->task_data; + } + + this->onRebuildMarketData(data); + delete task; +} + + +///------------------------------------------------------------------------------------- +/// +///------------------------------------------------------------------------------------- + +void QuoteApi::createQuoteApi(int clientid, string path, int log_level) +{ + this->api = XTP::API::QuoteApi::CreateQuoteApi(clientid, path.c_str(),(XTP_LOG_LEVEL)log_level); + this->api->RegisterSpi(this); +}; + +void QuoteApi::release() +{ + this->api->Release(); +}; + +int QuoteApi::exit() +{ + //úԭAPIûУڰȫ˳APIãԭjoinƺ̫ȶ + this->api->RegisterSpi(NULL); + this->api->Release(); + this->api = NULL; + return 1; +}; + +string QuoteApi::getTradingDay() +{ + string ret =""; + const char* p = this->api->GetTradingDay(); + if (p == NULL) + ret = "NULL"; + else + ret = p; + return ret; +}; + +string QuoteApi::getApiVersion() +{ + string ret =""; + const char* p = this->api->GetApiVersion(); + if (p == NULL) + ret = "NULL"; + else + ret = p; + return ret; +}; + +dict QuoteApi::getApiLastError() +{ + XTPRI *error = this->api->GetApiLastError(); + dict err; + if(error == NULL) + return err; + + err["error_id"] = error->error_id; + err["error_msg"] = error->error_msg; + + return err; +}; + +void QuoteApi::setUDPBufferSize(int size) +{ + this->api->SetUDPBufferSize(size); +}; + +void QuoteApi::setHeartBeatInterval(int interval) +{ + this->api->SetHeartBeatInterval(interval); +}; + +void QuoteApi::setUDPRecvThreadAffinity(int32_t cpu_no) +{ + this->api->SetUDPRecvThreadAffinity(cpu_no); +}; + +void QuoteApi::setUDPRecvThreadAffinityArray(boost::python::list tickerList,int count) +{ + int listLength = boost::python::len(tickerList); + if(listLength <= 0) + return; + int32_t *myreqList = new int32_t[listLength]; + for(int i=0;iapi->SetUDPRecvThreadAffinityArray(myreqList, count); + + delete[] myreqList; + myreqList = NULL; +}; + +void QuoteApi::setUDPParseThreadAffinity(int32_t cpu_no) +{ + this->api->SetUDPParseThreadAffinity(cpu_no); +}; + +void QuoteApi::setUDPParseThreadAffinityArray(boost::python::list tickerList,int count) +{ + int listLength = boost::python::len(tickerList); + if(listLength <= 0) + return; + int32_t *myreqList = new int32_t[listLength]; + for(int i=0;iapi->SetUDPParseThreadAffinityArray(myreqList, count); + + delete[] myreqList; + myreqList = NULL; +}; + +void QuoteApi::setUDPSeqLogOutPutFlag(bool flag) +{ + this->api->SetUDPSeqLogOutPutFlag(flag); +}; + +int QuoteApi::subscribeMarketData(boost::python::list tickerList,int count, int exchange) +{ + int listLength = boost::python::len(tickerList); + if(listLength <= 0) + return -1; + char **myreqList = new char *[listLength]; + for(int i=0;iapi->SubscribeMarketData(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + for(int i=0;iapi->UnSubscribeMarketData(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + for(int i=0;iapi->SubscribeOrderBook(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + for(int i=0;iapi->UnSubscribeOrderBook(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + for(int i=0;iapi->SubscribeTickByTick(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + for(int i=0;iapi->UnSubscribeTickByTick(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + for(int i=0;iapi->SubscribeAllMarketData((XTP_EXCHANGE_TYPE)exchange); +}; + +int QuoteApi::unSubscribeAllMarketData(int exchange) +{ + return this->api->UnSubscribeAllMarketData((XTP_EXCHANGE_TYPE)exchange); +}; + +int QuoteApi::subscribeAllOrderBook(int exchange) +{ + return this->api->SubscribeAllOrderBook((XTP_EXCHANGE_TYPE)exchange); +}; + +int QuoteApi::unSubscribeAllOrderBook(int exchange) +{ + return this->api->UnSubscribeAllOrderBook((XTP_EXCHANGE_TYPE)exchange); +}; + +int QuoteApi::subscribeAllTickByTick(int exchange) +{ + return this->api->SubscribeAllTickByTick((XTP_EXCHANGE_TYPE)exchange); +}; + +int QuoteApi::unSubscribeAllTickByTick(int exchange) +{ + return this->api->UnSubscribeAllTickByTick((XTP_EXCHANGE_TYPE)exchange); +}; + +int QuoteApi::login(string ip, int port, string user, string password, int socktype,string local_ip) +{ + int i = this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype,local_ip.c_str()); + return i; +}; + +int QuoteApi::logout() +{ + int i = this->api->Logout(); + return i; +}; + +int QuoteApi::queryAllTickers(int exchange) +{ + int i = this->api->QueryAllTickers((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::queryTickersPriceInfo(boost::python::list tickerList,int count, int exchange) +{ + int listLength = boost::python::len(tickerList); + if(listLength <= 0) + return -1; + //printf("listLength:%d\n",listLength); + char **myreqList = new char *[listLength]; + for(int i=0;iapi->QueryTickersPriceInfo(myreqList, count, (XTP_EXCHANGE_TYPE) exchange); + //printf("return i:%d\n",i); + for(int i=0;iapi->QueryAllTickersPriceInfo(); + return i; +} + +int QuoteApi::queryAllTickersFullInfo(int exchange) { + int i =this->api->QueryAllTickersFullInfo((XTP_EXCHANGE_TYPE) exchange); + return i; +} + +int QuoteApi::queryAllNQTickersFullInfo() + { + return this->api->QueryAllNQTickersFullInfo(); +} + +int QuoteApi::subscribeAllOptionMarketData(int exchange) +{ + int i = this->api->SubscribeAllOptionMarketData((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::unSubscribeAllOptionMarketData(int exchange) +{ + int i = this->api->UnSubscribeAllOptionMarketData((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::subscribeAllOptionOrderBook(int exchange) +{ + int i = this->api->SubscribeAllOptionOrderBook((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::unSubscribeAllOptionOrderBook(int exchange) +{ + int i = this->api->UnSubscribeAllOptionOrderBook((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::subscribeAllOptionTickByTick(int exchange) +{ + int i = this->api->SubscribeAllOptionTickByTick((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::unSubscribeAllOptionTickByTick(int exchange) +{ + int i = this->api->UnSubscribeAllOptionTickByTick((XTP_EXCHANGE_TYPE)exchange); + return i; +}; + +int QuoteApi::loginToRebuildQuoteServer(string ip, int port, string user, string password, int sock_type, string local_ip) +{ + int i = this->api->LoginToRebuildQuoteServer(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)sock_type, local_ip.c_str()); + return i; +} + +int QuoteApi::logoutFromRebuildQuoteServer() +{ + int i = this->api->LogoutFromRebuildQuoteServer(); + return i; +} + +int QuoteApi::requestRebuildQuote(dict req) +{ + XTPQuoteRebuildReq myreq = XTPQuoteRebuildReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + getInt(req, "request_id", &myreq.request_id); + int data_type; + int exchange_id; + int channel_number; + getInt(req, "data_type", &data_type); + getInt(req, "exchange_id", &exchange_id); + getInt16(req, "channel_number", &myreq.channel_number); + getInt64(req, "begin", &myreq.begin); + getInt64(req, "end", &myreq.end); + + myreq.data_type = (XTP_QUOTE_REBUILD_DATA_TYPE)data_type; + myreq.exchange_id = (XTP_EXCHANGE_TYPE)exchange_id; + + int ret = api->RequestRebuildQuote(&myreq); + + return ret; +} + +///------------------------------------------------------------------------------------- +///Boost.Pythonװ +///------------------------------------------------------------------------------------- + +struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > +{ + virtual void onDisconnected(int reason) + { + try + { + this->get_override("onDisconnected")(reason); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onError(dict data) + { + try + { + this->get_override("onError")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onTickByTickLossRange(int begin_seq, int end_seq) + { + try + { + this->get_override("onTickByTickLossRange")(begin_seq, end_seq); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubMarketData(dict data, dict error, bool last) + { + try + { + this->get_override("onSubMarketData")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubMarketData(dict data, dict error, bool last) + { + try + { + this->get_override("onUnSubMarketData")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onDepthMarketData(dict data,boost::python::list bid1_qty_list,int bid1_count,int max_bid1_count,boost::python::list ask1_qty_list,int ask1_count,int max_ask1_count) + { + try + { + this->get_override("onDepthMarketData")(data,bid1_qty_list,bid1_count,max_bid1_count,ask1_qty_list,ask1_count,max_ask1_count); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onETFIOPVData(dict data) + { + try + { + this->get_override("onETFIOPVData")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubOrderBook(dict data, dict error, bool last) + { + try + { + this->get_override("onSubOrderBook")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubOrderBook(dict data, dict error, bool last) + { + try + { + this->get_override("onUnSubOrderBook")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onOrderBook(dict data) + { + try + { + this->get_override("onOrderBook")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubTickByTick(dict data, dict error, bool last) + { + try + { + this->get_override("onSubTickByTick")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubTickByTick(dict data, dict error, bool last) + { + try + { + this->get_override("onUnSubTickByTick")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onTickByTick(dict data) + { + try + { + this->get_override("onTickByTick")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubscribeAllMarketData(int exchange_id,dict data) + { + try + { + this->get_override("onSubscribeAllMarketData")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubscribeAllMarketData(int exchange_id,dict data) + { + try + { + this->get_override("onUnSubscribeAllMarketData")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubscribeAllOrderBook(int exchange_id,dict data) + { + try + { + this->get_override("onSubscribeAllOrderBook")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubscribeAllOrderBook(int exchange_id,dict data) + { + try + { + this->get_override("onUnSubscribeAllOrderBook")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubscribeAllTickByTick(int exchange_id,dict data) + { + try + { + this->get_override("onSubscribeAllTickByTick")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubscribeAllTickByTick(int exchange_id,dict data) + { + try + { + this->get_override("onUnSubscribeAllTickByTick")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryAllTickers(dict data, dict error, bool last) + { + try + { + this->get_override("onQueryAllTickers")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryTickersPriceInfo(dict data, dict error, bool last) + { + try + { + this->get_override("onQueryTickersPriceInfo")(data, error, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + + + + + virtual void onSubscribeAllOptionMarketData(int exchange_id,dict data) + { + try + { + this->get_override("onSubscribeAllOptionMarketData")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubscribeAllOptionMarketData(int exchange_id,dict data) + { + try + { + this->get_override("onUnSubscribeAllOptionMarketData")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onSubscribeAllOptionOrderBook(int exchange_id,dict data) + { + try + { + this->get_override("onSubscribeAllOptionOrderBook")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubscribeAllOptionOrderBook(int exchange_id,dict data) + { + try + { + this->get_override("onUnSubscribeAllOptionOrderBook")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + virtual void onSubscribeAllOptionTickByTick(int exchange_id,dict data) + { + try + { + this->get_override("onSubscribeAllOptionTickByTick")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onUnSubscribeAllOptionTickByTick(int exchange_id,dict data) + { + try + { + this->get_override("onUnSubscribeAllOptionTickByTick")(exchange_id,data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryAllTickersFullInfo(dict data, dict error, bool last) { + PyLock lock; + + try { + this->get_override("onQueryAllTickersFullInfo")(data, error, last); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryAllNQTickersFullInfo(dict data, dict error, bool last) { + PyLock lock; + + try { + this->get_override("onQueryAllNQTickersFullInfo")(data, error, last); + } + catch (error_already_set const &) { + PyErr_Print(); + } + } + + virtual void onRebuildQuoteServerDisconnected(int reason) + { + try + { + this->get_override("onRebuildQuoteServerDisconnected")(reason); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + } + + virtual void onRequestRebuildQuote(dict data) + { + try + { + this->get_override("onRequestRebuildQuote")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + } + + virtual void onRebuildTickByTick(dict data) + { + try + { + this->get_override("onRebuildTickByTick")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + } + + virtual void onRebuildMarketData(dict data) + { + try + { + this->get_override("onRebuildMarketData")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + } +}; + + + + +BOOST_PYTHON_MODULE(vnxtpquote) +{ + //PyEval_InitThreads(); //ʱУ֤ȴGIL + Py_Initialize(); + + class_("QuoteApi") + .def("createQuoteApi", &QuoteApiWrap::createQuoteApi) + .def("release", &QuoteApiWrap::release) + .def("exit", &QuoteApiWrap::exit) + .def("getTradingDay", &QuoteApiWrap::getTradingDay) + .def("getApiVersion", &QuoteApiWrap::getApiVersion) + .def("getApiLastError", &QuoteApiWrap::getApiLastError) + .def("setUDPBufferSize", &QuoteApiWrap::setUDPBufferSize) + .def("setHeartBeatInterval", &QuoteApiWrap::setHeartBeatInterval) + .def("setUDPRecvThreadAffinity", &QuoteApiWrap::setUDPRecvThreadAffinity) + .def("setUDPRecvThreadAffinityArray", &QuoteApiWrap::setUDPRecvThreadAffinityArray) + .def("setUDPParseThreadAffinity", &QuoteApiWrap::setUDPParseThreadAffinity) + .def("setUDPParseThreadAffinityArray", &QuoteApiWrap::setUDPParseThreadAffinityArray) + .def("setUDPSeqLogOutPutFlag", &QuoteApiWrap::setUDPSeqLogOutPutFlag) + .def("subscribeMarketData", &QuoteApiWrap::subscribeMarketData) + .def("unSubscribeMarketData", &QuoteApiWrap::unSubscribeMarketData) + .def("subscribeOrderBook", &QuoteApiWrap::subscribeOrderBook) + .def("unSubscribeOrderBook", &QuoteApiWrap::unSubscribeOrderBook) + .def("subscribeTickByTick", &QuoteApiWrap::subscribeTickByTick) + .def("unSubscribeTickByTick", &QuoteApiWrap::unSubscribeTickByTick) + .def("subscribeAllMarketData", &QuoteApiWrap::subscribeAllMarketData) + .def("unSubscribeAllMarketData", &QuoteApiWrap::unSubscribeAllMarketData) + .def("subscribeAllOrderBook", &QuoteApiWrap::subscribeAllOrderBook) + .def("unSubscribeAllOrderBook", &QuoteApiWrap::unSubscribeAllOrderBook) + .def("subscribeAllTickByTick", &QuoteApiWrap::subscribeAllTickByTick) + .def("unSubscribeAllTickByTick", &QuoteApiWrap::unSubscribeAllTickByTick) + .def("login", &QuoteApiWrap::login) + .def("logout", &QuoteApiWrap::logout) + .def("queryAllTickers", &QuoteApiWrap::queryAllTickers) + .def("queryTickersPriceInfo", &QuoteApiWrap::queryTickersPriceInfo) + .def("queryAllTickersPriceInfo", &QuoteApiWrap::queryAllTickersPriceInfo) + .def("queryAllTickersFullInfo", &QuoteApiWrap::queryAllTickersFullInfo) + .def("queryAllNQTickersFullInfo", &QuoteApiWrap::queryAllNQTickersFullInfo) + .def("subscribeAllOptionMarketData", &QuoteApiWrap::subscribeAllOptionMarketData) + .def("unSubscribeAllOptionMarketData", &QuoteApiWrap::unSubscribeAllOptionMarketData) + .def("subscribeAllOptionOrderBook", &QuoteApiWrap::subscribeAllOptionOrderBook) + .def("unSubscribeAllOptionOrderBook", &QuoteApiWrap::unSubscribeAllOptionOrderBook) + .def("subscribeAllOptionTickByTick", &QuoteApiWrap::subscribeAllOptionTickByTick) + .def("unSubscribeAllOptionTickByTick", &QuoteApiWrap::unSubscribeAllOptionTickByTick) + .def("loginToRebuildQuoteServer", &QuoteApiWrap::loginToRebuildQuoteServer) + .def("requestRebuildQuote", &QuoteApiWrap::requestRebuildQuote) + .def("logoutFromRebuildQuoteServer", &QuoteApiWrap::logoutFromRebuildQuoteServer) + + + .def("onDisconnected", pure_virtual(&QuoteApiWrap::onDisconnected)) + .def("onError", pure_virtual(&QuoteApiWrap::onError)) + .def("onTickByTickLossRange", pure_virtual(&QuoteApiWrap::onTickByTickLossRange)) + .def("onSubMarketData", pure_virtual(&QuoteApiWrap::onSubMarketData)) + .def("onUnSubMarketData", pure_virtual(&QuoteApiWrap::onUnSubMarketData)) + .def("onDepthMarketData", pure_virtual(&QuoteApiWrap::onDepthMarketData)) + .def("onETFIOPVData", pure_virtual(&QuoteApiWrap::onETFIOPVData)) + .def("onSubOrderBook", pure_virtual(&QuoteApiWrap::onSubOrderBook)) + .def("onUnSubOrderBook", pure_virtual(&QuoteApiWrap::onUnSubOrderBook)) + .def("onOrderBook", pure_virtual(&QuoteApiWrap::onOrderBook)) + .def("onSubTickByTick", pure_virtual(&QuoteApiWrap::onSubTickByTick)) + .def("onUnSubTickByTick", pure_virtual(&QuoteApiWrap::onUnSubTickByTick)) + .def("onTickByTick", pure_virtual(&QuoteApiWrap::onTickByTick)) + .def("onSubscribeAllMarketData", pure_virtual(&QuoteApiWrap::onSubscribeAllMarketData)) + .def("onUnSubscribeAllMarketData", pure_virtual(&QuoteApiWrap::onUnSubscribeAllMarketData)) + .def("onSubscribeAllOrderBook", pure_virtual(&QuoteApiWrap::onSubscribeAllOrderBook)) + .def("onUnSubscribeAllOrderBook", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOrderBook)) + .def("onSubscribeAllTickByTick", pure_virtual(&QuoteApiWrap::onSubscribeAllTickByTick)) + .def("onUnSubscribeAllTickByTick", pure_virtual(&QuoteApiWrap::onUnSubscribeAllTickByTick)) + .def("onQueryAllTickers", pure_virtual(&QuoteApiWrap::onQueryAllTickers)) + .def("onQueryTickersPriceInfo", pure_virtual(&QuoteApiWrap::onQueryTickersPriceInfo)) + .def("onQueryAllTickersFullInfo", &QuoteApiWrap::onQueryAllTickersFullInfo) + .def("onQueryAllNQTickersFullInfo", &QuoteApiWrap::onQueryAllNQTickersFullInfo) + .def("onRebuildQuoteServerDisconnected", &QuoteApiWrap::onRebuildQuoteServerDisconnected) + .def("onRequestRebuildQuote", &QuoteApiWrap::onRequestRebuildQuote) + .def("onRebuildTickByTick", &QuoteApiWrap::onRebuildTickByTick) + .def("onRebuildMarketData", &QuoteApiWrap::onRebuildMarketData) + + .def("onSubscribeAllOptionMarketData", pure_virtual(&QuoteApiWrap::onSubscribeAllOptionMarketData)) + .def("onUnSubscribeAllOptionMarketData", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOptionMarketData)) + .def("onSubscribeAllOptionOrderBook", pure_virtual(&QuoteApiWrap::onSubscribeAllOptionOrderBook)) + .def("onUnSubscribeAllOptionOrderBook", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOptionOrderBook)) + .def("onSubscribeAllOptionTickByTick", pure_virtual(&QuoteApiWrap::onSubscribeAllOptionTickByTick)) + .def("onUnSubscribeAllOptionTickByTick", pure_virtual(&QuoteApiWrap::onUnSubscribeAllOptionTickByTick)) + ; +}; diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.h b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.h index cd09dc2..554a236 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtpquote/vnxtpquote.h @@ -1,631 +1,631 @@ -//˵ - -//API -#include "xtp_quote_api.h" - -//ϵͳ -//#ifdef WIN32 -//#include "stdafx.h" -//#endif -#include -#include -#include - -//Boost -#define BOOST_PYTHON_STATIC_LIB -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //е̹߳ -#include //е̹߳ - - -//ռ -using namespace std; -using namespace boost::python; -using namespace boost; - - -// -#define ONDISCONNECTED 1 -#define ONERROR 2 -#define ONSUBMARKETDATA 3 -#define ONUNSUBMARKETDATA 4 -#define ONDEPTHMARKETDATA 5 -#define ONSUBORDERBOOK 6 -#define ONUNSUBORDERBOOK 7 -#define ONORDERBOOK 8 -#define ONSUBTICKBYTICK 9 -#define ONUNSUBTICKBYTICK 10 -#define ONTICKBYTICK 11 -#define ONSUBSCRIBEALLMARKETDATA 12 -#define ONUNSUBSCRIBEALLMARKETDATA 13 -#define ONSUBSCRIBEALLORDERBOOK 14 -#define ONUNSUBSCRIBEALLORDERBOOK 15 -#define ONSUBSCRIBEALLTICKBYTICK 16 -#define ONUNSUBSCRIBEALLTICKBYTICK 17 -#define ONQUERYALLTICKERS 18 -#define ONQUERYTICKERSPRICEINFO 19 - -#define ONSUBSCRIBEALLOPTIONMARKETDATA 20 -#define ONUNSUBSCRIBEALLOPTIONMARKETDATA 21 -#define ONSUBSCRIBEALLOPTIONORDERBOOK 22 -#define ONUNSUBSCRIBEALLOPTIONORDERBOOK 23 -#define ONSUBSCRIBEALLOPTIONTICKBYTICK 24 -#define ONUNSUBSCRIBEALLOPTIONTICKBYTICK 25 -#define ONQUERYALLTICKERSFULLINFO 26 -#define ONREBUILDQUOTESERVERDISCONNECTED 27 -#define ONREQUESTREBUILDQUOTE 28 -#define ONREBUILDTICKBYTICK 29 -#define ONREBUILDMARKETDATA 30 - -#define ONQUERYALLNQTICKERSFULLINFO 31 -#define ONTICKBYTICKLOSSRANGE 32 -#define ONETFIOPVDATA 33 - -///------------------------------------------------------------------------------------- -///APIеIJ -///------------------------------------------------------------------------------------- - -//GILȫ򻯻ȡã -//ڰC++̻߳GILӶֹpython -class PyLock -{ -private: - PyGILState_STATE gil_state; - -public: - //ijдöʱGIL - PyLock() - { - gil_state = PyGILState_Ensure(); - } - - //ijɺٸöʱGIL - ~PyLock() - { - PyGILState_Release(gil_state); - } -}; - - -//ṹ -struct Task -{ - int task_name; //صƶӦij - void *task_data; //ݽṹ - void *task_error; //ṹ - int task_id; //id - bool task_last; //ǷΪ󷵻 - int exchange_id; //г - void *task_data_one; //ݽṹ - int task_one_counts; - int task_one_all_counts; - void *task_data_two; //ݽṹ - int task_two_counts; - int task_two_all_counts; - -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable boost::mutex the_mutex; //boost - boost::condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - boost::mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - boost::mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - boost::mutex::scoped_lock lock(the_mutex); - - while (the_queue.empty()) //Ϊʱ - { - the_condition_variable.wait(lock); //ȴ֪ͨ - } - - Data popped_value = the_queue.front(); //ȡеһ - the_queue.pop(); //ɾ - return popped_value; //ظ - } - -}; - - -//ֵлȡijֵӦֵṹֵ -void getInt(dict d, string key, int* value); - -//ֵлȡijֵӦĸֵṹֵ -void getDouble(dict d, string key, double* value); - -//ֵлȡijֵӦֵַṹֵ -void getChar(dict d, string key, char* value); - -//ֵлȡijֵӦֵַṹֵ -void getStr(dict d, string key, char* value); - -void getInt64(dict d, string key, int64_t *value); - -void getInt16(dict d, string key, int16_t *value); - - -///------------------------------------------------------------------------------------- -///C++ SPIĻصʵ -///------------------------------------------------------------------------------------- - -//APIļ̳ʵ -class QuoteApi : public XTP::API::QuoteSpi -{ -private: - XTP::API::QuoteApi* api; //API - boost::thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - QuoteApi() - { - function0 f = boost::bind(&QuoteApi::processTask, this); - boost::thread t(f); - this->task_thread = &t; - }; - - ~QuoteApi() - { - }; - - //------------------------------------------------------------------------------------- - //APIص - //------------------------------------------------------------------------------------- - - ///ͻ̨ͨӶϿʱ÷á - ///@param reason ԭӦ - ///@remark apiԶ߷ʱûѡڴ˺еLoginµ¼עûµ¼Ҫ¶ - virtual void OnDisconnected(int reason); - - - ///Ӧ - ///@param error_info ӦʱľĴʹϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark ˺ֻڷʱŻãһû - virtual void OnError(XTPRI *error_info); - - ///ʶӦ - ///@param begin_seq ʳֶʱޣһ£ - ///@param end_seq ʳֶʱޣһ£ - ///@remark ˺ֻʷʱŻеãһ£ʾʧһע˰Ϊݰ1߶ - virtual void OnTickByTickLossRange(int begin_seq, int end_seq); - - ///Ӧ - ///@param ticker ϸĺԼ - ///@param error_info ĺԼʱĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴ζĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - ///@remark ÿĵĺԼӦһӦҪٷأϢʱᴥ - virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last); - - ///˶Ӧ - ///@param ticker ϸĺԼȡ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴ȡĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - ///@remark ÿȡĵĺԼӦһȡӦҪٷأϢʱᴥ - virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last); - - ///֪ͨһһ - ///@param market_data - ///@param bid1_qty һ - ///@param bid1_count һеЧίб - ///@param max_bid1_count һίб - ///@param ask1_qty һ - ///@param ask1_count һеЧίб - ///@param max_ask1_count һίб - ///@remark ҪٷأϢʱᴥ - virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count); - - /// ETFIOPV֪ͨ - /// @param iopv ETFIJολֵݣҪٷأϢʱᴥ - virtual void OnETFIOPVData(IOPV *iopv); - - ///鶩Ӧ - ///@param ticker ϸĺԼ - ///@param error_info ĺԼʱĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴ζĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - ///@remark ÿĵĺԼӦһӦҪٷأϢʱᴥ - virtual void OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last); - - ///˶鶩Ӧ - ///@param ticker ϸĺԼȡ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴ȡĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - ///@remark ÿȡĵĺԼӦһȡӦҪٷأϢʱᴥ - virtual void OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last); - - ///鶩֪ͨ - ///@param order_book 鶩ݣҪٷأϢʱᴥ - virtual void OnOrderBook(XTPOB *order_book); - - ///Ӧ - ///@param ticker ϸĺԼ - ///@param error_info ĺԼʱĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴ζĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - ///@remark ÿĵĺԼӦһӦҪٷأϢʱᴥ - virtual void OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last); - - ///˶Ӧ - ///@param ticker ϸĺԼȡ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴ȡĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - ///@remark ÿȡĵĺԼӦһȡӦҪٷأϢʱᴥ - virtual void OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last); - - ///֪ͨ - ///@param tbt_data ݣίкʳɽΪýṹ壬ҪtypeίлʳɽҪٷأϢʱᴥ - virtual void OnTickByTick(XTPTBT *tbt_data); - - ///ȫгĹƱӦ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///˶ȫгӦ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); - - ///ȫг鶩Ӧ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); - - ///˶ȫг鶩Ӧ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); - - ///ȫгӦ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); - - ///˶ȫгӦ - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); - - - ///ѯɽ׺ԼӦ - ///@param ticker_info ɽ׺ԼϢ - ///@param error_info ѯɽ׺ԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴βѯɽ׺ԼһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - virtual void OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last); - - ///ѯԼ¼۸ϢӦ - ///@param ticker_info Լ¼۸Ϣ - ///@param error_info ѯԼ¼۸ϢʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴βѯһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - virtual void OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last); - - - ///ȫгȨӦ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///˶ȫгȨӦ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///ȫгȨ鶩Ӧ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///˶ȫгȨ鶩Ӧ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///ȫгȨӦ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///˶ȫгȨӦ - ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг - ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ҫٷ - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); - - ///ѯԼ̬ϢӦ - ///@param ticker_info Լ̬Ϣ - ///@param error_info ѯԼ̬ϢʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴βѯԼ̬ϢһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - virtual void OnQueryAllTickersFullInfo(XTPQFI* ticker_info, XTPRI *error_info, bool is_last); - - ///ѯԼ̬ϢӦ - ///@param ticker_info Լ̬Ϣ - ///@param error_info ѯԼ̬ϢʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param is_last Ƿ˴βѯԼ̬ϢһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ - virtual void OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last); - - ///ͻزͨӶϿʱ÷á - ///@param reason ԭӦ - ///@remark apiԶ߷ʱûѡزϢᶨʱߣעҪزʱűӣ޻زʱ½ - virtual void OnRebuildQuoteServerDisconnected(int reason); - - ///زָƵӦ - ///@param rebuild_result زʱãزʧܣmsgʾʧԭ - ///@remark Ҫٷأڻزݷͽã̫࣬һ޷ز꣬ôrebuild_result.result_code = XTP_REBUILD_RET_PARTLYʱҪݻزز - virtual void OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) ; - - ///ز - ///@param tbt_data ز - ///@remark Ҫٷأ˺OnTickByTickһ߳ڣOnRequestRebuildQuote()֮ǰص - virtual void OnRebuildTickByTick(XTPTBT *tbt_data); - - ///زĿ - ///@param md_data ز - ///@remark Ҫٷأ˺OnDepthMarketDataһ߳ڣOnRequestRebuildQuote()֮ǰص - virtual void OnRebuildMarketData(XTPMD *md_data); - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processTickByTickLossRange(Task *task); - - void processSubMarketData(Task *task); - - void processUnSubMarketData(Task *task); - - void processDepthMarketData(Task *task); - - void processETFIOPVData(Task *task); - - void processSubOrderBook(Task *task); - - void processUnSubOrderBook(Task *task); - - void processOrderBook(Task *task); - - void processSubTickByTick(Task *task); - - void processUnSubTickByTick(Task *task); - - void processTickByTick(Task *task); - - void processSubscribeAllMarketData(Task *task); - - void processUnSubscribeAllMarketData(Task *task); - - void processSubscribeAllOrderBook(Task *task); - - void processUnSubscribeAllOrderBook(Task *task); - - void processSubscribeAllTickByTick(Task *task); - - void processUnSubscribeAllTickByTick(Task *task); - - void processQueryAllTickers(Task *task); - - void processQueryTickersPriceInfo(Task *task); - - void processQueryAllTickersFullInfo(Task *task); - - void processQueryAllNQTickersFullInfo(Task *task); - - void processRebuildQuoteServerDisconnected(Task *task); - - void processRequestRebuildQuote(Task *task); - - void processRebuildTickByTick(Task *task); - - void processRebuildMarketData(Task *task); - - - void processSubscribeAllOptionMarketData(Task *task); - - void processUnSubscribeAllOptionMarketData(Task *task); - - void processSubscribeAllOptionOrderBook(Task *task); - - void processUnSubscribeAllOptionOrderBook(Task *task); - - void processSubscribeAllOptionTickByTick(Task *task); - - void processUnSubscribeAllOptionTickByTick(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //idid - //lastǷΪ󷵻 - //i - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(int reason) {}; - - virtual void onError(dict data) {}; - - virtual void onTickByTickLossRange(int begin_seq, int end_seq) {}; - - virtual void onSubMarketData(dict data, dict error, bool last) {}; - - virtual void onUnSubMarketData(dict data, dict error, bool last) {}; - - virtual void onDepthMarketData(dict data,boost::python::list bid1_qty_list,int bid1_count,int max_bid1_count,boost::python::list ask1_qty_list,int ask1_count,int max_ask1_count) {}; - - virtual void onETFIOPVData(dict data) {}; - - virtual void onSubOrderBook(dict data, dict error, bool last) {}; - - virtual void onUnSubOrderBook(dict data, dict error, bool last) {}; - - virtual void onOrderBook(dict data) {}; - - virtual void onSubTickByTick(dict data, dict error, bool last) {}; - - virtual void onUnSubTickByTick(dict data, dict error, bool last) {}; - - virtual void onTickByTick(dict data) {}; - - virtual void onSubscribeAllMarketData(int exchange_id,dict error) {}; - - virtual void onUnSubscribeAllMarketData(int exchange_id,dict error) {}; - - virtual void onSubscribeAllOrderBook(int exchange_id,dict error) {}; - - virtual void onUnSubscribeAllOrderBook(int exchange_id,dict error) {}; - - virtual void onSubscribeAllTickByTick(int exchange_id,dict error) {}; - - virtual void onUnSubscribeAllTickByTick(int exchange_id,dict error) {}; - - virtual void onQueryAllTickers(dict data, dict error, bool last) {}; - - virtual void onQueryTickersPriceInfo(dict data, dict error, bool last) {}; - - virtual void onQueryAllTickersFullInfo(dict data, dict error, bool last) {}; - - virtual void onQueryAllNQTickersFullInfo(dict data, dict error, bool last) {}; - - virtual void onRebuildQuoteServerDisconnected(int reason) {}; - - virtual void onRequestRebuildQuote(dict data) {}; - - virtual void onRebuildTickByTick(dict data) {}; - - virtual void onRebuildMarketData(dict data) {}; - - - virtual void onSubscribeAllOptionMarketData(int exchange_id,dict error) {}; - - virtual void onUnSubscribeAllOptionMarketData(int exchange_id,dict error) {}; - - virtual void onSubscribeAllOptionOrderBook(int exchange_id,dict error) {}; - - virtual void onUnSubscribeAllOptionOrderBook(int exchange_id,dict error) {}; - - virtual void onSubscribeAllOptionTickByTick(int exchange_id,dict error) {}; - - virtual void onUnSubscribeAllOptionTickByTick(int exchange_id,dict error) {}; - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createQuoteApi(int clientid, string path, int log_level); - - void release(); - - int exit(); - - string getTradingDay(); - - string getApiVersion(); - - dict getApiLastError(); - - void setUDPBufferSize(int size); - - void setHeartBeatInterval(int interval); - - void setUDPRecvThreadAffinity(int32_t cpu_no); - - void setUDPRecvThreadAffinityArray(boost::python::list tickerList,int count); - - void setUDPParseThreadAffinity(int32_t cpu_no); - - void setUDPParseThreadAffinityArray(boost::python::list tickerList,int count); - - void setUDPSeqLogOutPutFlag(bool flag); - - int subscribeMarketData(boost::python::list tickerList,int count, int exchange); - - int unSubscribeMarketData(boost::python::list tickerList,int count, int exchange); - - int subscribeOrderBook(boost::python::list tickerList,int count, int exchange); - - int unSubscribeOrderBook(boost::python::list tickerList,int count, int exchange); - - int subscribeTickByTick(boost::python::list tickerList,int count, int exchange); - - int unSubscribeTickByTick(boost::python::list tickerList,int count, int exchange); - - int subscribeAllMarketData(int exchange = 3); - - int unSubscribeAllMarketData(int exchange = 3); - - int subscribeAllOrderBook(int exchange = 3); - - int unSubscribeAllOrderBook(int exchange = 3); - - int subscribeAllTickByTick(int exchange = 3); - - int unSubscribeAllTickByTick(int exchange = 3); - - int login(string ip, int port, string user, string password, int socktype,string local_ip); - - int logout(); - - int queryAllTickers(int exchange); - - int queryTickersPriceInfo(boost::python::list tickerList, int count, int exchange); - - int queryAllTickersPriceInfo(); - - int queryAllTickersFullInfo(int exchange); - - int queryAllNQTickersFullInfo(); - - int subscribeAllOptionMarketData(int exchange = XTP_EXCHANGE_UNKNOWN); - - int unSubscribeAllOptionMarketData(int exchange = XTP_EXCHANGE_UNKNOWN); - - int subscribeAllOptionOrderBook(int exchange = XTP_EXCHANGE_UNKNOWN); - - int unSubscribeAllOptionOrderBook(int exchange = XTP_EXCHANGE_UNKNOWN); - - int subscribeAllOptionTickByTick(int exchange = XTP_EXCHANGE_UNKNOWN); - - int unSubscribeAllOptionTickByTick(int exchange = XTP_EXCHANGE_UNKNOWN); - - int loginToRebuildQuoteServer(string ip, int port, string user, string password, int sock_type, string local_ip); - - int logoutFromRebuildQuoteServer(); - - int requestRebuildQuote(dict req); -}; +//˵ + +//API +#include "xtp_quote_api.h" + +//ϵͳ +//#ifdef WIN32 +//#include "stdafx.h" +//#endif +#include +#include +#include + +//Boost +#define BOOST_PYTHON_STATIC_LIB +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //е̹߳ +#include //е̹߳ + + +//ռ +using namespace std; +using namespace boost::python; +using namespace boost; + + +// +#define ONDISCONNECTED 1 +#define ONERROR 2 +#define ONSUBMARKETDATA 3 +#define ONUNSUBMARKETDATA 4 +#define ONDEPTHMARKETDATA 5 +#define ONSUBORDERBOOK 6 +#define ONUNSUBORDERBOOK 7 +#define ONORDERBOOK 8 +#define ONSUBTICKBYTICK 9 +#define ONUNSUBTICKBYTICK 10 +#define ONTICKBYTICK 11 +#define ONSUBSCRIBEALLMARKETDATA 12 +#define ONUNSUBSCRIBEALLMARKETDATA 13 +#define ONSUBSCRIBEALLORDERBOOK 14 +#define ONUNSUBSCRIBEALLORDERBOOK 15 +#define ONSUBSCRIBEALLTICKBYTICK 16 +#define ONUNSUBSCRIBEALLTICKBYTICK 17 +#define ONQUERYALLTICKERS 18 +#define ONQUERYTICKERSPRICEINFO 19 + +#define ONSUBSCRIBEALLOPTIONMARKETDATA 20 +#define ONUNSUBSCRIBEALLOPTIONMARKETDATA 21 +#define ONSUBSCRIBEALLOPTIONORDERBOOK 22 +#define ONUNSUBSCRIBEALLOPTIONORDERBOOK 23 +#define ONSUBSCRIBEALLOPTIONTICKBYTICK 24 +#define ONUNSUBSCRIBEALLOPTIONTICKBYTICK 25 +#define ONQUERYALLTICKERSFULLINFO 26 +#define ONREBUILDQUOTESERVERDISCONNECTED 27 +#define ONREQUESTREBUILDQUOTE 28 +#define ONREBUILDTICKBYTICK 29 +#define ONREBUILDMARKETDATA 30 + +#define ONQUERYALLNQTICKERSFULLINFO 31 +#define ONTICKBYTICKLOSSRANGE 32 +#define ONETFIOPVDATA 33 + +///------------------------------------------------------------------------------------- +///APIеIJ +///------------------------------------------------------------------------------------- + +//GILȫ򻯻ȡã +//ڰC++̻߳GILӶֹpython +class PyLock +{ +private: + PyGILState_STATE gil_state; + +public: + //ijдöʱGIL + PyLock() + { + gil_state = PyGILState_Ensure(); + } + + //ijɺٸöʱGIL + ~PyLock() + { + PyGILState_Release(gil_state); + } +}; + + +//ṹ +struct Task +{ + int task_name; //صƶӦij + void *task_data; //ݽṹ + void *task_error; //ṹ + int task_id; //id + bool task_last; //ǷΪ󷵻 + int exchange_id; //г + void *task_data_one; //ݽṹ + int task_one_counts; + int task_one_all_counts; + void *task_data_two; //ݽṹ + int task_two_counts; + int task_two_all_counts; + +}; + + +///̰߳ȫĶ +template + +class ConcurrentQueue +{ +private: + queue the_queue; //׼ + mutable boost::mutex the_mutex; //boost + boost::condition_variable the_condition_variable; //boost + +public: + + //µ + void push(Data const& data) + { + boost::mutex::scoped_lock lock(the_mutex); //ȡ + the_queue.push(data); //д + lock.unlock(); //ͷ + the_condition_variable.notify_one(); //֪ͨȴ߳ + } + + //ǷΪ + bool empty() const + { + boost::mutex::scoped_lock lock(the_mutex); + return the_queue.empty(); + } + + //ȡ + Data wait_and_pop() + { + boost::mutex::scoped_lock lock(the_mutex); + + while (the_queue.empty()) //Ϊʱ + { + the_condition_variable.wait(lock); //ȴ֪ͨ + } + + Data popped_value = the_queue.front(); //ȡеһ + the_queue.pop(); //ɾ + return popped_value; //ظ + } + +}; + + +//ֵлȡijֵӦֵṹֵ +void getInt(dict d, string key, int* value); + +//ֵлȡijֵӦĸֵṹֵ +void getDouble(dict d, string key, double* value); + +//ֵлȡijֵӦֵַṹֵ +void getChar(dict d, string key, char* value); + +//ֵлȡijֵӦֵַṹֵ +void getStr(dict d, string key, char* value); + +void getInt64(dict d, string key, int64_t *value); + +void getInt16(dict d, string key, int16_t *value); + + +///------------------------------------------------------------------------------------- +///C++ SPIĻصʵ +///------------------------------------------------------------------------------------- + +//APIļ̳ʵ +class QuoteApi : public XTP::API::QuoteSpi +{ +private: + XTP::API::QuoteApi* api; //API + boost::thread *task_thread; //ָ߳루pythonݣ + ConcurrentQueue task_queue; // + +public: + QuoteApi() + { + function0 f = boost::bind(&QuoteApi::processTask, this); + boost::thread t(f); + this->task_thread = &t; + }; + + ~QuoteApi() + { + }; + + //------------------------------------------------------------------------------------- + //APIص + //------------------------------------------------------------------------------------- + + ///ͻ̨ͨӶϿʱ÷á + ///@param reason ԭӦ + ///@remark apiԶ߷ʱûѡڴ˺еLoginµ¼עûµ¼Ҫ¶ + virtual void OnDisconnected(int reason); + + + ///Ӧ + ///@param error_info ӦʱľĴʹϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark ˺ֻڷʱŻãһû + virtual void OnError(XTPRI *error_info); + + ///ʶӦ + ///@param begin_seq ʳֶʱޣһ£ + ///@param end_seq ʳֶʱޣһ£ + ///@remark ˺ֻʷʱŻеãһ£ʾʧһע˰Ϊݰ1߶ + virtual void OnTickByTickLossRange(int begin_seq, int end_seq); + + ///Ӧ + ///@param ticker ϸĺԼ + ///@param error_info ĺԼʱĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴ζĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + ///@remark ÿĵĺԼӦһӦҪٷأϢʱᴥ + virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last); + + ///˶Ӧ + ///@param ticker ϸĺԼȡ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴ȡĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + ///@remark ÿȡĵĺԼӦһȡӦҪٷأϢʱᴥ + virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last); + + ///֪ͨһһ + ///@param market_data + ///@param bid1_qty һ + ///@param bid1_count һеЧίб + ///@param max_bid1_count һίб + ///@param ask1_qty һ + ///@param ask1_count һеЧίб + ///@param max_ask1_count һίб + ///@remark ҪٷأϢʱᴥ + virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count); + + /// ETFIOPV֪ͨ + /// @param iopv ETFIJολֵݣҪٷأϢʱᴥ + virtual void OnETFIOPVData(IOPV *iopv); + + ///鶩Ӧ + ///@param ticker ϸĺԼ + ///@param error_info ĺԼʱĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴ζĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + ///@remark ÿĵĺԼӦһӦҪٷأϢʱᴥ + virtual void OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last); + + ///˶鶩Ӧ + ///@param ticker ϸĺԼȡ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴ȡĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + ///@remark ÿȡĵĺԼӦһȡӦҪٷأϢʱᴥ + virtual void OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last); + + ///鶩֪ͨ + ///@param order_book 鶩ݣҪٷأϢʱᴥ + virtual void OnOrderBook(XTPOB *order_book); + + ///Ӧ + ///@param ticker ϸĺԼ + ///@param error_info ĺԼʱĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴ζĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + ///@remark ÿĵĺԼӦһӦҪٷأϢʱᴥ + virtual void OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last); + + ///˶Ӧ + ///@param ticker ϸĺԼȡ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴ȡĵһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + ///@remark ÿȡĵĺԼӦһȡӦҪٷأϢʱᴥ + virtual void OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last); + + ///֪ͨ + ///@param tbt_data ݣίкʳɽΪýṹ壬ҪtypeίлʳɽҪٷأϢʱᴥ + virtual void OnTickByTick(XTPTBT *tbt_data); + + ///ȫгĹƱӦ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///˶ȫгӦ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); + + ///ȫг鶩Ӧ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); + + ///˶ȫг鶩Ӧ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); + + ///ȫгӦ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); + + ///˶ȫгӦ + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info); + + + ///ѯɽ׺ԼӦ + ///@param ticker_info ɽ׺ԼϢ + ///@param error_info ѯɽ׺ԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴βѯɽ׺ԼһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + virtual void OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last); + + ///ѯԼ¼۸ϢӦ + ///@param ticker_info Լ¼۸Ϣ + ///@param error_info ѯԼ¼۸ϢʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴βѯһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + virtual void OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last); + + + ///ȫгȨӦ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///˶ȫгȨӦ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///ȫгȨ鶩Ӧ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///˶ȫгȨ鶩Ӧ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///ȫгȨӦ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///˶ȫгȨӦ + ///@param exchage_id ʾǰȫĵгΪXTP_EXCHANGE_UNKNOWNʾȫгXTP_EXCHANGE_SHʾΪϺȫгXTP_EXCHANGE_SZʾΪȫг + ///@param error_info ȡĺԼʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ҫٷ + virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchage_id, XTPRI *error_info); + + ///ѯԼ̬ϢӦ + ///@param ticker_info Լ̬Ϣ + ///@param error_info ѯԼ̬ϢʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴βѯԼ̬ϢһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + virtual void OnQueryAllTickersFullInfo(XTPQFI* ticker_info, XTPRI *error_info, bool is_last); + + ///ѯԼ̬ϢӦ + ///@param ticker_info Լ̬Ϣ + ///@param error_info ѯԼ̬ϢʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param is_last Ƿ˴βѯԼ̬ϢһӦ𣬵ΪһʱΪtrueΪfalseʾϢӦ + virtual void OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last); + + ///ͻزͨӶϿʱ÷á + ///@param reason ԭӦ + ///@remark apiԶ߷ʱûѡزϢᶨʱߣעҪزʱűӣ޻زʱ½ + virtual void OnRebuildQuoteServerDisconnected(int reason); + + ///زָƵӦ + ///@param rebuild_result زʱãزʧܣmsgʾʧԭ + ///@remark Ҫٷأڻزݷͽã̫࣬һ޷ز꣬ôrebuild_result.result_code = XTP_REBUILD_RET_PARTLYʱҪݻزز + virtual void OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) ; + + ///ز + ///@param tbt_data ز + ///@remark Ҫٷأ˺OnTickByTickһ߳ڣOnRequestRebuildQuote()֮ǰص + virtual void OnRebuildTickByTick(XTPTBT *tbt_data); + + ///زĿ + ///@param md_data ز + ///@remark Ҫٷأ˺OnDepthMarketDataһ߳ڣOnRequestRebuildQuote()֮ǰص + virtual void OnRebuildMarketData(XTPMD *md_data); + + //------------------------------------------------------------------------------------- + //task + //------------------------------------------------------------------------------------- + + void processTask(); + + void processDisconnected(Task *task); + + void processError(Task *task); + + void processTickByTickLossRange(Task *task); + + void processSubMarketData(Task *task); + + void processUnSubMarketData(Task *task); + + void processDepthMarketData(Task *task); + + void processETFIOPVData(Task *task); + + void processSubOrderBook(Task *task); + + void processUnSubOrderBook(Task *task); + + void processOrderBook(Task *task); + + void processSubTickByTick(Task *task); + + void processUnSubTickByTick(Task *task); + + void processTickByTick(Task *task); + + void processSubscribeAllMarketData(Task *task); + + void processUnSubscribeAllMarketData(Task *task); + + void processSubscribeAllOrderBook(Task *task); + + void processUnSubscribeAllOrderBook(Task *task); + + void processSubscribeAllTickByTick(Task *task); + + void processUnSubscribeAllTickByTick(Task *task); + + void processQueryAllTickers(Task *task); + + void processQueryTickersPriceInfo(Task *task); + + void processQueryAllTickersFullInfo(Task *task); + + void processQueryAllNQTickersFullInfo(Task *task); + + void processRebuildQuoteServerDisconnected(Task *task); + + void processRequestRebuildQuote(Task *task); + + void processRebuildTickByTick(Task *task); + + void processRebuildMarketData(Task *task); + + + void processSubscribeAllOptionMarketData(Task *task); + + void processUnSubscribeAllOptionMarketData(Task *task); + + void processSubscribeAllOptionOrderBook(Task *task); + + void processUnSubscribeAllOptionOrderBook(Task *task); + + void processSubscribeAllOptionTickByTick(Task *task); + + void processUnSubscribeAllOptionTickByTick(Task *task); + //------------------------------------------------------------------------------------- + //dataصֵ + //errorصĴֵ + //idid + //lastǷΪ󷵻 + //i + //------------------------------------------------------------------------------------- + + virtual void onDisconnected(int reason) {}; + + virtual void onError(dict data) {}; + + virtual void onTickByTickLossRange(int begin_seq, int end_seq) {}; + + virtual void onSubMarketData(dict data, dict error, bool last) {}; + + virtual void onUnSubMarketData(dict data, dict error, bool last) {}; + + virtual void onDepthMarketData(dict data,boost::python::list bid1_qty_list,int bid1_count,int max_bid1_count,boost::python::list ask1_qty_list,int ask1_count,int max_ask1_count) {}; + + virtual void onETFIOPVData(dict data) {}; + + virtual void onSubOrderBook(dict data, dict error, bool last) {}; + + virtual void onUnSubOrderBook(dict data, dict error, bool last) {}; + + virtual void onOrderBook(dict data) {}; + + virtual void onSubTickByTick(dict data, dict error, bool last) {}; + + virtual void onUnSubTickByTick(dict data, dict error, bool last) {}; + + virtual void onTickByTick(dict data) {}; + + virtual void onSubscribeAllMarketData(int exchange_id,dict error) {}; + + virtual void onUnSubscribeAllMarketData(int exchange_id,dict error) {}; + + virtual void onSubscribeAllOrderBook(int exchange_id,dict error) {}; + + virtual void onUnSubscribeAllOrderBook(int exchange_id,dict error) {}; + + virtual void onSubscribeAllTickByTick(int exchange_id,dict error) {}; + + virtual void onUnSubscribeAllTickByTick(int exchange_id,dict error) {}; + + virtual void onQueryAllTickers(dict data, dict error, bool last) {}; + + virtual void onQueryTickersPriceInfo(dict data, dict error, bool last) {}; + + virtual void onQueryAllTickersFullInfo(dict data, dict error, bool last) {}; + + virtual void onQueryAllNQTickersFullInfo(dict data, dict error, bool last) {}; + + virtual void onRebuildQuoteServerDisconnected(int reason) {}; + + virtual void onRequestRebuildQuote(dict data) {}; + + virtual void onRebuildTickByTick(dict data) {}; + + virtual void onRebuildMarketData(dict data) {}; + + + virtual void onSubscribeAllOptionMarketData(int exchange_id,dict error) {}; + + virtual void onUnSubscribeAllOptionMarketData(int exchange_id,dict error) {}; + + virtual void onSubscribeAllOptionOrderBook(int exchange_id,dict error) {}; + + virtual void onUnSubscribeAllOptionOrderBook(int exchange_id,dict error) {}; + + virtual void onSubscribeAllOptionTickByTick(int exchange_id,dict error) {}; + + virtual void onUnSubscribeAllOptionTickByTick(int exchange_id,dict error) {}; + //------------------------------------------------------------------------------------- + //req:ֵ + //------------------------------------------------------------------------------------- + + void createQuoteApi(int clientid, string path, int log_level); + + void release(); + + int exit(); + + string getTradingDay(); + + string getApiVersion(); + + dict getApiLastError(); + + void setUDPBufferSize(int size); + + void setHeartBeatInterval(int interval); + + void setUDPRecvThreadAffinity(int32_t cpu_no); + + void setUDPRecvThreadAffinityArray(boost::python::list tickerList,int count); + + void setUDPParseThreadAffinity(int32_t cpu_no); + + void setUDPParseThreadAffinityArray(boost::python::list tickerList,int count); + + void setUDPSeqLogOutPutFlag(bool flag); + + int subscribeMarketData(boost::python::list tickerList,int count, int exchange); + + int unSubscribeMarketData(boost::python::list tickerList,int count, int exchange); + + int subscribeOrderBook(boost::python::list tickerList,int count, int exchange); + + int unSubscribeOrderBook(boost::python::list tickerList,int count, int exchange); + + int subscribeTickByTick(boost::python::list tickerList,int count, int exchange); + + int unSubscribeTickByTick(boost::python::list tickerList,int count, int exchange); + + int subscribeAllMarketData(int exchange = 3); + + int unSubscribeAllMarketData(int exchange = 3); + + int subscribeAllOrderBook(int exchange = 3); + + int unSubscribeAllOrderBook(int exchange = 3); + + int subscribeAllTickByTick(int exchange = 3); + + int unSubscribeAllTickByTick(int exchange = 3); + + int login(string ip, int port, string user, string password, int socktype,string local_ip); + + int logout(); + + int queryAllTickers(int exchange); + + int queryTickersPriceInfo(boost::python::list tickerList, int count, int exchange); + + int queryAllTickersPriceInfo(); + + int queryAllTickersFullInfo(int exchange); + + int queryAllNQTickersFullInfo(); + + int subscribeAllOptionMarketData(int exchange = XTP_EXCHANGE_UNKNOWN); + + int unSubscribeAllOptionMarketData(int exchange = XTP_EXCHANGE_UNKNOWN); + + int subscribeAllOptionOrderBook(int exchange = XTP_EXCHANGE_UNKNOWN); + + int unSubscribeAllOptionOrderBook(int exchange = XTP_EXCHANGE_UNKNOWN); + + int subscribeAllOptionTickByTick(int exchange = XTP_EXCHANGE_UNKNOWN); + + int unSubscribeAllOptionTickByTick(int exchange = XTP_EXCHANGE_UNKNOWN); + + int loginToRebuildQuoteServer(string ip, int port, string user, string password, int sock_type, string local_ip); + + int logoutFromRebuildQuoteServer(); + + int requestRebuildQuote(dict req); +}; diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/dllmain.cpp b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/dllmain.cpp index 69b5891..8a4edd3 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/dllmain.cpp +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/dllmain.cpp @@ -1,19 +1,19 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "stdafx.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.cpp b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.cpp index 44a05bf..d7ea8ac 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.cpp +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.cpp @@ -1,8 +1,8 @@ -// stdafx.cpp : source file that includes just the standard includes -// vnxtptrader.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +// stdafx.cpp : source file that includes just the standard includes +// vnxtptrader.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.h b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.h index f3a0737..677e68a 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/stdafx.h @@ -1,16 +1,16 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files: -#include - - - -// TODO: reference additional headers your program requires here +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + + + +// TODO: reference additional headers your program requires here diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/targetver.h b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/targetver.h index 87c0086..90e767b 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/targetver.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/targetver.h @@ -1,8 +1,8 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.cpp b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.cpp index 1467060..3edbc24 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.cpp +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.cpp @@ -1,5652 +1,5652 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.h" - -///------------------------------------------------------------------------------------- -///PythonC++תõĺ -///------------------------------------------------------------------------------------- - -// Ƕ׽ṹ-intʹ -void getNestedDictValue(dict d, string key1, string key2, int *value) { - if (d.has_key(key1)) { //ֵǷڸüֵ - dict o1 = (dict)d[key1]; //ȡüֵ - if (o1.has_key(key2)) { - object o2 = o1[key2]; //ȡüֵ - extract x(o2); //ȡ - if (x.check()) { //ȡ - *value = x(); //Ŀָ븳ֵ - } - } - } -} - -// Ƕ׽ṹ-ַʹ -void getNestedDictChar(dict d, string key1, string key2, char *value) { - if (d.has_key(key1)) { //ֵǷڸüֵ - dict o1 = (dict)d[key1]; //ȡüֵ - if (o1.has_key(key2)) { - object o2 = o1[key2]; //ȡüֵ - extract x(o2); //ȡ - if (x.check()) { //ȡ - string s = x(); - const char *buffer = s.c_str(); -#ifdef WIN32 - strcpy_s(value, strlen(buffer) + 1, buffer); -#else - strncpy(value, buffer, strlen(buffer) + 1); -#endif - } - } - } -} - -// Ƕ׽ṹ-ַʹ -void getNestedDictChar2(dict d, string key1, string key2, string key3, char *value, int index) { - if (d.has_key(key1)) { //ֵǷڸüֵ - dict o1 = (dict)d[key1]; //ȡüֵ - if (o1.has_key(key2)) { - dict o2 = (dict)(((boost::python::list)o1[key2])[index]); //ȡüֵ - if (o2.has_key(key3)) { - object o3 = o2[key3]; //ȡüֵ - extract x(o3); //ȡ - if (x.check()) { //ȡ - string s = x(); - const char *buffer = s.c_str(); -#ifdef WIN32 - strcpy_s(value, strlen(buffer) + 1, buffer); -#else - strncpy(value, buffer, strlen(buffer) + 1); -#endif - } - } - } - } -} - -// Ƕ׽ṹ-intʹ -void getNestedDictValue2(dict d, string key1, string key2, string key3, int *value, int index) -{ - if (d.has_key(key1)) { //ֵǷڸüֵ - dict o1 = (dict)d[key1]; //ȡüֵ - if (o1.has_key(key2)) { - dict o2 = (dict)(((boost::python::list)o1[key2])[index]); //ȡüֵ - if (o2.has_key(key3)) { - object o3 = o2[key3]; //ȡüֵ - extract x(o3); //ȡ - if (x.check()) { //ȡ - *value = x(); //Ŀָ븳ֵ - } - } - } - } -} - -void getInt(dict d, string key, int *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -}; - -void getUint64(dict d, string key, uint64_t *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -}; - -void getUint32(dict d, string key, uint32_t *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -}; - -void getInt64(dict d, string key, int64_t *value) -{ - if (d.has_key(key)) //ֵǷڸüֵ - { - object o = d[key]; //ȡüֵ - extract x(o); //ȡ - if (x.check()) //ȡ - { - *value = x(); //Ŀָ븳ֵ - } - } -}; - -void getDouble(dict d, string key, double *value) -{ - if (d.has_key(key)) - { - object o = d[key]; - extract x(o); - if (x.check()) - { - *value = x(); - } - } -}; - -void getStr(dict d, string key, char *value) -{ - if (d.has_key(key)) - { - object o = d[key]; - extract x(o); - if (x.check()) - { - string s = x(); - const char *buffer = s.c_str(); - //ַָ븳ֵʹstrcpy_s, vs2013ʹstrcpyͨ - //+1ӦΪC++ַĽβţرȷ1 -#ifdef _MSC_VER //WIN32 - strcpy_s(value, strlen(buffer) + 1, buffer); -#elif __GNUC__ - strncpy(value, buffer, strlen(buffer) + 1); -#endif - } - } -}; - -void getChar(dict d, string key, char *value) -{ - if (d.has_key(key)) - { - object o = d[key]; - extract x(o); - if (x.check()) - { - string s = x(); - const char *buffer = s.c_str(); - *value = *buffer; - } - } -}; - -string addEndingChar(char *value){ - //printf("value:%s\n",value); - string endStr = value; - //printf("endStr:%s\n",endStr.c_str()); - return endStr; -} - -///------------------------------------------------------------------------------------- -///C++Ļصݱ浽 -///------------------------------------------------------------------------------------- - -void TraderApi::OnDisconnected(uint64_t session_id, int reason) -{ - Task* task = new Task(); - task->task_name = ONDISCONNECTED; - task->addtional_int = session_id; //ֶ޸ - task->task_id = reason; - this->task_queue.push(task); -}; - -void TraderApi::OnError(XTPRI *error_info) -{ - Task* task = new Task(); - task->task_name = ONERROR; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - this->task_queue.push(task); -}; - -void TraderApi::OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYACCOUNTTRADEMARKET; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->reason = trade_location; - task->task_id = request_id; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONORDEREVENT; - - if (order_info) - { - XTPOrderInfo *task_data = new XTPOrderInfo(); - *task_data = *order_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - - this->task_queue.push(task); -}; - -void TraderApi::OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONTRADEEVENT; - - if (trade_info) - { - XTPTradeReport *task_data = new XTPTradeReport(); - *task_data = *trade_info; - task->task_data = task_data; - } - - task->addtional_int = session_id; - - this->task_queue.push(task); -}; - -void TraderApi::OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONCANCELORDERERROR; - - if (cancel_info) - { - XTPOrderCancelInfo *task_data = new XTPOrderCancelInfo(); - *task_data = *cancel_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - - this->task_queue.push(task); -}; - -void TraderApi::OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYORDER; - - if (order_info) - { - XTPQueryOrderRsp *task_data = new XTPQueryOrderRsp(); - *task_data = *order_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYORDEREX; - - if (order_info) - { - XTPOrderInfoEx* task_data = new XTPOrderInfoEx(); - *task_data = *order_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); - -} - -void TraderApi::OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYORDERBYPAGE; - - if (order_info) - { - XTPQueryOrderRsp *task_data = new XTPQueryOrderRsp(); - *task_data = *order_info; - task->task_data = task_data; - } - - task->addtional_int_two = req_count; - task->addtional_int_three = order_sequence; - task->addtional_int_four = query_reference; - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYORDERBYPAGEEX; - - if (order_info) - { - XTPOrderInfoEx* task_data = new XTPOrderInfoEx(); - *task_data = *order_info; - task->task_data = task_data; - } - - task->addtional_int_two = req_count; - task->addtional_int_three = order_sequence; - task->addtional_int_four = query_reference; - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYTRADE; - - if (trade_info) - { - XTPQueryTradeRsp *task_data = new XTPQueryTradeRsp(); - *task_data = *trade_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYTRADEBYPAGE; - - if (trade_info) - { - XTPQueryTradeRsp *task_data = new XTPQueryTradeRsp(); - *task_data = *trade_info; - task->task_data = task_data; - } - - task->addtional_int_two = req_count; - task->addtional_int_three = trade_sequence; - task->addtional_int_four = query_reference; - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYPOSITION; - if (position) - { - XTPQueryStkPositionRsp *task_data = new XTPQueryStkPositionRsp(); - *task_data = *position; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYASSET; - - if (asset) - { - XTPQueryAssetRsp *task_data = new XTPQueryAssetRsp(); - *task_data = *asset; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYSTRUCTUREDFUND; - - if (fund_info) - { - XTPStructuredFundInfo *task_data = new XTPStructuredFundInfo(); - *task_data = *fund_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYFUNDTRANSFER; - - if (fund_transfer_info) - { - XTPFundTransferNotice *task_data = new XTPFundTransferNotice(); - *task_data = *fund_transfer_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONFUNDTRANSFER; - - if (fund_transfer_info) - { - XTPFundTransferNotice *task_data = new XTPFundTransferNotice(); - *task_data = *fund_transfer_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYETF; - - if (etf_info) - { - XTPQueryETFBaseRsp *task_data = new XTPQueryETFBaseRsp(); - *task_data = *etf_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYETFBASKET; - - if (etf_component_info) - { - XTPQueryETFComponentRsp *task_data = new XTPQueryETFComponentRsp(); - *task_data = *etf_component_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYIPOINFOLIST; - - if (ipo_info) - { - XTPQueryIPOTickerRsp *task_data = new XTPQueryIPOTickerRsp(); - *task_data = *ipo_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYIPOQUOTAINFO; - - if (quota_info) - { - XTPQueryIPOQuotaRsp *task_data = new XTPQueryIPOQuotaRsp(); - *task_data = *quota_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -}; - -void TraderApi::OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYBONDIPOINFOLIST; - - if (ipo_info) - { - XTPQueryIPOTickerRsp *task_data = new XTPQueryIPOTickerRsp(); - *task_data = *ipo_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYBONDSWAPSTOCKINFO; - - if(swap_stock_info) - { - XTPQueryBondSwapStockRsp *task_data = new XTPQueryBondSwapStockRsp; - *task_data = *swap_stock_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYOPTIONAUCTIONINFO; - - if (option_info) - { - XTPQueryOptionAuctionInfoRsp *task_data = new XTPQueryOptionAuctionInfoRsp(); - *task_data = *option_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONCREDITCASHREPAY; - if (cash_repay_info) - { - XTPCrdCashRepayRsp *task_data = new XTPCrdCashRepayRsp(); - *task_data = *cash_repay_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo * cash_repay_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITCASHREPAYINFO; - if (cash_repay_info) - { - XTPCrdCashRepayInfo *task_data = new XTPCrdCashRepayInfo(); - *task_data = *cash_repay_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditFundInfo(XTPCrdFundInfo * fund_info, XTPRI * error_info, int request_id, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITFUNDINFO; - if (fund_info) - { - XTPCrdFundInfo *task_data = new XTPCrdFundInfo(); - *task_data = *fund_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditDebtInfo(XTPCrdDebtInfo * debt_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITDEBTINFO; - if (debt_info) - { - XTPCrdDebtInfo *task_data = new XTPCrdDebtInfo(); - *task_data = *debt_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo * debt_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITTICKERDEBTINFO; - if (debt_info) - { - XTPCrdDebtStockInfo *task_data = new XTPCrdDebtStockInfo(); - *task_data = *debt_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI * error_info, int request_id, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITASSETDEBTINFO; - task->remain_amount = remain_amount; - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo * assign_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITTICKERASSIGNINFO; - if (assign_info) - { - XTPClientQueryCrdPositionStkInfo *task_data = new XTPClientQueryCrdPositionStkInfo(); - *task_data = *assign_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo * stock_info, XTPRI * error_info, int request_id, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITEXCESSSTOCK; - if (stock_info) - { - XTPClientQueryCrdSurplusStkRspInfo *task_data = new XTPClientQueryCrdSurplusStkRspInfo(); - *task_data = *stock_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo * stock_info, XTPRI * error_info, int request_id, uint64_t session_id, bool is_last) { - - Task* task = new Task(); - task->task_name = ONQUERYMULCREDITEXCESSSTOCK; - if (stock_info) - { - XTPClientQueryCrdSurplusStkRspInfo *task_data = new XTPClientQueryCrdSurplusStkRspInfo(); - *task_data = *stock_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->addtional_int = session_id; - task->task_last = is_last; - this->task_queue.push(task); -} - - -void TraderApi::OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI * error_info, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONCREDITEXTENDDEBTDATE; - if (debt_extend_info) - { - XTPCreditDebtExtendNotice *task_data = new XTPCreditDebtExtendNotice(); - *task_data = *debt_extend_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITEXTENDDEBTDATEORDERS; - if (debt_extend_info) - { - XTPCreditDebtExtendNotice *task_data = new XTPCreditDebtExtendNotice(); - *task_data = *debt_extend_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - - this->task_queue.push(task); -} - -void TraderApi::OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITFUNDEXTRAINFO; - if (fund_info) - { - XTPCrdFundExtraInfo *task_data = new XTPCrdFundExtraInfo(); - *task_data = *fund_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->addtional_int = session_id; - - this->task_queue.push(task); -} - -void TraderApi::OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYCREDITPOSITIONEXTRAINFO; - if (fund_info) - { - XTPCrdPositionExtraInfo *task_data = new XTPCrdPositionExtraInfo(); - *task_data = *fund_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - - this->task_queue.push(task); -} - -void TraderApi::OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONCREDITCASHREPAYDEBTINTERESTFEE; - if (cash_repay_info) - { - XTPCrdCashRepayDebtInterestFeeRsp *task_data = new XTPCrdCashRepayDebtInterestFeeRsp(); - *task_data = *cash_repay_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - - - -void TraderApi::OnCancelOptionCombinedOrderError(XTPOrderCancelInfo * cancel_info, XTPRI * error_info, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONCANCELOPTIONCOMBINEDORDERERROR; - - if (cancel_info) { - XTPOrderCancelInfo *task_data = new XTPOrderCancelInfo(); - *task_data = *cancel_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnOptionCombinedOrderEvent(XTPOptCombOrderInfo * order_info, XTPRI * error_info, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONOPTIONCOMBINEDORDEREVENT; - - if (order_info) { - XTPOptCombOrderInfo *task_data = new XTPOptCombOrderInfo(); - *task_data = *order_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnOptionCombinedTradeEvent(XTPOptCombTradeReport * trade_info, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONOPTIONCOMBINEDTRADEEVENT; - - if (trade_info) { - XTPOptCombTradeReport *task_data = new XTPOptCombTradeReport(); - *task_data = *trade_info; - task->task_data = task_data; - } - - - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp * order_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDORDERS; - - if (order_info) { - XTPQueryOptCombOrderRsp *task_data = new XTPQueryOptCombOrderRsp(); - *task_data = *order_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDORDERSEX; - - if (order_info) - { - XTPOptCombOrderInfoEx *task_data = new XTPOptCombOrderInfoEx(); - *task_data = *order_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp * order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDORDERSBYPAGE; - - if (order_info) { - XTPQueryOptCombOrderRsp *task_data = new XTPQueryOptCombOrderRsp(); - *task_data = *order_info; - task->task_data = task_data; - } - - task->req_count = req_count; - task->order_sequence = order_sequence; - task->query_reference = query_reference; - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDORDERSBYPAGEEX; - - if (order_info) - { - XTPOptCombOrderInfoEx *task_data = new XTPOptCombOrderInfoEx(); - *task_data = *order_info; - task->task_data = task_data; - } - - task->req_count = req_count; - task->order_sequence = order_sequence; - task->query_reference = query_reference; - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp * trade_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDTRADES; - - if (trade_info) { - XTPQueryOptCombTradeRsp *task_data = new XTPQueryOptCombTradeRsp(); - *task_data = *trade_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp * trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDTRADESBYPAGE; - - - if (trade_info) { - XTPQueryOptCombTradeRsp *task_data = new XTPQueryOptCombTradeRsp(); - *task_data = *trade_info; - task->task_data = task_data; - } - task->task_id = request_id; - task->task_last = is_last; - task->query_reference = query_reference; - - task->req_count = req_count; - task->trade_sequence = trade_sequence; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp * position_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDPOSITION; - - if (position_info) { - XTPQueryOptCombPositionRsp *task_data = new XTPQueryOptCombPositionRsp(); - *task_data = *position_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp * strategy_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDSTRATEGYINFO; - - if (strategy_info) { - XTPQueryCombineStrategyInfoRsp *task_data = new XTPQueryCombineStrategyInfoRsp(); - *task_data = *strategy_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONQUERYOPTIONCOMBINEDEXECPOSITION; - if (position_info) { - XTPQueryOptCombExecPosRsp *task_data = new XTPQueryOptCombExecPosRsp(); - *task_data = *position_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONQUERYOTHERSERVERFUND; - - if (fund_info) { - XTPFundQueryRsp *task_data = new XTPFundQueryRsp(); - *task_data = *fund_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -////////////////////////algo//////////////////////// -void TraderApi::OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONQUERYSTRATEGY; - if (strategy_info) { - XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); - *task_data = *strategy_info; - task->task_data = task_data; - } - - if(strategy_param) - task->strategy_param = addEndingChar(strategy_param); - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); - -} - -void TraderApi::OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state,uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONSTRATEGYASTATEREPORT; - - if (strategy_state) { - XTPStrategyStateReportStruct *task_data = new XTPStrategyStateReportStruct(); - *task_data = *strategy_state; - task->task_data = task_data; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONALGOUSERESTABLISHCHANNEL; - - task->user = addEndingChar(user); - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONINSERTALGOORDER; - - if (strategy_info) { - XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); - *task_data = *strategy_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - - -void TraderApi::OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) { - Task* task = new Task(); - task->task_name = ONCANCELALGOORDER; - - if (strategy_info) { - XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); - *task_data = *strategy_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnAlgoDisconnected(int reason){ - Task* task = new Task(); - task->task_name = ONALGODISCONNECTED; - - - task->reason = reason; - this->task_queue.push(task); -} - -void TraderApi::OnAlgoConnected(){ - Task* task = new Task(); - task->task_name = ONALGOCONNECTED; - - this->task_queue.push(task); -} - -void TraderApi::OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONSTRATEGYSYMBOLSTATEREPORT; - - if (strategy_symbol_state) - { - XTPStrategySymbolStateReport *task_data = new XTPStrategySymbolStateReport(); - *task_data = *strategy_symbol_state; - task->task_data = task_data; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONNEWSTRATEGYCREATEREPORT; - - if (strategy_info) { - XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); - *task_data = *strategy_info; - task->task_data = task_data; - } - - if(strategy_param) - { - task->strategy_param = addEndingChar(strategy_param); - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONSTRATEGYRECOMMENDATION; - task->addtional_bool = basket_flag; - - if (recommendation_info) { - XTPStrategyRecommendationInfo *task_data = new XTPStrategyRecommendationInfo(); - *task_data = *recommendation_info; - task->task_data = task_data; - } - - if (strategy_param) - { - task->strategy_param = addEndingChar(strategy_param); - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->task_id = request_id; - task->task_last = is_last; - task->addtional_int = session_id; - this->task_queue.push(task); -} - -void TraderApi::OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) -{ - Task* task = new Task(); - task->task_name = ONMODIFYALGOORDER; - - if (strategy_info) { - XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); - *task_data = *strategy_info; - task->task_data = task_data; - } - - if (error_info) - { - XTPRI *task_error = new XTPRI(); - *task_error = *error_info; - task->task_error = task_error; - } - - task->addtional_int = session_id; - this->task_queue.push(task); -} - -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪpython󣬽 -///------------------------------------------------------------------------------------- - -void TraderApi::processTask() -{ - while (1) - { - Task* task = this->task_queue.wait_and_pop(); - - switch (task->task_name) - { - case ONDISCONNECTED: - { - this->processDisconnected(task); - break; - } - - case ONERROR: - { - this->processError(task); - break; - } - - case ONQUERYACCOUNTTRADEMARKET: - { - this->processQueryAccountTradeMarket(task); - break; - } - - case ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - case ONQUERYORDEREX: - { - this->processQueryOrderEx(task); - break; - } - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(task); - break; - } - case ONQUERYORDERBYPAGEEX: - { - this->processQueryOrderByPageEx(task); - break; - } - case ONQUERYTRADE: - { - this->processQueryTrade(task); - break; - } - case ONQUERYTRADEBYPAGE: - { - this->processQueryTradeByPage(task); - break; - } - case ONQUERYPOSITION: - { - this->processQueryPosition(task); - break; - } - - case ONQUERYASSET: - { - this->processQueryAsset(task); - break; - } - - - case ONQUERYSTRUCTUREDFUND: - { - this->processQueryStructuredFund(task); - break; - } - - case ONQUERYFUNDTRANSFER: - { - this->processQueryFundTransfer(task); - break; - } - - case ONFUNDTRANSFER: - { - this->processFundTransfer(task); - break; - } - - case ONQUERYETF: - { - this->processQueryETF(task); - break; - } - - case ONQUERYETFBASKET: - { - this->processQueryETFBasket(task); - break; - } - - case ONQUERYIPOINFOLIST: - { - this->processQueryIPOInfoList(task); - break; - } - - case ONQUERYIPOQUOTAINFO: - { - this->processQueryIPOQuotaInfo(task); - break; - } - - case ONQUERYBONDIPOINFOLIST: - { - this->processQueryBondIPOInfoList(task); - break; - } - - case ONQUERYBONDSWAPSTOCKINFO: - { - this->processQueryBondSwapStockInfo(task); - break; - } - - case ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(task); - break; - } - - case ONCREDITCASHREPAY: { - this->processCreditCashRepay(task); - break; - } - - case ONQUERYCREDITCASHREPAYINFO: { - this->processQueryCreditCashRepayInfo(task); - break; - } - - case ONQUERYCREDITFUNDINFO: { - this->processQueryCreditFundInfo(task); - break; - } - - case ONQUERYCREDITDEBTINFO: { - this->processQueryCreditDebtInfo(task); - break; - } - - case ONQUERYCREDITTICKERDEBTINFO: { - this->processQueryCreditTickerDebtInfo(task); - break; - } - - case ONQUERYCREDITASSETDEBTINFO: { - this->processQueryCreditAssetDebtInfo(task); - break; - } - - case ONQUERYCREDITTICKERASSIGNINFO: { - this->processQueryCreditTickerAssignInfo(task); - break; - } - - case ONQUERYCREDITEXCESSSTOCK: { - this->processQueryCreditExcessStock(task); - break; - } - case ONQUERYMULCREDITEXCESSSTOCK: { - this->processQueryMulCreditExcessStock(task); - break; - } - - case ONCREDITEXTENDDEBTDATE: { - this->processCreditExtendDebtDate(task); - break; - } - - case ONQUERYCREDITEXTENDDEBTDATEORDERS: { - this->processQueryCreditExtendDebtDateOrders(task); - break; - } - - case ONQUERYCREDITFUNDEXTRAINFO: { - this->processQueryCreditFundExtraInfo(task); - break; - } - - case ONQUERYCREDITPOSITIONEXTRAINFO: { - this->processQueryCreditPositionExtraInfo(task); - break; - } - case ONCREDITCASHREPAYDEBTINTERESTFEE: { - this->processCreditCashRepayDebtInterestFee(task); - break; - } - - case ONOPTIONCOMBINEDORDEREVENT: { - this->processOptionCombinedOrderEvent(task); - break; - } - - case ONOPTIONCOMBINEDTRADEEVENT: { - this->processOptionCombinedTradeEvent(task); - break; - } - - case ONQUERYOPTIONCOMBINEDORDERS: { - this->processQueryOptionCombinedOrders(task); - break; - } - case ONQUERYOPTIONCOMBINEDORDERSEX: - { - this->processQueryOptionCombinedOrdersEx(task); - break; - } - - case ONQUERYOPTIONCOMBINEDORDERSBYPAGE: { - this->processQueryOptionCombinedOrdersByPage(task); - break; - } - case ONQUERYOPTIONCOMBINEDORDERSBYPAGEEX: - { - this->processQueryOptionCombinedOrdersByPageEx(task); - break; - } - - case ONQUERYOPTIONCOMBINEDTRADES: { - this->processQueryOptionCombinedTrades(task); - break; - } - - case ONQUERYOPTIONCOMBINEDTRADESBYPAGE: { - this->processQueryOptionCombinedTradesByPage(task); - break; - } - - case ONQUERYOPTIONCOMBINEDPOSITION: { - this->processQueryOptionCombinedPosition(task); - break; - } - - case ONQUERYOPTIONCOMBINEDSTRATEGYINFO: { - this->processQueryOptionCombinedStrategyInfo(task); - break; - } - case ONCANCELOPTIONCOMBINEDORDERERROR: { - this->processCancelOptionCombinedOrderError(task); - break; - } - case ONQUERYOPTIONCOMBINEDEXECPOSITION: { - this->processQueryOptionCombinedExecPosition(task); - break; - } - case ONQUERYOTHERSERVERFUND: { - this->processQueryOtherServerFund(task); - break; - } - case ONQUERYSTRATEGY: { - this->processQueryStrategy(task); - break; - } - case ONSTRATEGYASTATEREPORT: { - this->processStrategyStateReport(task); - break; - } - case ONALGOUSERESTABLISHCHANNEL: { - this->processALGOUserEstablishChannel(task); - break; - } - case ONINSERTALGOORDER: { - this->processInsertAlgoOrder(task); - break; - } - case ONCANCELALGOORDER: { - this->processCancelAlgoOrder(task); - break; - } - case ONALGODISCONNECTED: { - this->processAlgoDisconnected(task); - break; - }case ONALGOCONNECTED: { - this->processAlgoConnected(task); - break; - } - case ONSTRATEGYSYMBOLSTATEREPORT: - { - this->processStrategySymbolStateReport(task); - break; - } - case ONNEWSTRATEGYCREATEREPORT: - { - this->processNewStrategyCreateReport(task); - break; - } - case ONSTRATEGYRECOMMENDATION: - { - this->processStrategyRecommendation(task); - break; - } - case ONMODIFYALGOORDER: - { - this->processModifyAlgoOrder(task); - break; - } - }; - } -}; - -void TraderApi::processDisconnected(Task *task) -{ - PyLock lock; - this->onDisconnected(task->addtional_int, task->task_id); - delete task; -}; - -void TraderApi::processError(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onError(error); - delete task; -}; - -void TraderApi::processQueryAccountTradeMarket(Task *task) -{ - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - this->onQueryAccountTradeMarket(task->reason, error, task->task_id, task->addtional_int); - delete task; -} - -void TraderApi::processOrderEvent(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPOrderInfo *task_data = (XTPOrderInfo*)task->task_data; - data["cancel_time"] = task_data->cancel_time; - data["update_time"] = task_data->update_time; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["trade_amount"] = task_data->trade_amount; - data["price_type"] = (int)task_data->price_type; - data["order_type"] = task_data->order_type; - data["price"] = task_data->price; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["order_local_id"] = task_data->order_local_id; - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["insert_time"] = task_data->insert_time; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_status"] = (int)task_data->order_status; - data["ticker"] = addEndingChar(task_data->ticker); - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["business_type"] = int(task_data->business_type); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onOrderEvent(data, error, task->addtional_int); - delete task; -}; - -void TraderApi::processTradeEvent(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPTradeReport *task_data = (XTPTradeReport*)task->task_data; - data["branch_pbu"] = addEndingChar(task_data->branch_pbu); - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = addEndingChar(task_data->exec_id); - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = addEndingChar(task_data->order_exch_id); - data["price"] = task_data->price; - data["report_index"] = task_data->report_index; - data["local_order_id"] = task_data->local_order_id; - data["trade_time"] = task_data->trade_time; - data["order_xtp_id"] = task_data->order_xtp_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["business_type"] = int(task_data->business_type); - delete task->task_data; - } - - this->onTradeEvent(data, task->addtional_int); - delete task; -}; - -void TraderApi::processCancelOrderError(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPOrderCancelInfo *task_data = (XTPOrderCancelInfo*)task->task_data; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_xtp_id"] = task_data->order_xtp_id; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onCancelOrderError(data, error, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryOrder(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOrderRsp *task_data = (XTPQueryOrderRsp*)task->task_data; - data["cancel_time"] = task_data->cancel_time; - data["update_time"] = task_data->update_time; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["trade_amount"] = task_data->trade_amount; - data["price_type"] = (int)task_data->price_type; - data["order_type"] = task_data->order_type; - data["price"] = task_data->price; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["order_local_id"] = addEndingChar(task_data->order_local_id); - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["insert_time"] = task_data->insert_time; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_status"] = (int)task_data->order_status; - data["ticker"] = addEndingChar(task_data->ticker); - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["business_type"] = int(task_data->business_type); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOrder(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryOrderEx(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPOrderInfoEx *task_data = (XTPOrderInfoEx*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["cancel_time"] = task_data->cancel_time; - data["update_time"] = task_data->update_time; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_client_id"] = task_data->order_client_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["market"] = (int)task_data->market; - data["price"] = task_data->price; - data["quantity"] = task_data->quantity; - data["price_type"] = (int)task_data->price_type; - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["business_type"] = int(task_data->business_type); - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = addEndingChar(task_data->order_local_id); - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["order_exch_id"] = task_data->order_exch_id; - data["error_id"] = task_data->order_err_t.error_id; - data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - this->onQueryOrderEx(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryOrderByPage(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOrderRsp *task_data = (XTPQueryOrderRsp*)task->task_data; - data["cancel_time"] = task_data->cancel_time; - data["update_time"] = task_data->update_time; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["trade_amount"] = task_data->trade_amount; - data["price_type"] = (int)task_data->price_type; - data["order_type"] = task_data->order_type; - data["price"] = task_data->price; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["order_local_id"] = addEndingChar(task_data->order_local_id); - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["insert_time"] = task_data->insert_time; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_status"] = (int)task_data->order_status; - data["ticker"] = addEndingChar(task_data->ticker); - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["business_type"] = int(task_data->business_type); - delete task->task_data; - } - - - - this->onQueryOrderByPage(data, task->addtional_int_two, task->addtional_int_three, task->addtional_int_four, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryOrderByPageEx(Task *task) -{ - PyLock lock; - dict data; - - if (task->task_data) - { - XTPOrderInfoEx *task_data = (XTPOrderInfoEx*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["cancel_time"] = task_data->cancel_time; - data["update_time"] = task_data->update_time; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_client_id"] = task_data->order_client_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["market"] = (int)task_data->market; - data["price"] = task_data->price; - data["quantity"] = task_data->quantity; - data["price_type"] = (int)task_data->price_type; - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["business_type"] = int(task_data->business_type); - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = addEndingChar(task_data->order_local_id); - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["order_exch_id"] = task_data->order_exch_id; - data["error_id"] = task_data->order_err_t.error_id; - data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); - delete task->task_data; - } - this->onQueryOrderByPageEx(data, task->addtional_int_two, task->addtional_int_three, task->addtional_int_four, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = addEndingChar(task_data->branch_pbu); - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = addEndingChar(task_data->exec_id); - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = addEndingChar(task_data->order_exch_id); - data["price"] = task_data->price; - data["report_index"] = task_data->report_index; - data["local_order_id"] = task_data->local_order_id; - data["trade_time"] = task_data->trade_time; - data["order_xtp_id"] = task_data->order_xtp_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["business_type"] = int(task_data->business_type); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryTrade(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryTradeByPage(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = addEndingChar(task_data->branch_pbu); - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = addEndingChar(task_data->exec_id); - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = addEndingChar(task_data->order_exch_id); - data["price"] = task_data->price; - data["report_index"] = task_data->report_index; - data["local_order_id"] = task_data->local_order_id; - data["trade_time"] = task_data->trade_time; - data["order_xtp_id"] = task_data->order_xtp_id; - data["ticker"] = addEndingChar(task_data->ticker); - data["side"] = (int)task_data->side; - data["position_effect"] = (int)task_data->position_effect; - data["reserved1"] = (int)task_data->reserved1; - data["reserved2"] = (int)task_data->reserved2; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["business_type"] = (int)(task_data->business_type); - delete task->task_data; - } - - this->onQueryTradeByPage(data, task->addtional_int_two, task->addtional_int_three, task->addtional_int_four, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryPosition(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryStkPositionRsp *task_data = (XTPQueryStkPositionRsp*)task->task_data; - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["market"] = int(task_data->market); //ֶ޸ - data["total_qty"] = task_data->total_qty; - data["sellable_qty"] = task_data->sellable_qty; - data["avg_price"] = task_data->avg_price; - data["unrealized_pnl"] = task_data->unrealized_pnl; - data["yesterday_position"] = task_data->yesterday_position; - data["purchase_redeemable_qty"] = task_data->purchase_redeemable_qty; - - data["position_direction"] = (int)task_data->position_direction; - data["position_security_type"] = (int)task_data->position_security_type; - data["executable_option"] = task_data->executable_option; - data["lockable_position"] = task_data->lockable_position; - data["executable_underlying"] = task_data->executable_underlying; - data["locked_position"] = task_data->locked_position; - data["usable_locked_position"] = task_data->usable_locked_position; - - data["profit_price"] = task_data->profit_price; - data["buy_cost"] = task_data->buy_cost; - data["profit_cost"] = task_data->profit_cost; - data["market_value"] = task_data->market_value; - - data["margin"] = task_data->margin; - data["last_buy_cost"] = task_data->last_buy_cost; - data["last_profit_cost"] = task_data->last_profit_cost; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryPosition(data, error, task->task_id, task->task_last, task->addtional_int); - - delete task; -}; - -void TraderApi::processQueryAsset(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryAssetRsp *task_data = (XTPQueryAssetRsp*)task->task_data; - - data["total_asset"] = task_data->total_asset; - data["buying_power"] = task_data->buying_power; - data["security_asset"] = task_data->security_asset; - data["fund_buy_amount"] = task_data->fund_buy_amount; - data["fund_buy_fee"] = task_data->fund_buy_fee; - data["fund_sell_amount"] = task_data->fund_sell_amount; - data["fund_sell_fee"] = task_data->fund_sell_fee; - data["withholding_amount"] = task_data->withholding_amount; - data["account_type"] = (int)task_data->account_type; - - data["frozen_margin"] = task_data->frozen_margin; - data["frozen_exec_cash"] = task_data->frozen_exec_cash; - data["frozen_exec_fee"] = task_data->frozen_exec_fee; - data["pay_later"] = task_data->pay_later; - data["preadva_pay"] = task_data->preadva_pay; - data["orig_banlance"] = task_data->orig_banlance; - data["banlance"] = task_data->banlance; - data["deposit_withdraw"] = task_data->deposit_withdraw; - data["trade_netting"] = task_data->trade_netting; - data["captial_asset"] = task_data->captial_asset; - data["force_freeze_amount"] = task_data->force_freeze_amount; - data["preferred_amount"] = task_data->preferred_amount; - - data["repay_stock_aval_banlance"] = task_data->repay_stock_aval_banlance; - data["fund_order_data_charges"] = task_data->fund_order_data_charges; - data["fund_cancel_data_charges"] = task_data->fund_cancel_data_charges; - data["exchange_cur_risk_degree"] = task_data->exchange_cur_risk_degree; - data["company_cur_risk_degree"] = task_data->company_cur_risk_degree; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryAsset(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryStructuredFund(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPStructuredFundInfo *task_data = (XTPStructuredFundInfo*)task->task_data; - data["exchange_id"] = (int)task_data->exchange_id; - data["sf_ticker"] = addEndingChar(task_data->sf_ticker); - data["sf_ticker_name"] = addEndingChar(task_data->sf_ticker_name); - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["split_merge_status"] = (int)task_data->split_merge_status; - data["ratio"] = task_data->ratio; - data["min_split_qty"] = task_data->min_split_qty; - data["min_merge_qty"] = task_data->min_merge_qty; - data["net_price"] = task_data->net_price; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryStructuredFund(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryFundTransfer(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPFundTransferNotice *task_data = (XTPFundTransferNotice*)task->task_data; - data["serial_id"] = task_data->serial_id; - data["transfer_type"] = (int)task_data->transfer_type; - data["amount"] = task_data->amount; - data["oper_status"] = (int)task_data->oper_status; - data["transfer_time"] = task_data->transfer_time; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryFundTransfer(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processFundTransfer(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPFundTransferNotice *task_data = (XTPFundTransferNotice*)task->task_data; - data["serial_id"] = task_data->serial_id; - data["transfer_type"] = (int)task_data->transfer_type; - data["amount"] = task_data->amount; - data["oper_status"] = (int)task_data->oper_status; - data["transfer_time"] = task_data->transfer_time; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onFundTransfer(data, error, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryETF(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryETFBaseRsp *task_data = (XTPQueryETFBaseRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["etf"] = addEndingChar(task_data->etf); - data["subscribe_redemption_ticker"] = addEndingChar(task_data->subscribe_redemption_ticker); - data["unit"] = task_data->unit; - data["subscribe_status"] = task_data->subscribe_status; - data["redemption_status"] = task_data->redemption_status; - data["max_cash_ratio"] = task_data->max_cash_ratio; - data["estimate_amount"] = task_data->estimate_amount; - data["cash_component"] = task_data->cash_component; - data["net_value"] = task_data->net_value; - data["total_amount"] = task_data->total_amount; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryETF(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryETFBasket(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryETFComponentRsp *task_data = (XTPQueryETFComponentRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["component_ticker"] = addEndingChar(task_data->component_ticker); - data["component_name"] = addEndingChar(task_data->component_name); - data["quantity"] = task_data->quantity; - data["component_market"] = (int)task_data->component_market; - data["replace_type"] = (int)task_data->replace_type; - data["premium_ratio"] = task_data->premium_ratio; - data["amount"] = task_data->amount; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryETFBasket(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryIPOInfoList(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryIPOTickerRsp *task_data = (XTPQueryIPOTickerRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["ticker_type"] = int(task_data->ticker_type); - data["price"] = task_data->price; - data["unit"] = task_data->unit; - data["qty_upper_limit"] = task_data->qty_upper_limit; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryIPOInfoList(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryIPOQuotaInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryIPOQuotaRsp *task_data = (XTPQueryIPOQuotaRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["tech_quantity"] = (int)task_data->tech_quantity; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryIPOQuotaInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - -void TraderApi::processQueryBondIPOInfoList(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryIPOTickerRsp *task_data = (XTPQueryIPOTickerRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["ticker_name"] = addEndingChar(task_data->ticker_name); - data["ticker_type"] = (int)task_data->ticker_type; - data["price"] = task_data->price; - data["unit"] = task_data->unit; - data["qty_upper_limit"] = task_data->qty_upper_limit; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryBondIPOInfoList(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryBondSwapStockInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryBondSwapStockRsp *task_data = (XTPQueryBondSwapStockRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["underlying_ticker"] = addEndingChar(task_data->underlying_ticker); - data["unit"] = task_data->unit; - data["qty_min"] = task_data->qty_min; - data["qty_max"] = task_data->qty_max; - data["swap_price"] = task_data->swap_price; - data["swap_flag"] = task_data->swap_flag; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryBondSwapStockInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = addEndingChar(task_data->ticker); - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = addEndingChar(task_data->symbol); - data["contract_id"] = addEndingChar(task_data->contract_id); - data["underlying_security_id"] = addEndingChar(task_data->underlying_security_id); - data["underlying_security_id_source"] = (int)task_data->underlying_security_id_source; - - data["list_date"] = task_data->list_date; - data["last_trade_date"] = task_data->last_trade_date; - data["ticker_type"] = (int)task_data->ticker_type; - data["day_trading"] = task_data->day_trading; - - data["call_or_put"] = (int)task_data->call_or_put; - data["delivery_day"] = task_data->delivery_day; - data["delivery_month"] = task_data->delivery_month; - - data["exercise_type"] = (int)task_data->exercise_type; - data["exercise_begin_date"] = task_data->exercise_begin_date; - data["exercise_end_date"] = task_data->exercise_end_date; - data["exercise_price"] = task_data->exercise_price; - - data["qty_unit"] = task_data->qty_unit; - data["contract_unit"] = task_data->contract_unit; - data["contract_position"] = task_data->contract_position; - - data["prev_close_price"] = task_data->prev_close_price; - data["prev_clearing_price"] = task_data->prev_clearing_price; - - data["lmt_buy_max_qty"] = task_data->lmt_buy_max_qty; - data["lmt_buy_min_qty"] = task_data->lmt_buy_min_qty; - data["lmt_sell_max_qty"] = task_data->lmt_sell_max_qty; - data["lmt_sell_min_qty"] = task_data->lmt_sell_min_qty; - data["mkt_buy_max_qty"] = task_data->mkt_buy_max_qty; - data["mkt_buy_min_qty"] = task_data->mkt_buy_min_qty; - data["mkt_sell_max_qty"] = task_data->mkt_sell_max_qty; - data["mkt_sell_min_qty"] = task_data->mkt_sell_min_qty; - - data["price_tick"] = task_data->price_tick; - data["upper_limit_price"] = task_data->upper_limit_price; - data["lower_limit_price"] = task_data->lower_limit_price; - data["sell_margin"] = task_data->sell_margin; - data["margin_ratio_param1"] = task_data->margin_ratio_param1; - data["margin_ratio_param2"] = task_data->margin_ratio_param2; - - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionAuctionInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -}; - - -void TraderApi::processCreditCashRepay(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdCashRepayRsp *task_data = (XTPCrdCashRepayRsp*)task->task_data; - data["xtp_id"] = task_data->xtp_id; - data["request_amount"] = task_data->request_amount; - data["cash_repay_amount"] = task_data->cash_repay_amount; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onCreditCashRepay(data, error, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditCashRepayInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdCashRepayInfo *task_data = (XTPCrdCashRepayInfo*)task->task_data; - data["xtp_id"] = task_data->xtp_id; - data["status"] = (int)task_data->status; - data["request_amount"] = task_data->request_amount; - data["cash_repay_amount"] = task_data->cash_repay_amount; - data["position_effect"] = (int)task_data->position_effect; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditCashRepayInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditFundInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdFundInfo *task_data = (XTPCrdFundInfo*)task->task_data; - data["maintenance_ratio"] = task_data->maintenance_ratio; - data["all_asset"] = task_data->all_asset; - data["all_debt"] = task_data->all_debt; - data["line_of_credit"] = task_data->line_of_credit; - data["guaranty"] = task_data->guaranty; - data["reserved"] = task_data->reserved; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditFundInfo(data, error, task->task_id, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditDebtInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdDebtInfo *task_data = (XTPCrdDebtInfo*)task->task_data; - data["debt_type"] = task_data->debt_type; - data["debt_id"] = addEndingChar(task_data->debt_id); - data["position_id"] = task_data->position_id; - data["order_xtp_id"] = task_data->order_xtp_id; - data["debt_status"] = task_data->debt_status; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["order_date"] = task_data->order_date; - data["end_date"] = task_data->end_date; - data["orig_end_date"] = task_data->orig_end_date; - data["is_extended"] = task_data->is_extended; - data["remain_amt"] = task_data->remain_amt; - data["remain_qty"] = task_data->remain_qty; - data["remain_principal"] = task_data->remain_principal; - data["due_right_qty"] = task_data->due_right_qty; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditDebtInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditTickerDebtInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdDebtStockInfo *task_data = (XTPCrdDebtStockInfo*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["stock_repay_quantity"] = task_data->stock_repay_quantity; - data["stock_total_quantity"] = task_data->stock_total_quantity; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditTickerDebtInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditAssetDebtInfo(Task *task) { - PyLock lock; - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditAssetDebtInfo(task->remain_amount, error, task->task_id, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditTickerAssignInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPClientQueryCrdPositionStkInfo *task_data = (XTPClientQueryCrdPositionStkInfo*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["limit_qty"] = task_data->limit_qty; - data["yesterday_qty"] = task_data->yesterday_qty; - data["left_qty"] = task_data->left_qty; - data["frozen_qty"] = task_data->frozen_qty; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditTickerAssignInfo(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditExcessStock(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPClientQueryCrdSurplusStkRspInfo *task_data = (XTPClientQueryCrdSurplusStkRspInfo*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["transferable_quantity"] = task_data->transferable_quantity; - data["transferred_quantity"] = task_data->transferred_quantity; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditExcessStock(data, error, task->task_id, task->addtional_int); - delete task; -} - - -void TraderApi::processQueryMulCreditExcessStock(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPClientQueryCrdSurplusStkRspInfo *task_data = (XTPClientQueryCrdSurplusStkRspInfo*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["transferable_quantity"] = task_data->transferable_quantity; - data["transferred_quantity"] = task_data->transferred_quantity; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryMulCreditExcessStock(data, error, task->task_id, task->addtional_int, task->task_last); - delete task; -} - -void TraderApi::processCreditExtendDebtDate(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCreditDebtExtendNotice *task_data = (XTPCreditDebtExtendNotice*)task->task_data; - data["xtpid"] = task_data->xtpid; - data["debt_id"] = addEndingChar(task_data->debt_id); - data["oper_status"] = (int)task_data->oper_status; - data["oper_time"] = task_data->oper_time; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onCreditExtendDebtDate(data, error, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditExtendDebtDateOrders(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCreditDebtExtendNotice *task_data = (XTPCreditDebtExtendNotice*)task->task_data; - data["xtpid"] = task_data->xtpid; - data["debt_id"] = addEndingChar(task_data->debt_id); - data["oper_status"] = (int)task_data->oper_status; - data["oper_time"] = task_data->oper_time; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditExtendDebtDateOrders(data, error,task->task_id,task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditFundExtraInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdFundExtraInfo *task_data = (XTPCrdFundExtraInfo*)task->task_data; - data["mf_rs_avl_used"] = task_data->mf_rs_avl_used; - data["security_capital"] = task_data->security_capital; - data["financing_debts"] = task_data->financing_debts; - data["short_sell_debts"] = task_data->short_sell_debts; - data["contract_debts_load"] = task_data->contract_debts_load; - data["reserve"] = addEndingChar(task_data->reserve); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditFundExtraInfo(data, error,task->task_id, task->addtional_int); - delete task; -} - -void TraderApi::processQueryCreditPositionExtraInfo(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdPositionExtraInfo *task_data = (XTPCrdPositionExtraInfo*)task->task_data; - data["market"] = (int)task_data->market; - data["ticker"] = addEndingChar(task_data->ticker); - data["mf_rs_avl_used"] = task_data->mf_rs_avl_used; - data["reserve"] = addEndingChar(task_data->reserve); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryCreditPositionExtraInfo(data, error,task->task_id,task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processCreditCashRepayDebtInterestFee(Task *task) { - PyLock lock; - dict data; - if (task->task_data) - { - XTPCrdCashRepayDebtInterestFeeRsp *task_data = (XTPCrdCashRepayDebtInterestFeeRsp*)task->task_data; - data["xtp_id"] = task_data->xtp_id; - data["request_amount"] = task_data->request_amount; - data["cash_repay_amount"] = task_data->cash_repay_amount; - data["debt_compact_id"] = addEndingChar(task_data->debt_compact_id); - data["unknow"] = addEndingChar(task_data->unknow); - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onCreditCashRepayDebtInterestFee(data, error, task->addtional_int); - delete task; -} - - - -void TraderApi::processOptionCombinedOrderEvent(Task *task) { - PyLock lock; - dict data; - - if (task->task_data){ - XTPOptCombOrderInfo *task_data = (XTPOptCombOrderInfo*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["update_time"] = task_data->update_time; - data["cancel_time"] = task_data->cancel_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = task_data->order_local_id; - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - } - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onOptionCombinedOrderEvent(data, error,task->addtional_int); - delete task; -} - -void TraderApi::processOptionCombinedTradeEvent(Task *task) { - PyLock lock; - - dict data; - if (task->task_data){ - XTPOptCombTradeReport *task_data = (XTPOptCombTradeReport*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["market"] = (int)task_data->market; - data["local_order_id"] = task_data->local_order_id; - data["exec_id"] = task_data->exec_id; - data["quantity"] = task_data->quantity; - data["trade_time"] = task_data->trade_time; - data["trade_amount"] = task_data->trade_amount; - data["report_index"] = task_data->report_index; - data["order_exch_id"] = task_data->order_exch_id; - data["trade_type"] = task_data->trade_type; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["branch_pbu"] = task_data->branch_pbu; - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - } - - this->onOptionCombinedTradeEvent(data,task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionCombinedOrders(Task *task) { - PyLock lock; - - dict data; - if (task->task_data){ - XTPQueryOptCombOrderRsp *task_data = (XTPQueryOptCombOrderRsp*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["update_time"] = task_data->update_time; - data["cancel_time"] = task_data->cancel_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = task_data->order_local_id; - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] =(int) task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - } - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionCombinedOrders(data, error, task->task_id, task->task_last,task->addtional_int); - delete task; -} - - -void TraderApi::processQueryOptionCombinedOrdersEx(Task *task) -{ - PyLock lock; - - dict data; - if (task->task_data) - { - XTPOptCombOrderInfoEx *task_data = (XTPOptCombOrderInfoEx*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["update_time"] = task_data->update_time; - data["cancel_time"] = task_data->cancel_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = task_data->order_local_id; - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["order_exch_id"] = task_data->order_exch_id; - data["error_id"] = task_data->order_err_t.error_id; - data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - - boost::python::list leg_detail_list; - for (int i = 0; i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - this->onQueryOptionCombinedOrdersEx(data, error, task->task_id, task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionCombinedOrdersByPage(Task *task) { - PyLock lock; - - dict data; - if (task->task_data){ - XTPQueryOptCombOrderRsp *task_data = (XTPQueryOptCombOrderRsp*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["update_time"] = task_data->update_time; - data["cancel_time"] = task_data->cancel_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = task_data->order_local_id; - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - - } - - this->onQueryOptionCombinedOrdersByPage(data, task->req_count, task->order_sequence, task->query_reference, task->task_id, task->task_last,task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionCombinedOrdersByPageEx(Task *task) -{ - PyLock lock; - - dict data; - - if (task->task_data) - { - XTPOptCombOrderInfoEx *task_data = (XTPOptCombOrderInfoEx*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["order_cancel_client_id"] = task_data->order_cancel_client_id; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["market"] = (int)task_data->market; - data["quantity"] = task_data->quantity; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["qty_traded"] = task_data->qty_traded; - data["qty_left"] = task_data->qty_left; - data["insert_time"] = task_data->insert_time; - data["update_time"] = task_data->update_time; - data["cancel_time"] = task_data->cancel_time; - data["trade_amount"] = task_data->trade_amount; - data["order_local_id"] = task_data->order_local_id; - data["order_status"] = (int)task_data->order_status; - data["order_submit_status"] = (int)task_data->order_submit_status; - data["order_type"] = task_data->order_type; - data["order_exch_id"] = task_data->order_exch_id; - data["error_id"] = task_data->order_err_t.error_id; - data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - - boost::python::list leg_detail_list; - for (int i = 0; i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - delete task->task_data; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionCombinedOrdersByPageEx(data, task->req_count, task->order_sequence, task->query_reference, task->task_id, task->task_last, task->addtional_int); - delete task; - -} - -void TraderApi::processQueryOptionCombinedTrades(Task *task) { - PyLock lock; - - dict data; - if (task->task_data){ - XTPQueryOptCombTradeRsp *task_data = (XTPQueryOptCombTradeRsp*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["market"] = (int)task_data->market; - data["local_order_id"] = task_data->local_order_id; - data["exec_id"] = task_data->exec_id; - data["quantity"] = task_data->quantity; - data["trade_time"] = task_data->trade_time; - data["trade_amount"] = task_data->trade_amount; - data["report_index"] = task_data->report_index; - data["order_exch_id"] = task_data->order_exch_id; - data["trade_type"] = task_data->trade_type; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["branch_pbu"] = task_data->branch_pbu; - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - } - - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionCombinedTrades(data, error, task->task_id, task->task_last,task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionCombinedTradesByPage(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPQueryOptCombTradeRsp *task_data = (XTPQueryOptCombTradeRsp*)task->task_data; - data["order_xtp_id"] = task_data->order_xtp_id; - data["order_client_id"] = task_data->order_client_id; - data["market"] = (int)task_data->market; - data["local_order_id"] = task_data->local_order_id; - data["exec_id"] = task_data->exec_id; - data["quantity"] = task_data->quantity; - data["trade_time"] = task_data->trade_time; - data["trade_amount"] = task_data->trade_amount; - data["report_index"] = task_data->report_index; - data["order_exch_id"] = task_data->order_exch_id; - data["trade_type"] = task_data->trade_type; - data["side"] = (int)task_data->side; - data["business_type"] = (int)task_data->business_type; - data["branch_pbu"] = task_data->branch_pbu; - data["strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - } - - - this->onQueryOptionCombinedTradesByPage(data, task->req_count, task->trade_sequence, task->query_reference, task->task_id, task->task_last,task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionCombinedPosition(Task *task) { - PyLock lock; - - dict data; - if (task->task_data){ - XTPQueryOptCombPositionRsp *task_data = (XTPQueryOptCombPositionRsp*)task->task_data; - data["strategy_id"] = task_data->strategy_id; - data["strategy_name"] = addEndingChar(task_data->strategy_name); - data["market"] = (int)task_data->market; - data["total_qty"] = task_data->total_qty; - data["available_qty"] = task_data->available_qty; - data["yesterday_position"] = task_data->yesterday_position; - data["comb_strategy_id"] = task_data->opt_comb_info.strategy_id; - data["comb_num"] = task_data->opt_comb_info.comb_num; - data["num_legs"] = task_data->opt_comb_info.num_legs; - boost::python::list leg_detail_list; - for (int i = 0;i < XTP_STRATEGE_LEG_NUM; i++) - { - dict leg_detail_dict; - leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; - leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; - leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; - leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; - leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; - leg_detail_list.append(leg_detail_dict); - } - data["leg_detail"] = leg_detail_list; - data["secu_comb_margin"] = task_data->secu_comb_margin; - } - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionCombinedPosition(data, error, task->task_id, task->task_last,task->addtional_int); - delete task; -} - -void TraderApi::processQueryOptionCombinedStrategyInfo(Task *task) { - PyLock lock; - - dict data; - if (task->task_data){ - - XTPQueryCombineStrategyInfoRsp *task_data = (XTPQueryCombineStrategyInfoRsp*)task->task_data; - //printf("task_data->strategy_id:%s,strategy_name:%s\n",task_data->strategy_id,task_data->strategy_name); - data["strategy_id"] = addEndingChar(task_data->strategy_id); - //char strategy_name[64] = {"\0"}; - //printf("sizeof(task_data->strategy_name):%d",sizeof(task_data->strategy_name)); - //strcpy(strategy_name, task_data->strategy_name); - //printf("task_data->strategy_name:%s",strategy_name); - //string strategy_name = addEndingChar(task_data->strategy_name); - //printf("value:%s\n", task_data->strategy_name); - //if (string(task_data->strategy_id) == "ZBD") - // return; - - data["strategy_name"] = addEndingChar(task_data->strategy_name); - data["market"] = (int)task_data->market; - data["leg_num"] = task_data->leg_num; - boost::python::list leg_strategy_list; - - for (int i = 0;i < XTP_STRATEGE_LEG_NUM; i++) - { - dict leg_strategy_dict; - leg_strategy_dict["call_or_put"] = (int)task_data->leg_strategy[i].call_or_put; - leg_strategy_dict["position_side"] = (int)task_data->leg_strategy[i].position_side; - char price_seq = task_data->leg_strategy[i].exercise_price_seq; - leg_strategy_dict["exercise_price_seq"] = price_seq; - leg_strategy_dict["expire_date_seq"] = task_data->leg_strategy[i].expire_date_seq; - leg_strategy_dict["leg_qty"] = task_data->leg_strategy[i].leg_qty; - leg_strategy_list.append(leg_strategy_dict); - } - - data["leg_strategy"] = leg_strategy_list; - data["expire_date_type"] = (int)task_data->expire_date_type; - data["underlying_type"] = (int)task_data->underlying_type; - data["auto_sep_type"] = (int)task_data->auto_sep_type; - } - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionCombinedStrategyInfo(data, error, task->task_id, task->task_last,task->addtional_int); - delete task; -} - - -void TraderApi::processCancelOptionCombinedOrderError(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPOptCombOrderCancelInfo *task_data = (XTPOptCombOrderCancelInfo*)task->task_data; - data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; - data["order_xtp_id"] = task_data->order_xtp_id; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onCancelOptionCombinedOrderError(data, error,task->addtional_int); - delete task; -} - - -void TraderApi::processQueryOptionCombinedExecPosition(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPQueryOptCombExecPosRsp *task_data = (XTPQueryOptCombExecPosRsp*)task->task_data; - data["market"] = (int)task_data->market; - data["cntrt_code_1"] = addEndingChar(task_data->cntrt_code_1); - data["cntrt_name_1"] = addEndingChar(task_data->cntrt_name_1); - data["position_side_1"] = (int)task_data->position_side_1; - data["call_or_put_1"] = (int)task_data->call_or_put_1; - data["avl_qty_1"] = task_data->avl_qty_1; - data["orig_own_qty_1"] = task_data->orig_own_qty_1; - data["own_qty_1"] = task_data->own_qty_1; - - data["cntrt_code_2"] = addEndingChar(task_data->cntrt_code_2); - data["cntrt_name_2"] = addEndingChar(task_data->cntrt_name_2); - data["position_side_2"] = (int)task_data->position_side_2; - data["call_or_put_2"] = (int)task_data->call_or_put_2; - data["avl_qty_2"] = task_data->avl_qty_2; - data["orig_own_qty_2"] = task_data->orig_own_qty_2; - data["own_qty_2"] = task_data->own_qty_2; - - data["net_qty"] = task_data->net_qty; - data["order_qty"] = task_data->order_qty; - data["confirm_qty"] = task_data->confirm_qty; - data["avl_qty"] = task_data->avl_qty; - //data["reserved"] = task_data->reserved; - } - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOptionCombinedExecPosition(data, error,task->task_id, task->task_last,task->addtional_int); - delete task; -} - -void TraderApi::processQueryOtherServerFund(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPFundQueryRsp *task_data = (XTPFundQueryRsp*)task->task_data; - data["amount"] = task_data->amount; - data["query_type"] = (int)task_data->query_type; - } - - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onQueryOtherServerFund(data, error,task->task_id,task->addtional_int); - delete task; -} - - -//////////algo///////// -void TraderApi::processQueryStrategy(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_state; - data["m_client_strategy_id"] = task_data->m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; - - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - this->onQueryStrategy(data,task->strategy_param, error,task->task_id,task->task_last,task->addtional_int); - delete task; -} - - -void TraderApi::processStrategyStateReport(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPStrategyStateReportStruct *task_data = (XTPStrategyStateReportStruct*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_info.m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_info.m_strategy_state; - data["m_client_strategy_id"] = task_data->m_strategy_info.m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_strategy_info.m_xtp_strategy_id; - - data["m_strategy_qty"] = task_data->m_strategy_qty; - data["m_strategy_ordered_qty"] = task_data->m_strategy_ordered_qty; - data["m_strategy_cancelled_qty"] = task_data->m_strategy_cancelled_qty; - data["m_strategy_execution_qty"] = task_data->m_strategy_execution_qty; - data["m_strategy_unclosed_qty"] = task_data->m_strategy_unclosed_qty; - data["m_strategy_asset"] = task_data->m_strategy_asset; - data["m_strategy_ordered_asset"] = task_data->m_strategy_ordered_asset; - data["m_strategy_execution_asset"] = task_data->m_strategy_execution_asset; - data["m_strategy_execution_price"] = task_data->m_strategy_execution_price; - data["m_strategy_market_price"] = task_data->m_strategy_market_price; - data["m_strategy_price_diff"] = task_data->m_strategy_price_diff; - data["m_strategy_asset_diff"] = task_data->m_strategy_asset_diff; - - data["error_id"] = task_data->m_error_info.error_id; - data["error_msg"] = addEndingChar(task_data->m_error_info.error_msg); - } - - - this->onStrategyStateReport(data,task->addtional_int); - delete task; -} - -void TraderApi::processALGOUserEstablishChannel(Task *task) { - PyLock lock; - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onALGOUserEstablishChannel(task->user, error,task->addtional_int); - delete task; -} - -void TraderApi::processInsertAlgoOrder(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_state; - data["m_client_strategy_id"] = task_data->m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; - - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onInsertAlgoOrder(data, error,task->addtional_int); - delete task; -} - -void TraderApi::processCancelAlgoOrder(Task *task) { - PyLock lock; - dict data; - if (task->task_data){ - XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_state; - data["m_client_strategy_id"] = task_data->m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; - - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onCancelAlgoOrder(data, error,task->addtional_int); - delete task; -} - -void TraderApi::processAlgoDisconnected(Task *task) { - PyLock lock; - - this->onAlgoDisconnected(task->reason); - delete task; -} - -void TraderApi::processAlgoConnected(Task *task) { - PyLock lock; - - this->onAlgoConnected(); - delete task; -} - -void TraderApi::processStrategySymbolStateReport(Task *task) -{ - PyLock lock; - - dict data; - if (task->task_data) - { - XTPStrategySymbolStateReport *task_data = (XTPStrategySymbolStateReport*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_info.m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_info.m_strategy_state; - data["m_client_strategy_id"] = task_data->m_strategy_info.m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_strategy_info.m_xtp_strategy_id; - data["m_ticker"] = addEndingChar(task_data->m_ticker); - data["m_market"] = (int)task_data->m_market; - data["m_side"] = (int)task_data->m_side; - data["m_strategy_qty"] = task_data->m_strategy_qty; - data["m_strategy_ordered_qty"] = task_data->m_strategy_ordered_qty; - data["m_strategy_cancelled_qty"] = task_data->m_strategy_cancelled_qty; - data["m_strategy_execution_qty"] = task_data->m_strategy_execution_qty; - data["m_strategy_buy_qty"] = task_data->m_strategy_buy_qty; - data["m_strategy_sell_qty"] = task_data->m_strategy_sell_qty; - data["m_strategy_unclosed_qty"] = task_data->m_strategy_unclosed_qty; - data["m_strategy_asset"] = task_data->m_strategy_asset; - data["m_strategy_ordered_asset"] = task_data->m_strategy_ordered_asset; - data["m_strategy_execution_asset"] = task_data->m_strategy_execution_asset; - data["m_strategy_buy_asset"] = task_data->m_strategy_buy_asset; - data["m_strategy_sell_asset"] = task_data->m_strategy_sell_asset; - data["m_strategy_unclosed_asset"] = task_data->m_strategy_unclosed_asset; - data["m_strategy_asset_diff"] = task_data->m_strategy_asset_diff; - data["m_strategy_execution_price"] = task_data->m_strategy_execution_price; - data["m_strategy_market_price"] = task_data->m_strategy_market_price; - data["m_strategy_price_diff"] = task_data->m_strategy_price_diff; - data["error_id"] = task_data->m_error_info.error_id; - data["error_msg"] = addEndingChar(task_data->m_error_info.error_msg); - - delete task->task_data; - } - this->onStrategySymbolStateReport(data, task->addtional_int); - delete task; -} - -void TraderApi::processNewStrategyCreateReport(Task *task) -{ - PyLock lock; - - dict data; - if (task->task_data) - { - XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_state; - data["m_client_strategy_id"] = task_data->m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; - } - - this->onNewStrategyCreateReport(data, task->strategy_param, task->addtional_int); - delete task; -} - -void TraderApi::processStrategyRecommendation(Task *task) -{ - PyLock lock; - - dict data; - if (task->task_data) - { - XTPStrategyRecommendationInfo *task_data = (XTPStrategyRecommendationInfo*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_type; - data["m_market"] = (int)task_data->m_market; - data["m_ticker"] = addEndingChar(task_data->m_ticker); - data["m_reserved"] = addEndingChar(task_data->m_reserved); - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onStrategyRecommendation(task->addtional_bool, data, task->strategy_param, error, task->task_id,task->task_last, task->addtional_int); - delete task; -} - -void TraderApi::processModifyAlgoOrder(Task *task) -{ - PyLock lock; - - dict data; - if (task->task_data) - { - XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; - data["m_strategy_type"] = task_data->m_strategy_type; - data["m_strategy_state"] = (int)task_data->m_strategy_state; - data["m_client_strategy_id"] = task_data->m_client_strategy_id; - data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; - } - - dict error; - if (task->task_error) - { - XTPRI *task_error = (XTPRI*)task->task_error; - error["error_id"] = task_error->error_id; - error["error_msg"] = addEndingChar(task_error->error_msg); - delete task->task_error; - } - - this->onModifyAlgoOrder(data, error, task->addtional_int); - delete task; -} - -///------------------------------------------------------------------------------------- -/// -///------------------------------------------------------------------------------------- - -void TraderApi::createTraderApi(uint8_t clientid, string path, int log_level) -{ - this->api = XTP::API::TraderApi::CreateTraderApi(clientid, path.c_str(),(XTP_LOG_LEVEL)log_level); - this->api->RegisterSpi(this); -}; - -void TraderApi::release() -{ - this->api->Release(); -}; - -int TraderApi::exit() -{ - //úԭAPIûУڰȫ˳APIãԭjoinƺ̫ȶ - this->api->RegisterSpi(NULL); - this->api->Release(); - this->api = NULL; - return 1; -}; - -string TraderApi::getTradingDay() -{ - string ret =""; - const char* p = this->api->GetTradingDay(); - if (p == NULL) - ret = "NULL"; - else - ret = p; - return ret; -}; - -dict TraderApi::getApiLastError() -{ - dict d; - XTPRI *error = this->api->GetApiLastError(); - if(error == NULL) - return d; - - d["error_id"] = error->error_id; - d["error_msg"] = addEndingChar(error->error_msg); - - return d; -} - -string TraderApi::getApiVersion() -{ - string ret =""; - const char* p = this->api->GetApiVersion(); - if (p == NULL) - ret = "NULL"; - else - ret = p; - return ret; -} - -uint8_t TraderApi::getClientIDByXTPID(uint64_t orderid) -{ - return this->api->GetClientIDByXTPID(orderid); -} - -string TraderApi::getAccountByXTPID(uint64_t orderid) -{ - string ret =""; - const char* p = this->api->GetAccountByXTPID(orderid); - if (p == NULL) - ret = "NULL"; - else - ret = p; - - return ret; -} - -void TraderApi::subscribePublicTopic(int type) -{ - this->api->SubscribePublicTopic((XTP_TE_RESUME_TYPE)type); -} - -void TraderApi::setSoftwareKey(string key) -{ - this->api->SetSoftwareKey(key.c_str()); -} - -void TraderApi::setSoftwareVersion(string version) -{ - this->api->SetSoftwareVersion(version.c_str()); -} - -void TraderApi::setHeartBeatInterval(uint32_t interval) -{ - this->api->SetHeartBeatInterval(interval); -}; - -uint64_t TraderApi::login(string ip, int port, string user, string password, int socktype,string local_ip) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype,local_ip.c_str()); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - -int TraderApi::modifyUserTerminalInfo(dict info, uint64_t session_id) -{ - XTPUserTerminalInfoReq myreq = XTPUserTerminalInfoReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(info, "local_ip", myreq.local_ip); - getStr(info, "mac_addr", myreq.mac_addr); - getStr(info, "hd", myreq.hd); - - int term_type; - getInt(info, "term_type", &term_type); - getStr(info, "internet_ip", myreq.internet_ip); - getInt(info, "internet_port", &myreq.internet_port); - getStr(info, "client_version", myreq.client_version); - getStr(info, "macos_sno", myreq.macos_sno); - getStr(info, "unused", myreq.unused); - - myreq.term_type = (XTPTerminalType)term_type; - - return this->api->ModifyUserTerminalInfo(&myreq, session_id); - -} - -int TraderApi::queryAccountTradeMarket(uint64_t session_id, int request_id) -{ - return this->api->QueryAccountTradeMarket(session_id, request_id); -} - -uint64_t TraderApi::getANewOrderXTPID(uint64_t session_id) -{ - return this->api->GetANewOrderXTPID(session_id); -} - - -uint64_t TraderApi::insertOrder(dict req, uint64_t sessionid) -{ - XTPOrderInsertInfo myreq = XTPOrderInsertInfo(); - memset(&myreq, 0, sizeof(myreq)); - getDouble(req, "stop_price", &myreq.stop_price); - getDouble(req, "price", &myreq.price); - getStr(req, "ticker", myreq.ticker); - - getUint32(req, "order_client_id", &myreq.order_client_id); - getUint64(req, "order_xtp_id", &myreq.order_xtp_id); - getInt64(req, "quantity", &myreq.quantity); - - int price_type; - int side; - int position_effect; - int reserved1; - int reserved2; - int market; - int business_type; - getInt(req, "price_type", &price_type); - getInt(req, "side", &side); - getInt(req, "position_effect", &position_effect); - getInt(req, "reserved1", &reserved1); - getInt(req, "reserved2", &reserved2); - getInt(req, "market", &market); - getInt(req, "business_type", &business_type); - myreq.price_type = (XTP_PRICE_TYPE)price_type; - myreq.side = (XTP_SIDE_TYPE)side; - myreq.position_effect = (XTP_POSITION_EFFECT_TYPE)position_effect; - myreq.reserved1 = reserved1; - myreq.reserved2 = reserved2; - myreq.market = (XTP_MARKET_TYPE)market; - myreq.business_type = (XTP_BUSINESS_TYPE)business_type; - - return this->api->InsertOrder(&myreq, sessionid); -}; - -uint64_t TraderApi::insertOrderExtra(dict req, uint64_t session_id) -{ - XTPOrderInsertInfo myreq = XTPOrderInsertInfo(); - memset(&myreq, 0, sizeof(myreq)); - getDouble(req, "stop_price", &myreq.stop_price); - getDouble(req, "price", &myreq.price); - getStr(req, "ticker", myreq.ticker); - - getUint32(req, "order_client_id", &myreq.order_client_id); - getUint64(req, "order_xtp_id", &myreq.order_xtp_id); - getInt64(req, "quantity", &myreq.quantity); - - int price_type; - int side; - int position_effect; - int reserved1; - int reserved2; - int market; - int business_type; - getInt(req, "price_type", &price_type); - getInt(req, "side", &side); - getInt(req, "position_effect", &position_effect); - getInt(req, "reserved1", &reserved1); - getInt(req, "reserved2", &reserved2); - getInt(req, "market", &market); - getInt(req, "business_type", &business_type); - myreq.price_type = (XTP_PRICE_TYPE)price_type; - myreq.side = (XTP_SIDE_TYPE)side; - myreq.position_effect = (XTP_POSITION_EFFECT_TYPE)position_effect; - myreq.reserved1 = reserved1; - myreq.reserved2 = reserved2; - myreq.market = (XTP_MARKET_TYPE)market; - myreq.business_type = (XTP_BUSINESS_TYPE)business_type; - - return this->api->InsertOrderExtra(&myreq, session_id); -} - -uint64_t TraderApi::cancelOrder(uint64_t orderid, uint64_t sessionid) -{ - return this->api->CancelOrder(orderid, sessionid); -} - -int TraderApi::queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid) -{ - return this->api->QueryOrderByXTPID(orderid, sessionid, reqid); -}; - -int TraderApi::queryOrderByXTPIDEx(uint64_t orderid, uint64_t sessionid, int reqid) -{ - return this->api->QueryOrderByXTPIDEx(orderid, sessionid, reqid); -} - -int TraderApi::queryOrders(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryOrderReq myreq = XTPQueryOrderReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - getInt64(req, "end_time", &myreq.end_time); - getInt64(req, "begin_time", &myreq.begin_time); - return this->api->QueryOrders(&myreq, sessionid, reqid); -}; - -int TraderApi::queryOrdersEx(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryOrderReq myreq = XTPQueryOrderReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - getInt64(req, "end_time", &myreq.end_time); - getInt64(req, "begin_time", &myreq.begin_time); - int ret = this->api->QueryOrdersEx(&myreq, sessionid, reqid); - return ret; -} - -int TraderApi::queryUnfinishedOrders(uint64_t sessionid, int reqid) -{ - return this->api->QueryUnfinishedOrders(sessionid, reqid); -}; - -int TraderApi::queryUnfinishedOrdersEx(uint64_t sessionid, int reqid) -{ - return this->api->QueryUnfinishedOrdersEx(sessionid, reqid); -} - -int TraderApi::queryTradesByXTPID(uint64_t orderid, uint64_t sessionid, int reqid) -{ - return this->api->QueryTradesByXTPID(orderid, sessionid, reqid); -}; - -int TraderApi::queryTrades(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryTraderReq myreq = XTPQueryTraderReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - getInt64(req, "end_time", &myreq.end_time); - getInt64(req, "begin_time", &myreq.begin_time); - return this->api->QueryTrades(&myreq, sessionid, reqid); -}; - -int TraderApi::queryPosition(string ticker, uint64_t sessionid, int reqid) -{ - return this->api->QueryPosition(ticker.c_str(), sessionid, reqid); -}; - -int TraderApi::queryAsset(uint64_t sessionid, int reqid) -{ - return this->api->QueryAsset(sessionid, reqid); -}; - -int TraderApi::queryStructuredFund(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryStructuredFundInfoReq myreq = XTPQueryStructuredFundInfoReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "sf_ticker", myreq.sf_ticker); - - int exchange_id; - getInt(req, "exchange_id", &exchange_id); - myreq.exchange_id = (XTP_EXCHANGE_TYPE)exchange_id; - - return this->api->QueryStructuredFund(&myreq, sessionid, reqid); - -}; - -uint64_t TraderApi::fundTransfer(dict req, uint64_t sessionid) -{ - XTPFundTransferReq myreq = XTPFundTransferReq(); - memset(&myreq, 0, sizeof(myreq)); - getUint64(req, "serial_id", &myreq.serial_id); - getStr(req, "fund_account", myreq.fund_account); - getStr(req, "password", myreq.password); - getDouble(req, "amount", &myreq.amount); - - int transfer_type; - getInt(req, "transfer_type", &transfer_type); - myreq.transfer_type = (XTP_FUND_TRANSFER_TYPE)transfer_type; - - return this->api->FundTransfer(&myreq, sessionid); -}; - -int TraderApi::queryFundTransfer(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryFundTransferLogReq myreq = XTPQueryFundTransferLogReq(); - memset(&myreq, 0, sizeof(myreq)); - getUint64(req, "serial_id", &myreq.serial_id); - return this->api->QueryFundTransfer(&myreq, sessionid, reqid); -}; - -int TraderApi::queryETF(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryETFBaseReq myreq = XTPQueryETFBaseReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - - return this->api->QueryETF(&myreq, sessionid, reqid); -}; - -int TraderApi::queryETFTickerBasket(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryETFComponentReq myreq = XTPQueryETFComponentReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - - return this->api->QueryETFTickerBasket(&myreq, sessionid, reqid); -}; - -int TraderApi::queryIPOInfoList(uint64_t sessionid, int reqid) -{ - return this->api->QueryIPOInfoList(sessionid, reqid); -}; - -int TraderApi::queryIPOQuotaInfo(uint64_t sessionid, int reqid) -{ - return this->api->QueryIPOQuotaInfo(sessionid, reqid); -}; - -int TraderApi::queryBondIPOInfoList(uint64_t sessionid, int reqid) -{ - return this->api->QueryBondIPOInfoList(sessionid, reqid); -}; - -int TraderApi::queryBondSwapStockInfo(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryBondSwapStockReq myreq = XTPQueryBondSwapStockReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - return this->api->QueryBondSwapStockInfo(&myreq, sessionid, reqid); -}; - -int TraderApi::queryOptionAuctionInfo(dict req,uint64_t sessionid, int reqid) -{ - XTPQueryOptionAuctionInfoReq myreq = XTPQueryOptionAuctionInfoReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - return this->api->QueryOptionAuctionInfo(&myreq,sessionid, reqid); -}; - -uint64_t TraderApi::creditCashRepay(double remain_amount, uint64_t session_id = 0) { - return this->api->CreditCashRepay(remain_amount, session_id); -} - -int TraderApi::queryCreditCashRepayInfo(uint64_t session_id, int request_id) { - - return this->api->QueryCreditCashRepayInfo(session_id, request_id); -} - -int TraderApi::queryCreditFundInfo(uint64_t session_id, int request_id) { - return this->api->QueryCreditFundInfo(session_id, request_id); -} - -int TraderApi::queryCreditDebtInfo(uint64_t session_id, int request_id) { - return this->api->QueryCreditDebtInfo(session_id, request_id); -} - -int TraderApi::queryCreditTickerDebtInfo(dict req, uint64_t session_id, int request_id) { - XTPClientQueryCrdDebtStockReq myreq = XTPClientQueryCrdDebtStockReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - return this->api->QueryCreditTickerDebtInfo(&myreq, session_id, request_id); -} - -int TraderApi::queryCreditAssetDebtInfo(uint64_t session_id, int request_id) { - return this->api->QueryCreditAssetDebtInfo(session_id, request_id); -} - -int TraderApi::queryCreditTickerAssignInfo(dict req, uint64_t session_id, int request_id) { - XTPClientQueryCrdPositionStockReq myreq = XTPClientQueryCrdPositionStockReq(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - return this->api->QueryCreditTickerAssignInfo(&myreq, session_id, request_id); -} - -int TraderApi::queryCreditExcessStock(dict req, uint64_t session_id, int request_id) { - XTPClientQueryCrdSurplusStkReqInfo myreq = XTPClientQueryCrdSurplusStkReqInfo(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - return this->api->QueryCreditExcessStock(&myreq, session_id, request_id); -} - -int TraderApi::queryMulCreditExcessStock(dict req, uint64_t session_id, int request_id) { - XTPClientQueryCrdSurplusStkReqInfo myreq = XTPClientQueryCrdSurplusStkReqInfo(); - memset(&myreq, 0, sizeof(myreq)); - getStr(req, "ticker", myreq.ticker); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - return this->api->QueryMulCreditExcessStock(&myreq, session_id, request_id); -} - -uint64_t TraderApi::creditExtendDebtDate(dict req,uint64_t session_id) { - XTPCreditDebtExtendReq myreq = XTPCreditDebtExtendReq(); - memset(&myreq, 0, sizeof(myreq)); - getUint64(req, "xtpid", &myreq.xtpid); - getStr(req, "debt_id", myreq.debt_id); - getUint32(req, "xtpid", &myreq.defer_days); - getStr(req, "fund_account", myreq.fund_account); - getStr(req, "password", myreq.password); - - return this->api->CreditExtendDebtDate(&myreq, session_id); -} - -int TraderApi::queryCreditExtendDebtDateOrders(uint64_t xtp_id, uint64_t session_id, int request_id) { - - return this->api->QueryCreditExtendDebtDateOrders(xtp_id, session_id, request_id); -} - -int TraderApi::queryCreditFundExtraInfo(uint64_t session_id, int request_id) { - - return this->api->QueryCreditFundExtraInfo(session_id, request_id); -} - -int TraderApi::queryCreditPositionExtraInfo(dict req, uint64_t session_id, int request_id) { - - XTPClientQueryCrdPositionStockReq myreq = XTPClientQueryCrdPositionStockReq(); - memset(&myreq, 0, sizeof(myreq)); - - int market; - getInt(req, "market", &market); - myreq.market = (XTP_MARKET_TYPE)market; - getStr(req, "ticker", myreq.ticker); - - return this->api->QueryCreditPositionExtraInfo(&myreq, session_id, request_id); -} - -int TraderApi::queryOrdersByPage(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryOrderByPageReq myreq = XTPQueryOrderByPageReq(); - memset(&myreq, 0, sizeof(myreq)); - getInt64(req, "req_count", &myreq.req_count); - getInt64(req, "reference", &myreq.reference); - getInt64(req, "reserved", &myreq.reserved); - return this->api->QueryOrdersByPage(&myreq, sessionid, reqid); -}; - -int TraderApi::queryOrdersByPageEx(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryOrderByPageReq myreq = XTPQueryOrderByPageReq(); - memset(&myreq, 0, sizeof(myreq)); - getInt64(req, "req_count", &myreq.req_count); - getInt64(req, "reference", &myreq.reference); - getInt64(req, "reserved", &myreq.reserved); - return this->api->QueryOrdersByPageEx(&myreq, sessionid, reqid); -} - -int TraderApi::queryTradesByPage(dict req, uint64_t sessionid, int reqid) -{ - XTPQueryTraderByPageReq myreq = XTPQueryTraderByPageReq(); - memset(&myreq, 0, sizeof(myreq)); - getInt64(req, "req_count", &myreq.req_count); - getInt64(req, "reference", &myreq.reference); - getInt64(req, "reserved", &myreq.reserved); - return this->api->QueryTradesByPage(&myreq, sessionid, reqid); -}; - -bool TraderApi::isServerRestart(uint64_t session_id) -{ - return this->api->IsServerRestart(session_id); -}; - -uint64_t TraderApi::creditCashRepayDebtInterestFee(string debt_id, double amount, uint64_t session_id) { - return this->api->CreditCashRepayDebtInterestFee(debt_id.c_str(),amount, session_id); -} - -uint64_t TraderApi::creditSellStockRepayDebtInterestFee(dict req, string debt_id, uint64_t session_id) { - XTPOrderInsertInfo myreq = XTPOrderInsertInfo(); - memset(&myreq, 0, sizeof(myreq)); - getDouble(req, "stop_price", &myreq.stop_price); - getDouble(req, "price", &myreq.price); - getStr(req, "ticker", myreq.ticker); - - getUint32(req, "order_client_id", &myreq.order_client_id); - getUint64(req, "order_xtp_id", &myreq.order_xtp_id); - getInt64(req, "quantity", &myreq.quantity); - - int price_type; - int side; - int position_effect; - int reserved1; - int reserved2; - int market; - int business_type; - getInt(req, "price_type", &price_type); - getInt(req, "side", &side); - getInt(req, "position_effect", &position_effect); - getInt(req, "reserved1", &reserved1); - getInt(req, "reserved2", &reserved2); - getInt(req, "market", &market); - getInt(req, "business_type", &business_type); - myreq.price_type = (XTP_PRICE_TYPE)price_type; - myreq.side = (XTP_SIDE_TYPE)side; - myreq.position_effect = (XTP_POSITION_EFFECT_TYPE)position_effect; - myreq.reserved1 = reserved1; - myreq.reserved2 = reserved2; - myreq.market = (XTP_MARKET_TYPE)market; - myreq.business_type = (XTP_BUSINESS_TYPE)business_type; - - return this->api->CreditSellStockRepayDebtInterestFee(&myreq,debt_id.c_str(),session_id); -} - - -uint64_t TraderApi::insertOptionCombinedOrder(dict req, uint64_t session_id) { - - XTPOptCombOrderInsertInfo query_param; - memset(&query_param, 0, sizeof(query_param)); - - getUint64(req, "order_xtp_id", &query_param.order_xtp_id); - getUint32(req, "order_client_id", &query_param.order_client_id); - - int side; - int market; - int business_type; - dict opt_comb_info; - - getInt(req, "side", &side); - getInt(req, "market", &market); - getInt(req, "business_type", &business_type); - query_param.side = (XTP_SIDE_TYPE)side; - query_param.market = (XTP_MARKET_TYPE)market; - query_param.business_type = (XTP_BUSINESS_TYPE)business_type; - - getNestedDictChar(req, "opt_comb_info", "strategy_id", query_param.opt_comb_info.strategy_id); - getNestedDictChar(req, "opt_comb_info", "comb_num", query_param.opt_comb_info.comb_num); - getNestedDictValue(req, "opt_comb_info", "num_legs", &query_param.opt_comb_info.num_legs); - - int leg_cntr_type; - int leg_side; - int leg_covered; - for (int i = 0; i< query_param.opt_comb_info.num_legs; i++) - { - getNestedDictChar2(req, "opt_comb_info", "leg_detail", "leg_security_id", query_param.opt_comb_info.leg_detail[i].leg_security_id, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_cntr_type", &leg_cntr_type, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_side", &leg_side, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_covered", &leg_covered, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_qty", &query_param.opt_comb_info.leg_detail[i].leg_qty, i); - query_param.opt_comb_info.leg_detail[i].leg_cntr_type = (XTP_OPT_CALL_OR_PUT_TYPE)leg_cntr_type; - query_param.opt_comb_info.leg_detail[i].leg_side = (XTP_POSITION_DIRECTION_TYPE)leg_side; - query_param.opt_comb_info.leg_detail[i].leg_covered = (XTP_OPT_COVERED_OR_UNCOVERED)leg_covered; - - } - - getInt64(req, "quantity", &query_param.quantity); - return this->api->InsertOptionCombinedOrder(&query_param, session_id); -} - -uint64_t TraderApi::insertOptionCombinedOrderExtra(dict req, uint64_t session_id) -{ - XTPOptCombOrderInsertInfo query_param; - memset(&query_param, 0, sizeof(query_param)); - - getUint64(req, "order_xtp_id", &query_param.order_xtp_id); - getUint32(req, "order_client_id", &query_param.order_client_id); - - int side; - int market; - int business_type; - dict opt_comb_info; - - getInt(req, "side", &side); - getInt(req, "market", &market); - getInt(req, "business_type", &business_type); - query_param.side = (XTP_SIDE_TYPE)side; - query_param.market = (XTP_MARKET_TYPE)market; - query_param.business_type = (XTP_BUSINESS_TYPE)business_type; - - getNestedDictChar(req, "opt_comb_info", "strategy_id", query_param.opt_comb_info.strategy_id); - getNestedDictChar(req, "opt_comb_info", "comb_num", query_param.opt_comb_info.comb_num); - getNestedDictValue(req, "opt_comb_info", "num_legs", &query_param.opt_comb_info.num_legs); - - int leg_cntr_type; - int leg_side; - int leg_covered; - for (int i = 0; i< query_param.opt_comb_info.num_legs; i++) - { - getNestedDictChar2(req, "opt_comb_info", "leg_detail", "leg_security_id", query_param.opt_comb_info.leg_detail[i].leg_security_id, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_cntr_type", &leg_cntr_type, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_side", &leg_side, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_covered", &leg_covered, i); - getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_qty", &query_param.opt_comb_info.leg_detail[i].leg_qty, i); - query_param.opt_comb_info.leg_detail[i].leg_cntr_type = (XTP_OPT_CALL_OR_PUT_TYPE)leg_cntr_type; - query_param.opt_comb_info.leg_detail[i].leg_side = (XTP_POSITION_DIRECTION_TYPE)leg_side; - query_param.opt_comb_info.leg_detail[i].leg_covered = (XTP_OPT_COVERED_OR_UNCOVERED)leg_covered; - - } - - getInt64(req, "quantity", &query_param.quantity); - return this->api->InsertOptionCombinedOrderExtra(&query_param, session_id); -} - -int TraderApi::queryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id) { - - return this->api->QueryOptionCombinedUnfinishedOrders(session_id, request_id); -} - -int TraderApi::queryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id) -{ - return this->api->QueryOptionCombinedUnfinishedOrdersEx(session_id, request_id); -} - -int TraderApi::queryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) { - - return this->api->QueryOptionCombinedOrderByXTPID(order_xtp_id, session_id, request_id); -} - -int TraderApi::queryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) -{ - return this->api->QueryOptionCombinedOrderByXTPIDEx(order_xtp_id, session_id, request_id); -} - -int TraderApi::queryOptionCombinedOrders(dict req, uint64_t session_id, int request_id) { - - XTPQueryOptCombOrderReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - getStr(req, "comb_num", query_param.comb_num); - getInt64(req, "begin_time", &query_param.begin_time); - getInt64(req, "end_time", &query_param.end_time); - return this->api->QueryOptionCombinedOrders(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedOrdersEx(dict req, uint64_t session_id, int request_id) -{ - XTPQueryOptCombOrderReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - getStr(req, "comb_num", query_param.comb_num); - getInt64(req, "begin_time", &query_param.begin_time); - getInt64(req, "end_time", &query_param.end_time); - return this->api->QueryOptionCombinedOrdersEx(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedOrdersByPage(dict req, uint64_t session_id, int request_id) { - - XTPQueryOptCombOrderByPageReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - getInt64(req, "req_count", &query_param.req_count); - getInt64(req, "reference", &query_param.reference); - getInt64(req, "reserved", &query_param.reserved); - return this->api->QueryOptionCombinedOrdersByPage(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedOrdersByPageEx(dict req, uint64_t session_id, int request_id) -{ - XTPQueryOptCombOrderByPageReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - getInt64(req, "req_count", &query_param.req_count); - getInt64(req, "reference", &query_param.reference); - getInt64(req, "reserved", &query_param.reserved); - return this->api->QueryOptionCombinedOrdersByPageEx(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) { - - return this->api->QueryOptionCombinedTradesByXTPID(order_xtp_id, session_id, request_id); -} - -int TraderApi::queryOptionCombinedTrades(dict req, uint64_t session_id, int request_id) { - - XTPQueryOptCombTraderReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - getStr(req, "comb_num", query_param.comb_num); - getInt64(req, "begin_time", &query_param.begin_time); - getInt64(req, "end_time", &query_param.end_time); - return this->api->QueryOptionCombinedTrades(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedTradesByPage(dict req, uint64_t session_id, int request_id) { - - XTPQueryOptCombTraderByPageReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - getInt64(req, "req_count", &query_param.req_count); - getInt64(req, "reference", &query_param.reference); - getInt64(req, "reserved", &query_param.reserved); - return this->api->QueryOptionCombinedTradesByPage(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedPosition(dict req, uint64_t session_id, int request_id) { - - XTPQueryOptCombPositionReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - int market; - getStr(req, "comb_num", query_param.comb_num); - getInt(req, "market", &market); - query_param.market = (XTP_MARKET_TYPE)market; - - //getValue(req, "market", &query_param.market); - return this->api->QueryOptionCombinedPosition(&query_param, session_id, request_id); -} - -int TraderApi::queryOptionCombinedStrategyInfo(uint64_t session_id, int request_id) { - //getValue(req, "market", &query_param.market); - return this->api->QueryOptionCombinedStrategyInfo(session_id, request_id); -} - -uint64_t TraderApi::cancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id = 0) { - return this->api->CancelOptionCombinedOrder(order_xtp_id, session_id); -} - -int TraderApi::queryOptionCombinedExecPosition(dict req,uint64_t session_id, int request_id) { - XTPQueryOptCombExecPosReq query_param; - memset(&query_param, 0, sizeof(query_param)); - - int market; - getInt(req, "market", &market); - query_param.market = (XTP_MARKET_TYPE)market; - getStr(req, "cntrt_code_1", query_param.cntrt_code_1); - getStr(req, "cntrt_code_2", query_param.cntrt_code_2); - return this->api->QueryOptionCombinedExecPosition(&query_param,session_id, request_id); -} - -int TraderApi::queryOtherServerFund(dict req,uint64_t session_id, int request_id) { - XTPFundQueryReq query_param; - memset(&query_param, 0, sizeof(query_param)); - getChar(req, "fund_account", query_param.fund_account); - getChar(req, "password", query_param.password); - int query_type; - getInt(req, "query_type", &query_type); - query_param.query_type = (XTP_FUND_QUERY_TYPE)query_type; - return this->api->QueryOtherServerFund(&query_param,session_id, request_id); -} - - - -////////////////////algo////////////////// - -int TraderApi::loginALGO(string ip, int port, string user, string password, int socktype,string local_ip) -{ - return this->api->LoginALGO(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype,local_ip.c_str()); -}; - -int TraderApi::queryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id) -{ - return this->api->QueryStrategy(strategy_type, client_strategy_id,xtp_strategy_id, session_id, request_id); -}; - -int TraderApi::aLGOUserEstablishChannel(string oms_ip, int oms_port, string user, string password, uint64_t session_id) -{ - return this->api->ALGOUserEstablishChannel(oms_ip.c_str(), oms_port, user.c_str(), password.c_str(), session_id); -}; - -int TraderApi::insertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, string strategy_param, uint64_t session_id) -{ - return this->api->InsertAlgoOrder(strategy_type, client_strategy_id, (char*)strategy_param.c_str(), session_id); -}; - -int TraderApi::cancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id) -{ - return this->api->CancelAlgoOrder(cancel_flag, xtp_strategy_id, session_id); -}; - -uint64_t TraderApi::getAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id) -{ - return this->api->GetAlgorithmIDByOrder(order_xtp_id, order_client_id); -}; - -int TraderApi::strategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id) -{ - return this->api->StrategyRecommendation(basket_flag, basket_param, session_id, request_id); -}; - -int TraderApi::modifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id) -{ - return this->api->ModifyAlgoOrder(xtp_strategy_id, strategy_param, session_id); -}; - -///------------------------------------------------------------------------------------- -///Boost.Pythonװ -///------------------------------------------------------------------------------------- - -struct TraderApiWrap : TraderApi, wrapper < TraderApi > -{ - virtual void onDisconnected(uint64_t session, int reason) - { - try - { - this->get_override("onDisconnected")(session, reason); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onError(dict data) - { - try - { - this->get_override("onError")(data); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryAccountTradeMarket(int trade_location, dict error, int request_id, uint64_t session_id) - { - try - { - this->get_override("onQueryAccountTradeMarket")(trade_location, error, request_id, session_id); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - } - - virtual void onOrderEvent(dict data, dict error, uint64_t session) - { - try - { - this->get_override("onOrderEvent")(data, error, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onTradeEvent(dict data, uint64_t session) - { - try - { - this->get_override("onTradeEvent")(data, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onCancelOrderError(dict data, dict error, uint64_t session) - { - try - { - this->get_override("onCancelOrderError")(data, error, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryOrder(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryOrder")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryOrderEx(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryOrderEx")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryOrderByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) - { - try - { - this->get_override("onQueryOrderByPage")(data,req_count,order_sequence, query_reference, reqid, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryOrderByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) - { - try - { - this->get_override("onQueryOrderByPageEx")(data, req_count, order_sequence, query_reference, reqid, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - } - - virtual void onQueryTrade(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryTrade")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) - { - try - { - this->get_override("onQueryTradeByPage")(data, req_count,trade_sequence,query_reference, reqid, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryPosition(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryPosition")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryAsset(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryAsset")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryStructuredFund(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryStructuredFund")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryFundTransfer(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryFundTransfer")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onFundTransfer(dict data, dict error, uint64_t session) - { - try - { - this->get_override("onFundTransfer")(data, error, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryETF(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryETF")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryETFBasket(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryETFBasket")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryIPOInfoList(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryIPOInfoList")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryIPOQuotaInfo(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryIPOQuotaInfo")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryBondIPOInfoList(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryBondIPOInfoList")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryBondSwapStockInfo(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryBondSwapStockInfo")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onQueryOptionAuctionInfo(dict data, dict error, int id, bool last, uint64_t session) - { - try - { - this->get_override("onQueryOptionAuctionInfo")(data, error, id, last, session); - } - catch (error_already_set const &) - { - PyErr_Print(); - } - }; - - virtual void onCreditCashRepay(dict data, dict error_info, uint64_t session) { - PyLock lock; - - try { - this->get_override("onCreditCashRepay")(data, error_info, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditCashRepayInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditCashRepayInfo")(data, error_info, request_id, is_last, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditFundInfo(dict data, dict error_info, int request_id, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditFundInfo")(data, error_info, request_id, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditDebtInfo")(data, error_info, request_id, is_last, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditTickerDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditTickerDebtInfo")(data, error_info, request_id, is_last, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditAssetDebtInfo(double remain_amount, dict error_info, int request_id, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditAssetDebtInfo")(remain_amount, error_info, request_id, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditTickerAssignInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditTickerAssignInfo")(data, error_info, request_id, is_last, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditExcessStock")(data, error_info, request_id, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryMulCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session, bool is_last) { - PyLock lock; - - try { - this->get_override("onQueryMulCreditExcessStock")(data, error_info, request_id, session,is_last); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onCreditExtendDebtDate(dict data, dict error_info, uint64_t session) { - PyLock lock; - - try { - this->get_override("onCreditExtendDebtDate")(data, error_info, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditExtendDebtDateOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditExtendDebtDateOrders")(data, error_info, request_id,is_last, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditFundExtraInfo(dict data, dict error_info, int request_id, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditFundExtraInfo")(data, error_info, request_id, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryCreditPositionExtraInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryCreditPositionExtraInfo")(data, error_info, request_id,is_last, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onCreditCashRepayDebtInterestFee(dict data, dict error_info, uint64_t session) { - PyLock lock; - - try { - this->get_override("onCreditCashRepayDebtInterestFee")(data, error_info, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onOptionCombinedOrderEvent(dict data, dict error_info, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onOptionCombinedOrderEvent")(data, error_info, session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onOptionCombinedTradeEvent(dict data, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onOptionCombinedTradeEvent")(data,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedOrders")(data, error_info, request_id, is_last, session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedOrdersEx(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedOrdersEx")(data, error_info, request_id, is_last, session_id); - } - catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedOrdersByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedOrdersByPage")(data, req_count, order_sequence, query_reference, request_id, is_last, session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedOrdersByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedOrdersByPageEx")(data, req_count, order_sequence, query_reference, request_id, is_last, session_id); - } - catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedTrades(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedTrades")(data, error_info, request_id, is_last,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedTradesByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedTradesByPage")(data, req_count, trade_sequence, query_reference, request_id, is_last,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedPosition")(data, error_info, request_id, is_last,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedStrategyInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedStrategyInfo")(data, error_info, request_id, is_last,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onCancelOptionCombinedOrderError(dict data, dict error_info, uint64_t session) { - PyLock lock; - - try { - this->get_override("onCancelOptionCombinedOrderError")(data, error_info,session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOptionCombinedExecPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryOptionCombinedExecPosition")(data, error_info, request_id, is_last,session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onQueryOtherServerFund(dict data, dict error_info, int request_id, uint64_t session) { - PyLock lock; - - try { - this->get_override("onQueryOtherServerFund")(data, error_info, request_id, session); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - - virtual void onQueryStrategy(dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id) { - PyLock lock; - printf("onQueryStrategy---\n"); - try { - this->get_override("onQueryStrategy")(data,strategy_param, error_info, request_id,is_last,session_id); - printf("get_override(onQueryStrategy)---\n"); - } catch (error_already_set const &) { - PyErr_Print(); - printf("catch(onQueryStrategy)\n"); - } - }; - - virtual void onStrategyStateReport(dict data, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onStrategyStateReport")(data,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onALGOUserEstablishChannel(string user,dict error_info, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onALGOUserEstablishChannel")(user,error_info,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - virtual void onInsertAlgoOrder(dict data,dict error_info, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onInsertAlgoOrder")(data,error_info,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onCancelAlgoOrder(dict data,dict error_info, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onCancelAlgoOrder")(data,error_info,session_id); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onAlgoDisconnected(int reason) { - PyLock lock; - - try { - this->get_override("onAlgoDisconnected")(reason); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onAlgoConnected() { - PyLock lock; - - try { - this->get_override("onAlgoConnected")(); - } catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onStrategySymbolStateReport(dict data, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onStrategySymbolStateReport")(data, session_id); - } - catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onNewStrategyCreateReport(dict data, string strategy_param, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onNewStrategyCreateReport")(data, strategy_param, session_id); - } - catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onStrategyRecommendation(bool basket_flag, dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onStrategyRecommendation")(basket_flag, data, strategy_param, error_info, request_id, is_last, session_id); - } - catch (error_already_set const &) { - PyErr_Print(); - } - }; - - virtual void onModifyAlgoOrder(dict data, dict error_info, uint64_t session_id) { - PyLock lock; - - try { - this->get_override("onModifyAlgoOrder")(data, error_info, session_id); - } - catch (error_already_set const &) { - PyErr_Print(); - } - }; -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - //PyEval_InitThreads(); //ʱУ֤ȴGIL - Py_Initialize(); - - class_("TraderApi") - .def("createTraderApi", &TraderApiWrap::createTraderApi) - .def("release", &TraderApiWrap::release) - .def("exit", &TraderApiWrap::exit) - .def("getTradingDay", &TraderApiWrap::getTradingDay) - .def("getApiLastError", &TraderApiWrap::getApiLastError) - .def("getApiVersion", &TraderApiWrap::getApiVersion) - .def("getClientIDByXTPID", &TraderApiWrap::getClientIDByXTPID) - .def("getAccountByXTPID", &TraderApiWrap::getAccountByXTPID) - .def("subscribePublicTopic", &TraderApiWrap::subscribePublicTopic) - .def("setSoftwareKey", &TraderApiWrap::setSoftwareKey) - .def("setSoftwareVersion", &TraderApiWrap::setSoftwareVersion) - .def("setHeartBeatInterval", &TraderApiWrap::setHeartBeatInterval) - .def("login", &TraderApiWrap::login) - .def("logout", &TraderApiWrap::logout) - .def("modifyUserTerminalInfo", &TraderApiWrap::modifyUserTerminalInfo) - .def("queryAccountTradeMarket", &TraderApiWrap::queryAccountTradeMarket) - .def("getANewOrderXTPID", &TraderApiWrap::getANewOrderXTPID) - .def("insertOrder", &TraderApiWrap::insertOrder) - .def("insertOrderExtra", &TraderApiWrap::insertOrderExtra) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrderByXTPIDEx", &TraderApiWrap::queryOrderByXTPIDEx) - .def("queryOrders", &TraderApiWrap::queryOrders) - .def("queryOrdersEx", &TraderApiWrap::queryOrdersEx) - .def("queryUnfinishedOrders", &TraderApiWrap::queryUnfinishedOrders) - .def("queryUnfinishedOrdersEx", &TraderApiWrap::queryUnfinishedOrdersEx) - .def("queryTradesByXTPID", &TraderApiWrap::queryTradesByXTPID) - .def("queryTrades", &TraderApiWrap::queryTrades) - .def("queryPosition", &TraderApiWrap::queryPosition) - .def("queryAsset", &TraderApiWrap::queryAsset) - .def("queryStructuredFund", &TraderApiWrap::queryStructuredFund) - .def("fundTransfer", &TraderApiWrap::fundTransfer) - .def("queryFundTransfer", &TraderApiWrap::queryFundTransfer) - .def("queryETF", &TraderApiWrap::queryETF) - .def("queryETFTickerBasket", &TraderApiWrap::queryETFTickerBasket) - .def("queryIPOInfoList", &TraderApiWrap::queryIPOInfoList) - .def("queryIPOQuotaInfo", &TraderApiWrap::queryIPOQuotaInfo) - .def("queryBondIPOInfoList", &TraderApiWrap::queryBondIPOInfoList) - .def("queryBondSwapStockInfo", &TraderApiWrap::queryBondSwapStockInfo) - .def("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("creditCashRepay", &TraderApiWrap::creditCashRepay) - .def("queryCreditCashRepayInfo", &TraderApiWrap::queryCreditCashRepayInfo) - .def("queryCreditFundInfo", &TraderApiWrap::queryCreditFundInfo) - .def("queryCreditDebtInfo", &TraderApiWrap::queryCreditDebtInfo) - .def("queryCreditTickerDebtInfo", &TraderApiWrap::queryCreditTickerDebtInfo) - .def("queryCreditAssetDebtInfo", &TraderApiWrap::queryCreditAssetDebtInfo) - .def("queryCreditTickerAssignInfo", &TraderApiWrap::queryCreditTickerAssignInfo) - .def("queryCreditExcessStock", &TraderApiWrap::queryCreditExcessStock) - .def("queryMulCreditExcessStock", &TraderApiWrap::queryMulCreditExcessStock) - - .def("creditExtendDebtDate", &TraderApiWrap::creditExtendDebtDate) - .def("queryCreditExtendDebtDateOrders", &TraderApiWrap::queryCreditExtendDebtDateOrders) - .def("queryCreditFundExtraInfo", &TraderApiWrap::queryCreditFundExtraInfo) - .def("queryCreditPositionExtraInfo", &TraderApiWrap::queryCreditPositionExtraInfo) - - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryOrdersByPageEx", &TraderApiWrap::queryOrdersByPageEx) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - .def("creditCashRepayDebtInterestFee", &TraderApiWrap::creditCashRepayDebtInterestFee) - .def("creditSellStockRepayDebtInterestFee", &TraderApiWrap::creditSellStockRepayDebtInterestFee) - .def("insertOptionCombinedOrder", &TraderApiWrap::insertOptionCombinedOrder) - .def("insertOptionCombinedOrderExtra", &TraderApiWrap::insertOptionCombinedOrderExtra) - .def("queryOptionCombinedUnfinishedOrders", &TraderApiWrap::queryOptionCombinedUnfinishedOrders) - .def("queryOptionCombinedUnfinishedOrdersEx", &TraderApiWrap::queryOptionCombinedUnfinishedOrdersEx) - .def("queryOptionCombinedOrderByXTPID", &TraderApiWrap::queryOptionCombinedOrderByXTPID) - .def("queryOptionCombinedOrderByXTPIDEx", &TraderApiWrap::queryOptionCombinedOrderByXTPIDEx) - .def("queryOptionCombinedOrders", &TraderApiWrap::queryOptionCombinedOrders) - .def("queryOptionCombinedOrdersEx", &TraderApiWrap::queryOptionCombinedOrdersEx) - .def("queryOptionCombinedOrdersByPage", &TraderApiWrap::queryOptionCombinedOrdersByPage) - .def("queryOptionCombinedOrdersByPageEx", &TraderApiWrap::queryOptionCombinedOrdersByPageEx) - .def("queryOptionCombinedTradesByXTPID", &TraderApiWrap::queryOptionCombinedTradesByXTPID) - .def("queryOptionCombinedTrades", &TraderApiWrap::queryOptionCombinedTrades) - .def("queryOptionCombinedTradesByPage", &TraderApiWrap::queryOptionCombinedTradesByPage) - .def("queryOptionCombinedPosition", &TraderApiWrap::queryOptionCombinedPosition) - .def("queryOptionCombinedStrategyInfo", &TraderApiWrap::queryOptionCombinedStrategyInfo) - .def("cancelOptionCombinedOrder", &TraderApiWrap::cancelOptionCombinedOrder) - .def("queryOptionCombinedExecPosition", &TraderApiWrap::queryOptionCombinedExecPosition) - .def("queryOtherServerFund", &TraderApiWrap::queryOtherServerFund) - - .def("loginALGO", &TraderApiWrap::loginALGO) - .def("queryStrategy", &TraderApiWrap::queryStrategy) - .def("aLGOUserEstablishChannel", &TraderApiWrap::aLGOUserEstablishChannel) - .def("insertAlgoOrder", &TraderApiWrap::insertAlgoOrder) - .def("cancelAlgoOrder", &TraderApiWrap::cancelAlgoOrder) - .def("getAlgorithmIDByOrder", &TraderApiWrap::getAlgorithmIDByOrder) - .def("strategyRecommendation", &TraderApiWrap::strategyRecommendation) - .def("modifyAlgoOrder", &TraderApiWrap::modifyAlgoOrder) - - ////////////////////////ص/////////////////////// - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .def("onQueryAccountTradeMarket", pure_virtual(&TraderApiWrap::onQueryAccountTradeMarket)) - .def("onOrderEvent", pure_virtual(&TraderApiWrap::onOrderEvent)) - .def("onTradeEvent", pure_virtual(&TraderApiWrap::onTradeEvent)) - .def("onCancelOrderError", pure_virtual(&TraderApiWrap::onCancelOrderError)) - .def("onQueryOrder", pure_virtual(&TraderApiWrap::onQueryOrder)) - .def("onQueryOrderEx", pure_virtual(&TraderApiWrap::onQueryOrderEx)) - .def("onQueryTrade", pure_virtual(&TraderApiWrap::onQueryTrade)) - .def("onQueryPosition", pure_virtual(&TraderApiWrap::onQueryPosition)) - .def("onQueryAsset", pure_virtual(&TraderApiWrap::onQueryAsset)) - .def("onQueryStructuredFund", pure_virtual(&TraderApiWrap::onQueryStructuredFund)) - .def("onQueryFundTransfer", pure_virtual(&TraderApiWrap::onQueryFundTransfer)) - .def("onFundTransfer", pure_virtual(&TraderApiWrap::onFundTransfer)) - .def("onQueryETF", pure_virtual(&TraderApiWrap::onQueryETF)) - .def("onQueryETFBasket", pure_virtual(&TraderApiWrap::onQueryETFBasket)) - .def("onQueryIPOInfoList", pure_virtual(&TraderApiWrap::onQueryIPOInfoList)) - .def("onQueryIPOQuotaInfo", pure_virtual(&TraderApiWrap::onQueryIPOQuotaInfo)) - .def("onQueryBondIPOInfoList", pure_virtual(&TraderApiWrap::onQueryBondIPOInfoList)) - .def("onQueryBondSwapStockInfo", pure_virtual(&TraderApiWrap::onQueryBondSwapStockInfo)) - .def("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onCreditCashRepay", pure_virtual(&TraderApiWrap::onCreditCashRepay)) - .def("onQueryCreditCashRepayInfo", pure_virtual(&TraderApiWrap::onQueryCreditCashRepayInfo)) - .def("onQueryCreditFundInfo", pure_virtual(&TraderApiWrap::onQueryCreditFundInfo)) - .def("onQueryCreditDebtInfo", pure_virtual(&TraderApiWrap::onQueryCreditDebtInfo)) - .def("onQueryCreditTickerDebtInfo", pure_virtual(&TraderApiWrap::onQueryCreditTickerDebtInfo)) - .def("onQueryCreditAssetDebtInfo",pure_virtual(&TraderApiWrap::onQueryCreditAssetDebtInfo)) - .def("onQueryCreditTickerAssignInfo", pure_virtual(&TraderApiWrap::onQueryCreditTickerAssignInfo)) - .def("onQueryCreditExcessStock", pure_virtual(&TraderApiWrap::onQueryCreditExcessStock)) - .def("onQueryMulCreditExcessStock", pure_virtual(&TraderApiWrap::onQueryMulCreditExcessStock)) - - .def("onCreditExtendDebtDate", pure_virtual(&TraderApiWrap::onCreditExtendDebtDate)) - .def("onQueryCreditExtendDebtDateOrders",pure_virtual(&TraderApiWrap::onQueryCreditExtendDebtDateOrders)) - .def("onQueryCreditFundExtraInfo", pure_virtual(&TraderApiWrap::onQueryCreditFundExtraInfo)) - .def("onQueryCreditPositionExtraInfo", pure_virtual(&TraderApiWrap::onQueryCreditPositionExtraInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryOrderByPageEx", pure_virtual(&TraderApiWrap::onQueryOrderByPageEx)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - .def("onCreditCashRepayDebtInterestFee", pure_virtual(&TraderApiWrap::onCreditCashRepayDebtInterestFee)) - - .def("onOptionCombinedOrderEvent", pure_virtual(&TraderApiWrap::onOptionCombinedOrderEvent)) - .def("onOptionCombinedTradeEvent", pure_virtual(&TraderApiWrap::onOptionCombinedTradeEvent)) - .def("onQueryOptionCombinedOrders", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrders)) - .def("onQueryOptionCombinedOrdersEx", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrdersEx)) - .def("onQueryOptionCombinedOrdersByPage", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrdersByPage)) - .def("onQueryOptionCombinedOrdersByPageEx", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrdersByPageEx)) - .def("onQueryOptionCombinedTrades", pure_virtual(&TraderApiWrap::onQueryOptionCombinedTrades)) - .def("onQueryOptionCombinedTradesByPage", pure_virtual(&TraderApiWrap::onQueryOptionCombinedTradesByPage)) - .def("onQueryOptionCombinedPosition", pure_virtual(&TraderApiWrap::onQueryOptionCombinedPosition)) - .def("onQueryOptionCombinedStrategyInfo", pure_virtual(&TraderApiWrap::onQueryOptionCombinedStrategyInfo)) - .def("onCancelOptionCombinedOrderError", pure_virtual(&TraderApiWrap::onCancelOptionCombinedOrderError)) - .def("onQueryOptionCombinedExecPosition", pure_virtual(&TraderApiWrap::onQueryOptionCombinedExecPosition)) - .def("onQueryOtherServerFund", pure_virtual(&TraderApiWrap::onQueryOtherServerFund)) - - .def("onQueryStrategy", pure_virtual(&TraderApiWrap::onQueryStrategy)) - .def("onStrategyStateReport", pure_virtual(&TraderApiWrap::onStrategyStateReport)) - .def("onALGOUserEstablishChannel", pure_virtual(&TraderApiWrap::onALGOUserEstablishChannel)) - .def("onInsertAlgoOrder", pure_virtual(&TraderApiWrap::onInsertAlgoOrder)) - .def("onCancelAlgoOrder", pure_virtual(&TraderApiWrap::onCancelAlgoOrder)) - .def("onAlgoDisconnected", pure_virtual(&TraderApiWrap::onAlgoDisconnected)) - .def("onAlgoConnected", pure_virtual(&TraderApiWrap::onAlgoConnected)) - .def("onStrategySymbolStateReport", pure_virtual(&TraderApiWrap::onStrategySymbolStateReport)) - .def("onNewStrategyCreateReport", pure_virtual(&TraderApiWrap::onNewStrategyCreateReport)) - .def("onStrategyRecommendation", pure_virtual(&TraderApiWrap::onStrategyRecommendation)) - .def("onModifyAlgoOrder", pure_virtual(&TraderApiWrap::onModifyAlgoOrder)) - ; -}; +// vnctpmd.cpp : DLL Ӧóĵ +// +//#include "stdafx.h" +#include "vnxtptrader.h" + +///------------------------------------------------------------------------------------- +///PythonC++תõĺ +///------------------------------------------------------------------------------------- + +// Ƕ׽ṹ-intʹ +void getNestedDictValue(dict d, string key1, string key2, int *value) { + if (d.has_key(key1)) { //ֵǷڸüֵ + dict o1 = (dict)d[key1]; //ȡüֵ + if (o1.has_key(key2)) { + object o2 = o1[key2]; //ȡüֵ + extract x(o2); //ȡ + if (x.check()) { //ȡ + *value = x(); //Ŀָ븳ֵ + } + } + } +} + +// Ƕ׽ṹ-ַʹ +void getNestedDictChar(dict d, string key1, string key2, char *value) { + if (d.has_key(key1)) { //ֵǷڸüֵ + dict o1 = (dict)d[key1]; //ȡüֵ + if (o1.has_key(key2)) { + object o2 = o1[key2]; //ȡüֵ + extract x(o2); //ȡ + if (x.check()) { //ȡ + string s = x(); + const char *buffer = s.c_str(); +#ifdef WIN32 + strcpy_s(value, strlen(buffer) + 1, buffer); +#else + strncpy(value, buffer, strlen(buffer) + 1); +#endif + } + } + } +} + +// Ƕ׽ṹ-ַʹ +void getNestedDictChar2(dict d, string key1, string key2, string key3, char *value, int index) { + if (d.has_key(key1)) { //ֵǷڸüֵ + dict o1 = (dict)d[key1]; //ȡüֵ + if (o1.has_key(key2)) { + dict o2 = (dict)(((boost::python::list)o1[key2])[index]); //ȡüֵ + if (o2.has_key(key3)) { + object o3 = o2[key3]; //ȡüֵ + extract x(o3); //ȡ + if (x.check()) { //ȡ + string s = x(); + const char *buffer = s.c_str(); +#ifdef WIN32 + strcpy_s(value, strlen(buffer) + 1, buffer); +#else + strncpy(value, buffer, strlen(buffer) + 1); +#endif + } + } + } + } +} + +// Ƕ׽ṹ-intʹ +void getNestedDictValue2(dict d, string key1, string key2, string key3, int *value, int index) +{ + if (d.has_key(key1)) { //ֵǷڸüֵ + dict o1 = (dict)d[key1]; //ȡüֵ + if (o1.has_key(key2)) { + dict o2 = (dict)(((boost::python::list)o1[key2])[index]); //ȡüֵ + if (o2.has_key(key3)) { + object o3 = o2[key3]; //ȡüֵ + extract x(o3); //ȡ + if (x.check()) { //ȡ + *value = x(); //Ŀָ븳ֵ + } + } + } + } +} + +void getInt(dict d, string key, int *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +}; + +void getUint64(dict d, string key, uint64_t *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +}; + +void getUint32(dict d, string key, uint32_t *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +}; + +void getInt64(dict d, string key, int64_t *value) +{ + if (d.has_key(key)) //ֵǷڸüֵ + { + object o = d[key]; //ȡüֵ + extract x(o); //ȡ + if (x.check()) //ȡ + { + *value = x(); //Ŀָ븳ֵ + } + } +}; + +void getDouble(dict d, string key, double *value) +{ + if (d.has_key(key)) + { + object o = d[key]; + extract x(o); + if (x.check()) + { + *value = x(); + } + } +}; + +void getStr(dict d, string key, char *value) +{ + if (d.has_key(key)) + { + object o = d[key]; + extract x(o); + if (x.check()) + { + string s = x(); + const char *buffer = s.c_str(); + //ַָ븳ֵʹstrcpy_s, vs2013ʹstrcpyͨ + //+1ӦΪC++ַĽβţرȷ1 +#ifdef _MSC_VER //WIN32 + strcpy_s(value, strlen(buffer) + 1, buffer); +#elif __GNUC__ + strncpy(value, buffer, strlen(buffer) + 1); +#endif + } + } +}; + +void getChar(dict d, string key, char *value) +{ + if (d.has_key(key)) + { + object o = d[key]; + extract x(o); + if (x.check()) + { + string s = x(); + const char *buffer = s.c_str(); + *value = *buffer; + } + } +}; + +string addEndingChar(char *value){ + //printf("value:%s\n",value); + string endStr = value; + //printf("endStr:%s\n",endStr.c_str()); + return endStr; +} + +///------------------------------------------------------------------------------------- +///C++Ļصݱ浽 +///------------------------------------------------------------------------------------- + +void TraderApi::OnDisconnected(uint64_t session_id, int reason) +{ + Task* task = new Task(); + task->task_name = ONDISCONNECTED; + task->addtional_int = session_id; //ֶ޸ + task->task_id = reason; + this->task_queue.push(task); +}; + +void TraderApi::OnError(XTPRI *error_info) +{ + Task* task = new Task(); + task->task_name = ONERROR; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + this->task_queue.push(task); +}; + +void TraderApi::OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYACCOUNTTRADEMARKET; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->reason = trade_location; + task->task_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONORDEREVENT; + + if (order_info) + { + XTPOrderInfo *task_data = new XTPOrderInfo(); + *task_data = *order_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + + this->task_queue.push(task); +}; + +void TraderApi::OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONTRADEEVENT; + + if (trade_info) + { + XTPTradeReport *task_data = new XTPTradeReport(); + *task_data = *trade_info; + task->task_data = task_data; + } + + task->addtional_int = session_id; + + this->task_queue.push(task); +}; + +void TraderApi::OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONCANCELORDERERROR; + + if (cancel_info) + { + XTPOrderCancelInfo *task_data = new XTPOrderCancelInfo(); + *task_data = *cancel_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + + this->task_queue.push(task); +}; + +void TraderApi::OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYORDER; + + if (order_info) + { + XTPQueryOrderRsp *task_data = new XTPQueryOrderRsp(); + *task_data = *order_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYORDEREX; + + if (order_info) + { + XTPOrderInfoEx* task_data = new XTPOrderInfoEx(); + *task_data = *order_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); + +} + +void TraderApi::OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYORDERBYPAGE; + + if (order_info) + { + XTPQueryOrderRsp *task_data = new XTPQueryOrderRsp(); + *task_data = *order_info; + task->task_data = task_data; + } + + task->addtional_int_two = req_count; + task->addtional_int_three = order_sequence; + task->addtional_int_four = query_reference; + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYORDERBYPAGEEX; + + if (order_info) + { + XTPOrderInfoEx* task_data = new XTPOrderInfoEx(); + *task_data = *order_info; + task->task_data = task_data; + } + + task->addtional_int_two = req_count; + task->addtional_int_three = order_sequence; + task->addtional_int_four = query_reference; + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYTRADE; + + if (trade_info) + { + XTPQueryTradeRsp *task_data = new XTPQueryTradeRsp(); + *task_data = *trade_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYTRADEBYPAGE; + + if (trade_info) + { + XTPQueryTradeRsp *task_data = new XTPQueryTradeRsp(); + *task_data = *trade_info; + task->task_data = task_data; + } + + task->addtional_int_two = req_count; + task->addtional_int_three = trade_sequence; + task->addtional_int_four = query_reference; + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYPOSITION; + if (position) + { + XTPQueryStkPositionRsp *task_data = new XTPQueryStkPositionRsp(); + *task_data = *position; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYASSET; + + if (asset) + { + XTPQueryAssetRsp *task_data = new XTPQueryAssetRsp(); + *task_data = *asset; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYSTRUCTUREDFUND; + + if (fund_info) + { + XTPStructuredFundInfo *task_data = new XTPStructuredFundInfo(); + *task_data = *fund_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYFUNDTRANSFER; + + if (fund_transfer_info) + { + XTPFundTransferNotice *task_data = new XTPFundTransferNotice(); + *task_data = *fund_transfer_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONFUNDTRANSFER; + + if (fund_transfer_info) + { + XTPFundTransferNotice *task_data = new XTPFundTransferNotice(); + *task_data = *fund_transfer_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYETF; + + if (etf_info) + { + XTPQueryETFBaseRsp *task_data = new XTPQueryETFBaseRsp(); + *task_data = *etf_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYETFBASKET; + + if (etf_component_info) + { + XTPQueryETFComponentRsp *task_data = new XTPQueryETFComponentRsp(); + *task_data = *etf_component_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYIPOINFOLIST; + + if (ipo_info) + { + XTPQueryIPOTickerRsp *task_data = new XTPQueryIPOTickerRsp(); + *task_data = *ipo_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYIPOQUOTAINFO; + + if (quota_info) + { + XTPQueryIPOQuotaRsp *task_data = new XTPQueryIPOQuotaRsp(); + *task_data = *quota_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +}; + +void TraderApi::OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYBONDIPOINFOLIST; + + if (ipo_info) + { + XTPQueryIPOTickerRsp *task_data = new XTPQueryIPOTickerRsp(); + *task_data = *ipo_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYBONDSWAPSTOCKINFO; + + if(swap_stock_info) + { + XTPQueryBondSwapStockRsp *task_data = new XTPQueryBondSwapStockRsp; + *task_data = *swap_stock_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYOPTIONAUCTIONINFO; + + if (option_info) + { + XTPQueryOptionAuctionInfoRsp *task_data = new XTPQueryOptionAuctionInfoRsp(); + *task_data = *option_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONCREDITCASHREPAY; + if (cash_repay_info) + { + XTPCrdCashRepayRsp *task_data = new XTPCrdCashRepayRsp(); + *task_data = *cash_repay_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo * cash_repay_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITCASHREPAYINFO; + if (cash_repay_info) + { + XTPCrdCashRepayInfo *task_data = new XTPCrdCashRepayInfo(); + *task_data = *cash_repay_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditFundInfo(XTPCrdFundInfo * fund_info, XTPRI * error_info, int request_id, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITFUNDINFO; + if (fund_info) + { + XTPCrdFundInfo *task_data = new XTPCrdFundInfo(); + *task_data = *fund_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditDebtInfo(XTPCrdDebtInfo * debt_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITDEBTINFO; + if (debt_info) + { + XTPCrdDebtInfo *task_data = new XTPCrdDebtInfo(); + *task_data = *debt_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo * debt_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITTICKERDEBTINFO; + if (debt_info) + { + XTPCrdDebtStockInfo *task_data = new XTPCrdDebtStockInfo(); + *task_data = *debt_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI * error_info, int request_id, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITASSETDEBTINFO; + task->remain_amount = remain_amount; + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo * assign_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITTICKERASSIGNINFO; + if (assign_info) + { + XTPClientQueryCrdPositionStkInfo *task_data = new XTPClientQueryCrdPositionStkInfo(); + *task_data = *assign_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo * stock_info, XTPRI * error_info, int request_id, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITEXCESSSTOCK; + if (stock_info) + { + XTPClientQueryCrdSurplusStkRspInfo *task_data = new XTPClientQueryCrdSurplusStkRspInfo(); + *task_data = *stock_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo * stock_info, XTPRI * error_info, int request_id, uint64_t session_id, bool is_last) { + + Task* task = new Task(); + task->task_name = ONQUERYMULCREDITEXCESSSTOCK; + if (stock_info) + { + XTPClientQueryCrdSurplusStkRspInfo *task_data = new XTPClientQueryCrdSurplusStkRspInfo(); + *task_data = *stock_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->addtional_int = session_id; + task->task_last = is_last; + this->task_queue.push(task); +} + + +void TraderApi::OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI * error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONCREDITEXTENDDEBTDATE; + if (debt_extend_info) + { + XTPCreditDebtExtendNotice *task_data = new XTPCreditDebtExtendNotice(); + *task_data = *debt_extend_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITEXTENDDEBTDATEORDERS; + if (debt_extend_info) + { + XTPCreditDebtExtendNotice *task_data = new XTPCreditDebtExtendNotice(); + *task_data = *debt_extend_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + + this->task_queue.push(task); +} + +void TraderApi::OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITFUNDEXTRAINFO; + if (fund_info) + { + XTPCrdFundExtraInfo *task_data = new XTPCrdFundExtraInfo(); + *task_data = *fund_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->addtional_int = session_id; + + this->task_queue.push(task); +} + +void TraderApi::OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYCREDITPOSITIONEXTRAINFO; + if (fund_info) + { + XTPCrdPositionExtraInfo *task_data = new XTPCrdPositionExtraInfo(); + *task_data = *fund_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + + this->task_queue.push(task); +} + +void TraderApi::OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONCREDITCASHREPAYDEBTINTERESTFEE; + if (cash_repay_info) + { + XTPCrdCashRepayDebtInterestFeeRsp *task_data = new XTPCrdCashRepayDebtInterestFeeRsp(); + *task_data = *cash_repay_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + + + +void TraderApi::OnCancelOptionCombinedOrderError(XTPOrderCancelInfo * cancel_info, XTPRI * error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONCANCELOPTIONCOMBINEDORDERERROR; + + if (cancel_info) { + XTPOrderCancelInfo *task_data = new XTPOrderCancelInfo(); + *task_data = *cancel_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnOptionCombinedOrderEvent(XTPOptCombOrderInfo * order_info, XTPRI * error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONOPTIONCOMBINEDORDEREVENT; + + if (order_info) { + XTPOptCombOrderInfo *task_data = new XTPOptCombOrderInfo(); + *task_data = *order_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnOptionCombinedTradeEvent(XTPOptCombTradeReport * trade_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONOPTIONCOMBINEDTRADEEVENT; + + if (trade_info) { + XTPOptCombTradeReport *task_data = new XTPOptCombTradeReport(); + *task_data = *trade_info; + task->task_data = task_data; + } + + + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp * order_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDORDERS; + + if (order_info) { + XTPQueryOptCombOrderRsp *task_data = new XTPQueryOptCombOrderRsp(); + *task_data = *order_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDORDERSEX; + + if (order_info) + { + XTPOptCombOrderInfoEx *task_data = new XTPOptCombOrderInfoEx(); + *task_data = *order_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp * order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDORDERSBYPAGE; + + if (order_info) { + XTPQueryOptCombOrderRsp *task_data = new XTPQueryOptCombOrderRsp(); + *task_data = *order_info; + task->task_data = task_data; + } + + task->req_count = req_count; + task->order_sequence = order_sequence; + task->query_reference = query_reference; + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDORDERSBYPAGEEX; + + if (order_info) + { + XTPOptCombOrderInfoEx *task_data = new XTPOptCombOrderInfoEx(); + *task_data = *order_info; + task->task_data = task_data; + } + + task->req_count = req_count; + task->order_sequence = order_sequence; + task->query_reference = query_reference; + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp * trade_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDTRADES; + + if (trade_info) { + XTPQueryOptCombTradeRsp *task_data = new XTPQueryOptCombTradeRsp(); + *task_data = *trade_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp * trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDTRADESBYPAGE; + + + if (trade_info) { + XTPQueryOptCombTradeRsp *task_data = new XTPQueryOptCombTradeRsp(); + *task_data = *trade_info; + task->task_data = task_data; + } + task->task_id = request_id; + task->task_last = is_last; + task->query_reference = query_reference; + + task->req_count = req_count; + task->trade_sequence = trade_sequence; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp * position_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDPOSITION; + + if (position_info) { + XTPQueryOptCombPositionRsp *task_data = new XTPQueryOptCombPositionRsp(); + *task_data = *position_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp * strategy_info, XTPRI * error_info, int request_id, bool is_last, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDSTRATEGYINFO; + + if (strategy_info) { + XTPQueryCombineStrategyInfoRsp *task_data = new XTPQueryCombineStrategyInfoRsp(); + *task_data = *strategy_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONQUERYOPTIONCOMBINEDEXECPOSITION; + if (position_info) { + XTPQueryOptCombExecPosRsp *task_data = new XTPQueryOptCombExecPosRsp(); + *task_data = *position_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONQUERYOTHERSERVERFUND; + + if (fund_info) { + XTPFundQueryRsp *task_data = new XTPFundQueryRsp(); + *task_data = *fund_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +////////////////////////algo//////////////////////// +void TraderApi::OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONQUERYSTRATEGY; + if (strategy_info) { + XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); + *task_data = *strategy_info; + task->task_data = task_data; + } + + if(strategy_param) + task->strategy_param = addEndingChar(strategy_param); + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); + +} + +void TraderApi::OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state,uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONSTRATEGYASTATEREPORT; + + if (strategy_state) { + XTPStrategyStateReportStruct *task_data = new XTPStrategyStateReportStruct(); + *task_data = *strategy_state; + task->task_data = task_data; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONALGOUSERESTABLISHCHANNEL; + + task->user = addEndingChar(user); + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONINSERTALGOORDER; + + if (strategy_info) { + XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); + *task_data = *strategy_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + + +void TraderApi::OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) { + Task* task = new Task(); + task->task_name = ONCANCELALGOORDER; + + if (strategy_info) { + XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); + *task_data = *strategy_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnAlgoDisconnected(int reason){ + Task* task = new Task(); + task->task_name = ONALGODISCONNECTED; + + + task->reason = reason; + this->task_queue.push(task); +} + +void TraderApi::OnAlgoConnected(){ + Task* task = new Task(); + task->task_name = ONALGOCONNECTED; + + this->task_queue.push(task); +} + +void TraderApi::OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONSTRATEGYSYMBOLSTATEREPORT; + + if (strategy_symbol_state) + { + XTPStrategySymbolStateReport *task_data = new XTPStrategySymbolStateReport(); + *task_data = *strategy_symbol_state; + task->task_data = task_data; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONNEWSTRATEGYCREATEREPORT; + + if (strategy_info) { + XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); + *task_data = *strategy_info; + task->task_data = task_data; + } + + if(strategy_param) + { + task->strategy_param = addEndingChar(strategy_param); + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONSTRATEGYRECOMMENDATION; + task->addtional_bool = basket_flag; + + if (recommendation_info) { + XTPStrategyRecommendationInfo *task_data = new XTPStrategyRecommendationInfo(); + *task_data = *recommendation_info; + task->task_data = task_data; + } + + if (strategy_param) + { + task->strategy_param = addEndingChar(strategy_param); + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->task_id = request_id; + task->task_last = is_last; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONMODIFYALGOORDER; + + if (strategy_info) { + XTPStrategyInfoStruct *task_data = new XTPStrategyInfoStruct(); + *task_data = *strategy_info; + task->task_data = task_data; + } + + if (error_info) + { + XTPRI *task_error = new XTPRI(); + *task_error = *error_info; + task->task_error = task_error; + } + + task->addtional_int = session_id; + this->task_queue.push(task); +} + +///------------------------------------------------------------------------------------- +///̴߳ӶȡݣתΪpython󣬽 +///------------------------------------------------------------------------------------- + +void TraderApi::processTask() +{ + while (1) + { + Task* task = this->task_queue.wait_and_pop(); + + switch (task->task_name) + { + case ONDISCONNECTED: + { + this->processDisconnected(task); + break; + } + + case ONERROR: + { + this->processError(task); + break; + } + + case ONQUERYACCOUNTTRADEMARKET: + { + this->processQueryAccountTradeMarket(task); + break; + } + + case ONORDEREVENT: + { + this->processOrderEvent(task); + break; + } + + case ONTRADEEVENT: + { + this->processTradeEvent(task); + break; + } + + case ONCANCELORDERERROR: + { + this->processCancelOrderError(task); + break; + } + + case ONQUERYORDER: + { + this->processQueryOrder(task); + break; + } + case ONQUERYORDEREX: + { + this->processQueryOrderEx(task); + break; + } + case ONQUERYORDERBYPAGE: + { + this->processQueryOrderByPage(task); + break; + } + case ONQUERYORDERBYPAGEEX: + { + this->processQueryOrderByPageEx(task); + break; + } + case ONQUERYTRADE: + { + this->processQueryTrade(task); + break; + } + case ONQUERYTRADEBYPAGE: + { + this->processQueryTradeByPage(task); + break; + } + case ONQUERYPOSITION: + { + this->processQueryPosition(task); + break; + } + + case ONQUERYASSET: + { + this->processQueryAsset(task); + break; + } + + + case ONQUERYSTRUCTUREDFUND: + { + this->processQueryStructuredFund(task); + break; + } + + case ONQUERYFUNDTRANSFER: + { + this->processQueryFundTransfer(task); + break; + } + + case ONFUNDTRANSFER: + { + this->processFundTransfer(task); + break; + } + + case ONQUERYETF: + { + this->processQueryETF(task); + break; + } + + case ONQUERYETFBASKET: + { + this->processQueryETFBasket(task); + break; + } + + case ONQUERYIPOINFOLIST: + { + this->processQueryIPOInfoList(task); + break; + } + + case ONQUERYIPOQUOTAINFO: + { + this->processQueryIPOQuotaInfo(task); + break; + } + + case ONQUERYBONDIPOINFOLIST: + { + this->processQueryBondIPOInfoList(task); + break; + } + + case ONQUERYBONDSWAPSTOCKINFO: + { + this->processQueryBondSwapStockInfo(task); + break; + } + + case ONQUERYOPTIONAUCTIONINFO: + { + this->processQueryOptionAuctionInfo(task); + break; + } + + case ONCREDITCASHREPAY: { + this->processCreditCashRepay(task); + break; + } + + case ONQUERYCREDITCASHREPAYINFO: { + this->processQueryCreditCashRepayInfo(task); + break; + } + + case ONQUERYCREDITFUNDINFO: { + this->processQueryCreditFundInfo(task); + break; + } + + case ONQUERYCREDITDEBTINFO: { + this->processQueryCreditDebtInfo(task); + break; + } + + case ONQUERYCREDITTICKERDEBTINFO: { + this->processQueryCreditTickerDebtInfo(task); + break; + } + + case ONQUERYCREDITASSETDEBTINFO: { + this->processQueryCreditAssetDebtInfo(task); + break; + } + + case ONQUERYCREDITTICKERASSIGNINFO: { + this->processQueryCreditTickerAssignInfo(task); + break; + } + + case ONQUERYCREDITEXCESSSTOCK: { + this->processQueryCreditExcessStock(task); + break; + } + case ONQUERYMULCREDITEXCESSSTOCK: { + this->processQueryMulCreditExcessStock(task); + break; + } + + case ONCREDITEXTENDDEBTDATE: { + this->processCreditExtendDebtDate(task); + break; + } + + case ONQUERYCREDITEXTENDDEBTDATEORDERS: { + this->processQueryCreditExtendDebtDateOrders(task); + break; + } + + case ONQUERYCREDITFUNDEXTRAINFO: { + this->processQueryCreditFundExtraInfo(task); + break; + } + + case ONQUERYCREDITPOSITIONEXTRAINFO: { + this->processQueryCreditPositionExtraInfo(task); + break; + } + case ONCREDITCASHREPAYDEBTINTERESTFEE: { + this->processCreditCashRepayDebtInterestFee(task); + break; + } + + case ONOPTIONCOMBINEDORDEREVENT: { + this->processOptionCombinedOrderEvent(task); + break; + } + + case ONOPTIONCOMBINEDTRADEEVENT: { + this->processOptionCombinedTradeEvent(task); + break; + } + + case ONQUERYOPTIONCOMBINEDORDERS: { + this->processQueryOptionCombinedOrders(task); + break; + } + case ONQUERYOPTIONCOMBINEDORDERSEX: + { + this->processQueryOptionCombinedOrdersEx(task); + break; + } + + case ONQUERYOPTIONCOMBINEDORDERSBYPAGE: { + this->processQueryOptionCombinedOrdersByPage(task); + break; + } + case ONQUERYOPTIONCOMBINEDORDERSBYPAGEEX: + { + this->processQueryOptionCombinedOrdersByPageEx(task); + break; + } + + case ONQUERYOPTIONCOMBINEDTRADES: { + this->processQueryOptionCombinedTrades(task); + break; + } + + case ONQUERYOPTIONCOMBINEDTRADESBYPAGE: { + this->processQueryOptionCombinedTradesByPage(task); + break; + } + + case ONQUERYOPTIONCOMBINEDPOSITION: { + this->processQueryOptionCombinedPosition(task); + break; + } + + case ONQUERYOPTIONCOMBINEDSTRATEGYINFO: { + this->processQueryOptionCombinedStrategyInfo(task); + break; + } + case ONCANCELOPTIONCOMBINEDORDERERROR: { + this->processCancelOptionCombinedOrderError(task); + break; + } + case ONQUERYOPTIONCOMBINEDEXECPOSITION: { + this->processQueryOptionCombinedExecPosition(task); + break; + } + case ONQUERYOTHERSERVERFUND: { + this->processQueryOtherServerFund(task); + break; + } + case ONQUERYSTRATEGY: { + this->processQueryStrategy(task); + break; + } + case ONSTRATEGYASTATEREPORT: { + this->processStrategyStateReport(task); + break; + } + case ONALGOUSERESTABLISHCHANNEL: { + this->processALGOUserEstablishChannel(task); + break; + } + case ONINSERTALGOORDER: { + this->processInsertAlgoOrder(task); + break; + } + case ONCANCELALGOORDER: { + this->processCancelAlgoOrder(task); + break; + } + case ONALGODISCONNECTED: { + this->processAlgoDisconnected(task); + break; + }case ONALGOCONNECTED: { + this->processAlgoConnected(task); + break; + } + case ONSTRATEGYSYMBOLSTATEREPORT: + { + this->processStrategySymbolStateReport(task); + break; + } + case ONNEWSTRATEGYCREATEREPORT: + { + this->processNewStrategyCreateReport(task); + break; + } + case ONSTRATEGYRECOMMENDATION: + { + this->processStrategyRecommendation(task); + break; + } + case ONMODIFYALGOORDER: + { + this->processModifyAlgoOrder(task); + break; + } + }; + } +}; + +void TraderApi::processDisconnected(Task *task) +{ + PyLock lock; + this->onDisconnected(task->addtional_int, task->task_id); + delete task; +}; + +void TraderApi::processError(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onError(error); + delete task; +}; + +void TraderApi::processQueryAccountTradeMarket(Task *task) +{ + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + this->onQueryAccountTradeMarket(task->reason, error, task->task_id, task->addtional_int); + delete task; +} + +void TraderApi::processOrderEvent(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPOrderInfo *task_data = (XTPOrderInfo*)task->task_data; + data["cancel_time"] = task_data->cancel_time; + data["update_time"] = task_data->update_time; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["trade_amount"] = task_data->trade_amount; + data["price_type"] = (int)task_data->price_type; + data["order_type"] = task_data->order_type; + data["price"] = task_data->price; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["order_local_id"] = task_data->order_local_id; + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["insert_time"] = task_data->insert_time; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_status"] = (int)task_data->order_status; + data["ticker"] = addEndingChar(task_data->ticker); + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["business_type"] = int(task_data->business_type); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onOrderEvent(data, error, task->addtional_int); + delete task; +}; + +void TraderApi::processTradeEvent(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPTradeReport *task_data = (XTPTradeReport*)task->task_data; + data["branch_pbu"] = addEndingChar(task_data->branch_pbu); + data["trade_amount"] = task_data->trade_amount; + data["exec_id"] = addEndingChar(task_data->exec_id); + data["trade_type"] = task_data->trade_type; + data["order_client_id"] = task_data->order_client_id; + data["order_exch_id"] = addEndingChar(task_data->order_exch_id); + data["price"] = task_data->price; + data["report_index"] = task_data->report_index; + data["local_order_id"] = task_data->local_order_id; + data["trade_time"] = task_data->trade_time; + data["order_xtp_id"] = task_data->order_xtp_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["business_type"] = int(task_data->business_type); + delete task->task_data; + } + + this->onTradeEvent(data, task->addtional_int); + delete task; +}; + +void TraderApi::processCancelOrderError(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPOrderCancelInfo *task_data = (XTPOrderCancelInfo*)task->task_data; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_xtp_id"] = task_data->order_xtp_id; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onCancelOrderError(data, error, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryOrder(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryOrderRsp *task_data = (XTPQueryOrderRsp*)task->task_data; + data["cancel_time"] = task_data->cancel_time; + data["update_time"] = task_data->update_time; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["trade_amount"] = task_data->trade_amount; + data["price_type"] = (int)task_data->price_type; + data["order_type"] = task_data->order_type; + data["price"] = task_data->price; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["order_local_id"] = addEndingChar(task_data->order_local_id); + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["insert_time"] = task_data->insert_time; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_status"] = (int)task_data->order_status; + data["ticker"] = addEndingChar(task_data->ticker); + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["business_type"] = int(task_data->business_type); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOrder(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryOrderEx(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPOrderInfoEx *task_data = (XTPOrderInfoEx*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["cancel_time"] = task_data->cancel_time; + data["update_time"] = task_data->update_time; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_client_id"] = task_data->order_client_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["market"] = (int)task_data->market; + data["price"] = task_data->price; + data["quantity"] = task_data->quantity; + data["price_type"] = (int)task_data->price_type; + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["business_type"] = int(task_data->business_type); + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = addEndingChar(task_data->order_local_id); + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["order_exch_id"] = task_data->order_exch_id; + data["error_id"] = task_data->order_err_t.error_id; + data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + this->onQueryOrderEx(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryOrderByPage(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryOrderRsp *task_data = (XTPQueryOrderRsp*)task->task_data; + data["cancel_time"] = task_data->cancel_time; + data["update_time"] = task_data->update_time; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["trade_amount"] = task_data->trade_amount; + data["price_type"] = (int)task_data->price_type; + data["order_type"] = task_data->order_type; + data["price"] = task_data->price; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["order_local_id"] = addEndingChar(task_data->order_local_id); + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["insert_time"] = task_data->insert_time; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_status"] = (int)task_data->order_status; + data["ticker"] = addEndingChar(task_data->ticker); + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["business_type"] = int(task_data->business_type); + delete task->task_data; + } + + + + this->onQueryOrderByPage(data, task->addtional_int_two, task->addtional_int_three, task->addtional_int_four, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryOrderByPageEx(Task *task) +{ + PyLock lock; + dict data; + + if (task->task_data) + { + XTPOrderInfoEx *task_data = (XTPOrderInfoEx*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["cancel_time"] = task_data->cancel_time; + data["update_time"] = task_data->update_time; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_client_id"] = task_data->order_client_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["market"] = (int)task_data->market; + data["price"] = task_data->price; + data["quantity"] = task_data->quantity; + data["price_type"] = (int)task_data->price_type; + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["business_type"] = int(task_data->business_type); + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = addEndingChar(task_data->order_local_id); + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["order_exch_id"] = task_data->order_exch_id; + data["error_id"] = task_data->order_err_t.error_id; + data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); + delete task->task_data; + } + this->onQueryOrderByPageEx(data, task->addtional_int_two, task->addtional_int_three, task->addtional_int_four, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryTrade(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; + data["branch_pbu"] = addEndingChar(task_data->branch_pbu); + data["trade_amount"] = task_data->trade_amount; + data["exec_id"] = addEndingChar(task_data->exec_id); + data["trade_type"] = task_data->trade_type; + data["order_client_id"] = task_data->order_client_id; + data["order_exch_id"] = addEndingChar(task_data->order_exch_id); + data["price"] = task_data->price; + data["report_index"] = task_data->report_index; + data["local_order_id"] = task_data->local_order_id; + data["trade_time"] = task_data->trade_time; + data["order_xtp_id"] = task_data->order_xtp_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["business_type"] = int(task_data->business_type); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryTrade(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryTradeByPage(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; + data["branch_pbu"] = addEndingChar(task_data->branch_pbu); + data["trade_amount"] = task_data->trade_amount; + data["exec_id"] = addEndingChar(task_data->exec_id); + data["trade_type"] = task_data->trade_type; + data["order_client_id"] = task_data->order_client_id; + data["order_exch_id"] = addEndingChar(task_data->order_exch_id); + data["price"] = task_data->price; + data["report_index"] = task_data->report_index; + data["local_order_id"] = task_data->local_order_id; + data["trade_time"] = task_data->trade_time; + data["order_xtp_id"] = task_data->order_xtp_id; + data["ticker"] = addEndingChar(task_data->ticker); + data["side"] = (int)task_data->side; + data["position_effect"] = (int)task_data->position_effect; + data["reserved1"] = (int)task_data->reserved1; + data["reserved2"] = (int)task_data->reserved2; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["business_type"] = (int)(task_data->business_type); + delete task->task_data; + } + + this->onQueryTradeByPage(data, task->addtional_int_two, task->addtional_int_three, task->addtional_int_four, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryPosition(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryStkPositionRsp *task_data = (XTPQueryStkPositionRsp*)task->task_data; + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["market"] = int(task_data->market); //ֶ޸ + data["total_qty"] = task_data->total_qty; + data["sellable_qty"] = task_data->sellable_qty; + data["avg_price"] = task_data->avg_price; + data["unrealized_pnl"] = task_data->unrealized_pnl; + data["yesterday_position"] = task_data->yesterday_position; + data["purchase_redeemable_qty"] = task_data->purchase_redeemable_qty; + + data["position_direction"] = (int)task_data->position_direction; + data["position_security_type"] = (int)task_data->position_security_type; + data["executable_option"] = task_data->executable_option; + data["lockable_position"] = task_data->lockable_position; + data["executable_underlying"] = task_data->executable_underlying; + data["locked_position"] = task_data->locked_position; + data["usable_locked_position"] = task_data->usable_locked_position; + + data["profit_price"] = task_data->profit_price; + data["buy_cost"] = task_data->buy_cost; + data["profit_cost"] = task_data->profit_cost; + data["market_value"] = task_data->market_value; + + data["margin"] = task_data->margin; + data["last_buy_cost"] = task_data->last_buy_cost; + data["last_profit_cost"] = task_data->last_profit_cost; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryPosition(data, error, task->task_id, task->task_last, task->addtional_int); + + delete task; +}; + +void TraderApi::processQueryAsset(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryAssetRsp *task_data = (XTPQueryAssetRsp*)task->task_data; + + data["total_asset"] = task_data->total_asset; + data["buying_power"] = task_data->buying_power; + data["security_asset"] = task_data->security_asset; + data["fund_buy_amount"] = task_data->fund_buy_amount; + data["fund_buy_fee"] = task_data->fund_buy_fee; + data["fund_sell_amount"] = task_data->fund_sell_amount; + data["fund_sell_fee"] = task_data->fund_sell_fee; + data["withholding_amount"] = task_data->withholding_amount; + data["account_type"] = (int)task_data->account_type; + + data["frozen_margin"] = task_data->frozen_margin; + data["frozen_exec_cash"] = task_data->frozen_exec_cash; + data["frozen_exec_fee"] = task_data->frozen_exec_fee; + data["pay_later"] = task_data->pay_later; + data["preadva_pay"] = task_data->preadva_pay; + data["orig_banlance"] = task_data->orig_banlance; + data["banlance"] = task_data->banlance; + data["deposit_withdraw"] = task_data->deposit_withdraw; + data["trade_netting"] = task_data->trade_netting; + data["captial_asset"] = task_data->captial_asset; + data["force_freeze_amount"] = task_data->force_freeze_amount; + data["preferred_amount"] = task_data->preferred_amount; + + data["repay_stock_aval_banlance"] = task_data->repay_stock_aval_banlance; + data["fund_order_data_charges"] = task_data->fund_order_data_charges; + data["fund_cancel_data_charges"] = task_data->fund_cancel_data_charges; + data["exchange_cur_risk_degree"] = task_data->exchange_cur_risk_degree; + data["company_cur_risk_degree"] = task_data->company_cur_risk_degree; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryAsset(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryStructuredFund(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPStructuredFundInfo *task_data = (XTPStructuredFundInfo*)task->task_data; + data["exchange_id"] = (int)task_data->exchange_id; + data["sf_ticker"] = addEndingChar(task_data->sf_ticker); + data["sf_ticker_name"] = addEndingChar(task_data->sf_ticker_name); + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["split_merge_status"] = (int)task_data->split_merge_status; + data["ratio"] = task_data->ratio; + data["min_split_qty"] = task_data->min_split_qty; + data["min_merge_qty"] = task_data->min_merge_qty; + data["net_price"] = task_data->net_price; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryStructuredFund(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryFundTransfer(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPFundTransferNotice *task_data = (XTPFundTransferNotice*)task->task_data; + data["serial_id"] = task_data->serial_id; + data["transfer_type"] = (int)task_data->transfer_type; + data["amount"] = task_data->amount; + data["oper_status"] = (int)task_data->oper_status; + data["transfer_time"] = task_data->transfer_time; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryFundTransfer(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processFundTransfer(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPFundTransferNotice *task_data = (XTPFundTransferNotice*)task->task_data; + data["serial_id"] = task_data->serial_id; + data["transfer_type"] = (int)task_data->transfer_type; + data["amount"] = task_data->amount; + data["oper_status"] = (int)task_data->oper_status; + data["transfer_time"] = task_data->transfer_time; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onFundTransfer(data, error, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryETF(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryETFBaseRsp *task_data = (XTPQueryETFBaseRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["etf"] = addEndingChar(task_data->etf); + data["subscribe_redemption_ticker"] = addEndingChar(task_data->subscribe_redemption_ticker); + data["unit"] = task_data->unit; + data["subscribe_status"] = task_data->subscribe_status; + data["redemption_status"] = task_data->redemption_status; + data["max_cash_ratio"] = task_data->max_cash_ratio; + data["estimate_amount"] = task_data->estimate_amount; + data["cash_component"] = task_data->cash_component; + data["net_value"] = task_data->net_value; + data["total_amount"] = task_data->total_amount; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryETF(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryETFBasket(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryETFComponentRsp *task_data = (XTPQueryETFComponentRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["component_ticker"] = addEndingChar(task_data->component_ticker); + data["component_name"] = addEndingChar(task_data->component_name); + data["quantity"] = task_data->quantity; + data["component_market"] = (int)task_data->component_market; + data["replace_type"] = (int)task_data->replace_type; + data["premium_ratio"] = task_data->premium_ratio; + data["amount"] = task_data->amount; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryETFBasket(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryIPOInfoList(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryIPOTickerRsp *task_data = (XTPQueryIPOTickerRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["ticker_type"] = int(task_data->ticker_type); + data["price"] = task_data->price; + data["unit"] = task_data->unit; + data["qty_upper_limit"] = task_data->qty_upper_limit; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryIPOInfoList(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryIPOQuotaInfo(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryIPOQuotaRsp *task_data = (XTPQueryIPOQuotaRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["tech_quantity"] = (int)task_data->tech_quantity; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryIPOQuotaInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + +void TraderApi::processQueryBondIPOInfoList(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryIPOTickerRsp *task_data = (XTPQueryIPOTickerRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["ticker_name"] = addEndingChar(task_data->ticker_name); + data["ticker_type"] = (int)task_data->ticker_type; + data["price"] = task_data->price; + data["unit"] = task_data->unit; + data["qty_upper_limit"] = task_data->qty_upper_limit; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryBondIPOInfoList(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryBondSwapStockInfo(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryBondSwapStockRsp *task_data = (XTPQueryBondSwapStockRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["underlying_ticker"] = addEndingChar(task_data->underlying_ticker); + data["unit"] = task_data->unit; + data["qty_min"] = task_data->qty_min; + data["qty_max"] = task_data->qty_max; + data["swap_price"] = task_data->swap_price; + data["swap_flag"] = task_data->swap_flag; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryBondSwapStockInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionAuctionInfo(Task *task) +{ + PyLock lock; + dict data; + if (task->task_data) + { + XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; + data["ticker"] = addEndingChar(task_data->ticker); + data["security_id_source"] = (int)task_data->security_id_source; + data["symbol"] = addEndingChar(task_data->symbol); + data["contract_id"] = addEndingChar(task_data->contract_id); + data["underlying_security_id"] = addEndingChar(task_data->underlying_security_id); + data["underlying_security_id_source"] = (int)task_data->underlying_security_id_source; + + data["list_date"] = task_data->list_date; + data["last_trade_date"] = task_data->last_trade_date; + data["ticker_type"] = (int)task_data->ticker_type; + data["day_trading"] = task_data->day_trading; + + data["call_or_put"] = (int)task_data->call_or_put; + data["delivery_day"] = task_data->delivery_day; + data["delivery_month"] = task_data->delivery_month; + + data["exercise_type"] = (int)task_data->exercise_type; + data["exercise_begin_date"] = task_data->exercise_begin_date; + data["exercise_end_date"] = task_data->exercise_end_date; + data["exercise_price"] = task_data->exercise_price; + + data["qty_unit"] = task_data->qty_unit; + data["contract_unit"] = task_data->contract_unit; + data["contract_position"] = task_data->contract_position; + + data["prev_close_price"] = task_data->prev_close_price; + data["prev_clearing_price"] = task_data->prev_clearing_price; + + data["lmt_buy_max_qty"] = task_data->lmt_buy_max_qty; + data["lmt_buy_min_qty"] = task_data->lmt_buy_min_qty; + data["lmt_sell_max_qty"] = task_data->lmt_sell_max_qty; + data["lmt_sell_min_qty"] = task_data->lmt_sell_min_qty; + data["mkt_buy_max_qty"] = task_data->mkt_buy_max_qty; + data["mkt_buy_min_qty"] = task_data->mkt_buy_min_qty; + data["mkt_sell_max_qty"] = task_data->mkt_sell_max_qty; + data["mkt_sell_min_qty"] = task_data->mkt_sell_min_qty; + + data["price_tick"] = task_data->price_tick; + data["upper_limit_price"] = task_data->upper_limit_price; + data["lower_limit_price"] = task_data->lower_limit_price; + data["sell_margin"] = task_data->sell_margin; + data["margin_ratio_param1"] = task_data->margin_ratio_param1; + data["margin_ratio_param2"] = task_data->margin_ratio_param2; + + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionAuctionInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +}; + + +void TraderApi::processCreditCashRepay(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdCashRepayRsp *task_data = (XTPCrdCashRepayRsp*)task->task_data; + data["xtp_id"] = task_data->xtp_id; + data["request_amount"] = task_data->request_amount; + data["cash_repay_amount"] = task_data->cash_repay_amount; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onCreditCashRepay(data, error, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditCashRepayInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdCashRepayInfo *task_data = (XTPCrdCashRepayInfo*)task->task_data; + data["xtp_id"] = task_data->xtp_id; + data["status"] = (int)task_data->status; + data["request_amount"] = task_data->request_amount; + data["cash_repay_amount"] = task_data->cash_repay_amount; + data["position_effect"] = (int)task_data->position_effect; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditCashRepayInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditFundInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdFundInfo *task_data = (XTPCrdFundInfo*)task->task_data; + data["maintenance_ratio"] = task_data->maintenance_ratio; + data["all_asset"] = task_data->all_asset; + data["all_debt"] = task_data->all_debt; + data["line_of_credit"] = task_data->line_of_credit; + data["guaranty"] = task_data->guaranty; + data["reserved"] = task_data->reserved; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditFundInfo(data, error, task->task_id, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditDebtInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdDebtInfo *task_data = (XTPCrdDebtInfo*)task->task_data; + data["debt_type"] = task_data->debt_type; + data["debt_id"] = addEndingChar(task_data->debt_id); + data["position_id"] = task_data->position_id; + data["order_xtp_id"] = task_data->order_xtp_id; + data["debt_status"] = task_data->debt_status; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["order_date"] = task_data->order_date; + data["end_date"] = task_data->end_date; + data["orig_end_date"] = task_data->orig_end_date; + data["is_extended"] = task_data->is_extended; + data["remain_amt"] = task_data->remain_amt; + data["remain_qty"] = task_data->remain_qty; + data["remain_principal"] = task_data->remain_principal; + data["due_right_qty"] = task_data->due_right_qty; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditDebtInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditTickerDebtInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdDebtStockInfo *task_data = (XTPCrdDebtStockInfo*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["stock_repay_quantity"] = task_data->stock_repay_quantity; + data["stock_total_quantity"] = task_data->stock_total_quantity; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditTickerDebtInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditAssetDebtInfo(Task *task) { + PyLock lock; + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditAssetDebtInfo(task->remain_amount, error, task->task_id, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditTickerAssignInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPClientQueryCrdPositionStkInfo *task_data = (XTPClientQueryCrdPositionStkInfo*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["limit_qty"] = task_data->limit_qty; + data["yesterday_qty"] = task_data->yesterday_qty; + data["left_qty"] = task_data->left_qty; + data["frozen_qty"] = task_data->frozen_qty; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditTickerAssignInfo(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditExcessStock(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPClientQueryCrdSurplusStkRspInfo *task_data = (XTPClientQueryCrdSurplusStkRspInfo*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["transferable_quantity"] = task_data->transferable_quantity; + data["transferred_quantity"] = task_data->transferred_quantity; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditExcessStock(data, error, task->task_id, task->addtional_int); + delete task; +} + + +void TraderApi::processQueryMulCreditExcessStock(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPClientQueryCrdSurplusStkRspInfo *task_data = (XTPClientQueryCrdSurplusStkRspInfo*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["transferable_quantity"] = task_data->transferable_quantity; + data["transferred_quantity"] = task_data->transferred_quantity; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryMulCreditExcessStock(data, error, task->task_id, task->addtional_int, task->task_last); + delete task; +} + +void TraderApi::processCreditExtendDebtDate(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCreditDebtExtendNotice *task_data = (XTPCreditDebtExtendNotice*)task->task_data; + data["xtpid"] = task_data->xtpid; + data["debt_id"] = addEndingChar(task_data->debt_id); + data["oper_status"] = (int)task_data->oper_status; + data["oper_time"] = task_data->oper_time; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onCreditExtendDebtDate(data, error, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditExtendDebtDateOrders(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCreditDebtExtendNotice *task_data = (XTPCreditDebtExtendNotice*)task->task_data; + data["xtpid"] = task_data->xtpid; + data["debt_id"] = addEndingChar(task_data->debt_id); + data["oper_status"] = (int)task_data->oper_status; + data["oper_time"] = task_data->oper_time; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditExtendDebtDateOrders(data, error,task->task_id,task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditFundExtraInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdFundExtraInfo *task_data = (XTPCrdFundExtraInfo*)task->task_data; + data["mf_rs_avl_used"] = task_data->mf_rs_avl_used; + data["security_capital"] = task_data->security_capital; + data["financing_debts"] = task_data->financing_debts; + data["short_sell_debts"] = task_data->short_sell_debts; + data["contract_debts_load"] = task_data->contract_debts_load; + data["reserve"] = addEndingChar(task_data->reserve); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditFundExtraInfo(data, error,task->task_id, task->addtional_int); + delete task; +} + +void TraderApi::processQueryCreditPositionExtraInfo(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdPositionExtraInfo *task_data = (XTPCrdPositionExtraInfo*)task->task_data; + data["market"] = (int)task_data->market; + data["ticker"] = addEndingChar(task_data->ticker); + data["mf_rs_avl_used"] = task_data->mf_rs_avl_used; + data["reserve"] = addEndingChar(task_data->reserve); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryCreditPositionExtraInfo(data, error,task->task_id,task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processCreditCashRepayDebtInterestFee(Task *task) { + PyLock lock; + dict data; + if (task->task_data) + { + XTPCrdCashRepayDebtInterestFeeRsp *task_data = (XTPCrdCashRepayDebtInterestFeeRsp*)task->task_data; + data["xtp_id"] = task_data->xtp_id; + data["request_amount"] = task_data->request_amount; + data["cash_repay_amount"] = task_data->cash_repay_amount; + data["debt_compact_id"] = addEndingChar(task_data->debt_compact_id); + data["unknow"] = addEndingChar(task_data->unknow); + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onCreditCashRepayDebtInterestFee(data, error, task->addtional_int); + delete task; +} + + + +void TraderApi::processOptionCombinedOrderEvent(Task *task) { + PyLock lock; + dict data; + + if (task->task_data){ + XTPOptCombOrderInfo *task_data = (XTPOptCombOrderInfo*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["update_time"] = task_data->update_time; + data["cancel_time"] = task_data->cancel_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = task_data->order_local_id; + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + } + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onOptionCombinedOrderEvent(data, error,task->addtional_int); + delete task; +} + +void TraderApi::processOptionCombinedTradeEvent(Task *task) { + PyLock lock; + + dict data; + if (task->task_data){ + XTPOptCombTradeReport *task_data = (XTPOptCombTradeReport*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["market"] = (int)task_data->market; + data["local_order_id"] = task_data->local_order_id; + data["exec_id"] = task_data->exec_id; + data["quantity"] = task_data->quantity; + data["trade_time"] = task_data->trade_time; + data["trade_amount"] = task_data->trade_amount; + data["report_index"] = task_data->report_index; + data["order_exch_id"] = task_data->order_exch_id; + data["trade_type"] = task_data->trade_type; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["branch_pbu"] = task_data->branch_pbu; + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + } + + this->onOptionCombinedTradeEvent(data,task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionCombinedOrders(Task *task) { + PyLock lock; + + dict data; + if (task->task_data){ + XTPQueryOptCombOrderRsp *task_data = (XTPQueryOptCombOrderRsp*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["update_time"] = task_data->update_time; + data["cancel_time"] = task_data->cancel_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = task_data->order_local_id; + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] =(int) task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + } + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionCombinedOrders(data, error, task->task_id, task->task_last,task->addtional_int); + delete task; +} + + +void TraderApi::processQueryOptionCombinedOrdersEx(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPOptCombOrderInfoEx *task_data = (XTPOptCombOrderInfoEx*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["update_time"] = task_data->update_time; + data["cancel_time"] = task_data->cancel_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = task_data->order_local_id; + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["order_exch_id"] = task_data->order_exch_id; + data["error_id"] = task_data->order_err_t.error_id; + data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + + boost::python::list leg_detail_list; + for (int i = 0; i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + this->onQueryOptionCombinedOrdersEx(data, error, task->task_id, task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionCombinedOrdersByPage(Task *task) { + PyLock lock; + + dict data; + if (task->task_data){ + XTPQueryOptCombOrderRsp *task_data = (XTPQueryOptCombOrderRsp*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["update_time"] = task_data->update_time; + data["cancel_time"] = task_data->cancel_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = task_data->order_local_id; + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + + } + + this->onQueryOptionCombinedOrdersByPage(data, task->req_count, task->order_sequence, task->query_reference, task->task_id, task->task_last,task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionCombinedOrdersByPageEx(Task *task) +{ + PyLock lock; + + dict data; + + if (task->task_data) + { + XTPOptCombOrderInfoEx *task_data = (XTPOptCombOrderInfoEx*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["order_cancel_client_id"] = task_data->order_cancel_client_id; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["market"] = (int)task_data->market; + data["quantity"] = task_data->quantity; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["qty_traded"] = task_data->qty_traded; + data["qty_left"] = task_data->qty_left; + data["insert_time"] = task_data->insert_time; + data["update_time"] = task_data->update_time; + data["cancel_time"] = task_data->cancel_time; + data["trade_amount"] = task_data->trade_amount; + data["order_local_id"] = task_data->order_local_id; + data["order_status"] = (int)task_data->order_status; + data["order_submit_status"] = (int)task_data->order_submit_status; + data["order_type"] = task_data->order_type; + data["order_exch_id"] = task_data->order_exch_id; + data["error_id"] = task_data->order_err_t.error_id; + data["error_msg"] = addEndingChar(task_data->order_err_t.error_msg); + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + + boost::python::list leg_detail_list; + for (int i = 0; i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + delete task->task_data; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionCombinedOrdersByPageEx(data, task->req_count, task->order_sequence, task->query_reference, task->task_id, task->task_last, task->addtional_int); + delete task; + +} + +void TraderApi::processQueryOptionCombinedTrades(Task *task) { + PyLock lock; + + dict data; + if (task->task_data){ + XTPQueryOptCombTradeRsp *task_data = (XTPQueryOptCombTradeRsp*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["market"] = (int)task_data->market; + data["local_order_id"] = task_data->local_order_id; + data["exec_id"] = task_data->exec_id; + data["quantity"] = task_data->quantity; + data["trade_time"] = task_data->trade_time; + data["trade_amount"] = task_data->trade_amount; + data["report_index"] = task_data->report_index; + data["order_exch_id"] = task_data->order_exch_id; + data["trade_type"] = task_data->trade_type; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["branch_pbu"] = task_data->branch_pbu; + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + } + + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionCombinedTrades(data, error, task->task_id, task->task_last,task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionCombinedTradesByPage(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPQueryOptCombTradeRsp *task_data = (XTPQueryOptCombTradeRsp*)task->task_data; + data["order_xtp_id"] = task_data->order_xtp_id; + data["order_client_id"] = task_data->order_client_id; + data["market"] = (int)task_data->market; + data["local_order_id"] = task_data->local_order_id; + data["exec_id"] = task_data->exec_id; + data["quantity"] = task_data->quantity; + data["trade_time"] = task_data->trade_time; + data["trade_amount"] = task_data->trade_amount; + data["report_index"] = task_data->report_index; + data["order_exch_id"] = task_data->order_exch_id; + data["trade_type"] = task_data->trade_type; + data["side"] = (int)task_data->side; + data["business_type"] = (int)task_data->business_type; + data["branch_pbu"] = task_data->branch_pbu; + data["strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < task_data->opt_comb_info.num_legs; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + } + + + this->onQueryOptionCombinedTradesByPage(data, task->req_count, task->trade_sequence, task->query_reference, task->task_id, task->task_last,task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionCombinedPosition(Task *task) { + PyLock lock; + + dict data; + if (task->task_data){ + XTPQueryOptCombPositionRsp *task_data = (XTPQueryOptCombPositionRsp*)task->task_data; + data["strategy_id"] = task_data->strategy_id; + data["strategy_name"] = addEndingChar(task_data->strategy_name); + data["market"] = (int)task_data->market; + data["total_qty"] = task_data->total_qty; + data["available_qty"] = task_data->available_qty; + data["yesterday_position"] = task_data->yesterday_position; + data["comb_strategy_id"] = task_data->opt_comb_info.strategy_id; + data["comb_num"] = task_data->opt_comb_info.comb_num; + data["num_legs"] = task_data->opt_comb_info.num_legs; + boost::python::list leg_detail_list; + for (int i = 0;i < XTP_STRATEGE_LEG_NUM; i++) + { + dict leg_detail_dict; + leg_detail_dict["leg_security_id"] = task_data->opt_comb_info.leg_detail[i].leg_security_id; + leg_detail_dict["leg_cntr_type"] = (int)task_data->opt_comb_info.leg_detail[i].leg_cntr_type; + leg_detail_dict["leg_side"] = (int)task_data->opt_comb_info.leg_detail[i].leg_side; + leg_detail_dict["leg_covered"] = (int)task_data->opt_comb_info.leg_detail[i].leg_covered; + leg_detail_dict["leg_qty"] = task_data->opt_comb_info.leg_detail[i].leg_qty; + leg_detail_list.append(leg_detail_dict); + } + data["leg_detail"] = leg_detail_list; + data["secu_comb_margin"] = task_data->secu_comb_margin; + } + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionCombinedPosition(data, error, task->task_id, task->task_last,task->addtional_int); + delete task; +} + +void TraderApi::processQueryOptionCombinedStrategyInfo(Task *task) { + PyLock lock; + + dict data; + if (task->task_data){ + + XTPQueryCombineStrategyInfoRsp *task_data = (XTPQueryCombineStrategyInfoRsp*)task->task_data; + //printf("task_data->strategy_id:%s,strategy_name:%s\n",task_data->strategy_id,task_data->strategy_name); + data["strategy_id"] = addEndingChar(task_data->strategy_id); + //char strategy_name[64] = {"\0"}; + //printf("sizeof(task_data->strategy_name):%d",sizeof(task_data->strategy_name)); + //strcpy(strategy_name, task_data->strategy_name); + //printf("task_data->strategy_name:%s",strategy_name); + //string strategy_name = addEndingChar(task_data->strategy_name); + //printf("value:%s\n", task_data->strategy_name); + //if (string(task_data->strategy_id) == "ZBD") + // return; + + data["strategy_name"] = addEndingChar(task_data->strategy_name); + data["market"] = (int)task_data->market; + data["leg_num"] = task_data->leg_num; + boost::python::list leg_strategy_list; + + for (int i = 0;i < XTP_STRATEGE_LEG_NUM; i++) + { + dict leg_strategy_dict; + leg_strategy_dict["call_or_put"] = (int)task_data->leg_strategy[i].call_or_put; + leg_strategy_dict["position_side"] = (int)task_data->leg_strategy[i].position_side; + char price_seq = task_data->leg_strategy[i].exercise_price_seq; + leg_strategy_dict["exercise_price_seq"] = price_seq; + leg_strategy_dict["expire_date_seq"] = task_data->leg_strategy[i].expire_date_seq; + leg_strategy_dict["leg_qty"] = task_data->leg_strategy[i].leg_qty; + leg_strategy_list.append(leg_strategy_dict); + } + + data["leg_strategy"] = leg_strategy_list; + data["expire_date_type"] = (int)task_data->expire_date_type; + data["underlying_type"] = (int)task_data->underlying_type; + data["auto_sep_type"] = (int)task_data->auto_sep_type; + } + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionCombinedStrategyInfo(data, error, task->task_id, task->task_last,task->addtional_int); + delete task; +} + + +void TraderApi::processCancelOptionCombinedOrderError(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPOptCombOrderCancelInfo *task_data = (XTPOptCombOrderCancelInfo*)task->task_data; + data["order_cancel_xtp_id"] = task_data->order_cancel_xtp_id; + data["order_xtp_id"] = task_data->order_xtp_id; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onCancelOptionCombinedOrderError(data, error,task->addtional_int); + delete task; +} + + +void TraderApi::processQueryOptionCombinedExecPosition(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPQueryOptCombExecPosRsp *task_data = (XTPQueryOptCombExecPosRsp*)task->task_data; + data["market"] = (int)task_data->market; + data["cntrt_code_1"] = addEndingChar(task_data->cntrt_code_1); + data["cntrt_name_1"] = addEndingChar(task_data->cntrt_name_1); + data["position_side_1"] = (int)task_data->position_side_1; + data["call_or_put_1"] = (int)task_data->call_or_put_1; + data["avl_qty_1"] = task_data->avl_qty_1; + data["orig_own_qty_1"] = task_data->orig_own_qty_1; + data["own_qty_1"] = task_data->own_qty_1; + + data["cntrt_code_2"] = addEndingChar(task_data->cntrt_code_2); + data["cntrt_name_2"] = addEndingChar(task_data->cntrt_name_2); + data["position_side_2"] = (int)task_data->position_side_2; + data["call_or_put_2"] = (int)task_data->call_or_put_2; + data["avl_qty_2"] = task_data->avl_qty_2; + data["orig_own_qty_2"] = task_data->orig_own_qty_2; + data["own_qty_2"] = task_data->own_qty_2; + + data["net_qty"] = task_data->net_qty; + data["order_qty"] = task_data->order_qty; + data["confirm_qty"] = task_data->confirm_qty; + data["avl_qty"] = task_data->avl_qty; + //data["reserved"] = task_data->reserved; + } + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOptionCombinedExecPosition(data, error,task->task_id, task->task_last,task->addtional_int); + delete task; +} + +void TraderApi::processQueryOtherServerFund(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPFundQueryRsp *task_data = (XTPFundQueryRsp*)task->task_data; + data["amount"] = task_data->amount; + data["query_type"] = (int)task_data->query_type; + } + + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onQueryOtherServerFund(data, error,task->task_id,task->addtional_int); + delete task; +} + + +//////////algo///////// +void TraderApi::processQueryStrategy(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_state; + data["m_client_strategy_id"] = task_data->m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; + + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + this->onQueryStrategy(data,task->strategy_param, error,task->task_id,task->task_last,task->addtional_int); + delete task; +} + + +void TraderApi::processStrategyStateReport(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPStrategyStateReportStruct *task_data = (XTPStrategyStateReportStruct*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_info.m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_info.m_strategy_state; + data["m_client_strategy_id"] = task_data->m_strategy_info.m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_strategy_info.m_xtp_strategy_id; + + data["m_strategy_qty"] = task_data->m_strategy_qty; + data["m_strategy_ordered_qty"] = task_data->m_strategy_ordered_qty; + data["m_strategy_cancelled_qty"] = task_data->m_strategy_cancelled_qty; + data["m_strategy_execution_qty"] = task_data->m_strategy_execution_qty; + data["m_strategy_unclosed_qty"] = task_data->m_strategy_unclosed_qty; + data["m_strategy_asset"] = task_data->m_strategy_asset; + data["m_strategy_ordered_asset"] = task_data->m_strategy_ordered_asset; + data["m_strategy_execution_asset"] = task_data->m_strategy_execution_asset; + data["m_strategy_execution_price"] = task_data->m_strategy_execution_price; + data["m_strategy_market_price"] = task_data->m_strategy_market_price; + data["m_strategy_price_diff"] = task_data->m_strategy_price_diff; + data["m_strategy_asset_diff"] = task_data->m_strategy_asset_diff; + + data["error_id"] = task_data->m_error_info.error_id; + data["error_msg"] = addEndingChar(task_data->m_error_info.error_msg); + } + + + this->onStrategyStateReport(data,task->addtional_int); + delete task; +} + +void TraderApi::processALGOUserEstablishChannel(Task *task) { + PyLock lock; + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onALGOUserEstablishChannel(task->user, error,task->addtional_int); + delete task; +} + +void TraderApi::processInsertAlgoOrder(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_state; + data["m_client_strategy_id"] = task_data->m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; + + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onInsertAlgoOrder(data, error,task->addtional_int); + delete task; +} + +void TraderApi::processCancelAlgoOrder(Task *task) { + PyLock lock; + dict data; + if (task->task_data){ + XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_state; + data["m_client_strategy_id"] = task_data->m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; + + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onCancelAlgoOrder(data, error,task->addtional_int); + delete task; +} + +void TraderApi::processAlgoDisconnected(Task *task) { + PyLock lock; + + this->onAlgoDisconnected(task->reason); + delete task; +} + +void TraderApi::processAlgoConnected(Task *task) { + PyLock lock; + + this->onAlgoConnected(); + delete task; +} + +void TraderApi::processStrategySymbolStateReport(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategySymbolStateReport *task_data = (XTPStrategySymbolStateReport*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_info.m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_info.m_strategy_state; + data["m_client_strategy_id"] = task_data->m_strategy_info.m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_strategy_info.m_xtp_strategy_id; + data["m_ticker"] = addEndingChar(task_data->m_ticker); + data["m_market"] = (int)task_data->m_market; + data["m_side"] = (int)task_data->m_side; + data["m_strategy_qty"] = task_data->m_strategy_qty; + data["m_strategy_ordered_qty"] = task_data->m_strategy_ordered_qty; + data["m_strategy_cancelled_qty"] = task_data->m_strategy_cancelled_qty; + data["m_strategy_execution_qty"] = task_data->m_strategy_execution_qty; + data["m_strategy_buy_qty"] = task_data->m_strategy_buy_qty; + data["m_strategy_sell_qty"] = task_data->m_strategy_sell_qty; + data["m_strategy_unclosed_qty"] = task_data->m_strategy_unclosed_qty; + data["m_strategy_asset"] = task_data->m_strategy_asset; + data["m_strategy_ordered_asset"] = task_data->m_strategy_ordered_asset; + data["m_strategy_execution_asset"] = task_data->m_strategy_execution_asset; + data["m_strategy_buy_asset"] = task_data->m_strategy_buy_asset; + data["m_strategy_sell_asset"] = task_data->m_strategy_sell_asset; + data["m_strategy_unclosed_asset"] = task_data->m_strategy_unclosed_asset; + data["m_strategy_asset_diff"] = task_data->m_strategy_asset_diff; + data["m_strategy_execution_price"] = task_data->m_strategy_execution_price; + data["m_strategy_market_price"] = task_data->m_strategy_market_price; + data["m_strategy_price_diff"] = task_data->m_strategy_price_diff; + data["error_id"] = task_data->m_error_info.error_id; + data["error_msg"] = addEndingChar(task_data->m_error_info.error_msg); + + delete task->task_data; + } + this->onStrategySymbolStateReport(data, task->addtional_int); + delete task; +} + +void TraderApi::processNewStrategyCreateReport(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_state; + data["m_client_strategy_id"] = task_data->m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; + } + + this->onNewStrategyCreateReport(data, task->strategy_param, task->addtional_int); + delete task; +} + +void TraderApi::processStrategyRecommendation(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyRecommendationInfo *task_data = (XTPStrategyRecommendationInfo*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_type; + data["m_market"] = (int)task_data->m_market; + data["m_ticker"] = addEndingChar(task_data->m_ticker); + data["m_reserved"] = addEndingChar(task_data->m_reserved); + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onStrategyRecommendation(task->addtional_bool, data, task->strategy_param, error, task->task_id,task->task_last, task->addtional_int); + delete task; +} + +void TraderApi::processModifyAlgoOrder(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyInfoStruct *task_data = (XTPStrategyInfoStruct*)task->task_data; + data["m_strategy_type"] = task_data->m_strategy_type; + data["m_strategy_state"] = (int)task_data->m_strategy_state; + data["m_client_strategy_id"] = task_data->m_client_strategy_id; + data["m_xtp_strategy_id"] = task_data->m_xtp_strategy_id; + } + + dict error; + if (task->task_error) + { + XTPRI *task_error = (XTPRI*)task->task_error; + error["error_id"] = task_error->error_id; + error["error_msg"] = addEndingChar(task_error->error_msg); + delete task->task_error; + } + + this->onModifyAlgoOrder(data, error, task->addtional_int); + delete task; +} + +///------------------------------------------------------------------------------------- +/// +///------------------------------------------------------------------------------------- + +void TraderApi::createTraderApi(uint8_t clientid, string path, int log_level) +{ + this->api = XTP::API::TraderApi::CreateTraderApi(clientid, path.c_str(),(XTP_LOG_LEVEL)log_level); + this->api->RegisterSpi(this); +}; + +void TraderApi::release() +{ + this->api->Release(); +}; + +int TraderApi::exit() +{ + //úԭAPIûУڰȫ˳APIãԭjoinƺ̫ȶ + this->api->RegisterSpi(NULL); + this->api->Release(); + this->api = NULL; + return 1; +}; + +string TraderApi::getTradingDay() +{ + string ret =""; + const char* p = this->api->GetTradingDay(); + if (p == NULL) + ret = "NULL"; + else + ret = p; + return ret; +}; + +dict TraderApi::getApiLastError() +{ + dict d; + XTPRI *error = this->api->GetApiLastError(); + if(error == NULL) + return d; + + d["error_id"] = error->error_id; + d["error_msg"] = addEndingChar(error->error_msg); + + return d; +} + +string TraderApi::getApiVersion() +{ + string ret =""; + const char* p = this->api->GetApiVersion(); + if (p == NULL) + ret = "NULL"; + else + ret = p; + return ret; +} + +uint8_t TraderApi::getClientIDByXTPID(uint64_t orderid) +{ + return this->api->GetClientIDByXTPID(orderid); +} + +string TraderApi::getAccountByXTPID(uint64_t orderid) +{ + string ret =""; + const char* p = this->api->GetAccountByXTPID(orderid); + if (p == NULL) + ret = "NULL"; + else + ret = p; + + return ret; +} + +void TraderApi::subscribePublicTopic(int type) +{ + this->api->SubscribePublicTopic((XTP_TE_RESUME_TYPE)type); +} + +void TraderApi::setSoftwareKey(string key) +{ + this->api->SetSoftwareKey(key.c_str()); +} + +void TraderApi::setSoftwareVersion(string version) +{ + this->api->SetSoftwareVersion(version.c_str()); +} + +void TraderApi::setHeartBeatInterval(uint32_t interval) +{ + this->api->SetHeartBeatInterval(interval); +}; + +uint64_t TraderApi::login(string ip, int port, string user, string password, int socktype,string local_ip) +{ + return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype,local_ip.c_str()); +}; + +int TraderApi::logout(uint64_t sessionid) +{ + return this->api->Logout(sessionid); +}; + +int TraderApi::modifyUserTerminalInfo(dict info, uint64_t session_id) +{ + XTPUserTerminalInfoReq myreq = XTPUserTerminalInfoReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(info, "local_ip", myreq.local_ip); + getStr(info, "mac_addr", myreq.mac_addr); + getStr(info, "hd", myreq.hd); + + int term_type; + getInt(info, "term_type", &term_type); + getStr(info, "internet_ip", myreq.internet_ip); + getInt(info, "internet_port", &myreq.internet_port); + getStr(info, "client_version", myreq.client_version); + getStr(info, "macos_sno", myreq.macos_sno); + getStr(info, "unused", myreq.unused); + + myreq.term_type = (XTPTerminalType)term_type; + + return this->api->ModifyUserTerminalInfo(&myreq, session_id); + +} + +int TraderApi::queryAccountTradeMarket(uint64_t session_id, int request_id) +{ + return this->api->QueryAccountTradeMarket(session_id, request_id); +} + +uint64_t TraderApi::getANewOrderXTPID(uint64_t session_id) +{ + return this->api->GetANewOrderXTPID(session_id); +} + + +uint64_t TraderApi::insertOrder(dict req, uint64_t sessionid) +{ + XTPOrderInsertInfo myreq = XTPOrderInsertInfo(); + memset(&myreq, 0, sizeof(myreq)); + getDouble(req, "stop_price", &myreq.stop_price); + getDouble(req, "price", &myreq.price); + getStr(req, "ticker", myreq.ticker); + + getUint32(req, "order_client_id", &myreq.order_client_id); + getUint64(req, "order_xtp_id", &myreq.order_xtp_id); + getInt64(req, "quantity", &myreq.quantity); + + int price_type; + int side; + int position_effect; + int reserved1; + int reserved2; + int market; + int business_type; + getInt(req, "price_type", &price_type); + getInt(req, "side", &side); + getInt(req, "position_effect", &position_effect); + getInt(req, "reserved1", &reserved1); + getInt(req, "reserved2", &reserved2); + getInt(req, "market", &market); + getInt(req, "business_type", &business_type); + myreq.price_type = (XTP_PRICE_TYPE)price_type; + myreq.side = (XTP_SIDE_TYPE)side; + myreq.position_effect = (XTP_POSITION_EFFECT_TYPE)position_effect; + myreq.reserved1 = reserved1; + myreq.reserved2 = reserved2; + myreq.market = (XTP_MARKET_TYPE)market; + myreq.business_type = (XTP_BUSINESS_TYPE)business_type; + + return this->api->InsertOrder(&myreq, sessionid); +}; + +uint64_t TraderApi::insertOrderExtra(dict req, uint64_t session_id) +{ + XTPOrderInsertInfo myreq = XTPOrderInsertInfo(); + memset(&myreq, 0, sizeof(myreq)); + getDouble(req, "stop_price", &myreq.stop_price); + getDouble(req, "price", &myreq.price); + getStr(req, "ticker", myreq.ticker); + + getUint32(req, "order_client_id", &myreq.order_client_id); + getUint64(req, "order_xtp_id", &myreq.order_xtp_id); + getInt64(req, "quantity", &myreq.quantity); + + int price_type; + int side; + int position_effect; + int reserved1; + int reserved2; + int market; + int business_type; + getInt(req, "price_type", &price_type); + getInt(req, "side", &side); + getInt(req, "position_effect", &position_effect); + getInt(req, "reserved1", &reserved1); + getInt(req, "reserved2", &reserved2); + getInt(req, "market", &market); + getInt(req, "business_type", &business_type); + myreq.price_type = (XTP_PRICE_TYPE)price_type; + myreq.side = (XTP_SIDE_TYPE)side; + myreq.position_effect = (XTP_POSITION_EFFECT_TYPE)position_effect; + myreq.reserved1 = reserved1; + myreq.reserved2 = reserved2; + myreq.market = (XTP_MARKET_TYPE)market; + myreq.business_type = (XTP_BUSINESS_TYPE)business_type; + + return this->api->InsertOrderExtra(&myreq, session_id); +} + +uint64_t TraderApi::cancelOrder(uint64_t orderid, uint64_t sessionid) +{ + return this->api->CancelOrder(orderid, sessionid); +} + +int TraderApi::queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid) +{ + return this->api->QueryOrderByXTPID(orderid, sessionid, reqid); +}; + +int TraderApi::queryOrderByXTPIDEx(uint64_t orderid, uint64_t sessionid, int reqid) +{ + return this->api->QueryOrderByXTPIDEx(orderid, sessionid, reqid); +} + +int TraderApi::queryOrders(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryOrderReq myreq = XTPQueryOrderReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + getInt64(req, "end_time", &myreq.end_time); + getInt64(req, "begin_time", &myreq.begin_time); + return this->api->QueryOrders(&myreq, sessionid, reqid); +}; + +int TraderApi::queryOrdersEx(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryOrderReq myreq = XTPQueryOrderReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + getInt64(req, "end_time", &myreq.end_time); + getInt64(req, "begin_time", &myreq.begin_time); + int ret = this->api->QueryOrdersEx(&myreq, sessionid, reqid); + return ret; +} + +int TraderApi::queryUnfinishedOrders(uint64_t sessionid, int reqid) +{ + return this->api->QueryUnfinishedOrders(sessionid, reqid); +}; + +int TraderApi::queryUnfinishedOrdersEx(uint64_t sessionid, int reqid) +{ + return this->api->QueryUnfinishedOrdersEx(sessionid, reqid); +} + +int TraderApi::queryTradesByXTPID(uint64_t orderid, uint64_t sessionid, int reqid) +{ + return this->api->QueryTradesByXTPID(orderid, sessionid, reqid); +}; + +int TraderApi::queryTrades(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryTraderReq myreq = XTPQueryTraderReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + getInt64(req, "end_time", &myreq.end_time); + getInt64(req, "begin_time", &myreq.begin_time); + return this->api->QueryTrades(&myreq, sessionid, reqid); +}; + +int TraderApi::queryPosition(string ticker, uint64_t sessionid, int reqid) +{ + return this->api->QueryPosition(ticker.c_str(), sessionid, reqid); +}; + +int TraderApi::queryAsset(uint64_t sessionid, int reqid) +{ + return this->api->QueryAsset(sessionid, reqid); +}; + +int TraderApi::queryStructuredFund(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryStructuredFundInfoReq myreq = XTPQueryStructuredFundInfoReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "sf_ticker", myreq.sf_ticker); + + int exchange_id; + getInt(req, "exchange_id", &exchange_id); + myreq.exchange_id = (XTP_EXCHANGE_TYPE)exchange_id; + + return this->api->QueryStructuredFund(&myreq, sessionid, reqid); + +}; + +uint64_t TraderApi::fundTransfer(dict req, uint64_t sessionid) +{ + XTPFundTransferReq myreq = XTPFundTransferReq(); + memset(&myreq, 0, sizeof(myreq)); + getUint64(req, "serial_id", &myreq.serial_id); + getStr(req, "fund_account", myreq.fund_account); + getStr(req, "password", myreq.password); + getDouble(req, "amount", &myreq.amount); + + int transfer_type; + getInt(req, "transfer_type", &transfer_type); + myreq.transfer_type = (XTP_FUND_TRANSFER_TYPE)transfer_type; + + return this->api->FundTransfer(&myreq, sessionid); +}; + +int TraderApi::queryFundTransfer(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryFundTransferLogReq myreq = XTPQueryFundTransferLogReq(); + memset(&myreq, 0, sizeof(myreq)); + getUint64(req, "serial_id", &myreq.serial_id); + return this->api->QueryFundTransfer(&myreq, sessionid, reqid); +}; + +int TraderApi::queryETF(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryETFBaseReq myreq = XTPQueryETFBaseReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + + return this->api->QueryETF(&myreq, sessionid, reqid); +}; + +int TraderApi::queryETFTickerBasket(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryETFComponentReq myreq = XTPQueryETFComponentReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + + return this->api->QueryETFTickerBasket(&myreq, sessionid, reqid); +}; + +int TraderApi::queryIPOInfoList(uint64_t sessionid, int reqid) +{ + return this->api->QueryIPOInfoList(sessionid, reqid); +}; + +int TraderApi::queryIPOQuotaInfo(uint64_t sessionid, int reqid) +{ + return this->api->QueryIPOQuotaInfo(sessionid, reqid); +}; + +int TraderApi::queryBondIPOInfoList(uint64_t sessionid, int reqid) +{ + return this->api->QueryBondIPOInfoList(sessionid, reqid); +}; + +int TraderApi::queryBondSwapStockInfo(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryBondSwapStockReq myreq = XTPQueryBondSwapStockReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + return this->api->QueryBondSwapStockInfo(&myreq, sessionid, reqid); +}; + +int TraderApi::queryOptionAuctionInfo(dict req,uint64_t sessionid, int reqid) +{ + XTPQueryOptionAuctionInfoReq myreq = XTPQueryOptionAuctionInfoReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + return this->api->QueryOptionAuctionInfo(&myreq,sessionid, reqid); +}; + +uint64_t TraderApi::creditCashRepay(double remain_amount, uint64_t session_id = 0) { + return this->api->CreditCashRepay(remain_amount, session_id); +} + +int TraderApi::queryCreditCashRepayInfo(uint64_t session_id, int request_id) { + + return this->api->QueryCreditCashRepayInfo(session_id, request_id); +} + +int TraderApi::queryCreditFundInfo(uint64_t session_id, int request_id) { + return this->api->QueryCreditFundInfo(session_id, request_id); +} + +int TraderApi::queryCreditDebtInfo(uint64_t session_id, int request_id) { + return this->api->QueryCreditDebtInfo(session_id, request_id); +} + +int TraderApi::queryCreditTickerDebtInfo(dict req, uint64_t session_id, int request_id) { + XTPClientQueryCrdDebtStockReq myreq = XTPClientQueryCrdDebtStockReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + return this->api->QueryCreditTickerDebtInfo(&myreq, session_id, request_id); +} + +int TraderApi::queryCreditAssetDebtInfo(uint64_t session_id, int request_id) { + return this->api->QueryCreditAssetDebtInfo(session_id, request_id); +} + +int TraderApi::queryCreditTickerAssignInfo(dict req, uint64_t session_id, int request_id) { + XTPClientQueryCrdPositionStockReq myreq = XTPClientQueryCrdPositionStockReq(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + return this->api->QueryCreditTickerAssignInfo(&myreq, session_id, request_id); +} + +int TraderApi::queryCreditExcessStock(dict req, uint64_t session_id, int request_id) { + XTPClientQueryCrdSurplusStkReqInfo myreq = XTPClientQueryCrdSurplusStkReqInfo(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + return this->api->QueryCreditExcessStock(&myreq, session_id, request_id); +} + +int TraderApi::queryMulCreditExcessStock(dict req, uint64_t session_id, int request_id) { + XTPClientQueryCrdSurplusStkReqInfo myreq = XTPClientQueryCrdSurplusStkReqInfo(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "ticker", myreq.ticker); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + return this->api->QueryMulCreditExcessStock(&myreq, session_id, request_id); +} + +uint64_t TraderApi::creditExtendDebtDate(dict req,uint64_t session_id) { + XTPCreditDebtExtendReq myreq = XTPCreditDebtExtendReq(); + memset(&myreq, 0, sizeof(myreq)); + getUint64(req, "xtpid", &myreq.xtpid); + getStr(req, "debt_id", myreq.debt_id); + getUint32(req, "xtpid", &myreq.defer_days); + getStr(req, "fund_account", myreq.fund_account); + getStr(req, "password", myreq.password); + + return this->api->CreditExtendDebtDate(&myreq, session_id); +} + +int TraderApi::queryCreditExtendDebtDateOrders(uint64_t xtp_id, uint64_t session_id, int request_id) { + + return this->api->QueryCreditExtendDebtDateOrders(xtp_id, session_id, request_id); +} + +int TraderApi::queryCreditFundExtraInfo(uint64_t session_id, int request_id) { + + return this->api->QueryCreditFundExtraInfo(session_id, request_id); +} + +int TraderApi::queryCreditPositionExtraInfo(dict req, uint64_t session_id, int request_id) { + + XTPClientQueryCrdPositionStockReq myreq = XTPClientQueryCrdPositionStockReq(); + memset(&myreq, 0, sizeof(myreq)); + + int market; + getInt(req, "market", &market); + myreq.market = (XTP_MARKET_TYPE)market; + getStr(req, "ticker", myreq.ticker); + + return this->api->QueryCreditPositionExtraInfo(&myreq, session_id, request_id); +} + +int TraderApi::queryOrdersByPage(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryOrderByPageReq myreq = XTPQueryOrderByPageReq(); + memset(&myreq, 0, sizeof(myreq)); + getInt64(req, "req_count", &myreq.req_count); + getInt64(req, "reference", &myreq.reference); + getInt64(req, "reserved", &myreq.reserved); + return this->api->QueryOrdersByPage(&myreq, sessionid, reqid); +}; + +int TraderApi::queryOrdersByPageEx(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryOrderByPageReq myreq = XTPQueryOrderByPageReq(); + memset(&myreq, 0, sizeof(myreq)); + getInt64(req, "req_count", &myreq.req_count); + getInt64(req, "reference", &myreq.reference); + getInt64(req, "reserved", &myreq.reserved); + return this->api->QueryOrdersByPageEx(&myreq, sessionid, reqid); +} + +int TraderApi::queryTradesByPage(dict req, uint64_t sessionid, int reqid) +{ + XTPQueryTraderByPageReq myreq = XTPQueryTraderByPageReq(); + memset(&myreq, 0, sizeof(myreq)); + getInt64(req, "req_count", &myreq.req_count); + getInt64(req, "reference", &myreq.reference); + getInt64(req, "reserved", &myreq.reserved); + return this->api->QueryTradesByPage(&myreq, sessionid, reqid); +}; + +bool TraderApi::isServerRestart(uint64_t session_id) +{ + return this->api->IsServerRestart(session_id); +}; + +uint64_t TraderApi::creditCashRepayDebtInterestFee(string debt_id, double amount, uint64_t session_id) { + return this->api->CreditCashRepayDebtInterestFee(debt_id.c_str(),amount, session_id); +} + +uint64_t TraderApi::creditSellStockRepayDebtInterestFee(dict req, string debt_id, uint64_t session_id) { + XTPOrderInsertInfo myreq = XTPOrderInsertInfo(); + memset(&myreq, 0, sizeof(myreq)); + getDouble(req, "stop_price", &myreq.stop_price); + getDouble(req, "price", &myreq.price); + getStr(req, "ticker", myreq.ticker); + + getUint32(req, "order_client_id", &myreq.order_client_id); + getUint64(req, "order_xtp_id", &myreq.order_xtp_id); + getInt64(req, "quantity", &myreq.quantity); + + int price_type; + int side; + int position_effect; + int reserved1; + int reserved2; + int market; + int business_type; + getInt(req, "price_type", &price_type); + getInt(req, "side", &side); + getInt(req, "position_effect", &position_effect); + getInt(req, "reserved1", &reserved1); + getInt(req, "reserved2", &reserved2); + getInt(req, "market", &market); + getInt(req, "business_type", &business_type); + myreq.price_type = (XTP_PRICE_TYPE)price_type; + myreq.side = (XTP_SIDE_TYPE)side; + myreq.position_effect = (XTP_POSITION_EFFECT_TYPE)position_effect; + myreq.reserved1 = reserved1; + myreq.reserved2 = reserved2; + myreq.market = (XTP_MARKET_TYPE)market; + myreq.business_type = (XTP_BUSINESS_TYPE)business_type; + + return this->api->CreditSellStockRepayDebtInterestFee(&myreq,debt_id.c_str(),session_id); +} + + +uint64_t TraderApi::insertOptionCombinedOrder(dict req, uint64_t session_id) { + + XTPOptCombOrderInsertInfo query_param; + memset(&query_param, 0, sizeof(query_param)); + + getUint64(req, "order_xtp_id", &query_param.order_xtp_id); + getUint32(req, "order_client_id", &query_param.order_client_id); + + int side; + int market; + int business_type; + dict opt_comb_info; + + getInt(req, "side", &side); + getInt(req, "market", &market); + getInt(req, "business_type", &business_type); + query_param.side = (XTP_SIDE_TYPE)side; + query_param.market = (XTP_MARKET_TYPE)market; + query_param.business_type = (XTP_BUSINESS_TYPE)business_type; + + getNestedDictChar(req, "opt_comb_info", "strategy_id", query_param.opt_comb_info.strategy_id); + getNestedDictChar(req, "opt_comb_info", "comb_num", query_param.opt_comb_info.comb_num); + getNestedDictValue(req, "opt_comb_info", "num_legs", &query_param.opt_comb_info.num_legs); + + int leg_cntr_type; + int leg_side; + int leg_covered; + for (int i = 0; i< query_param.opt_comb_info.num_legs; i++) + { + getNestedDictChar2(req, "opt_comb_info", "leg_detail", "leg_security_id", query_param.opt_comb_info.leg_detail[i].leg_security_id, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_cntr_type", &leg_cntr_type, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_side", &leg_side, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_covered", &leg_covered, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_qty", &query_param.opt_comb_info.leg_detail[i].leg_qty, i); + query_param.opt_comb_info.leg_detail[i].leg_cntr_type = (XTP_OPT_CALL_OR_PUT_TYPE)leg_cntr_type; + query_param.opt_comb_info.leg_detail[i].leg_side = (XTP_POSITION_DIRECTION_TYPE)leg_side; + query_param.opt_comb_info.leg_detail[i].leg_covered = (XTP_OPT_COVERED_OR_UNCOVERED)leg_covered; + + } + + getInt64(req, "quantity", &query_param.quantity); + return this->api->InsertOptionCombinedOrder(&query_param, session_id); +} + +uint64_t TraderApi::insertOptionCombinedOrderExtra(dict req, uint64_t session_id) +{ + XTPOptCombOrderInsertInfo query_param; + memset(&query_param, 0, sizeof(query_param)); + + getUint64(req, "order_xtp_id", &query_param.order_xtp_id); + getUint32(req, "order_client_id", &query_param.order_client_id); + + int side; + int market; + int business_type; + dict opt_comb_info; + + getInt(req, "side", &side); + getInt(req, "market", &market); + getInt(req, "business_type", &business_type); + query_param.side = (XTP_SIDE_TYPE)side; + query_param.market = (XTP_MARKET_TYPE)market; + query_param.business_type = (XTP_BUSINESS_TYPE)business_type; + + getNestedDictChar(req, "opt_comb_info", "strategy_id", query_param.opt_comb_info.strategy_id); + getNestedDictChar(req, "opt_comb_info", "comb_num", query_param.opt_comb_info.comb_num); + getNestedDictValue(req, "opt_comb_info", "num_legs", &query_param.opt_comb_info.num_legs); + + int leg_cntr_type; + int leg_side; + int leg_covered; + for (int i = 0; i< query_param.opt_comb_info.num_legs; i++) + { + getNestedDictChar2(req, "opt_comb_info", "leg_detail", "leg_security_id", query_param.opt_comb_info.leg_detail[i].leg_security_id, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_cntr_type", &leg_cntr_type, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_side", &leg_side, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_covered", &leg_covered, i); + getNestedDictValue2(req, "opt_comb_info", "leg_detail", "leg_qty", &query_param.opt_comb_info.leg_detail[i].leg_qty, i); + query_param.opt_comb_info.leg_detail[i].leg_cntr_type = (XTP_OPT_CALL_OR_PUT_TYPE)leg_cntr_type; + query_param.opt_comb_info.leg_detail[i].leg_side = (XTP_POSITION_DIRECTION_TYPE)leg_side; + query_param.opt_comb_info.leg_detail[i].leg_covered = (XTP_OPT_COVERED_OR_UNCOVERED)leg_covered; + + } + + getInt64(req, "quantity", &query_param.quantity); + return this->api->InsertOptionCombinedOrderExtra(&query_param, session_id); +} + +int TraderApi::queryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id) { + + return this->api->QueryOptionCombinedUnfinishedOrders(session_id, request_id); +} + +int TraderApi::queryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id) +{ + return this->api->QueryOptionCombinedUnfinishedOrdersEx(session_id, request_id); +} + +int TraderApi::queryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) { + + return this->api->QueryOptionCombinedOrderByXTPID(order_xtp_id, session_id, request_id); +} + +int TraderApi::queryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) +{ + return this->api->QueryOptionCombinedOrderByXTPIDEx(order_xtp_id, session_id, request_id); +} + +int TraderApi::queryOptionCombinedOrders(dict req, uint64_t session_id, int request_id) { + + XTPQueryOptCombOrderReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + getStr(req, "comb_num", query_param.comb_num); + getInt64(req, "begin_time", &query_param.begin_time); + getInt64(req, "end_time", &query_param.end_time); + return this->api->QueryOptionCombinedOrders(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedOrdersEx(dict req, uint64_t session_id, int request_id) +{ + XTPQueryOptCombOrderReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + getStr(req, "comb_num", query_param.comb_num); + getInt64(req, "begin_time", &query_param.begin_time); + getInt64(req, "end_time", &query_param.end_time); + return this->api->QueryOptionCombinedOrdersEx(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedOrdersByPage(dict req, uint64_t session_id, int request_id) { + + XTPQueryOptCombOrderByPageReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + getInt64(req, "req_count", &query_param.req_count); + getInt64(req, "reference", &query_param.reference); + getInt64(req, "reserved", &query_param.reserved); + return this->api->QueryOptionCombinedOrdersByPage(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedOrdersByPageEx(dict req, uint64_t session_id, int request_id) +{ + XTPQueryOptCombOrderByPageReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + getInt64(req, "req_count", &query_param.req_count); + getInt64(req, "reference", &query_param.reference); + getInt64(req, "reserved", &query_param.reserved); + return this->api->QueryOptionCombinedOrdersByPageEx(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) { + + return this->api->QueryOptionCombinedTradesByXTPID(order_xtp_id, session_id, request_id); +} + +int TraderApi::queryOptionCombinedTrades(dict req, uint64_t session_id, int request_id) { + + XTPQueryOptCombTraderReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + getStr(req, "comb_num", query_param.comb_num); + getInt64(req, "begin_time", &query_param.begin_time); + getInt64(req, "end_time", &query_param.end_time); + return this->api->QueryOptionCombinedTrades(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedTradesByPage(dict req, uint64_t session_id, int request_id) { + + XTPQueryOptCombTraderByPageReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + getInt64(req, "req_count", &query_param.req_count); + getInt64(req, "reference", &query_param.reference); + getInt64(req, "reserved", &query_param.reserved); + return this->api->QueryOptionCombinedTradesByPage(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedPosition(dict req, uint64_t session_id, int request_id) { + + XTPQueryOptCombPositionReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + int market; + getStr(req, "comb_num", query_param.comb_num); + getInt(req, "market", &market); + query_param.market = (XTP_MARKET_TYPE)market; + + //getValue(req, "market", &query_param.market); + return this->api->QueryOptionCombinedPosition(&query_param, session_id, request_id); +} + +int TraderApi::queryOptionCombinedStrategyInfo(uint64_t session_id, int request_id) { + //getValue(req, "market", &query_param.market); + return this->api->QueryOptionCombinedStrategyInfo(session_id, request_id); +} + +uint64_t TraderApi::cancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id = 0) { + return this->api->CancelOptionCombinedOrder(order_xtp_id, session_id); +} + +int TraderApi::queryOptionCombinedExecPosition(dict req,uint64_t session_id, int request_id) { + XTPQueryOptCombExecPosReq query_param; + memset(&query_param, 0, sizeof(query_param)); + + int market; + getInt(req, "market", &market); + query_param.market = (XTP_MARKET_TYPE)market; + getStr(req, "cntrt_code_1", query_param.cntrt_code_1); + getStr(req, "cntrt_code_2", query_param.cntrt_code_2); + return this->api->QueryOptionCombinedExecPosition(&query_param,session_id, request_id); +} + +int TraderApi::queryOtherServerFund(dict req,uint64_t session_id, int request_id) { + XTPFundQueryReq query_param; + memset(&query_param, 0, sizeof(query_param)); + getChar(req, "fund_account", query_param.fund_account); + getChar(req, "password", query_param.password); + int query_type; + getInt(req, "query_type", &query_type); + query_param.query_type = (XTP_FUND_QUERY_TYPE)query_type; + return this->api->QueryOtherServerFund(&query_param,session_id, request_id); +} + + + +////////////////////algo////////////////// + +int TraderApi::loginALGO(string ip, int port, string user, string password, int socktype,string local_ip) +{ + return this->api->LoginALGO(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype,local_ip.c_str()); +}; + +int TraderApi::queryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id) +{ + return this->api->QueryStrategy(strategy_type, client_strategy_id,xtp_strategy_id, session_id, request_id); +}; + +int TraderApi::aLGOUserEstablishChannel(string oms_ip, int oms_port, string user, string password, uint64_t session_id) +{ + return this->api->ALGOUserEstablishChannel(oms_ip.c_str(), oms_port, user.c_str(), password.c_str(), session_id); +}; + +int TraderApi::insertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, string strategy_param, uint64_t session_id) +{ + return this->api->InsertAlgoOrder(strategy_type, client_strategy_id, (char*)strategy_param.c_str(), session_id); +}; + +int TraderApi::cancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id) +{ + return this->api->CancelAlgoOrder(cancel_flag, xtp_strategy_id, session_id); +}; + +uint64_t TraderApi::getAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id) +{ + return this->api->GetAlgorithmIDByOrder(order_xtp_id, order_client_id); +}; + +int TraderApi::strategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id) +{ + return this->api->StrategyRecommendation(basket_flag, basket_param, session_id, request_id); +}; + +int TraderApi::modifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id) +{ + return this->api->ModifyAlgoOrder(xtp_strategy_id, strategy_param, session_id); +}; + +///------------------------------------------------------------------------------------- +///Boost.Pythonװ +///------------------------------------------------------------------------------------- + +struct TraderApiWrap : TraderApi, wrapper < TraderApi > +{ + virtual void onDisconnected(uint64_t session, int reason) + { + try + { + this->get_override("onDisconnected")(session, reason); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onError(dict data) + { + try + { + this->get_override("onError")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryAccountTradeMarket(int trade_location, dict error, int request_id, uint64_t session_id) + { + try + { + this->get_override("onQueryAccountTradeMarket")(trade_location, error, request_id, session_id); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + } + + virtual void onOrderEvent(dict data, dict error, uint64_t session) + { + try + { + this->get_override("onOrderEvent")(data, error, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onTradeEvent(dict data, uint64_t session) + { + try + { + this->get_override("onTradeEvent")(data, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onCancelOrderError(dict data, dict error, uint64_t session) + { + try + { + this->get_override("onCancelOrderError")(data, error, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryOrder(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryOrder")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryOrderEx(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryOrderEx")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryOrderByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) + { + try + { + this->get_override("onQueryOrderByPage")(data,req_count,order_sequence, query_reference, reqid, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryOrderByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) + { + try + { + this->get_override("onQueryOrderByPageEx")(data, req_count, order_sequence, query_reference, reqid, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + } + + virtual void onQueryTrade(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryTrade")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) + { + try + { + this->get_override("onQueryTradeByPage")(data, req_count,trade_sequence,query_reference, reqid, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryPosition(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryPosition")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryAsset(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryAsset")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryStructuredFund(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryStructuredFund")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryFundTransfer(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryFundTransfer")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onFundTransfer(dict data, dict error, uint64_t session) + { + try + { + this->get_override("onFundTransfer")(data, error, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryETF(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryETF")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryETFBasket(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryETFBasket")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryIPOInfoList(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryIPOInfoList")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryIPOQuotaInfo(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryIPOQuotaInfo")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryBondIPOInfoList(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryBondIPOInfoList")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryBondSwapStockInfo(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryBondSwapStockInfo")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onQueryOptionAuctionInfo(dict data, dict error, int id, bool last, uint64_t session) + { + try + { + this->get_override("onQueryOptionAuctionInfo")(data, error, id, last, session); + } + catch (error_already_set const &) + { + PyErr_Print(); + } + }; + + virtual void onCreditCashRepay(dict data, dict error_info, uint64_t session) { + PyLock lock; + + try { + this->get_override("onCreditCashRepay")(data, error_info, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditCashRepayInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditCashRepayInfo")(data, error_info, request_id, is_last, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditFundInfo(dict data, dict error_info, int request_id, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditFundInfo")(data, error_info, request_id, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditDebtInfo")(data, error_info, request_id, is_last, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditTickerDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditTickerDebtInfo")(data, error_info, request_id, is_last, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditAssetDebtInfo(double remain_amount, dict error_info, int request_id, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditAssetDebtInfo")(remain_amount, error_info, request_id, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditTickerAssignInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditTickerAssignInfo")(data, error_info, request_id, is_last, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditExcessStock")(data, error_info, request_id, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryMulCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session, bool is_last) { + PyLock lock; + + try { + this->get_override("onQueryMulCreditExcessStock")(data, error_info, request_id, session,is_last); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onCreditExtendDebtDate(dict data, dict error_info, uint64_t session) { + PyLock lock; + + try { + this->get_override("onCreditExtendDebtDate")(data, error_info, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditExtendDebtDateOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditExtendDebtDateOrders")(data, error_info, request_id,is_last, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditFundExtraInfo(dict data, dict error_info, int request_id, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditFundExtraInfo")(data, error_info, request_id, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryCreditPositionExtraInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryCreditPositionExtraInfo")(data, error_info, request_id,is_last, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onCreditCashRepayDebtInterestFee(dict data, dict error_info, uint64_t session) { + PyLock lock; + + try { + this->get_override("onCreditCashRepayDebtInterestFee")(data, error_info, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onOptionCombinedOrderEvent(dict data, dict error_info, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onOptionCombinedOrderEvent")(data, error_info, session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onOptionCombinedTradeEvent(dict data, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onOptionCombinedTradeEvent")(data,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedOrders")(data, error_info, request_id, is_last, session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedOrdersEx(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedOrdersEx")(data, error_info, request_id, is_last, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedOrdersByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedOrdersByPage")(data, req_count, order_sequence, query_reference, request_id, is_last, session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedOrdersByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedOrdersByPageEx")(data, req_count, order_sequence, query_reference, request_id, is_last, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedTrades(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedTrades")(data, error_info, request_id, is_last,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedTradesByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedTradesByPage")(data, req_count, trade_sequence, query_reference, request_id, is_last,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedPosition")(data, error_info, request_id, is_last,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedStrategyInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedStrategyInfo")(data, error_info, request_id, is_last,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onCancelOptionCombinedOrderError(dict data, dict error_info, uint64_t session) { + PyLock lock; + + try { + this->get_override("onCancelOptionCombinedOrderError")(data, error_info,session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOptionCombinedExecPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryOptionCombinedExecPosition")(data, error_info, request_id, is_last,session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onQueryOtherServerFund(dict data, dict error_info, int request_id, uint64_t session) { + PyLock lock; + + try { + this->get_override("onQueryOtherServerFund")(data, error_info, request_id, session); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + + virtual void onQueryStrategy(dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id) { + PyLock lock; + printf("onQueryStrategy---\n"); + try { + this->get_override("onQueryStrategy")(data,strategy_param, error_info, request_id,is_last,session_id); + printf("get_override(onQueryStrategy)---\n"); + } catch (error_already_set const &) { + PyErr_Print(); + printf("catch(onQueryStrategy)\n"); + } + }; + + virtual void onStrategyStateReport(dict data, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onStrategyStateReport")(data,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onALGOUserEstablishChannel(string user,dict error_info, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onALGOUserEstablishChannel")(user,error_info,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + virtual void onInsertAlgoOrder(dict data,dict error_info, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onInsertAlgoOrder")(data,error_info,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onCancelAlgoOrder(dict data,dict error_info, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onCancelAlgoOrder")(data,error_info,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onAlgoDisconnected(int reason) { + PyLock lock; + + try { + this->get_override("onAlgoDisconnected")(reason); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onAlgoConnected() { + PyLock lock; + + try { + this->get_override("onAlgoConnected")(); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onStrategySymbolStateReport(dict data, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onStrategySymbolStateReport")(data, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onNewStrategyCreateReport(dict data, string strategy_param, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onNewStrategyCreateReport")(data, strategy_param, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onStrategyRecommendation(bool basket_flag, dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onStrategyRecommendation")(basket_flag, data, strategy_param, error_info, request_id, is_last, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onModifyAlgoOrder(dict data, dict error_info, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onModifyAlgoOrder")(data, error_info, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; +}; + + +BOOST_PYTHON_MODULE(vnxtptrader) +{ + //PyEval_InitThreads(); //ʱУ֤ȴGIL + Py_Initialize(); + + class_("TraderApi") + .def("createTraderApi", &TraderApiWrap::createTraderApi) + .def("release", &TraderApiWrap::release) + .def("exit", &TraderApiWrap::exit) + .def("getTradingDay", &TraderApiWrap::getTradingDay) + .def("getApiLastError", &TraderApiWrap::getApiLastError) + .def("getApiVersion", &TraderApiWrap::getApiVersion) + .def("getClientIDByXTPID", &TraderApiWrap::getClientIDByXTPID) + .def("getAccountByXTPID", &TraderApiWrap::getAccountByXTPID) + .def("subscribePublicTopic", &TraderApiWrap::subscribePublicTopic) + .def("setSoftwareKey", &TraderApiWrap::setSoftwareKey) + .def("setSoftwareVersion", &TraderApiWrap::setSoftwareVersion) + .def("setHeartBeatInterval", &TraderApiWrap::setHeartBeatInterval) + .def("login", &TraderApiWrap::login) + .def("logout", &TraderApiWrap::logout) + .def("modifyUserTerminalInfo", &TraderApiWrap::modifyUserTerminalInfo) + .def("queryAccountTradeMarket", &TraderApiWrap::queryAccountTradeMarket) + .def("getANewOrderXTPID", &TraderApiWrap::getANewOrderXTPID) + .def("insertOrder", &TraderApiWrap::insertOrder) + .def("insertOrderExtra", &TraderApiWrap::insertOrderExtra) + .def("cancelOrder", &TraderApiWrap::cancelOrder) + .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) + .def("queryOrderByXTPIDEx", &TraderApiWrap::queryOrderByXTPIDEx) + .def("queryOrders", &TraderApiWrap::queryOrders) + .def("queryOrdersEx", &TraderApiWrap::queryOrdersEx) + .def("queryUnfinishedOrders", &TraderApiWrap::queryUnfinishedOrders) + .def("queryUnfinishedOrdersEx", &TraderApiWrap::queryUnfinishedOrdersEx) + .def("queryTradesByXTPID", &TraderApiWrap::queryTradesByXTPID) + .def("queryTrades", &TraderApiWrap::queryTrades) + .def("queryPosition", &TraderApiWrap::queryPosition) + .def("queryAsset", &TraderApiWrap::queryAsset) + .def("queryStructuredFund", &TraderApiWrap::queryStructuredFund) + .def("fundTransfer", &TraderApiWrap::fundTransfer) + .def("queryFundTransfer", &TraderApiWrap::queryFundTransfer) + .def("queryETF", &TraderApiWrap::queryETF) + .def("queryETFTickerBasket", &TraderApiWrap::queryETFTickerBasket) + .def("queryIPOInfoList", &TraderApiWrap::queryIPOInfoList) + .def("queryIPOQuotaInfo", &TraderApiWrap::queryIPOQuotaInfo) + .def("queryBondIPOInfoList", &TraderApiWrap::queryBondIPOInfoList) + .def("queryBondSwapStockInfo", &TraderApiWrap::queryBondSwapStockInfo) + .def("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) + .def("creditCashRepay", &TraderApiWrap::creditCashRepay) + .def("queryCreditCashRepayInfo", &TraderApiWrap::queryCreditCashRepayInfo) + .def("queryCreditFundInfo", &TraderApiWrap::queryCreditFundInfo) + .def("queryCreditDebtInfo", &TraderApiWrap::queryCreditDebtInfo) + .def("queryCreditTickerDebtInfo", &TraderApiWrap::queryCreditTickerDebtInfo) + .def("queryCreditAssetDebtInfo", &TraderApiWrap::queryCreditAssetDebtInfo) + .def("queryCreditTickerAssignInfo", &TraderApiWrap::queryCreditTickerAssignInfo) + .def("queryCreditExcessStock", &TraderApiWrap::queryCreditExcessStock) + .def("queryMulCreditExcessStock", &TraderApiWrap::queryMulCreditExcessStock) + + .def("creditExtendDebtDate", &TraderApiWrap::creditExtendDebtDate) + .def("queryCreditExtendDebtDateOrders", &TraderApiWrap::queryCreditExtendDebtDateOrders) + .def("queryCreditFundExtraInfo", &TraderApiWrap::queryCreditFundExtraInfo) + .def("queryCreditPositionExtraInfo", &TraderApiWrap::queryCreditPositionExtraInfo) + + .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) + .def("queryOrdersByPageEx", &TraderApiWrap::queryOrdersByPageEx) + .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) + .def("isServerRestart", &TraderApiWrap::isServerRestart) + .def("creditCashRepayDebtInterestFee", &TraderApiWrap::creditCashRepayDebtInterestFee) + .def("creditSellStockRepayDebtInterestFee", &TraderApiWrap::creditSellStockRepayDebtInterestFee) + .def("insertOptionCombinedOrder", &TraderApiWrap::insertOptionCombinedOrder) + .def("insertOptionCombinedOrderExtra", &TraderApiWrap::insertOptionCombinedOrderExtra) + .def("queryOptionCombinedUnfinishedOrders", &TraderApiWrap::queryOptionCombinedUnfinishedOrders) + .def("queryOptionCombinedUnfinishedOrdersEx", &TraderApiWrap::queryOptionCombinedUnfinishedOrdersEx) + .def("queryOptionCombinedOrderByXTPID", &TraderApiWrap::queryOptionCombinedOrderByXTPID) + .def("queryOptionCombinedOrderByXTPIDEx", &TraderApiWrap::queryOptionCombinedOrderByXTPIDEx) + .def("queryOptionCombinedOrders", &TraderApiWrap::queryOptionCombinedOrders) + .def("queryOptionCombinedOrdersEx", &TraderApiWrap::queryOptionCombinedOrdersEx) + .def("queryOptionCombinedOrdersByPage", &TraderApiWrap::queryOptionCombinedOrdersByPage) + .def("queryOptionCombinedOrdersByPageEx", &TraderApiWrap::queryOptionCombinedOrdersByPageEx) + .def("queryOptionCombinedTradesByXTPID", &TraderApiWrap::queryOptionCombinedTradesByXTPID) + .def("queryOptionCombinedTrades", &TraderApiWrap::queryOptionCombinedTrades) + .def("queryOptionCombinedTradesByPage", &TraderApiWrap::queryOptionCombinedTradesByPage) + .def("queryOptionCombinedPosition", &TraderApiWrap::queryOptionCombinedPosition) + .def("queryOptionCombinedStrategyInfo", &TraderApiWrap::queryOptionCombinedStrategyInfo) + .def("cancelOptionCombinedOrder", &TraderApiWrap::cancelOptionCombinedOrder) + .def("queryOptionCombinedExecPosition", &TraderApiWrap::queryOptionCombinedExecPosition) + .def("queryOtherServerFund", &TraderApiWrap::queryOtherServerFund) + + .def("loginALGO", &TraderApiWrap::loginALGO) + .def("queryStrategy", &TraderApiWrap::queryStrategy) + .def("aLGOUserEstablishChannel", &TraderApiWrap::aLGOUserEstablishChannel) + .def("insertAlgoOrder", &TraderApiWrap::insertAlgoOrder) + .def("cancelAlgoOrder", &TraderApiWrap::cancelAlgoOrder) + .def("getAlgorithmIDByOrder", &TraderApiWrap::getAlgorithmIDByOrder) + .def("strategyRecommendation", &TraderApiWrap::strategyRecommendation) + .def("modifyAlgoOrder", &TraderApiWrap::modifyAlgoOrder) + + ////////////////////////ص/////////////////////// + .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) + .def("onError", pure_virtual(&TraderApiWrap::onError)) + .def("onQueryAccountTradeMarket", pure_virtual(&TraderApiWrap::onQueryAccountTradeMarket)) + .def("onOrderEvent", pure_virtual(&TraderApiWrap::onOrderEvent)) + .def("onTradeEvent", pure_virtual(&TraderApiWrap::onTradeEvent)) + .def("onCancelOrderError", pure_virtual(&TraderApiWrap::onCancelOrderError)) + .def("onQueryOrder", pure_virtual(&TraderApiWrap::onQueryOrder)) + .def("onQueryOrderEx", pure_virtual(&TraderApiWrap::onQueryOrderEx)) + .def("onQueryTrade", pure_virtual(&TraderApiWrap::onQueryTrade)) + .def("onQueryPosition", pure_virtual(&TraderApiWrap::onQueryPosition)) + .def("onQueryAsset", pure_virtual(&TraderApiWrap::onQueryAsset)) + .def("onQueryStructuredFund", pure_virtual(&TraderApiWrap::onQueryStructuredFund)) + .def("onQueryFundTransfer", pure_virtual(&TraderApiWrap::onQueryFundTransfer)) + .def("onFundTransfer", pure_virtual(&TraderApiWrap::onFundTransfer)) + .def("onQueryETF", pure_virtual(&TraderApiWrap::onQueryETF)) + .def("onQueryETFBasket", pure_virtual(&TraderApiWrap::onQueryETFBasket)) + .def("onQueryIPOInfoList", pure_virtual(&TraderApiWrap::onQueryIPOInfoList)) + .def("onQueryIPOQuotaInfo", pure_virtual(&TraderApiWrap::onQueryIPOQuotaInfo)) + .def("onQueryBondIPOInfoList", pure_virtual(&TraderApiWrap::onQueryBondIPOInfoList)) + .def("onQueryBondSwapStockInfo", pure_virtual(&TraderApiWrap::onQueryBondSwapStockInfo)) + .def("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) + .def("onCreditCashRepay", pure_virtual(&TraderApiWrap::onCreditCashRepay)) + .def("onQueryCreditCashRepayInfo", pure_virtual(&TraderApiWrap::onQueryCreditCashRepayInfo)) + .def("onQueryCreditFundInfo", pure_virtual(&TraderApiWrap::onQueryCreditFundInfo)) + .def("onQueryCreditDebtInfo", pure_virtual(&TraderApiWrap::onQueryCreditDebtInfo)) + .def("onQueryCreditTickerDebtInfo", pure_virtual(&TraderApiWrap::onQueryCreditTickerDebtInfo)) + .def("onQueryCreditAssetDebtInfo",pure_virtual(&TraderApiWrap::onQueryCreditAssetDebtInfo)) + .def("onQueryCreditTickerAssignInfo", pure_virtual(&TraderApiWrap::onQueryCreditTickerAssignInfo)) + .def("onQueryCreditExcessStock", pure_virtual(&TraderApiWrap::onQueryCreditExcessStock)) + .def("onQueryMulCreditExcessStock", pure_virtual(&TraderApiWrap::onQueryMulCreditExcessStock)) + + .def("onCreditExtendDebtDate", pure_virtual(&TraderApiWrap::onCreditExtendDebtDate)) + .def("onQueryCreditExtendDebtDateOrders",pure_virtual(&TraderApiWrap::onQueryCreditExtendDebtDateOrders)) + .def("onQueryCreditFundExtraInfo", pure_virtual(&TraderApiWrap::onQueryCreditFundExtraInfo)) + .def("onQueryCreditPositionExtraInfo", pure_virtual(&TraderApiWrap::onQueryCreditPositionExtraInfo)) + .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) + .def("onQueryOrderByPageEx", pure_virtual(&TraderApiWrap::onQueryOrderByPageEx)) + .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) + .def("onCreditCashRepayDebtInterestFee", pure_virtual(&TraderApiWrap::onCreditCashRepayDebtInterestFee)) + + .def("onOptionCombinedOrderEvent", pure_virtual(&TraderApiWrap::onOptionCombinedOrderEvent)) + .def("onOptionCombinedTradeEvent", pure_virtual(&TraderApiWrap::onOptionCombinedTradeEvent)) + .def("onQueryOptionCombinedOrders", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrders)) + .def("onQueryOptionCombinedOrdersEx", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrdersEx)) + .def("onQueryOptionCombinedOrdersByPage", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrdersByPage)) + .def("onQueryOptionCombinedOrdersByPageEx", pure_virtual(&TraderApiWrap::onQueryOptionCombinedOrdersByPageEx)) + .def("onQueryOptionCombinedTrades", pure_virtual(&TraderApiWrap::onQueryOptionCombinedTrades)) + .def("onQueryOptionCombinedTradesByPage", pure_virtual(&TraderApiWrap::onQueryOptionCombinedTradesByPage)) + .def("onQueryOptionCombinedPosition", pure_virtual(&TraderApiWrap::onQueryOptionCombinedPosition)) + .def("onQueryOptionCombinedStrategyInfo", pure_virtual(&TraderApiWrap::onQueryOptionCombinedStrategyInfo)) + .def("onCancelOptionCombinedOrderError", pure_virtual(&TraderApiWrap::onCancelOptionCombinedOrderError)) + .def("onQueryOptionCombinedExecPosition", pure_virtual(&TraderApiWrap::onQueryOptionCombinedExecPosition)) + .def("onQueryOtherServerFund", pure_virtual(&TraderApiWrap::onQueryOtherServerFund)) + + .def("onQueryStrategy", pure_virtual(&TraderApiWrap::onQueryStrategy)) + .def("onStrategyStateReport", pure_virtual(&TraderApiWrap::onStrategyStateReport)) + .def("onALGOUserEstablishChannel", pure_virtual(&TraderApiWrap::onALGOUserEstablishChannel)) + .def("onInsertAlgoOrder", pure_virtual(&TraderApiWrap::onInsertAlgoOrder)) + .def("onCancelAlgoOrder", pure_virtual(&TraderApiWrap::onCancelAlgoOrder)) + .def("onAlgoDisconnected", pure_virtual(&TraderApiWrap::onAlgoDisconnected)) + .def("onAlgoConnected", pure_virtual(&TraderApiWrap::onAlgoConnected)) + .def("onStrategySymbolStateReport", pure_virtual(&TraderApiWrap::onStrategySymbolStateReport)) + .def("onNewStrategyCreateReport", pure_virtual(&TraderApiWrap::onNewStrategyCreateReport)) + .def("onStrategyRecommendation", pure_virtual(&TraderApiWrap::onStrategyRecommendation)) + .def("onModifyAlgoOrder", pure_virtual(&TraderApiWrap::onModifyAlgoOrder)) + ; +}; diff --git a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.h b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.h index 3d355ee..cab677d 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/vnxtptrader/vnxtptrader.h @@ -1,1207 +1,1207 @@ -//˵ - -//API -#include "xtp_trader_api.h" - -//ϵͳ -//#ifdef WIN32 -//#include "stdafx.h" -//#endif -#include -#include - -//Boost -#define BOOST_PYTHON_STATIC_LIB -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //pythonװ -#include //е̹߳ -#include //е̹߳ - - -//ռ -using namespace std; -using namespace boost::python; -using namespace boost; - - -// -#define ONDISCONNECTED 1 -#define ONERROR 2 -#define ONORDEREVENT 3 -#define ONTRADEEVENT 4 -#define ONCANCELORDERERROR 5 -#define ONQUERYORDER 6 -#define ONQUERYTRADE 7 -#define ONQUERYPOSITION 8 -#define ONQUERYASSET 9 -#define ONQUERYSTRUCTUREDFUND 10 -#define ONQUERYFUNDTRANSFER 11 -#define ONFUNDTRANSFER 12 -#define ONQUERYETF 13 -#define ONQUERYETFBASKET 14 -#define ONQUERYIPOINFOLIST 15 -#define ONQUERYIPOQUOTAINFO 16 - -#define ONQUERYOPTIONAUCTIONINFO 17 - -#define ONCREDITCASHREPAY 18 -#define ONQUERYCREDITCASHREPAYINFO 19 -#define ONQUERYCREDITFUNDINFO 20 -#define ONQUERYCREDITDEBTINFO 21 -#define ONQUERYCREDITTICKERDEBTINFO 22 -#define ONQUERYCREDITASSETDEBTINFO 23 -#define ONQUERYCREDITTICKERASSIGNINFO 24 -#define ONQUERYCREDITEXCESSSTOCK 25 - -#define ONCREDITEXTENDDEBTDATE 26 -#define ONQUERYCREDITEXTENDDEBTDATEORDERS 27 -#define ONQUERYCREDITFUNDEXTRAINFO 28 -#define ONQUERYCREDITPOSITIONEXTRAINFO 29 - -#define ONQUERYORDERBYPAGE 30 -#define ONQUERYTRADEBYPAGE 31 -#define ONCREDITCASHREPAYDEBTINTERESTFEE 32 -#define ONQUERYMULCREDITEXCESSSTOCK 33 - -#define ONOPTIONCOMBINEDORDEREVENT 34 -#define ONOPTIONCOMBINEDTRADEEVENT 35 -#define ONQUERYOPTIONCOMBINEDORDERS 36 -#define ONQUERYOPTIONCOMBINEDORDERSBYPAGE 37 -#define ONQUERYOPTIONCOMBINEDTRADES 38 -#define ONQUERYOPTIONCOMBINEDTRADESBYPAGE 39 -#define ONQUERYOPTIONCOMBINEDPOSITION 40 -#define ONQUERYOPTIONCOMBINEDSTRATEGYINFO 41 -#define ONCANCELOPTIONCOMBINEDORDERERROR 42 - -#define ONQUERYOPTIONCOMBINEDEXECPOSITION 43 -#define ONQUERYOTHERSERVERFUND 44 - - -#define ONQUERYSTRATEGY 45 -#define ONSTRATEGYASTATEREPORT 46 -#define ONALGOUSERESTABLISHCHANNEL 47 -#define ONINSERTALGOORDER 48 -#define ONCANCELALGOORDER 49 -#define ONALGODISCONNECTED 50 -#define ONALGOCONNECTED 51 -#define ONQUERYORDEREX 52 -#define ONQUERYORDERBYPAGEEX 53 -#define ONQUERYOPTIONCOMBINEDORDERSEX 54 -#define ONQUERYOPTIONCOMBINEDORDERSBYPAGEEX 55 -#define ONSTRATEGYSYMBOLSTATEREPORT 56 -#define ONQUERYACCOUNTTRADEMARKET 57 - -#define ONQUERYBONDIPOINFOLIST 58 -#define ONQUERYBONDSWAPSTOCKINFO 59 -#define ONNEWSTRATEGYCREATEREPORT 60 -#define ONSTRATEGYRECOMMENDATION 61 -#define ONMODIFYALGOORDER 62 -///------------------------------------------------------------------------------------- -///APIеIJ -///------------------------------------------------------------------------------------- - -//GILȫ򻯻ȡã -//ڰC++̻߳GILӶֹpython -class PyLock -{ -private: - PyGILState_STATE gil_state; - -public: - //ijдöʱGIL - PyLock() - { - gil_state = PyGILState_Ensure(); - } - - //ijɺٸöʱGIL - ~PyLock() - { - PyGILState_Release(gil_state); - } -}; - - -//ṹ -struct Task -{ - int task_name; //صƶӦij - void *task_data; //ݽṹ - void *task_error; //ṹ - int task_id; //id - bool task_last; //ǷΪ󷵻 - bool addtional_bool; //boolֶ - uint64_t addtional_int; //ֶ - double remain_amount;//doubleֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ - - int64_t req_count; - int64_t order_sequence; - int64_t query_reference; - int64_t trade_sequence; - - string strategy_param; - string user; - int reason; -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable boost::mutex the_mutex; //boost - boost::condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - boost::mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - boost::mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - boost::mutex::scoped_lock lock(the_mutex); - - while (the_queue.empty()) //Ϊʱ - { - the_condition_variable.wait(lock); //ȴ֪ͨ - } - - Data popped_value = the_queue.front(); //ȡеһ - the_queue.pop(); //ɾ - return popped_value; //ظ - } - -}; - - -void getNestedDictValue(dict d, string key1, string key2, int *value); - -void getNestedDictChar(dict d, string key1, string key2, char *value); - -void getNestedDictChar2(dict d, string key1, string key2, string key3, char *value, int index); - -void getNestedDictValue2(dict d, string key1, string key2, string key3, int *value, int index); - -//ֵлȡijֵӦֵṹֵ -void getInt(dict d, string key, int *value); - -void getUint64(dict d, string key, uint64_t *value); - -void getUint32(dict d, string key, uint32_t *value); - -void getInt64(dict d, string key, int64_t *value); - - - -//ֵлȡijֵӦĸֵṹֵ -void getDouble(dict d, string key, double* value); - - -//ֵлȡijֵӦֵַṹֵ -void getChar(dict d, string key, char* value); - - -//ֵлȡijֵӦֵַṹֵ -void getStr(dict d, string key, char* value); - - -///------------------------------------------------------------------------------------- -///C++ SPIĻصʵ -///------------------------------------------------------------------------------------- - -//APIļ̳ʵ -class TraderApi : public XTP::API::TraderSpi -{ -private: - XTP::API::TraderApi* api; //API - boost::thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - boost::thread t(f); - this->task_thread = &t; - }; - - ~TraderApi() - { - }; - - //------------------------------------------------------------------------------------- - //APIص - //------------------------------------------------------------------------------------- - - ///ͻ˵ij뽻׺̨ͨӶϿʱ÷á - ///@param reason ԭӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ûlogoutµĶߣᴥ˺apiԶ߷ʱûѡڴ˺еLoginµ¼session_idʱûյݸ֮ǰ - virtual void OnDisconnected(uint64_t session_id, int reason) ; - - ///Ӧ - ///@param error_info ӦʱľĴʹϢ,error_infoΪգerror_info.error_idΪ0ʱûд - ///@remark ˺ֻڷʱŻãһû - virtual void OnError(XTPRI *error_info) ; - - ///ѯûڱڵϿɽгӦ - ///@param trade_location ѯĽгϢλӵλʼ0λʾУ(trade_location&0x01) == 0x01ɽ׻У1λʾУ(trade_location&0x02) == 0x02ʾɽУ0λ͵1λ1(trade_location&(0x01|0x02)) == 0x03ͱʾɽ׻2г - ///@param error_info ѯɽгʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ˲ѯֻһ - virtual void OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id); - - ///֪ͨ - ///@param order_info ӦϢûͨorder_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶorder_info.qty_leftֶڶΪδɽɡȫɡϵ״̬ʱʾ˶ûгɽڲȫ״̬ʱʾ˶order_info.order_cancel_xtp_idΪӦijIDΪ0ʱʾ˵ɹ - ///@param error_info ܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark ÿζ״̬ʱᱻãҪٷأϢʱᴥߣڶδɽȫɽȫֳѾܾЩ״̬ʱӦڲֳɽɶijɽرȷϡе¼˴ûĿͻ˶յûĶӦ - virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) ; - - ///ɽ֪ͨ - ///@param trade_info ɽرľϢûͨtrade_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶϽexec_idΨһʶһʳɽ2ʳɽرӵͬexec_idΪ˱ʽԳɽˡexec_idΨһģʱ޴жϻơreport_index+marketֶοΨһʶʾɽر - ///@remark гɽʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûijɽرضΪ״̬ҪûͨɽرijɽȷOnOrderEvent()Ͳ״̬ - virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) ; - - ///Ӧ - ///@param cancel_info Ϣorder_cancel_xtp_idʹorder_xtp_id - ///@param error_info ܾ߷ʱʹϢҪٷأϢʱᴥߣerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark Ӧֻڳʱص - virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) ; - - ///ѯӦ - ///@param order_info ѯһ - ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥ - virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - ///ѯӦ-°汾ӿ - ///@param order_info ѯһϢ - ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥ - virtual void OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ҳѯӦ - ///@param order_info ѯһ - ///@param req_count ҳ - ///@param order_sequence ҳĵǰر - ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); - - ///ҳѯӦ-°汾ӿ - ///@param order_info ѯһ - ///@param req_count ҳ - ///@param order_sequence ҳĵǰر - ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); - - ///ѯɽӦ - ///@param trade_info ѯһɽر - ///@param error_info ѯɽرʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥ - virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - ///ҳѯɽӦ - ///@param trade_info ѯһɽϢ - ///@param req_count ҳ - ///@param trade_sequence ҳĵǰر - ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark trade_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱtrade_sequencereq_countôʾлرԽһηҳѯȣʾлرѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); - - ///ѯͶֲ߳Ӧ - ///@param position ѯһֻƱijֲ - ///@param error_info ѯ˻ֲַʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ûܳжƱһѯܶӦӦҪٷأϢʱᴥ - virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - ///ѯʽ˻ӦҪٷأϢʱᴥ - ///@param asset ѯʽ˻ - ///@param error_info ѯʽ˻ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - - ///ѯּϢӦҪٷأϢʱᴥ - ///@param fund_info ѯķּ - ///@param error_info ѯּʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯʽ𻮲ӦҪٷأϢʱᴥ - ///@param fund_transfer_info ѯʽ˻ - ///@param error_info ѯʽ˻ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ʽ𻮲֪ͨ - ///@param fund_transfer_info ʽ𻮲֪ͨľϢûͨfund_transfer_info.serial_idͨGetClientIDByXTPID() == client_idԼĶ - ///@param error_info ʽ𻮲ܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@remark ʽ𻮲״̬仯ʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûʽ𻮲֪ͨ - virtual void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id); - - ///ѯETF嵥ļӦҪٷأϢʱᴥ - ///@param etf_info ѯETF嵥ļ - ///@param error_info ѯETF嵥ļʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯETFƱӦҪٷأϢʱᴥ - ///@param etf_component_info ѯETFԼسɷֹϢ - ///@param error_info ѯETFƱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯ¹깺ϢбӦҪٷأϢʱᴥ - ///@param ipo_info ѯĽ¹깺һֻƱϢ - ///@param error_info ѯ¹깺ϢбʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯû¹깺ϢӦҪٷأϢʱᴥ - ///@param quota_info ѯûijгĽ¹깺Ϣ - ///@param error_info ѯû¹깺ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯտתծ깺ϢбӦҪٷأϢʱᴥ - ///@param ipo_info ѯĽտתծ깺һֻתծϢ - ///@param error_info ѯտתծ깺ϢбʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯûתծתϢӦҪٷأϢʱᴥ - ///@param swap_stock_info ѯijתծתϢ - ///@param error_info ѯתծתϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯȨԼӦҪٷأϢʱᴥ - ///@param option_info ѯȨԼ - ///@param error_info ѯȨԼʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ȯҵֱֽӻӦ - ///@param cash_repay_info ֱֽӻ֪ͨľϢûͨcash_repay_info.xtp_idͨGetClientIDByXTPID() == client_idԼĶ - ///@param error_info ֽ𻹿ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id); - - ///ȯҵֽϢӦ - ///@param cash_repay_info ֽϢ֪ͨľϢûͨcash_repay_info.xtp_idͨGetClientIDByXTPID() == client_idԼĶ - ///@param error_info ֽϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id); - - ///ѯȯҵеֱֽӻӦ - ///@param cash_repay_info ѯijһֱֽӻ֪ͨľϢ - ///@param error_info ѯֱֽӱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo *cash_repay_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯ˻ϢӦҪٷأϢʱᴥ - ///@param fund_info ѯ˻Ϣ - ///@param error_info ѯ˻ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditFundInfo(XTPCrdFundInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) ; - - ///ѯ˻ծϢӦҪٷأϢʱᴥ - ///@param debt_info ѯ˻Լծ - ///@param error_info ѯ˻ծϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditDebtInfo(XTPCrdDebtInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - ///ѯ˻ָ֤ȯծδϢӦҪٷأϢʱᴥ - ///@param debt_info ѯ˻ָ֤ȯծδϢ - ///@param error_info ѯ˻ָ֤ȯծδϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯ˻ʽӦҪٷأϢʱᴥ - ///@param remain_amount ѯ˻ʽ - ///@param error_info ѯ˻ʽʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI *error_info, int request_id, uint64_t session_id); - - ///ѯ˻ȯͷϢӦҪٷأϢʱᴥ - ///@param assign_info ѯ˻ȯͷϢ - ///@param error_info ѯ˻ȯͷϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo *assign_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ȯҵѯָȯϢӦҪٷأϢʱᴥ - ///@param stock_info ѯȯϢ - ///@param error_info ѯ˻ȯϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id); - - ///ȯҵѯȯϢӦҪٷأϢʱᴥ - ///@param stock_info ѯȯϢ - ///@param error_info ѯ˻ȯϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id, bool is_last); - - ///ȯҵиծԼչڵ֪ͨ - ///@param debt_extend_info ծԼչ֪ͨľϢûͨdebt_extend_info.xtpidͨGetClientIDByXTPID() == client_idԼĶ - ///@param error_info ծԼչڶܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ծԼչڶ״̬仯ʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûĸծԼչ֪ͨ - virtual void OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, uint64_t session_id); - - ///ѯȯҵиծԼչڶӦҪٷأϢʱᴥ - ///@param debt_extend_info ѯĸծԼչ - ///@param error_info ѯծԼչڷʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд󡣵error_info.error_id=11000350ʱûм¼Ϊ0ֵʱԼܵʱĴԭ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯȯҵ˻ϢӦҪٷأϢʱᴥ - ///@param fund_info ˻Ϣ - ///@param error_info ѯ˻ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id); - - ///ѯȯҵ˻ָ֤ȯĸϢӦҪٷأϢʱᴥ - ///@param fund_info ˻ָ֤ȯĸϢ - ///@param error_info ѯ˻ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ȨϲԱ֪ͨ - ///@param order_info ӦϢûͨorder_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶorder_info.qty_leftֶڶΪδɽɡȫɡϵ״̬ʱʾ˶ûгɽڲȫ״̬ʱʾ˶order_info.order_cancel_xtp_idΪӦijIDΪ0ʱʾ˵ɹ - ///@param error_info ܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ÿζ״̬ʱᱻãҪٷأϢʱᴥߣڶδɽȫɽȫֳѾܾЩ״̬ʱӦڲֳɽɶijɽرȷϡе¼˴ûĿͻ˶յûĶӦ - virtual void OnOptionCombinedOrderEvent(XTPOptCombOrderInfo *order_info, XTPRI *error_info, uint64_t session_id); - - ///ȨϲԳɽ֪ͨ - ///@param trade_info ɽرľϢûͨtrade_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶϽexec_idΨһʶһʳɽ2ʳɽرӵͬexec_idΪ˱ʽԳɽˡexec_idΨһģʱ޴жϻơreport_index+marketֶοΨһʶʾɽر - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark гɽʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûijɽرضΪ״̬ҪûͨɽرijɽȷOnOrderEvent()Ͳ״̬ - virtual void OnOptionCombinedTradeEvent(XTPOptCombTradeReport *trade_info, uint64_t session_id); - - ///ȨϲԳӦ - ///@param cancel_info Ϣorder_cancel_xtp_idʹorder_xtp_id - ///@param error_info ܾ߷ʱʹϢҪٷأϢʱᴥߣerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark Ӧֻڳʱص - virtual void OnCancelOptionCombinedOrderError(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) ; - - ///ѯȨϲԱӦ - ///@param order_info ѯһ - ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥߡ˶Ӧѯʹãʱû·ӵ£api - virtual void OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - ///ѯȨϲԱӦ-°汾ӿ - ///@param order_info ѯһ - ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥߡ˶Ӧѯʹãʱû·ӵ£api - virtual void OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ҳѯȨϲԱӦ - ///@param order_info ѯһ - ///@param req_count ҳ - ///@param order_sequence ҳĵǰر - ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) ; - - ///ҳѯȨϲԱӦ-°汾ӿ - ///@param order_info ѯһ - ///@param req_count ҳ - ///@param order_sequence ҳĵǰر - ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) ; - - ///ѯȨϲԳɽӦ - ///@param trade_info ѯһɽر - ///@param error_info ѯɽرʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥߡ˶Ӧѯʹãʱû·ӵ£api - virtual void OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; - - ///ҳѯȨϲԳɽӦ - ///@param trade_info ѯһɽϢ - ///@param req_count ҳ - ///@param trade_sequence ҳĵǰر - ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark trade_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱtrade_sequencereq_countôʾлرԽһηҳѯȣʾлرѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); - - ///ѯȨϲԳֲӦ - ///@param position_info ѯһֲϢ - ///@param error_info ѯֲַʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark һѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯȨϲϢӦ - ///@param strategy_info ѯһϲϢ - ///@param error_info ѯɽرʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark һѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp *strategy_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯȨȨϲͷӦ - ///@param position_info ѯһȨϲͷϢ - ///@param error_info ѯֲַʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark һѯܶӦӦҪٷأϢʱᴥߡ - virtual void OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); - - ///ѯڵʽӦҪٷأϢʱᴥ - ///@param fund_info ѯڵʽ - ///@param error_info ѯڵʽʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id); - - - //////////////////////////////////////////////////////////////// - /*****algo algo algo algo algo algo algo algo algo algo ******/ - //////////////////////////////////////////////////////////////// - - ///algoҵвѯбӦ - ///@param strategy_info ԾϢ - ///@param strategy_param ˲аIJerror_info.error_idΪ0ʱ - ///@param error_info ѯѯбʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id); - - ///algoҵвʱ״̬֪ͨ - ///@param strategy_state û״̬֪ͨ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state, uint64_t session_id); - - ///algoҵû㷨ͨϢӦ - ///@param user û - ///@param error_info 㷨ͨʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд󣬼㷨ͨɹ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark 㷨ͨɹ󣬲ܶûԵȲһûֻӵһ㷨֮ͨǰѾظ - virtual void OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id); - - ///algoҵбͲԵӦ - ///@param strategy_info û͵IJԵľϢ - ///@param error_info ͲԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id); - - ///algoҵгԵӦ - ///@param strategy_info ûIJԵľϢ - ///@param error_info ԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id); - - ///ͻAlgoBusͨӶϿʱ÷á - ///@param reason ԭӦ - ///@remark 벻Ҫ̣߳Ӱalgoĵ¼Algo֮ӣߺԶû - virtual void OnAlgoDisconnected(int reason) ; - - ///ͻAlgoBusߺʱ÷ãڶɹᱻá - virtual void OnAlgoConnected(); - - ///algoҵвʱָ֤ȯִ״̬֪ͨ - ///@param strategy_symbol_state ûָ֤ȯ״̬֪ͨ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) ; - - ///algoҵбĸʱϢ(ͻ˴ĸ) - ///@param strategy_info ԾϢ - ///@param strategy_param ˲аIJ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id); - - ///algoҵ㷨ƼӦ - ///@param basket_flag ǷƼĸı־һ£˲ΪtrueôԷصstrategy_paramΪ׼ - ///@param recommendation_info Ƽ㷨ľϢbasket_flag=trueʱ˽ṹеmarkettickerû壬ʱstrategy_paramΪ׼ - ///@param strategy_param 㷨ֱĸerror_info.error_idΪ0ʱ - ///@param error_info Ƽ㷨ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param request_id ϢӦӦID - ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id); - - ///algoҵ޸вԵӦ - ///@param strategy_info û޸ĺԵľϢ - ///@param error_info ޸IJԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд - ///@param session_id ʽ˻Ӧsession_id¼ʱõ - ///@remark ҪٷأϢʱᴥ - virtual void OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id); - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processQueryAccountTradeMarket(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderEx(Task *task); - - void processQueryOrderByPage(Task *task); - - void processQueryOrderByPageEx(Task *task); - - void processQueryTrade(Task *task); - - void processQueryTradeByPage(Task *task); - - void processQueryPosition(Task *task); - - void processQueryAsset(Task *task); - - void processQueryStructuredFund(Task *task); - - void processQueryFundTransfer(Task *task); - - void processFundTransfer(Task *task); - - void processQueryETF(Task *task); - - void processQueryETFBasket(Task *task); - - void processQueryIPOInfoList(Task *task); - - void processQueryIPOQuotaInfo(Task *task); - - void processQueryBondIPOInfoList(Task *task); - - void processQueryBondSwapStockInfo(Task *task); - - void processQueryOptionAuctionInfo(Task *task); - - void processCreditCashRepay(Task *task); - - void processQueryCreditCashRepayInfo(Task *task); - - void processQueryCreditFundInfo(Task *task); - - void processQueryCreditDebtInfo(Task *task); - - void processQueryCreditTickerDebtInfo(Task *task); - - void processQueryCreditAssetDebtInfo(Task *task); - - void processQueryCreditTickerAssignInfo(Task *task); - - void processQueryCreditExcessStock(Task *task); - - void processQueryMulCreditExcessStock(Task *task); - - void processCreditExtendDebtDate(Task *task); - - void processQueryCreditExtendDebtDateOrders(Task *task); - - void processQueryCreditFundExtraInfo(Task *task); - - void processQueryCreditPositionExtraInfo(Task *task); - - void processCreditCashRepayDebtInterestFee(Task *task); - - - void processOptionCombinedOrderEvent(Task *task); - - void processOptionCombinedTradeEvent(Task *task); - - void processQueryOptionCombinedOrders(Task *task); - - void processQueryOptionCombinedOrdersEx(Task *task); - - void processQueryOptionCombinedOrdersByPage(Task *task); - - void processQueryOptionCombinedOrdersByPageEx(Task *task); - - void processQueryOptionCombinedTrades(Task *task); - - void processQueryOptionCombinedTradesByPage(Task *task); - - void processQueryOptionCombinedPosition(Task *task); - - void processQueryOptionCombinedStrategyInfo(Task *task); - - void processCancelOptionCombinedOrderError(Task *task); - - void processQueryOptionCombinedExecPosition(Task *task); - - void processQueryOtherServerFund(Task *task); - - //////////algo///////// - void processQueryStrategy(Task *task); - - void processStrategyStateReport(Task *task); - - void processALGOUserEstablishChannel(Task *task); - - void processInsertAlgoOrder(Task *task); - - void processCancelAlgoOrder(Task *task); - - void processAlgoDisconnected(Task *task); - - void processAlgoConnected(Task *task); - - void processStrategySymbolStateReport(Task *task); - - void processNewStrategyCreateReport(Task *task); - - void processStrategyRecommendation(Task *task); - - void processModifyAlgoOrder(Task *task); - - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - virtual void onQueryAccountTradeMarket(int trade_location, dict error, int request_id, uint64_t session_id) {}; - - virtual void onOrderEvent(dict data, dict error, uint64_t session) {}; - - virtual void onTradeEvent(dict data, uint64_t session) {}; - - virtual void onCancelOrderError(dict data, dict error, uint64_t session) {}; - - virtual void onQueryOrder(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryOrderEx(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryTrade(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryPosition(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryAsset(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryStructuredFund(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryFundTransfer(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onFundTransfer(dict data, dict error, uint64_t session) {}; - - virtual void onQueryETF(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryETFBasket(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryIPOInfoList(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryIPOQuotaInfo(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryBondIPOInfoList(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryBondSwapStockInfo(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool last, uint64_t session) {}; - - virtual void onCreditCashRepay(dict data, dict error_info, uint64_t session) {}; - - virtual void onQueryCreditCashRepayInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryCreditFundInfo(dict data, dict error_info, int request_id, uint64_t session) {}; - - virtual void onQueryCreditDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryCreditTickerDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryCreditAssetDebtInfo(double remain_amount, dict error_info, int request_id, uint64_t session) {}; - - virtual void onQueryCreditTickerAssignInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session) {}; - - virtual void onQueryMulCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session, bool last) {}; - - virtual void onCreditExtendDebtDate(dict data, dict error_info, uint64_t session) {}; - - virtual void onQueryCreditExtendDebtDateOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryCreditFundExtraInfo(dict data, dict error_info, int request_id, uint64_t session) {}; - - virtual void onQueryCreditPositionExtraInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryOrderByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryOrderByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - virtual void onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - virtual void onCreditCashRepayDebtInterestFee(dict data, dict error_info, uint64_t session) {}; - - - - - virtual void onOptionCombinedOrderEvent(dict data, dict error_info, uint64_t session_id) {}; - - virtual void onOptionCombinedTradeEvent(dict data, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedOrdersEx(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedOrdersByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedOrdersByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedTrades(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedTradesByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onQueryOptionCombinedStrategyInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; - - virtual void onCancelOptionCombinedOrderError(dict data, dict error_info, uint64_t session) {}; - - virtual void onQueryOptionCombinedExecPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; - - virtual void onQueryOtherServerFund(dict data, dict error_info, int request_id, uint64_t session) {}; - - - //////////////algo//////// - - virtual void onQueryStrategy(dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id){}; - - virtual void onStrategyStateReport(dict data, uint64_t session_id){}; - - virtual void onALGOUserEstablishChannel(string user,dict error_info, uint64_t session_id){}; - - virtual void onInsertAlgoOrder(dict data,dict error_info, uint64_t session_id){}; - - virtual void onCancelAlgoOrder(dict data,dict error_info, uint64_t session_id){}; - - virtual void onAlgoDisconnected(int reason){}; - - virtual void onAlgoConnected(){}; - - virtual void onStrategySymbolStateReport(dict data, uint64_t session_id) {}; - - virtual void onNewStrategyCreateReport(dict data, string strategy_param, uint64_t session_id) {}; - - virtual void onStrategyRecommendation(bool basket_flag, dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; - - virtual void onModifyAlgoOrder(dict data,dict error_info, uint64_t session_id) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level); - - void release(); - - int exit(); - - string getTradingDay(); - - dict getApiLastError(); - - string getApiVersion(); - - uint8_t getClientIDByXTPID(uint64_t orderid); - - string getAccountByXTPID(uint64_t orderid); - - void subscribePublicTopic(int tpye); - - void setSoftwareKey(string key); - - void setSoftwareVersion(string version); - - void setHeartBeatInterval(uint32_t interval); - - uint64_t login(string ip, int port, string user, string password, int socktype,string local_ip); - - int logout(uint64_t sessionid); - - int modifyUserTerminalInfo(dict info, uint64_t session_id); - - int queryAccountTradeMarket(uint64_t session_id, int request_id); - - uint64_t getANewOrderXTPID(uint64_t session_id); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t insertOrderExtra(dict req, uint64_t session_id); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrderByXTPIDEx(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, uint64_t sessionid, int reqid); - - int queryOrdersEx(dict req, uint64_t sessionid, int reqid); - - int queryUnfinishedOrders(uint64_t sessionid, int reqid); - - int queryUnfinishedOrdersEx(uint64_t sessionid, int reqid); - - int queryTradesByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryTrades(dict req, uint64_t sessionid, int reqid); - - int queryPosition(string ticker, uint64_t sessionid, int reqid); - - int queryAsset(uint64_t sessionid, int reqid); - - int queryStructuredFund(dict req, uint64_t sessionid, int reqid); - - uint64_t fundTransfer(dict req, uint64_t sessionid); - - int queryFundTransfer(dict req, uint64_t sessionid, int reqid); - - int queryETF(dict req, uint64_t sessionid, int reqid); - - int queryETFTickerBasket(dict req, uint64_t sessionid, int reqid); - - int queryIPOInfoList(uint64_t sessionid, int reqid); - - int queryIPOQuotaInfo(uint64_t sessionid, int reqid); - - int queryBondIPOInfoList(uint64_t session_id, int request_id); - - int queryBondSwapStockInfo(dict req, uint64_t session_id, int request_id); - - int queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - uint64_t creditCashRepay(double amount, uint64_t session_id); - - int queryCreditCashRepayInfo(uint64_t session_id, int request_id); - - int queryCreditFundInfo(uint64_t session_id, int request_id); - - int queryCreditDebtInfo(uint64_t session_id, int request_id); - - int queryCreditTickerDebtInfo(dict req, uint64_t session_id, int request_id); - - int queryCreditAssetDebtInfo(uint64_t session_id, int request_id); - - int queryCreditTickerAssignInfo(dict req, uint64_t session_id, int request_id); - - int queryCreditExcessStock(dict req, uint64_t session_id, int request_id); - - int queryMulCreditExcessStock(dict req, uint64_t session_id, int request_id); - - uint64_t creditExtendDebtDate(dict req, uint64_t session_id); - - int queryCreditExtendDebtDateOrders(uint64_t xtp_id,uint64_t session_id, int request_id); - - int queryCreditFundExtraInfo( uint64_t session_id, int request_id); - - int queryCreditPositionExtraInfo(dict req, uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryOrdersByPageEx(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); - - uint64_t creditCashRepayDebtInterestFee(string debt_id, double amount, uint64_t session_id); - - uint64_t creditSellStockRepayDebtInterestFee(dict req, string debt_id, uint64_t session_id); - - uint64_t insertOptionCombinedOrder(dict req, uint64_t session_id); - - uint64_t insertOptionCombinedOrderExtra(dict req, uint64_t session_id); - - int queryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id); - - int queryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id); - - int queryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id); - - int queryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id); - - int queryOptionCombinedOrders(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedOrdersEx(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedOrdersByPage(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedOrdersByPageEx(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id); - - int queryOptionCombinedTrades(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedTradesByPage(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedPosition(dict req, uint64_t session_id, int request_id); - - int queryOptionCombinedStrategyInfo(uint64_t session_id, int request_id); - - uint64_t cancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id); - - int queryOptionCombinedExecPosition(dict req, uint64_t session_id, int request_id); - - int queryOtherServerFund(dict req, uint64_t session_id, int request_id); - - /////////////////////algo/////////////////////// - - int loginALGO(string ip, int port, string user, string password, int socktype,string local_ip); - - int queryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id); - - int aLGOUserEstablishChannel(string oms_ip, int oms_port, string user, string password, uint64_t session_id); - - int insertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, string strategy_param, uint64_t session_id); - - int cancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id); - - uint64_t getAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id); - - int strategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id); - - int modifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id); -}; +//˵ + +//API +#include "xtp_trader_api.h" + +//ϵͳ +//#ifdef WIN32 +//#include "stdafx.h" +//#endif +#include +#include + +//Boost +#define BOOST_PYTHON_STATIC_LIB +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //pythonװ +#include //е̹߳ +#include //е̹߳ + + +//ռ +using namespace std; +using namespace boost::python; +using namespace boost; + + +// +#define ONDISCONNECTED 1 +#define ONERROR 2 +#define ONORDEREVENT 3 +#define ONTRADEEVENT 4 +#define ONCANCELORDERERROR 5 +#define ONQUERYORDER 6 +#define ONQUERYTRADE 7 +#define ONQUERYPOSITION 8 +#define ONQUERYASSET 9 +#define ONQUERYSTRUCTUREDFUND 10 +#define ONQUERYFUNDTRANSFER 11 +#define ONFUNDTRANSFER 12 +#define ONQUERYETF 13 +#define ONQUERYETFBASKET 14 +#define ONQUERYIPOINFOLIST 15 +#define ONQUERYIPOQUOTAINFO 16 + +#define ONQUERYOPTIONAUCTIONINFO 17 + +#define ONCREDITCASHREPAY 18 +#define ONQUERYCREDITCASHREPAYINFO 19 +#define ONQUERYCREDITFUNDINFO 20 +#define ONQUERYCREDITDEBTINFO 21 +#define ONQUERYCREDITTICKERDEBTINFO 22 +#define ONQUERYCREDITASSETDEBTINFO 23 +#define ONQUERYCREDITTICKERASSIGNINFO 24 +#define ONQUERYCREDITEXCESSSTOCK 25 + +#define ONCREDITEXTENDDEBTDATE 26 +#define ONQUERYCREDITEXTENDDEBTDATEORDERS 27 +#define ONQUERYCREDITFUNDEXTRAINFO 28 +#define ONQUERYCREDITPOSITIONEXTRAINFO 29 + +#define ONQUERYORDERBYPAGE 30 +#define ONQUERYTRADEBYPAGE 31 +#define ONCREDITCASHREPAYDEBTINTERESTFEE 32 +#define ONQUERYMULCREDITEXCESSSTOCK 33 + +#define ONOPTIONCOMBINEDORDEREVENT 34 +#define ONOPTIONCOMBINEDTRADEEVENT 35 +#define ONQUERYOPTIONCOMBINEDORDERS 36 +#define ONQUERYOPTIONCOMBINEDORDERSBYPAGE 37 +#define ONQUERYOPTIONCOMBINEDTRADES 38 +#define ONQUERYOPTIONCOMBINEDTRADESBYPAGE 39 +#define ONQUERYOPTIONCOMBINEDPOSITION 40 +#define ONQUERYOPTIONCOMBINEDSTRATEGYINFO 41 +#define ONCANCELOPTIONCOMBINEDORDERERROR 42 + +#define ONQUERYOPTIONCOMBINEDEXECPOSITION 43 +#define ONQUERYOTHERSERVERFUND 44 + + +#define ONQUERYSTRATEGY 45 +#define ONSTRATEGYASTATEREPORT 46 +#define ONALGOUSERESTABLISHCHANNEL 47 +#define ONINSERTALGOORDER 48 +#define ONCANCELALGOORDER 49 +#define ONALGODISCONNECTED 50 +#define ONALGOCONNECTED 51 +#define ONQUERYORDEREX 52 +#define ONQUERYORDERBYPAGEEX 53 +#define ONQUERYOPTIONCOMBINEDORDERSEX 54 +#define ONQUERYOPTIONCOMBINEDORDERSBYPAGEEX 55 +#define ONSTRATEGYSYMBOLSTATEREPORT 56 +#define ONQUERYACCOUNTTRADEMARKET 57 + +#define ONQUERYBONDIPOINFOLIST 58 +#define ONQUERYBONDSWAPSTOCKINFO 59 +#define ONNEWSTRATEGYCREATEREPORT 60 +#define ONSTRATEGYRECOMMENDATION 61 +#define ONMODIFYALGOORDER 62 +///------------------------------------------------------------------------------------- +///APIеIJ +///------------------------------------------------------------------------------------- + +//GILȫ򻯻ȡã +//ڰC++̻߳GILӶֹpython +class PyLock +{ +private: + PyGILState_STATE gil_state; + +public: + //ijдöʱGIL + PyLock() + { + gil_state = PyGILState_Ensure(); + } + + //ijɺٸöʱGIL + ~PyLock() + { + PyGILState_Release(gil_state); + } +}; + + +//ṹ +struct Task +{ + int task_name; //صƶӦij + void *task_data; //ݽṹ + void *task_error; //ṹ + int task_id; //id + bool task_last; //ǷΪ󷵻 + bool addtional_bool; //boolֶ + uint64_t addtional_int; //ֶ + double remain_amount;//doubleֶ + int64_t addtional_int_two; //ֶ + int64_t addtional_int_three; //ֶ + int64_t addtional_int_four; //ֶ + + int64_t req_count; + int64_t order_sequence; + int64_t query_reference; + int64_t trade_sequence; + + string strategy_param; + string user; + int reason; +}; + + +///̰߳ȫĶ +template + +class ConcurrentQueue +{ +private: + queue the_queue; //׼ + mutable boost::mutex the_mutex; //boost + boost::condition_variable the_condition_variable; //boost + +public: + + //µ + void push(Data const& data) + { + boost::mutex::scoped_lock lock(the_mutex); //ȡ + the_queue.push(data); //д + lock.unlock(); //ͷ + the_condition_variable.notify_one(); //֪ͨȴ߳ + } + + //ǷΪ + bool empty() const + { + boost::mutex::scoped_lock lock(the_mutex); + return the_queue.empty(); + } + + //ȡ + Data wait_and_pop() + { + boost::mutex::scoped_lock lock(the_mutex); + + while (the_queue.empty()) //Ϊʱ + { + the_condition_variable.wait(lock); //ȴ֪ͨ + } + + Data popped_value = the_queue.front(); //ȡеһ + the_queue.pop(); //ɾ + return popped_value; //ظ + } + +}; + + +void getNestedDictValue(dict d, string key1, string key2, int *value); + +void getNestedDictChar(dict d, string key1, string key2, char *value); + +void getNestedDictChar2(dict d, string key1, string key2, string key3, char *value, int index); + +void getNestedDictValue2(dict d, string key1, string key2, string key3, int *value, int index); + +//ֵлȡijֵӦֵṹֵ +void getInt(dict d, string key, int *value); + +void getUint64(dict d, string key, uint64_t *value); + +void getUint32(dict d, string key, uint32_t *value); + +void getInt64(dict d, string key, int64_t *value); + + + +//ֵлȡijֵӦĸֵṹֵ +void getDouble(dict d, string key, double* value); + + +//ֵлȡijֵӦֵַṹֵ +void getChar(dict d, string key, char* value); + + +//ֵлȡijֵӦֵַṹֵ +void getStr(dict d, string key, char* value); + + +///------------------------------------------------------------------------------------- +///C++ SPIĻصʵ +///------------------------------------------------------------------------------------- + +//APIļ̳ʵ +class TraderApi : public XTP::API::TraderSpi +{ +private: + XTP::API::TraderApi* api; //API + boost::thread *task_thread; //ָ߳루pythonݣ + ConcurrentQueue task_queue; // + +public: + TraderApi() + { + function0 f = boost::bind(&TraderApi::processTask, this); + boost::thread t(f); + this->task_thread = &t; + }; + + ~TraderApi() + { + }; + + //------------------------------------------------------------------------------------- + //APIص + //------------------------------------------------------------------------------------- + + ///ͻ˵ij뽻׺̨ͨӶϿʱ÷á + ///@param reason ԭӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ûlogoutµĶߣᴥ˺apiԶ߷ʱûѡڴ˺еLoginµ¼session_idʱûյݸ֮ǰ + virtual void OnDisconnected(uint64_t session_id, int reason) ; + + ///Ӧ + ///@param error_info ӦʱľĴʹϢ,error_infoΪգerror_info.error_idΪ0ʱûд + ///@remark ˺ֻڷʱŻãһû + virtual void OnError(XTPRI *error_info) ; + + ///ѯûڱڵϿɽгӦ + ///@param trade_location ѯĽгϢλӵλʼ0λʾУ(trade_location&0x01) == 0x01ɽ׻У1λʾУ(trade_location&0x02) == 0x02ʾɽУ0λ͵1λ1(trade_location&(0x01|0x02)) == 0x03ͱʾɽ׻2г + ///@param error_info ѯɽгʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ˲ѯֻһ + virtual void OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id); + + ///֪ͨ + ///@param order_info ӦϢûͨorder_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶorder_info.qty_leftֶڶΪδɽɡȫɡϵ״̬ʱʾ˶ûгɽڲȫ״̬ʱʾ˶order_info.order_cancel_xtp_idΪӦijIDΪ0ʱʾ˵ɹ + ///@param error_info ܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark ÿζ״̬ʱᱻãҪٷأϢʱᴥߣڶδɽȫɽȫֳѾܾЩ״̬ʱӦڲֳɽɶijɽرȷϡе¼˴ûĿͻ˶յûĶӦ + virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) ; + + ///ɽ֪ͨ + ///@param trade_info ɽرľϢûͨtrade_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶϽexec_idΨһʶһʳɽ2ʳɽرӵͬexec_idΪ˱ʽԳɽˡexec_idΨһģʱ޴жϻơreport_index+marketֶοΨһʶʾɽر + ///@remark гɽʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûijɽرضΪ״̬ҪûͨɽرijɽȷOnOrderEvent()Ͳ״̬ + virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) ; + + ///Ӧ + ///@param cancel_info Ϣorder_cancel_xtp_idʹorder_xtp_id + ///@param error_info ܾ߷ʱʹϢҪٷأϢʱᴥߣerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark Ӧֻڳʱص + virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) ; + + ///ѯӦ + ///@param order_info ѯһ + ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥ + virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + ///ѯӦ-°汾ӿ + ///@param order_info ѯһϢ + ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥ + virtual void OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ҳѯӦ + ///@param order_info ѯһ + ///@param req_count ҳ + ///@param order_sequence ҳĵǰر + ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); + + ///ҳѯӦ-°汾ӿ + ///@param order_info ѯһ + ///@param req_count ҳ + ///@param order_sequence ҳĵǰر + ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); + + ///ѯɽӦ + ///@param trade_info ѯһɽر + ///@param error_info ѯɽرʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥ + virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + ///ҳѯɽӦ + ///@param trade_info ѯһɽϢ + ///@param req_count ҳ + ///@param trade_sequence ҳĵǰر + ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark trade_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱtrade_sequencereq_countôʾлرԽһηҳѯȣʾлرѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); + + ///ѯͶֲ߳Ӧ + ///@param position ѯһֻƱijֲ + ///@param error_info ѯ˻ֲַʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ûܳжƱһѯܶӦӦҪٷأϢʱᴥ + virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + ///ѯʽ˻ӦҪٷأϢʱᴥ + ///@param asset ѯʽ˻ + ///@param error_info ѯʽ˻ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + + ///ѯּϢӦҪٷأϢʱᴥ + ///@param fund_info ѯķּ + ///@param error_info ѯּʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯʽ𻮲ӦҪٷأϢʱᴥ + ///@param fund_transfer_info ѯʽ˻ + ///@param error_info ѯʽ˻ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ʽ𻮲֪ͨ + ///@param fund_transfer_info ʽ𻮲֪ͨľϢûͨfund_transfer_info.serial_idͨGetClientIDByXTPID() == client_idԼĶ + ///@param error_info ʽ𻮲ܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@remark ʽ𻮲״̬仯ʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûʽ𻮲֪ͨ + virtual void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id); + + ///ѯETF嵥ļӦҪٷأϢʱᴥ + ///@param etf_info ѯETF嵥ļ + ///@param error_info ѯETF嵥ļʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯETFƱӦҪٷأϢʱᴥ + ///@param etf_component_info ѯETFԼسɷֹϢ + ///@param error_info ѯETFƱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯ¹깺ϢбӦҪٷأϢʱᴥ + ///@param ipo_info ѯĽ¹깺һֻƱϢ + ///@param error_info ѯ¹깺ϢбʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯû¹깺ϢӦҪٷأϢʱᴥ + ///@param quota_info ѯûijгĽ¹깺Ϣ + ///@param error_info ѯû¹깺ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯտתծ깺ϢбӦҪٷأϢʱᴥ + ///@param ipo_info ѯĽտתծ깺һֻתծϢ + ///@param error_info ѯտתծ깺ϢбʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯûתծתϢӦҪٷأϢʱᴥ + ///@param swap_stock_info ѯijתծתϢ + ///@param error_info ѯתծתϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯȨԼӦҪٷأϢʱᴥ + ///@param option_info ѯȨԼ + ///@param error_info ѯȨԼʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ȯҵֱֽӻӦ + ///@param cash_repay_info ֱֽӻ֪ͨľϢûͨcash_repay_info.xtp_idͨGetClientIDByXTPID() == client_idԼĶ + ///@param error_info ֽ𻹿ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id); + + ///ȯҵֽϢӦ + ///@param cash_repay_info ֽϢ֪ͨľϢûͨcash_repay_info.xtp_idͨGetClientIDByXTPID() == client_idԼĶ + ///@param error_info ֽϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id); + + ///ѯȯҵеֱֽӻӦ + ///@param cash_repay_info ѯijһֱֽӻ֪ͨľϢ + ///@param error_info ѯֱֽӱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo *cash_repay_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯ˻ϢӦҪٷأϢʱᴥ + ///@param fund_info ѯ˻Ϣ + ///@param error_info ѯ˻ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditFundInfo(XTPCrdFundInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) ; + + ///ѯ˻ծϢӦҪٷأϢʱᴥ + ///@param debt_info ѯ˻Լծ + ///@param error_info ѯ˻ծϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditDebtInfo(XTPCrdDebtInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + ///ѯ˻ָ֤ȯծδϢӦҪٷأϢʱᴥ + ///@param debt_info ѯ˻ָ֤ȯծδϢ + ///@param error_info ѯ˻ָ֤ȯծδϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯ˻ʽӦҪٷأϢʱᴥ + ///@param remain_amount ѯ˻ʽ + ///@param error_info ѯ˻ʽʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI *error_info, int request_id, uint64_t session_id); + + ///ѯ˻ȯͷϢӦҪٷأϢʱᴥ + ///@param assign_info ѯ˻ȯͷϢ + ///@param error_info ѯ˻ȯͷϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo *assign_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ȯҵѯָȯϢӦҪٷأϢʱᴥ + ///@param stock_info ѯȯϢ + ///@param error_info ѯ˻ȯϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id); + + ///ȯҵѯȯϢӦҪٷأϢʱᴥ + ///@param stock_info ѯȯϢ + ///@param error_info ѯ˻ȯϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id, bool is_last); + + ///ȯҵиծԼչڵ֪ͨ + ///@param debt_extend_info ծԼչ֪ͨľϢûͨdebt_extend_info.xtpidͨGetClientIDByXTPID() == client_idԼĶ + ///@param error_info ծԼչڶܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ծԼչڶ״̬仯ʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûĸծԼչ֪ͨ + virtual void OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, uint64_t session_id); + + ///ѯȯҵиծԼչڶӦҪٷأϢʱᴥ + ///@param debt_extend_info ѯĸծԼչ + ///@param error_info ѯծԼչڷʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд󡣵error_info.error_id=11000350ʱûм¼Ϊ0ֵʱԼܵʱĴԭ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯȯҵ˻ϢӦҪٷأϢʱᴥ + ///@param fund_info ˻Ϣ + ///@param error_info ѯ˻ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id); + + ///ѯȯҵ˻ָ֤ȯĸϢӦҪٷأϢʱᴥ + ///@param fund_info ˻ָ֤ȯĸϢ + ///@param error_info ѯ˻ϢʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ȨϲԱ֪ͨ + ///@param order_info ӦϢûͨorder_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶorder_info.qty_leftֶڶΪδɽɡȫɡϵ״̬ʱʾ˶ûгɽڲȫ״̬ʱʾ˶order_info.order_cancel_xtp_idΪӦijIDΪ0ʱʾ˵ɹ + ///@param error_info ܾ߷ʱʹϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ÿζ״̬ʱᱻãҪٷأϢʱᴥߣڶδɽȫɽȫֳѾܾЩ״̬ʱӦڲֳɽɶijɽرȷϡе¼˴ûĿͻ˶յûĶӦ + virtual void OnOptionCombinedOrderEvent(XTPOptCombOrderInfo *order_info, XTPRI *error_info, uint64_t session_id); + + ///ȨϲԳɽ֪ͨ + ///@param trade_info ɽرľϢûͨtrade_info.order_xtp_idͨGetClientIDByXTPID() == client_idԼĶϽexec_idΨһʶһʳɽ2ʳɽرӵͬexec_idΪ˱ʽԳɽˡexec_idΨһģʱ޴жϻơreport_index+marketֶοΨһʶʾɽر + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark гɽʱ򣬻ᱻãҪٷأϢʱᴥߡе¼˴ûĿͻ˶յûijɽرضΪ״̬ҪûͨɽرijɽȷOnOrderEvent()Ͳ״̬ + virtual void OnOptionCombinedTradeEvent(XTPOptCombTradeReport *trade_info, uint64_t session_id); + + ///ȨϲԳӦ + ///@param cancel_info Ϣorder_cancel_xtp_idʹorder_xtp_id + ///@param error_info ܾ߷ʱʹϢҪٷأϢʱᴥߣerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark Ӧֻڳʱص + virtual void OnCancelOptionCombinedOrderError(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) ; + + ///ѯȨϲԱӦ + ///@param order_info ѯһ + ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥߡ˶Ӧѯʹãʱû·ӵ£api + virtual void OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + ///ѯȨϲԱӦ-°汾ӿ + ///@param order_info ѯһ + ///@param error_info ѯʱʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥߡ˶Ӧѯʹãʱû·ӵ£api + virtual void OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ҳѯȨϲԱӦ + ///@param order_info ѯһ + ///@param req_count ҳ + ///@param order_sequence ҳĵǰر + ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) ; + + ///ҳѯȨϲԱӦ-°汾ӿ + ///@param order_info ѯһ + ///@param req_count ҳ + ///@param order_sequence ҳĵǰر + ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark order_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱorder_sequencereq_countôʾбԽһηҳѯȣʾбѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) ; + + ///ѯȨϲԳɽӦ + ///@param trade_info ѯһɽر + ///@param error_info ѯɽرʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ַ֧ʱβѯһѯܶӦӦҪٷأϢʱᴥߡ˶Ӧѯʹãʱû·ӵ£api + virtual void OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) ; + + ///ҳѯȨϲԳɽӦ + ///@param trade_info ѯһɽϢ + ///@param req_count ҳ + ///@param trade_sequence ҳĵǰر + ///@param query_reference ǰϢӦIJѯҪ¼ڽһηҳѯʱҪõ + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark trade_sequenceΪ0βѯûв鵽κμ¼is_lastΪtrueʱtrade_sequencereq_countôʾлرԽһηҳѯȣʾлرѾѯϡһѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id); + + ///ѯȨϲԳֲӦ + ///@param position_info ѯһֲϢ + ///@param error_info ѯֲַʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark һѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯȨϲϢӦ + ///@param strategy_info ѯһϲϢ + ///@param error_info ѯɽرʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark һѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp *strategy_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯȨȨϲͷӦ + ///@param position_info ѯһȨϲͷϢ + ///@param error_info ѯֲַʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark һѯܶӦӦҪٷأϢʱᴥߡ + virtual void OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id); + + ///ѯڵʽӦҪٷأϢʱᴥ + ///@param fund_info ѯڵʽ + ///@param error_info ѯڵʽʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id); + + + //////////////////////////////////////////////////////////////// + /*****algo algo algo algo algo algo algo algo algo algo ******/ + //////////////////////////////////////////////////////////////// + + ///algoҵвѯбӦ + ///@param strategy_info ԾϢ + ///@param strategy_param ˲аIJerror_info.error_idΪ0ʱ + ///@param error_info ѯѯбʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id); + + ///algoҵвʱ״̬֪ͨ + ///@param strategy_state û״̬֪ͨ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state, uint64_t session_id); + + ///algoҵû㷨ͨϢӦ + ///@param user û + ///@param error_info 㷨ͨʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд󣬼㷨ͨɹ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark 㷨ͨɹ󣬲ܶûԵȲһûֻӵһ㷨֮ͨǰѾظ + virtual void OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id); + + ///algoҵбͲԵӦ + ///@param strategy_info û͵IJԵľϢ + ///@param error_info ͲԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id); + + ///algoҵгԵӦ + ///@param strategy_info ûIJԵľϢ + ///@param error_info ԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id); + + ///ͻAlgoBusͨӶϿʱ÷á + ///@param reason ԭӦ + ///@remark 벻Ҫ̣߳Ӱalgoĵ¼Algo֮ӣߺԶû + virtual void OnAlgoDisconnected(int reason) ; + + ///ͻAlgoBusߺʱ÷ãڶɹᱻá + virtual void OnAlgoConnected(); + + ///algoҵвʱָ֤ȯִ״̬֪ͨ + ///@param strategy_symbol_state ûָ֤ȯ״̬֪ͨ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) ; + + ///algoҵбĸʱϢ(ͻ˴ĸ) + ///@param strategy_info ԾϢ + ///@param strategy_param ˲аIJ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id); + + ///algoҵ㷨ƼӦ + ///@param basket_flag ǷƼĸı־һ£˲ΪtrueôԷصstrategy_paramΪ׼ + ///@param recommendation_info Ƽ㷨ľϢbasket_flag=trueʱ˽ṹеmarkettickerû壬ʱstrategy_paramΪ׼ + ///@param strategy_param 㷨ֱĸerror_info.error_idΪ0ʱ + ///@param error_info Ƽ㷨ʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param is_last ϢӦǷΪrequest_idӦһӦΪһʱΪtrueΪfalseʾϢӦ + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id); + + ///algoҵ޸вԵӦ + ///@param strategy_info û޸ĺԵľϢ + ///@param error_info ޸IJԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id); + + //------------------------------------------------------------------------------------- + //task + //------------------------------------------------------------------------------------- + + void processTask(); + + void processDisconnected(Task *task); + + void processError(Task *task); + + void processQueryAccountTradeMarket(Task *task); + + void processOrderEvent(Task *task); + + void processTradeEvent(Task *task); + + void processCancelOrderError(Task *task); + + void processQueryOrder(Task *task); + + void processQueryOrderEx(Task *task); + + void processQueryOrderByPage(Task *task); + + void processQueryOrderByPageEx(Task *task); + + void processQueryTrade(Task *task); + + void processQueryTradeByPage(Task *task); + + void processQueryPosition(Task *task); + + void processQueryAsset(Task *task); + + void processQueryStructuredFund(Task *task); + + void processQueryFundTransfer(Task *task); + + void processFundTransfer(Task *task); + + void processQueryETF(Task *task); + + void processQueryETFBasket(Task *task); + + void processQueryIPOInfoList(Task *task); + + void processQueryIPOQuotaInfo(Task *task); + + void processQueryBondIPOInfoList(Task *task); + + void processQueryBondSwapStockInfo(Task *task); + + void processQueryOptionAuctionInfo(Task *task); + + void processCreditCashRepay(Task *task); + + void processQueryCreditCashRepayInfo(Task *task); + + void processQueryCreditFundInfo(Task *task); + + void processQueryCreditDebtInfo(Task *task); + + void processQueryCreditTickerDebtInfo(Task *task); + + void processQueryCreditAssetDebtInfo(Task *task); + + void processQueryCreditTickerAssignInfo(Task *task); + + void processQueryCreditExcessStock(Task *task); + + void processQueryMulCreditExcessStock(Task *task); + + void processCreditExtendDebtDate(Task *task); + + void processQueryCreditExtendDebtDateOrders(Task *task); + + void processQueryCreditFundExtraInfo(Task *task); + + void processQueryCreditPositionExtraInfo(Task *task); + + void processCreditCashRepayDebtInterestFee(Task *task); + + + void processOptionCombinedOrderEvent(Task *task); + + void processOptionCombinedTradeEvent(Task *task); + + void processQueryOptionCombinedOrders(Task *task); + + void processQueryOptionCombinedOrdersEx(Task *task); + + void processQueryOptionCombinedOrdersByPage(Task *task); + + void processQueryOptionCombinedOrdersByPageEx(Task *task); + + void processQueryOptionCombinedTrades(Task *task); + + void processQueryOptionCombinedTradesByPage(Task *task); + + void processQueryOptionCombinedPosition(Task *task); + + void processQueryOptionCombinedStrategyInfo(Task *task); + + void processCancelOptionCombinedOrderError(Task *task); + + void processQueryOptionCombinedExecPosition(Task *task); + + void processQueryOtherServerFund(Task *task); + + //////////algo///////// + void processQueryStrategy(Task *task); + + void processStrategyStateReport(Task *task); + + void processALGOUserEstablishChannel(Task *task); + + void processInsertAlgoOrder(Task *task); + + void processCancelAlgoOrder(Task *task); + + void processAlgoDisconnected(Task *task); + + void processAlgoConnected(Task *task); + + void processStrategySymbolStateReport(Task *task); + + void processNewStrategyCreateReport(Task *task); + + void processStrategyRecommendation(Task *task); + + void processModifyAlgoOrder(Task *task); + + //------------------------------------------------------------------------------------- + //dataصֵ + //errorصĴֵ + //reqidid + //lastǷΪ󷵻 + //------------------------------------------------------------------------------------- + + virtual void onDisconnected(uint64_t session, int reason) {}; + + virtual void onError(dict data) {}; + + virtual void onQueryAccountTradeMarket(int trade_location, dict error, int request_id, uint64_t session_id) {}; + + virtual void onOrderEvent(dict data, dict error, uint64_t session) {}; + + virtual void onTradeEvent(dict data, uint64_t session) {}; + + virtual void onCancelOrderError(dict data, dict error, uint64_t session) {}; + + virtual void onQueryOrder(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryOrderEx(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryTrade(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryPosition(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryAsset(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryStructuredFund(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryFundTransfer(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onFundTransfer(dict data, dict error, uint64_t session) {}; + + virtual void onQueryETF(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryETFBasket(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryIPOInfoList(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryIPOQuotaInfo(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryBondIPOInfoList(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryBondSwapStockInfo(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool last, uint64_t session) {}; + + virtual void onCreditCashRepay(dict data, dict error_info, uint64_t session) {}; + + virtual void onQueryCreditCashRepayInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryCreditFundInfo(dict data, dict error_info, int request_id, uint64_t session) {}; + + virtual void onQueryCreditDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryCreditTickerDebtInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryCreditAssetDebtInfo(double remain_amount, dict error_info, int request_id, uint64_t session) {}; + + virtual void onQueryCreditTickerAssignInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session) {}; + + virtual void onQueryMulCreditExcessStock(dict data, dict error_info, int request_id, uint64_t session, bool last) {}; + + virtual void onCreditExtendDebtDate(dict data, dict error_info, uint64_t session) {}; + + virtual void onQueryCreditExtendDebtDateOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryCreditFundExtraInfo(dict data, dict error_info, int request_id, uint64_t session) {}; + + virtual void onQueryCreditPositionExtraInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryOrderByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryOrderByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; + + virtual void onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; + + virtual void onCreditCashRepayDebtInterestFee(dict data, dict error_info, uint64_t session) {}; + + + + + virtual void onOptionCombinedOrderEvent(dict data, dict error_info, uint64_t session_id) {}; + + virtual void onOptionCombinedTradeEvent(dict data, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedOrders(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedOrdersEx(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedOrdersByPage(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedOrdersByPageEx(dict data, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedTrades(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedTradesByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onQueryOptionCombinedStrategyInfo(dict data, dict error_info, int request_id, bool is_last, uint64_t session_id) {}; + + virtual void onCancelOptionCombinedOrderError(dict data, dict error_info, uint64_t session) {}; + + virtual void onQueryOptionCombinedExecPosition(dict data, dict error_info, int request_id, bool is_last, uint64_t session) {}; + + virtual void onQueryOtherServerFund(dict data, dict error_info, int request_id, uint64_t session) {}; + + + //////////////algo//////// + + virtual void onQueryStrategy(dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id){}; + + virtual void onStrategyStateReport(dict data, uint64_t session_id){}; + + virtual void onALGOUserEstablishChannel(string user,dict error_info, uint64_t session_id){}; + + virtual void onInsertAlgoOrder(dict data,dict error_info, uint64_t session_id){}; + + virtual void onCancelAlgoOrder(dict data,dict error_info, uint64_t session_id){}; + + virtual void onAlgoDisconnected(int reason){}; + + virtual void onAlgoConnected(){}; + + virtual void onStrategySymbolStateReport(dict data, uint64_t session_id) {}; + + virtual void onNewStrategyCreateReport(dict data, string strategy_param, uint64_t session_id) {}; + + virtual void onStrategyRecommendation(bool basket_flag, dict data, string strategy_param, dict error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; + + virtual void onModifyAlgoOrder(dict data,dict error_info, uint64_t session_id) {}; + + //------------------------------------------------------------------------------------- + //req:ֵ + //------------------------------------------------------------------------------------- + + void createTraderApi(uint8_t clientid, string path, int log_level); + + void release(); + + int exit(); + + string getTradingDay(); + + dict getApiLastError(); + + string getApiVersion(); + + uint8_t getClientIDByXTPID(uint64_t orderid); + + string getAccountByXTPID(uint64_t orderid); + + void subscribePublicTopic(int tpye); + + void setSoftwareKey(string key); + + void setSoftwareVersion(string version); + + void setHeartBeatInterval(uint32_t interval); + + uint64_t login(string ip, int port, string user, string password, int socktype,string local_ip); + + int logout(uint64_t sessionid); + + int modifyUserTerminalInfo(dict info, uint64_t session_id); + + int queryAccountTradeMarket(uint64_t session_id, int request_id); + + uint64_t getANewOrderXTPID(uint64_t session_id); + + uint64_t insertOrder(dict req, uint64_t sessionid); + + uint64_t insertOrderExtra(dict req, uint64_t session_id); + + uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); + + int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); + + int queryOrderByXTPIDEx(uint64_t orderid, uint64_t sessionid, int reqid); + + int queryOrders(dict req, uint64_t sessionid, int reqid); + + int queryOrdersEx(dict req, uint64_t sessionid, int reqid); + + int queryUnfinishedOrders(uint64_t sessionid, int reqid); + + int queryUnfinishedOrdersEx(uint64_t sessionid, int reqid); + + int queryTradesByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); + + int queryTrades(dict req, uint64_t sessionid, int reqid); + + int queryPosition(string ticker, uint64_t sessionid, int reqid); + + int queryAsset(uint64_t sessionid, int reqid); + + int queryStructuredFund(dict req, uint64_t sessionid, int reqid); + + uint64_t fundTransfer(dict req, uint64_t sessionid); + + int queryFundTransfer(dict req, uint64_t sessionid, int reqid); + + int queryETF(dict req, uint64_t sessionid, int reqid); + + int queryETFTickerBasket(dict req, uint64_t sessionid, int reqid); + + int queryIPOInfoList(uint64_t sessionid, int reqid); + + int queryIPOQuotaInfo(uint64_t sessionid, int reqid); + + int queryBondIPOInfoList(uint64_t session_id, int request_id); + + int queryBondSwapStockInfo(dict req, uint64_t session_id, int request_id); + + int queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); + + uint64_t creditCashRepay(double amount, uint64_t session_id); + + int queryCreditCashRepayInfo(uint64_t session_id, int request_id); + + int queryCreditFundInfo(uint64_t session_id, int request_id); + + int queryCreditDebtInfo(uint64_t session_id, int request_id); + + int queryCreditTickerDebtInfo(dict req, uint64_t session_id, int request_id); + + int queryCreditAssetDebtInfo(uint64_t session_id, int request_id); + + int queryCreditTickerAssignInfo(dict req, uint64_t session_id, int request_id); + + int queryCreditExcessStock(dict req, uint64_t session_id, int request_id); + + int queryMulCreditExcessStock(dict req, uint64_t session_id, int request_id); + + uint64_t creditExtendDebtDate(dict req, uint64_t session_id); + + int queryCreditExtendDebtDateOrders(uint64_t xtp_id,uint64_t session_id, int request_id); + + int queryCreditFundExtraInfo( uint64_t session_id, int request_id); + + int queryCreditPositionExtraInfo(dict req, uint64_t session_id, int request_id); + + int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); + + int queryOrdersByPageEx(dict req, uint64_t sessionid, int reqid); + + int queryTradesByPage(dict req, uint64_t sessionid, int reqid); + + bool isServerRestart(uint64_t session_id); + + uint64_t creditCashRepayDebtInterestFee(string debt_id, double amount, uint64_t session_id); + + uint64_t creditSellStockRepayDebtInterestFee(dict req, string debt_id, uint64_t session_id); + + uint64_t insertOptionCombinedOrder(dict req, uint64_t session_id); + + uint64_t insertOptionCombinedOrderExtra(dict req, uint64_t session_id); + + int queryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id); + + int queryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id); + + int queryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id); + + int queryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id); + + int queryOptionCombinedOrders(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedOrdersEx(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedOrdersByPage(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedOrdersByPageEx(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id); + + int queryOptionCombinedTrades(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedTradesByPage(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedPosition(dict req, uint64_t session_id, int request_id); + + int queryOptionCombinedStrategyInfo(uint64_t session_id, int request_id); + + uint64_t cancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id); + + int queryOptionCombinedExecPosition(dict req, uint64_t session_id, int request_id); + + int queryOtherServerFund(dict req, uint64_t session_id, int request_id); + + /////////////////////algo/////////////////////// + + int loginALGO(string ip, int port, string user, string password, int socktype,string local_ip); + + int queryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id); + + int aLGOUserEstablishChannel(string oms_ip, int oms_port, string user, string password, uint64_t session_id); + + int insertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, string strategy_param, uint64_t session_id); + + int cancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id); + + uint64_t getAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id); + + int strategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id); + + int modifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id); +}; diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_api_struct.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_api_struct.h index 012e0a1..405ddca 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_api_struct.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_api_struct.h @@ -1,96 +1,96 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file algo_api_struct.h -///@brief 定义业务公共数据结构 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_ALGO_API_STRUCT_H_ -#define _XTP_ALGO_API_STRUCT_H_ - -#include "algo_data_type.h" -#include "xtp_api_struct_common.h" - -#pragma pack(8) - -///策略信息结构体 -typedef struct XTPStrategyInfoStruct -{ - uint16_t m_strategy_type; ///< 策略类型 - XTPStrategyStateType m_strategy_state; ///< 策略状态 - uint64_t m_client_strategy_id; ///< 客户策略id - uint64_t m_xtp_strategy_id; ///< xtp策略id -} XTPStrategyInfoStruct; - -///策略中指定证券信息结构体 -typedef struct XTPStrategySymbolInfoStruct -{ - XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - XTP_MARKET_TYPE m_market; ///< 市场 -} XTPStrategySymbolInfo; - -///策略状态结构体 -typedef struct XTPStrategyStateReportStruct -{ - XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 - int64_t m_strategy_qty; ///< 策略总量 - int64_t m_strategy_ordered_qty; ///< 策略已委托数量 - int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 - int64_t m_strategy_execution_qty; ///< 策略已成交数量 - int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) - double m_strategy_asset; ///< 策略总金额 - double m_strategy_ordered_asset; ///< 策略已委托金额 - double m_strategy_execution_asset; ///< 策略已成交金额 - double m_strategy_execution_price; ///< 策略执行价格 - double m_strategy_market_price; ///< 策略市场价 - double m_strategy_price_diff; ///< 策略执行价差 - double m_strategy_asset_diff; ///< 策略执行绩效(T0资金预净收入) - XTPRI m_error_info; ///< 错误信息 -} XTPStrategyStateReport; - -///指定策略指定证券的请求结构体 -typedef struct XTPStrategySymbolReqStruct -{ - uint64_t m_xtp_strategy_id; ///< xtp策略id - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - XTP_MARKET_TYPE m_market; ///< 市场 -} XTPStrategySymbolReq; - -///策略中指定证券的算法执行状态结构体 -typedef struct XTPStrategySymbolStateReportStruct -{ - XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - XTP_MARKET_TYPE m_market; ///< 市场 - XTP_SIDE_TYPE m_side; ///< 买卖方向,=0时为T0单 - int64_t m_strategy_qty; ///< 策略总量 - int64_t m_strategy_ordered_qty; ///< 策略已委托数量 - int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 - int64_t m_strategy_execution_qty; ///< 策略已成交数量 - int64_t m_strategy_buy_qty; ///< 策略已买入数量(T0) - int64_t m_strategy_sell_qty; ///< 策略已卖出数量(T0) - int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) - double m_strategy_asset; ///< 策略总金额 - double m_strategy_ordered_asset; ///< 策略已委托金额 - double m_strategy_execution_asset; ///< 策略已成交金额 - double m_strategy_buy_asset; ///< 策略买入金额(T0) - double m_strategy_sell_asset; ///< 策略卖出金额(TO) - double m_strategy_unclosed_asset; ///< 策略未平仓金额(T0) - double m_strategy_asset_diff; ///< 策略毛收益增强金额(T0) - double m_strategy_execution_price; ///< 策略执行价格 - double m_strategy_market_price; ///< 策略市场价 - double m_strategy_price_diff; ///< 策略执行价差(T0时为毛增强收益率) - XTPRI m_error_info; ///< 错误信息 -} XTPStrategySymbolStateReport; - -///推荐算法结构体 -typedef struct XTPStrategyRecommendationInfoStruct -{ - uint16_t m_strategy_type; ///< 策略类型 - XTP_MARKET_TYPE m_market; ///< 交易市场 - char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 - char m_reserved[64]; ///< 保留域 -} XTPStrategyRecommendationInfo; - -#pragma pack() - -#endif //_XTP_ALGO_API_STRUCT_H_ +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file algo_api_struct.h +///@brief 定义业务公共数据结构 +///////////////////////////////////////////////////////////////////////// +#ifndef _XTP_ALGO_API_STRUCT_H_ +#define _XTP_ALGO_API_STRUCT_H_ + +#include "algo_data_type.h" +#include "xtp_api_struct_common.h" + +#pragma pack(8) + +///策略信息结构体 +typedef struct XTPStrategyInfoStruct +{ + uint16_t m_strategy_type; ///< 策略类型 + XTPStrategyStateType m_strategy_state; ///< 策略状态 + uint64_t m_client_strategy_id; ///< 客户策略id + uint64_t m_xtp_strategy_id; ///< xtp策略id +} XTPStrategyInfoStruct; + +///策略中指定证券信息结构体 +typedef struct XTPStrategySymbolInfoStruct +{ + XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 市场 +} XTPStrategySymbolInfo; + +///策略状态结构体 +typedef struct XTPStrategyStateReportStruct +{ + XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 + int64_t m_strategy_qty; ///< 策略总量 + int64_t m_strategy_ordered_qty; ///< 策略已委托数量 + int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 + int64_t m_strategy_execution_qty; ///< 策略已成交数量 + int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) + double m_strategy_asset; ///< 策略总金额 + double m_strategy_ordered_asset; ///< 策略已委托金额 + double m_strategy_execution_asset; ///< 策略已成交金额 + double m_strategy_execution_price; ///< 策略执行价格 + double m_strategy_market_price; ///< 策略市场价 + double m_strategy_price_diff; ///< 策略执行价差 + double m_strategy_asset_diff; ///< 策略执行绩效(T0资金预净收入) + XTPRI m_error_info; ///< 错误信息 +} XTPStrategyStateReport; + +///指定策略指定证券的请求结构体 +typedef struct XTPStrategySymbolReqStruct +{ + uint64_t m_xtp_strategy_id; ///< xtp策略id + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 市场 +} XTPStrategySymbolReq; + +///策略中指定证券的算法执行状态结构体 +typedef struct XTPStrategySymbolStateReportStruct +{ + XTPStrategyInfoStruct m_strategy_info; ///< 策略信息 + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 市场 + XTP_SIDE_TYPE m_side; ///< 买卖方向,=0时为T0单 + int64_t m_strategy_qty; ///< 策略总量 + int64_t m_strategy_ordered_qty; ///< 策略已委托数量 + int64_t m_strategy_cancelled_qty; ///< 策略已撤单数量 + int64_t m_strategy_execution_qty; ///< 策略已成交数量 + int64_t m_strategy_buy_qty; ///< 策略已买入数量(T0) + int64_t m_strategy_sell_qty; ///< 策略已卖出数量(T0) + int64_t m_strategy_unclosed_qty; ///< 策略未平仓数量(T0卖出数量-买入数量) + double m_strategy_asset; ///< 策略总金额 + double m_strategy_ordered_asset; ///< 策略已委托金额 + double m_strategy_execution_asset; ///< 策略已成交金额 + double m_strategy_buy_asset; ///< 策略买入金额(T0) + double m_strategy_sell_asset; ///< 策略卖出金额(TO) + double m_strategy_unclosed_asset; ///< 策略未平仓金额(T0) + double m_strategy_asset_diff; ///< 策略毛收益增强金额(T0) + double m_strategy_execution_price; ///< 策略执行价格 + double m_strategy_market_price; ///< 策略市场价 + double m_strategy_price_diff; ///< 策略执行价差(T0时为毛增强收益率) + XTPRI m_error_info; ///< 错误信息 +} XTPStrategySymbolStateReport; + +///推荐算法结构体 +typedef struct XTPStrategyRecommendationInfoStruct +{ + uint16_t m_strategy_type; ///< 策略类型 + XTP_MARKET_TYPE m_market; ///< 交易市场 + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + char m_reserved[64]; ///< 保留域 +} XTPStrategyRecommendationInfo; + +#pragma pack() + +#endif //_XTP_ALGO_API_STRUCT_H_ diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_data_type.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_data_type.h index 91a709e..f2922c9 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_data_type.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/algo_data_type.h @@ -1,31 +1,31 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file algo_data_type.h -///@brief 定义业务公共数据结构 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_ALGO_DATA_TYPE_H_ -#define _XTP_ALGO_DATA_TYPE_H_ - -///@brief XTPStrategyStateType策略状态类型 -typedef uint8_t XTPStrategyStateType; - -///创建中 -#define XTP_STRATEGY_STATE_CREATING 0 -///已创建 -#define XTP_STRATEGY_STATE_CREATED 1 -///开始执行中 -#define XTP_STRATEGY_STATE_STARTING 2 -///已执行 -#define XTP_STRATEGY_STATE_STARTED 3 -///停止中 -#define XTP_STRATEGY_STATE_STOPPING 4 -///已停止 -#define XTP_STRATEGY_STATE_STOPPED 5 -///销毁中 -#define XTP_STRATEGY_STATE_DESTROYING 6 -///已销毁 -#define XTP_STRATEGY_STATE_DESTROYED 7 -///发生错误 -#define XTP_STRATEGY_STATE_ERROR 8 - -#endif //_XTP_ALGO_DATA_TYPE_H_ +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file algo_data_type.h +///@brief 定义业务公共数据结构 +///////////////////////////////////////////////////////////////////////// +#ifndef _XTP_ALGO_DATA_TYPE_H_ +#define _XTP_ALGO_DATA_TYPE_H_ + +///@brief XTPStrategyStateType策略状态类型 +typedef uint8_t XTPStrategyStateType; + +///创建中 +#define XTP_STRATEGY_STATE_CREATING 0 +///已创建 +#define XTP_STRATEGY_STATE_CREATED 1 +///开始执行中 +#define XTP_STRATEGY_STATE_STARTING 2 +///已执行 +#define XTP_STRATEGY_STATE_STARTED 3 +///停止中 +#define XTP_STRATEGY_STATE_STOPPING 4 +///已停止 +#define XTP_STRATEGY_STATE_STOPPED 5 +///销毁中 +#define XTP_STRATEGY_STATE_DESTROYING 6 +///已销毁 +#define XTP_STRATEGY_STATE_DESTROYED 7 +///发生错误 +#define XTP_STRATEGY_STATE_ERROR 8 + +#endif //_XTP_ALGO_DATA_TYPE_H_ diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/config.json b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/config.json index 09ce795..5984bbe 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/config.json +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/config.json @@ -1,51 +1,51 @@ -{ - "client_id": 1, - "path": "./", - "path_linux": "./", - "account_key":"xxxxxxxx", - "account": [ - { - "user": "tradeusername", - "password": "tradepw" - } - ], - "trade_port": 6001, - "trade_ip": "XXX.XXX.XXX.XXX", - "auto_save": true, - "resume_type": 2, - "order": [ - { - "instrument_id": "600090", - "exchange": 2, - "price": 7.0, - "quantity": 200, - "side": 1, - "price_type": 1, - "business_type":0, - "position_effect":0 - } - ], - "ping_pong_test": false, - "quote_ip": "XXX.XXX.XXX.XXX", - "quote_port": 6002, - "quote_user": "quoteusername", - "quote_password": "quotepw", - "quote_ticker": { - "instrument": [ - "600120" - ], - "exchange": 1 - }, - "hb_interval":15, - "quote_buffer_size":256, - "quote_protocol":1, - "account_algo": "XXXXX", - "password_algo": "XXXXXX", - "ip_algo": "XXX.XXX.XXX.XXX", - "port_algo": 0, - "strategy": { - "client_id": 1, - "type": 1001, - "param": "test param" - } +{ + "client_id": 1, + "path": "./", + "path_linux": "./", + "account_key":"xxxxxxxx", + "account": [ + { + "user": "tradeusername", + "password": "tradepw" + } + ], + "trade_port": 6001, + "trade_ip": "XXX.XXX.XXX.XXX", + "auto_save": true, + "resume_type": 2, + "order": [ + { + "instrument_id": "600090", + "exchange": 2, + "price": 7.0, + "quantity": 200, + "side": 1, + "price_type": 1, + "business_type":0, + "position_effect":0 + } + ], + "ping_pong_test": false, + "quote_ip": "XXX.XXX.XXX.XXX", + "quote_port": 6002, + "quote_user": "quoteusername", + "quote_password": "quotepw", + "quote_ticker": { + "instrument": [ + "600120" + ], + "exchange": 1 + }, + "hb_interval":15, + "quote_buffer_size":256, + "quote_protocol":1, + "account_algo": "XXXXX", + "password_algo": "XXXXXX", + "ip_algo": "XXX.XXX.XXX.XXX", + "port_algo": 0, + "strategy": { + "client_id": 1, + "type": 1001, + "param": "test param" + } } \ No newline at end of file diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_fund_struct.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_fund_struct.h index eb7748a..c685a70 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_fund_struct.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_fund_struct.h @@ -1,73 +1,73 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xoms_api_fund_struct.h -///@brief 定义资金划拨相关结构体类型 -///////////////////////////////////////////////////////////////////////// -#ifndef XOMS_API_FUND_STRUCT_H_ -#define XOMS_API_FUND_STRUCT_H_ - -#include "xtp_api_data_type.h" -#include "xoms_api_struct.h" -#include "xtp_api_struct_common.h" - -#pragma pack(8) - -/// 用户资金账户的密码字符串长度 -#define XTP_ACCOUNT_PASSWORD_LEN 64 - -///////////////////////////////////////////////////////////////////////// -///用户资金请求 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferReq -{ - ///资金内转编号,无需用户填写,类似于xtp_id - uint64_t serial_id; - ///资金账户代码 - char fund_account[XTP_ACCOUNT_NAME_LEN]; - ///资金账户密码 - char password[XTP_ACCOUNT_PASSWORD_LEN]; - ///金额 - double amount; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - -}; - -///////////////////////////////////////////////////////////////////////// -///用户资金划转请求的响应-复用资金通知结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferAck ; - -///////////////////////////////////////////////////////////////////////// -///用户资金查询请求结构体 -///////////////////////////////////////////////////////////////////////// -struct XTPFundQueryReq -{ - ///资金账户代码 - char fund_account[XTP_ACCOUNT_NAME_LEN]; - ///资金账户密码 - char password[XTP_ACCOUNT_PASSWORD_LEN]; - ///查询类型 - XTP_FUND_QUERY_TYPE query_type; - ///预留字段,用户无需填写 - uint64_t unknown[4]; - -}; - -///////////////////////////////////////////////////////////////////////// -///用户资金查询响应结构体 -///////////////////////////////////////////////////////////////////////// -struct XTPFundQueryRsp -{ - ///金额 - double amount; - ///查询类型 - XTP_FUND_QUERY_TYPE query_type; - ///预留字段,用户无需填写 - uint64_t unknown[4]; - -}; - -#pragma pack() - +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xoms_api_fund_struct.h +///@brief 定义资金划拨相关结构体类型 +///////////////////////////////////////////////////////////////////////// +#ifndef XOMS_API_FUND_STRUCT_H_ +#define XOMS_API_FUND_STRUCT_H_ + +#include "xtp_api_data_type.h" +#include "xoms_api_struct.h" +#include "xtp_api_struct_common.h" + +#pragma pack(8) + +/// 用户资金账户的密码字符串长度 +#define XTP_ACCOUNT_PASSWORD_LEN 64 + +///////////////////////////////////////////////////////////////////////// +///用户资金请求 +///////////////////////////////////////////////////////////////////////// +struct XTPFundTransferReq +{ + ///资金内转编号,无需用户填写,类似于xtp_id + uint64_t serial_id; + ///资金账户代码 + char fund_account[XTP_ACCOUNT_NAME_LEN]; + ///资金账户密码 + char password[XTP_ACCOUNT_PASSWORD_LEN]; + ///金额 + double amount; + ///内转类型 + XTP_FUND_TRANSFER_TYPE transfer_type; + +}; + +///////////////////////////////////////////////////////////////////////// +///用户资金划转请求的响应-复用资金通知结构体 +///////////////////////////////////////////////////////////////////////// +typedef struct XTPFundTransferNotice XTPFundTransferAck ; + +///////////////////////////////////////////////////////////////////////// +///用户资金查询请求结构体 +///////////////////////////////////////////////////////////////////////// +struct XTPFundQueryReq +{ + ///资金账户代码 + char fund_account[XTP_ACCOUNT_NAME_LEN]; + ///资金账户密码 + char password[XTP_ACCOUNT_PASSWORD_LEN]; + ///查询类型 + XTP_FUND_QUERY_TYPE query_type; + ///预留字段,用户无需填写 + uint64_t unknown[4]; + +}; + +///////////////////////////////////////////////////////////////////////// +///用户资金查询响应结构体 +///////////////////////////////////////////////////////////////////////// +struct XTPFundQueryRsp +{ + ///金额 + double amount; + ///查询类型 + XTP_FUND_QUERY_TYPE query_type; + ///预留字段,用户无需填写 + uint64_t unknown[4]; + +}; + +#pragma pack() + #endif \ No newline at end of file diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_struct.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_struct.h index cce9389..b37f48c 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_struct.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xoms_api_struct.h @@ -1,1338 +1,1338 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xoms_api_struct.h -///@brief 定义交易类相关数据结构 -///////////////////////////////////////////////////////////////////////// -#ifndef _XOMS_API_STRUCT_H_ -#define _XOMS_API_STRUCT_H_ - -#include "xtp_api_data_type.h" -#include "stddef.h" -#include "xtp_api_struct_common.h" - -#pragma pack(8) - -//=====================客户端接口定义================================= -///新订单请求 -struct XTPOrderInsertInfo -{ - ///XTP系统订单ID,无需用户填写,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用,由客户自定义 - uint32_t order_client_id; - ///合约代码 客户端请求不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///价格 - double price; - ///止损价(保留字段) - double stop_price; - ///数量(股票单位为股,逆回购单位为张) - int64_t quantity; - ///报单价格 - XTP_PRICE_TYPE price_type; - union{ - ///32位字段,用来兼容老版本api,用户无需关心 - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - }; - - -///撤单失败响应消息 -struct XTPOrderCancelInfo -{ - ///撤单XTPID - uint64_t order_cancel_xtp_id; - ///原始订单XTPID - uint64_t order_xtp_id; -}; - - -///报单响应结构体 -struct XTPOrderInfo -{ - ///XTP系统订单ID,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用,用户自定义 - uint32_t order_client_id; - ///报单操作引用,用户自定义(暂未使用) - uint32_t order_cancel_client_id; - ///撤单在XTP系统中的id,在XTP系统中唯一 - uint64_t order_cancel_xtp_id; - ///合约代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///价格 - double price; - ///数量,此订单的报单数量 - int64_t quantity; - ///报单价格条件 - XTP_PRICE_TYPE price_type; - union{ - ///32位字段,用来兼容老版本api,用户无需关心 - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志,期权用户关注字段,其余用户填0即可 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - ///今成交数量,为此订单累计成交数量 - int64_t qty_traded; - ///剩余数量,当撤单成功时,表示撤单数量 - int64_t qty_left; - ///委托时间,格式为YYYYMMDDHHMMSSsss - int64_t insert_time; - ///最后修改时间,格式为YYYYMMDDHHMMSSsss - int64_t update_time; - ///撤销时间,格式为YYYYMMDDHHMMSSsss - int64_t cancel_time; - ///成交金额,为此订单的成交总金额 - double trade_amount; - ///本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - char order_local_id[XTP_LOCAL_ORDER_LEN]; - ///报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - XTP_ORDER_STATUS_TYPE order_status; - ///报单提交状态,OMS内部使用,用户可用此字段来区分撤单和报单 - XTP_ORDER_SUBMIT_STATUS_TYPE order_submit_status; - ///报单类型 - TXTPOrderTypeType order_type; -}; - - - -///报单响应结构体,新版本 -struct XTPOrderInfoEx -{ - ///XTP系统订单ID,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用,用户自定义 - uint32_t order_client_id; - ///报单操作引用,用户自定义(暂未使用) - uint32_t order_cancel_client_id; - ///撤单在XTP系统中的id,在XTP系统中唯一 - uint64_t order_cancel_xtp_id; - ///合约代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///价格 - double price; - ///数量,此订单的报单数量 - int64_t quantity; - ///报单价格条件 - XTP_PRICE_TYPE price_type; - union{ - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - ///今成交数量,为此订单累计成交数量 - int64_t qty_traded; - ///剩余数量,当撤单成功时,表示撤单数量 - int64_t qty_left; - ///委托时间,格式为YYYYMMDDHHMMSSsss - int64_t insert_time; - ///最后修改时间,格式为YYYYMMDDHHMMSSsss - int64_t update_time; - ///撤销时间,格式为YYYYMMDDHHMMSSsss - int64_t cancel_time; - ///成交金额,为此订单的成交总金额 - double trade_amount; - ///本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - char order_local_id[XTP_LOCAL_ORDER_LEN]; - ///报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - XTP_ORDER_STATUS_TYPE order_status; - ///报单提交状态,OMS内部使用,用户无需关心 - XTP_ORDER_SUBMIT_STATUS_TYPE order_submit_status; - ///报单类型 - TXTPOrderTypeType order_type; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///订单的错误信息 - XTPRI order_err_t; - ///保留字段 - uint64_t unknown[2]; -}; - - - -///报单成交结构体 -struct XTPTradeReport -{ - ///XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 - uint64_t order_xtp_id; - ///报单引用 - uint32_t order_client_id; - ///合约代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留。 - uint64_t local_order_id; - ///成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 - char exec_id[XTP_EXEC_ID_LEN]; - ///价格,此次成交的价格 - double price; - ///数量,此次成交的数量,不是累计数量 - int64_t quantity; - ///成交时间,格式为YYYYMMDDHHMMSSsss - int64_t trade_time; - ///成交金额,此次成交的总金额 = price*quantity - double trade_amount; - ///成交序号 --回报记录号,对于单个账户来说,深交所每个平台(不同交易品种)唯一,上交所唯一,对于多账户来说,不唯一 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_type; - union{ - ///32位字段,用来兼容老版本api,用户无需关心 - uint32_t u32; - struct { - ///买卖方向 - XTP_SIDE_TYPE side; - ///开平标志 - XTP_POSITION_EFFECT_TYPE position_effect; - ///预留字段1 - uint8_t reserved1; - ///预留字段2 - uint8_t reserved2; - }; - }; - ///业务类型 - XTP_BUSINESS_TYPE business_type; - ///交易所交易员代码 - char branch_pbu[XTP_BRANCH_PBU_LEN]; -}; - - -////////////////////////////////////////////////////////////////////////// -///报单查询 -////////////////////////////////////////////////////////////////////////// -///报单查询请求-条件查询 -struct XTPQueryOrderReq -{ - ///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报 - char ticker[XTP_TICKER_LEN]; - ///格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点 - int64_t begin_time; - ///格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - int64_t end_time; -}; - -///报单查询响应结构体 -typedef struct XTPOrderInfo XTPQueryOrderRsp; - - -///查询订单请求-分页查询 -struct XTPQueryOrderByPageReq -{ - ///需要查询的订单条数 - int64_t req_count; - ///上一次收到的查询订单结果中带回来的索引,如果是从头查询,请置0 - int64_t reference; - ///保留字段 - int64_t reserved; -}; - -////////////////////////////////////////////////////////////////////////// -///成交回报查询 -////////////////////////////////////////////////////////////////////////// -///查询成交报告请求-根据执行编号查询(保留字段) -struct XTPQueryReportByExecIdReq -{ - ///XTP订单系统ID - uint64_t order_xtp_id; - ///成交执行编号 - char exec_id[XTP_EXEC_ID_LEN]; -}; - -///查询成交回报请求-查询条件 -struct XTPQueryTraderReq -{ - ///证券代码,可以为空,如果为空,则默认查询时间段内的所有成交回报 - char ticker[XTP_TICKER_LEN]; - ///开始时间,格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点 - int64_t begin_time; - ///结束时间,格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - int64_t end_time; -}; - -///成交回报查询响应结构体 -typedef struct XTPTradeReport XTPQueryTradeRsp; - -///查询成交回报请求-分页查询 -struct XTPQueryTraderByPageReq -{ - ///需要查询的成交回报条数 - int64_t req_count; - ///上一次收到的查询成交回报结果中带回来的索引,如果是从头查询,请置0 - int64_t reference; - ///保留字段 - int64_t reserved; -}; - -////////////////////////////////////////////////////////////////////////// -///账户资金查询响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryAssetRsp -{ - ///总资产(现货账户/期权账户参考公式:总资产 = 可用资金 + 证券资产(目前为0)+ 预扣的资金),(信用账户参考公式:总资产 = 可用资金 + 融券卖出所得资金余额 + 证券资产+ 预扣的资金) - double total_asset; - ///可用资金 - double buying_power; - ///证券资产(保留字段,目前为0) - double security_asset; - ///累计买入成交证券占用资金(仅限现货账户/期权账户,信用账户暂不可用) - double fund_buy_amount; - ///累计买入成交交易费用(仅限现货账户/期权账户,信用账户暂不可用) - double fund_buy_fee; - ///累计卖出成交证券所得资金(仅限现货账户/期权账户,信用账户暂不可用) - double fund_sell_amount; - ///累计卖出成交交易费用(仅限现货账户/期权账户,信用账户暂不可用) - double fund_sell_fee; - ///XTP系统预扣的资金(包括买卖股票时预扣的交易资金+预扣手续费) - double withholding_amount; - ///账户类型 - XTP_ACCOUNT_TYPE account_type; - - ///冻结的保证金(仅限期权账户) - double frozen_margin; - ///行权冻结资金(仅限期权账户) - double frozen_exec_cash; - ///行权费用(仅限期权账户) - double frozen_exec_fee; - ///垫付资金(仅限期权账户) - double pay_later; - ///预垫付资金(仅限期权账户) - double preadva_pay; - ///昨日余额(仅限期权账户) - double orig_banlance; - ///当前余额(仅限期权账户) - double banlance; - ///当天出入金(仅限期权账户) - double deposit_withdraw; - ///当日交易资金轧差(仅限期权账户) - double trade_netting; - ///资金资产(仅限期权账户) - double captial_asset; - - ///强锁资金(仅限期权账户) - double force_freeze_amount; - ///可取资金(仅限期权账户) - double preferred_amount; - - // 信用业务新增字段开始(数量1) - ///融券卖出所得资金余额(仅限信用账户,只能用于买券还券) - double repay_stock_aval_banlance; - - // 信用业务新增字段结束(数量1) - - ///累计订单流量费 - double fund_order_data_charges; - ///累计撤单流量费 - double fund_cancel_data_charges; - //流量费统计新增字段结束(数量2) - - ///交易所实时风险度(仅限期权账户,后续服务器版本支持,目前为0) - double exchange_cur_risk_degree; - ///公司实时风险度(仅限期权账户,后续服务器版本支持,目前为0) - double company_cur_risk_degree; - //风险度新增字段结束(数量2) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1 - 2 - 2]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况请求结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStkPositionReq -{ - ///证券代码 - char ticker[XTP_TICKER_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStkPositionRsp -{ - ///证券代码 - char ticker[XTP_TICKER_LEN]; - ///证券名称 - char ticker_name[XTP_TICKER_NAME_LEN]; - ///交易市场 - XTP_MARKET_TYPE market; - ///总持仓 - int64_t total_qty; - ///可卖持仓 - int64_t sellable_qty; - ///持仓成本 - double avg_price; - ///浮动盈亏(保留字段) - double unrealized_pnl; - ///昨日持仓 - int64_t yesterday_position; - ///今日申购赎回数量(申购和赎回数量不可能同时存在,因此可以共用一个字段) - int64_t purchase_redeemable_qty; - - //以下为期权用户关心字段 - /// 持仓方向 - XTP_POSITION_DIRECTION_TYPE position_direction; - ///持仓类型(此字段所有账户都可能用到,可以用来区分股份是否为配售) - XTP_POSITION_SECURITY_TYPE position_security_type; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - //以下为现货用户关心字段 - ///盈亏成本价 - double profit_price; - ///买入成本 - double buy_cost; - ///盈亏成本 - double profit_cost; - - ///持仓市值(此字段目前只有期权账户有值,其他类型账户为0) - double market_value; - ///义务仓占用保证金(此字段目前只有期权账户有值,其他类型账户为0) - double margin; - - ///昨日买入成本 - double last_buy_cost; - ///昨日盈亏成本 - double last_profit_cost; - - ///(保留字段) - uint64_t unknown[50 - 13]; -}; - -///////////////////////////////////////////////////////////////////////// -///用户展期请求的通知 -///////////////////////////////////////////////////////////////////////// -struct XTPCreditDebtExtendNotice -{ - uint64_t xtpid; /// -#include "xtp_api_data_type.h" - -#pragma pack(8) - -///指定的合约 -typedef struct XTPSpecificTickerStruct -{ - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息)例如"600000",不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; -} XTPST; - -///股票、基金 等额外数据 -struct XTPMarketDataStockExData { - ///委托买入总量(SH,SZ) - int64_t total_bid_qty; - ///委托卖出总量(SH,SZ) - int64_t total_ask_qty; - ///加权平均委买价格(SH,SZ) - double ma_bid_price; - ///加权平均委卖价格(SH,SZ) - double ma_ask_price; - ///债券加权平均委买价格(SH) - double ma_bond_bid_price; - ///债券加权平均委卖价格(SH) - double ma_bond_ask_price; - ///债券到期收益率(SH) - double yield_to_maturity; - ///基金实时参考净值(SH,SZ) - double iopv; - ///ETF申购笔数(SH) - int32_t etf_buy_count; - ///ETF赎回笔数(SH) - int32_t etf_sell_count; - ///ETF申购数量(SH) - double etf_buy_qty; - ///ETF申购金额(SH) - double etf_buy_money; - ///ETF赎回数量(SH) - double etf_sell_qty; - ///ETF赎回金额(SH) - double etf_sell_money; - ///权证执行的总数量(SH) - double total_warrant_exec_qty; - ///权证跌停价格(元)(SH) - double warrant_lower_price; - ///权证涨停价格(元)(SH) - double warrant_upper_price; - ///买入撤单笔数(SH) - int32_t cancel_buy_count; - ///卖出撤单笔数(SH) - int32_t cancel_sell_count; - ///买入撤单数量(SH) - double cancel_buy_qty; - ///卖出撤单数量(SH) - double cancel_sell_qty; - ///买入撤单金额(SH) - double cancel_buy_money; - ///卖出撤单金额(SH) - double cancel_sell_money; - ///买入总笔数(SH) - int64_t total_buy_count; - ///卖出总笔数(SH) - int64_t total_sell_count; - ///买入委托成交最大等待时间(SH) - int32_t duration_after_buy; - ///卖出委托成交最大等待时间(SH) - int32_t duration_after_sell; - ///买方委托价位数(SH) - int32_t num_bid_orders; - ///卖方委托价位数(SH) - int32_t num_ask_orders; - - ///基金T-1日净值(SZ) - double pre_iopv; - ///预留 - int64_t r1; - ///预留 - int64_t r2; -}; - -///债券额外数据 -struct XTPMarketDataBondExData { - ///委托买入总量(SH,SZ) - int64_t total_bid_qty; - ///委托卖出总量(SH,SZ) - int64_t total_ask_qty; - ///加权平均委买价格(SZ) - double ma_bid_price; - ///加权平均委卖价格(SZ) - double ma_ask_price; - ///债券加权平均委买价格(SH) - double ma_bond_bid_price; - ///债券加权平均委卖价格(SH) - double ma_bond_ask_price; - ///债券到期收益率(SH) - double yield_to_maturity; - ///匹配成交最近价(SZ) - double match_lastpx; - ///债券加权平均价格(SH) - double ma_bond_price; - ///匹配成交成交量(SZ) - int64_t match_qty; - ///匹配成交成交金额(SZ) - double match_turnover; - ///预留 - double r4; - ///预留 - double r5; - ///预留 - double r6; - ///预留 - double r7; - ///预留 - double r8; - ///买入撤单笔数(SH) - int32_t cancel_buy_count; - ///卖出撤单笔数(SH) - int32_t cancel_sell_count; - ///买入撤单数量(SH) - double cancel_buy_qty; - ///卖出撤单数量(SH) - double cancel_sell_qty; - ///买入撤单金额(SH) - double cancel_buy_money; - ///卖出撤单金额(SH) - double cancel_sell_money; - ///买入总笔数(SH) - int64_t total_buy_count; - ///卖出总笔数(SH) - int64_t total_sell_count; - ///买入委托成交最大等待时间(SH) - int32_t duration_after_buy; - ///卖出委托成交最大等待时间(SH) - int32_t duration_after_sell; - ///买方委托价位数(SH) - int32_t num_bid_orders; - ///卖方委托价位数(SH) - int32_t num_ask_orders; - ///时段(SHL2),L1快照数据没有此字段,具体字段说明参阅《上海新债券Level2行情说明.doc》文档 - char instrument_status[8]; -}; - -/// 期权额外数据 -struct XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -///////////////////////////////////////////////////////////////////////// -///@brief XTP_MARKETDATA_TYPE是行情快照数据类型,2.2.32以前版本所用 -///////////////////////////////////////////////////////////////////////// -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///////////////////////////////////////////////////////////////////////// -///@brief XTP_MARKETDATA_TYPE_V2是行情快照数据类型,2.2.32版本新增字段 -///////////////////////////////////////////////////////////////////////// -enum XTP_MARKETDATA_TYPE_V2 { - XTP_MARKETDATA_V2_INDEX = 0, // 指数 - XTP_MARKETDATA_V2_OPTION = 1, // 期权 - XTP_MARKETDATA_V2_ACTUAL = 2, // 现货(股票/基金等) - XTP_MARKETDATA_V2_BOND = 3, // 债券 -}; - -///行情 -typedef struct XTPMarketDataStruct -{ - // 代码 - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - - // 价格 - ///最新价 - double last_price; - ///昨收盘 - double pre_close_price; - ///今开盘 - double open_price; - ///最高价 - double high_price; - ///最低价 - double low_price; - ///今收盘 - double close_price; - - // 期权数据 - ///昨日持仓量(张)(目前未填写) - int64_t pre_total_long_positon; - ///持仓量(张) - int64_t total_long_positon; - ///昨日结算价(SH) - double pre_settl_price; - ///今日结算价(SH) - double settl_price; - - // 涨跌停 - ///涨停价 - double upper_limit_price; - ///跌停价 - double lower_limit_price; - ///预留 - double pre_delta; - ///预留 - double curr_delta; - - /// 时间类,格式为YYYYMMDDHHMMSSsss - int64_t data_time; - - // 量额数据 - ///数量,为总成交量(单位股,与交易所一致) - int64_t qty; - ///成交金额,为总成交金额(单位元,与交易所一致) - double turnover; - ///预留(无意义) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明,参阅《XTP API常见问题.doc》文档 - char ticker_status[8]; - - //对于新三板行情来说,以下结构和字段均无效 - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - XTPMarketDataBondExData bond; - } ; - ///决定了union是哪种数据类型 (2.2.32版本以前所用字段,仅为了保持兼容,不建议使用该字段) - XTP_MARKETDATA_TYPE data_type; - ///决定了union是哪种数据类型(2.2.32版本新增字段,更详细区分了行情快照数据类型) - XTP_MARKETDATA_TYPE_V2 data_type_v2; -} XTPMD; - -///IOPV信息 -struct IOPV { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - /// 时间 - int64_t data_time; - /// iopv值 - double iopv; -}; - -///股票行情静态信息 -typedef struct XTPQuoteStaticInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - /// 合约名称 - char ticker_name[XTP_TICKER_NAME_LEN]; - /// 合约类型 - XTP_TICKER_TYPE ticker_type; - ///昨收盘 - double pre_close_price; - ///涨停板价 - double upper_limit_price; - ///跌停板价 - double lower_limit_price; - ///最小变动价位 - double price_tick; - /// 合约最小交易量(买) - int32_t buy_qty_unit; - /// 合约最小交易量(卖) - int32_t sell_qty_unit; -} XTPQSI; - - -///订单薄 -typedef struct OrderBookStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - - ///最新价 - double last_price; - ///数量,为总成交量 - int64_t qty; - ///成交金额,为总成交金额 - double turnover; - ///成交笔数 - int64_t trades_count; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - /// 时间类 - int64_t data_time; -} XTPOB; - -////////////////////////////////// 逐笔数据 - - -///逐笔委托 -struct XTPTickByTickEntrust { - ///频道代码 - int32_t channel_no; - ///SH: 委托序号(委托单独编号, 同一channel_no内连续) - ///SZ: 委托序号(委托成交统一编号, 同一channel_no内连续) - int64_t seq; - ///委托价格 - double price; - ///SH: 剩余委托数量(balance) - ///SZ: 委托数量 - int64_t qty; - ///SH: 'B':买; 'S':卖 - ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///SH: 'A': 增加; 'D': 删除 - ///SZ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; - ///SH: 原始订单号 - ///SZ: 无意义 - int64_t order_no; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///SH: 成交序号(成交单独编号, 同一channel_no内连续) - ///SZ: 成交序号(委托成交统一编号, 同一channel_no内连续) - int64_t seq; - ///成交价格 - double price; - ///成交量 - int64_t qty; - ///成交金额(仅适用上交所) - double money; - ///买方订单号 - int64_t bid_no; - ///卖方订单号 - int64_t ask_no; - /// SH: 内外盘标识('B':主动买; 'S':主动卖; 'N':未知) - /// SZ: 成交标识('4':撤; 'F':成交) - char trade_flag; -}; - -///逐笔状态订单 -struct XTPTickByTickStatus { - ///频道代码 - int32_t channel_no; - ///同一channel_no内连续 - int64_t seq; - ///状态信息 - char flag[8]; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - /// SH: 业务序号(委托成交统一编号,同一个channel_no内连续,此seq区别于联合体内的seq,channel_no等同于联合体内的channel_no) - /// SZ: 无意义 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - XTPTickByTickStatus state; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -///股票行情全量静态信息 -typedef struct XTPQuoteFullInfo { - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char ticker[XTP_TICKER_LEN]; ///<证券代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 - XTP_SECURITY_TYPE security_type; ///<合约详细类型 - XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 - bool is_registration; ///<是否注册制(仅适用创业板股票,创新企业股票及存托凭证) - bool is_VIE; ///<是否具有协议控制架构(仅适用创业板股票,创新企业股票及存托凭证) - bool is_noprofit; ///<是否尚未盈利(仅适用创业板股票,创新企业股票及存托凭证) - bool is_weighted_voting_rights; ///<是否存在投票权差异(仅适用创业板股票,创新企业股票及存托凭证) - bool is_have_price_limit; ///<是否有涨跌幅限制(注:不提供具体幅度,可通过涨跌停价和昨收价来计算幅度) - double upper_limit_price; ///<涨停价(仅在有涨跌幅限制时有效) - double lower_limit_price; ///<跌停价(仅在有涨跌幅限制时有效) - double pre_close_price; ///<昨收价 - double price_tick; ///<价格最小变动价位 - int32_t bid_qty_upper_limit; ///<限价买委托数量上限 - int32_t bid_qty_lower_limit; ///<限价买委托数量下限 - int32_t bid_qty_unit; ///<限价买数量单位 - int32_t ask_qty_upper_limit; ///<限价卖委托数量上限 - int32_t ask_qty_lower_limit; ///<限价卖委托数量下限 - int32_t ask_qty_unit; ///<限价卖数量单位 - int32_t market_bid_qty_upper_limit; ///<市价买委托数量上限 - int32_t market_bid_qty_lower_limit; ///<市价买委托数量下限 - int32_t market_bid_qty_unit; ///<市价买数量单位 - int32_t market_ask_qty_upper_limit; ///<市价卖委托数量上限 - int32_t market_ask_qty_lower_limit; ///<市价卖委托数量上限 - int32_t market_ask_qty_unit; ///<市价卖数量单位 - XTP_SECURITY_STATUS security_status; ///<证券状态 - uint32_t unknown1; ///<保留字段 - uint64_t unknown[3]; ///<保留字段 - -}XTPQFI; - -///新三板全量静态信息 -typedef struct XTPQuoteNQFullInfo { - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char ticker[XTP_TICKER_LEN]; ///<证券代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 - XTP_SECURITY_TYPE security_type; ///<合约详细类型,目前均为255 - XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 - char ticker_abbr_en[XTP_TICKER_NAME_LEN]; ///<英文简称 - char base_ticker[XTP_TICKER_LEN]; ///<基础证券 - char industry_type[6]; ///<行业种类 - char currency_type[3]; ///<货币种类 - int32_t trade_unit; ///<交易单位 - int32_t hang_out_date; ///<挂牌日期 - int32_t value_date; ///<起息日期 - int32_t maturity_date; ///<到期日 - int32_t per_limit_vol; ///<每笔限量 - int32_t buy_vol_unit; ///<买数量单位 - int32_t sell_vol_unit; ///<卖数量单位 - int32_t mini_declared_vol; ///<最小申报数量 - int32_t limit_price_attr; ///<限价参数性质 - int32_t market_maker_quantity; ///<做市商数量 - double price_gear; ///<价格档位 - double first_limit_trans; ///<首笔交易限价参数 - double subsequent_limit_trans; ///<后续交易限价参数 - double limit_upper_price; ///<涨停价格 - double limit_lower_price; ///<跌停价格 - double block_trade_upper; ///<大宗交易价格上限(预留,默认0) - double block_trade_lower; ///<大宗交易价格下限(预留,默认0) - double convert_into_ration; ///<折合比例 - XTP_TRADE_STATUS trade_status : 8; ///<交易状态 - XTP_SECURITY_LEVEL security_level : 8; ///<证券级别 - XTP_TRADE_TYPE trade_type : 8; ///<交易类型 - XTP_SUSPEND_FLAG suspend_flag : 8; ///<停牌标志 - XTP_EX_DIVIDEND_FLAG ex_dividend_flag : 8; ///<除权除息标志 - XTP_SECURITY_LAYER_TYPE layer_type : 8; ///<分层信息 - int32_t reserved1 : 16; ///<保留字段 - char trade_places[3]; ///<交易场所 预留 - char is_rzbd; ///<是否融资标的 Y是 N否 - char is_rqbd; ///<是否融券标的 Y是 N否 - char is_drrz; ///<是否当日可融资 Y是 N否 - char is_drrq; ///<是否当日可融券 Y是 N否 - char reserved; ///<保留字段 - uint64_t unknown[3]; ///<保留字段 -}XTPNQFI; - - -#pragma pack() - -#endif +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xquote_api_struct.h +///@brief 定义行情类相关数据结构 +///////////////////////////////////////////////////////////////////////// +#ifndef _XQUOTE_API_STRUCT_H_ +#define _XQUOTE_API_STRUCT_H_ + +#include +#include "xtp_api_data_type.h" + +#pragma pack(8) + +///指定的合约 +typedef struct XTPSpecificTickerStruct +{ + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息)例如"600000",不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; +} XTPST; + +///股票、基金 等额外数据 +struct XTPMarketDataStockExData { + ///委托买入总量(SH,SZ) + int64_t total_bid_qty; + ///委托卖出总量(SH,SZ) + int64_t total_ask_qty; + ///加权平均委买价格(SH,SZ) + double ma_bid_price; + ///加权平均委卖价格(SH,SZ) + double ma_ask_price; + ///债券加权平均委买价格(SH) + double ma_bond_bid_price; + ///债券加权平均委卖价格(SH) + double ma_bond_ask_price; + ///债券到期收益率(SH) + double yield_to_maturity; + ///基金实时参考净值(SH,SZ) + double iopv; + ///ETF申购笔数(SH) + int32_t etf_buy_count; + ///ETF赎回笔数(SH) + int32_t etf_sell_count; + ///ETF申购数量(SH) + double etf_buy_qty; + ///ETF申购金额(SH) + double etf_buy_money; + ///ETF赎回数量(SH) + double etf_sell_qty; + ///ETF赎回金额(SH) + double etf_sell_money; + ///权证执行的总数量(SH) + double total_warrant_exec_qty; + ///权证跌停价格(元)(SH) + double warrant_lower_price; + ///权证涨停价格(元)(SH) + double warrant_upper_price; + ///买入撤单笔数(SH) + int32_t cancel_buy_count; + ///卖出撤单笔数(SH) + int32_t cancel_sell_count; + ///买入撤单数量(SH) + double cancel_buy_qty; + ///卖出撤单数量(SH) + double cancel_sell_qty; + ///买入撤单金额(SH) + double cancel_buy_money; + ///卖出撤单金额(SH) + double cancel_sell_money; + ///买入总笔数(SH) + int64_t total_buy_count; + ///卖出总笔数(SH) + int64_t total_sell_count; + ///买入委托成交最大等待时间(SH) + int32_t duration_after_buy; + ///卖出委托成交最大等待时间(SH) + int32_t duration_after_sell; + ///买方委托价位数(SH) + int32_t num_bid_orders; + ///卖方委托价位数(SH) + int32_t num_ask_orders; + + ///基金T-1日净值(SZ) + double pre_iopv; + ///预留 + int64_t r1; + ///预留 + int64_t r2; +}; + +///债券额外数据 +struct XTPMarketDataBondExData { + ///委托买入总量(SH,SZ) + int64_t total_bid_qty; + ///委托卖出总量(SH,SZ) + int64_t total_ask_qty; + ///加权平均委买价格(SZ) + double ma_bid_price; + ///加权平均委卖价格(SZ) + double ma_ask_price; + ///债券加权平均委买价格(SH) + double ma_bond_bid_price; + ///债券加权平均委卖价格(SH) + double ma_bond_ask_price; + ///债券到期收益率(SH) + double yield_to_maturity; + ///匹配成交最近价(SZ) + double match_lastpx; + ///债券加权平均价格(SH) + double ma_bond_price; + ///匹配成交成交量(SZ) + int64_t match_qty; + ///匹配成交成交金额(SZ) + double match_turnover; + ///预留 + double r4; + ///预留 + double r5; + ///预留 + double r6; + ///预留 + double r7; + ///预留 + double r8; + ///买入撤单笔数(SH) + int32_t cancel_buy_count; + ///卖出撤单笔数(SH) + int32_t cancel_sell_count; + ///买入撤单数量(SH) + double cancel_buy_qty; + ///卖出撤单数量(SH) + double cancel_sell_qty; + ///买入撤单金额(SH) + double cancel_buy_money; + ///卖出撤单金额(SH) + double cancel_sell_money; + ///买入总笔数(SH) + int64_t total_buy_count; + ///卖出总笔数(SH) + int64_t total_sell_count; + ///买入委托成交最大等待时间(SH) + int32_t duration_after_buy; + ///卖出委托成交最大等待时间(SH) + int32_t duration_after_sell; + ///买方委托价位数(SH) + int32_t num_bid_orders; + ///卖方委托价位数(SH) + int32_t num_ask_orders; + ///时段(SHL2),L1快照数据没有此字段,具体字段说明参阅《上海新债券Level2行情说明.doc》文档 + char instrument_status[8]; +}; + +/// 期权额外数据 +struct XTPMarketDataOptionExData { + ///波段性中断参考价(SH) + double auction_price; + ///波段性中断集合竞价虚拟匹配量(SH) + int64_t auction_qty; + ///最近询价时间(SH) + int64_t last_enquiry_time; +}; + +///////////////////////////////////////////////////////////////////////// +///@brief XTP_MARKETDATA_TYPE是行情快照数据类型,2.2.32以前版本所用 +///////////////////////////////////////////////////////////////////////// +enum XTP_MARKETDATA_TYPE { + XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) + XTP_MARKETDATA_OPTION = 1, // 期权 +}; + +///////////////////////////////////////////////////////////////////////// +///@brief XTP_MARKETDATA_TYPE_V2是行情快照数据类型,2.2.32版本新增字段 +///////////////////////////////////////////////////////////////////////// +enum XTP_MARKETDATA_TYPE_V2 { + XTP_MARKETDATA_V2_INDEX = 0, // 指数 + XTP_MARKETDATA_V2_OPTION = 1, // 期权 + XTP_MARKETDATA_V2_ACTUAL = 2, // 现货(股票/基金等) + XTP_MARKETDATA_V2_BOND = 3, // 债券 +}; + +///行情 +typedef struct XTPMarketDataStruct +{ + // 代码 + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + + // 价格 + ///最新价 + double last_price; + ///昨收盘 + double pre_close_price; + ///今开盘 + double open_price; + ///最高价 + double high_price; + ///最低价 + double low_price; + ///今收盘 + double close_price; + + // 期权数据 + ///昨日持仓量(张)(目前未填写) + int64_t pre_total_long_positon; + ///持仓量(张) + int64_t total_long_positon; + ///昨日结算价(SH) + double pre_settl_price; + ///今日结算价(SH) + double settl_price; + + // 涨跌停 + ///涨停价 + double upper_limit_price; + ///跌停价 + double lower_limit_price; + ///预留 + double pre_delta; + ///预留 + double curr_delta; + + /// 时间类,格式为YYYYMMDDHHMMSSsss + int64_t data_time; + + // 量额数据 + ///数量,为总成交量(单位股,与交易所一致) + int64_t qty; + ///成交金额,为总成交金额(单位元,与交易所一致) + double turnover; + ///预留(无意义) + double avg_price; + + // 买卖盘 + ///十档申买价 + double bid[10]; + ///十档申卖价 + double ask[10]; + ///十档申买量 + int64_t bid_qty[10]; + ///十档申卖量 + int64_t ask_qty[10]; + + // 额外数据 + ///成交笔数 + int64_t trades_count; + ///当前交易状态说明,参阅《XTP API常见问题.doc》文档 + char ticker_status[8]; + + //对于新三板行情来说,以下结构和字段均无效 + ///数据 + union { + XTPMarketDataStockExData stk; + XTPMarketDataOptionExData opt; + XTPMarketDataBondExData bond; + } ; + ///决定了union是哪种数据类型 (2.2.32版本以前所用字段,仅为了保持兼容,不建议使用该字段) + XTP_MARKETDATA_TYPE data_type; + ///决定了union是哪种数据类型(2.2.32版本新增字段,更详细区分了行情快照数据类型) + XTP_MARKETDATA_TYPE_V2 data_type_v2; +} XTPMD; + +///IOPV信息 +struct IOPV { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 时间 + int64_t data_time; + /// iopv值 + double iopv; +}; + +///股票行情静态信息 +typedef struct XTPQuoteStaticInfo { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 合约名称 + char ticker_name[XTP_TICKER_NAME_LEN]; + /// 合约类型 + XTP_TICKER_TYPE ticker_type; + ///昨收盘 + double pre_close_price; + ///涨停板价 + double upper_limit_price; + ///跌停板价 + double lower_limit_price; + ///最小变动价位 + double price_tick; + /// 合约最小交易量(买) + int32_t buy_qty_unit; + /// 合约最小交易量(卖) + int32_t sell_qty_unit; +} XTPQSI; + + +///订单薄 +typedef struct OrderBookStruct { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + + ///最新价 + double last_price; + ///数量,为总成交量 + int64_t qty; + ///成交金额,为总成交金额 + double turnover; + ///成交笔数 + int64_t trades_count; + + // 买卖盘 + ///十档申买价 + double bid[10]; + ///十档申卖价 + double ask[10]; + ///十档申买量 + int64_t bid_qty[10]; + ///十档申卖量 + int64_t ask_qty[10]; + /// 时间类 + int64_t data_time; +} XTPOB; + +////////////////////////////////// 逐笔数据 + + +///逐笔委托 +struct XTPTickByTickEntrust { + ///频道代码 + int32_t channel_no; + ///SH: 委托序号(委托单独编号, 同一channel_no内连续) + ///SZ: 委托序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///委托价格 + double price; + ///SH: 剩余委托数量(balance) + ///SZ: 委托数量 + int64_t qty; + ///SH: 'B':买; 'S':卖 + ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 + char side; + ///SH: 'A': 增加; 'D': 删除 + ///SZ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 + char ord_type; + ///SH: 原始订单号 + ///SZ: 无意义 + int64_t order_no; +}; + +///逐笔成交 +struct XTPTickByTickTrade { + ///频道代码 + int32_t channel_no; + ///SH: 成交序号(成交单独编号, 同一channel_no内连续) + ///SZ: 成交序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///成交价格 + double price; + ///成交量 + int64_t qty; + ///成交金额(仅适用上交所) + double money; + ///买方订单号 + int64_t bid_no; + ///卖方订单号 + int64_t ask_no; + /// SH: 内外盘标识('B':主动买; 'S':主动卖; 'N':未知) + /// SZ: 成交标识('4':撤; 'F':成交) + char trade_flag; +}; + +///逐笔状态订单 +struct XTPTickByTickStatus { + ///频道代码 + int32_t channel_no; + ///同一channel_no内连续 + int64_t seq; + ///状态信息 + char flag[8]; +}; + +///逐笔数据信息 +typedef struct XTPTickByTickStruct { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// SH: 业务序号(委托成交统一编号,同一个channel_no内连续,此seq区别于联合体内的seq,channel_no等同于联合体内的channel_no) + /// SZ: 无意义 + int64_t seq; + ///委托时间 or 成交时间 + int64_t data_time; + ///委托 or 成交 + XTP_TBT_TYPE type; + + union { + XTPTickByTickEntrust entrust; + XTPTickByTickTrade trade; + XTPTickByTickStatus state; + }; +} XTPTBT; + + +///供查询的最新信息 +typedef struct XTPTickerPriceInfo { + ///交易所代码 + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + ///最新价 + double last_price; +} XTPTPI; + +///股票行情全量静态信息 +typedef struct XTPQuoteFullInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + XTP_SECURITY_TYPE security_type; ///<合约详细类型 + XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 + bool is_registration; ///<是否注册制(仅适用创业板股票,创新企业股票及存托凭证) + bool is_VIE; ///<是否具有协议控制架构(仅适用创业板股票,创新企业股票及存托凭证) + bool is_noprofit; ///<是否尚未盈利(仅适用创业板股票,创新企业股票及存托凭证) + bool is_weighted_voting_rights; ///<是否存在投票权差异(仅适用创业板股票,创新企业股票及存托凭证) + bool is_have_price_limit; ///<是否有涨跌幅限制(注:不提供具体幅度,可通过涨跌停价和昨收价来计算幅度) + double upper_limit_price; ///<涨停价(仅在有涨跌幅限制时有效) + double lower_limit_price; ///<跌停价(仅在有涨跌幅限制时有效) + double pre_close_price; ///<昨收价 + double price_tick; ///<价格最小变动价位 + int32_t bid_qty_upper_limit; ///<限价买委托数量上限 + int32_t bid_qty_lower_limit; ///<限价买委托数量下限 + int32_t bid_qty_unit; ///<限价买数量单位 + int32_t ask_qty_upper_limit; ///<限价卖委托数量上限 + int32_t ask_qty_lower_limit; ///<限价卖委托数量下限 + int32_t ask_qty_unit; ///<限价卖数量单位 + int32_t market_bid_qty_upper_limit; ///<市价买委托数量上限 + int32_t market_bid_qty_lower_limit; ///<市价买委托数量下限 + int32_t market_bid_qty_unit; ///<市价买数量单位 + int32_t market_ask_qty_upper_limit; ///<市价卖委托数量上限 + int32_t market_ask_qty_lower_limit; ///<市价卖委托数量上限 + int32_t market_ask_qty_unit; ///<市价卖数量单位 + XTP_SECURITY_STATUS security_status; ///<证券状态 + uint32_t unknown1; ///<保留字段 + uint64_t unknown[3]; ///<保留字段 + +}XTPQFI; + +///新三板全量静态信息 +typedef struct XTPQuoteNQFullInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + XTP_SECURITY_TYPE security_type; ///<合约详细类型,目前均为255 + XTP_QUALIFICATION_TYPE ticker_qualification_class; ///<合约适当性类别 + char ticker_abbr_en[XTP_TICKER_NAME_LEN]; ///<英文简称 + char base_ticker[XTP_TICKER_LEN]; ///<基础证券 + char industry_type[6]; ///<行业种类 + char currency_type[3]; ///<货币种类 + int32_t trade_unit; ///<交易单位 + int32_t hang_out_date; ///<挂牌日期 + int32_t value_date; ///<起息日期 + int32_t maturity_date; ///<到期日 + int32_t per_limit_vol; ///<每笔限量 + int32_t buy_vol_unit; ///<买数量单位 + int32_t sell_vol_unit; ///<卖数量单位 + int32_t mini_declared_vol; ///<最小申报数量 + int32_t limit_price_attr; ///<限价参数性质 + int32_t market_maker_quantity; ///<做市商数量 + double price_gear; ///<价格档位 + double first_limit_trans; ///<首笔交易限价参数 + double subsequent_limit_trans; ///<后续交易限价参数 + double limit_upper_price; ///<涨停价格 + double limit_lower_price; ///<跌停价格 + double block_trade_upper; ///<大宗交易价格上限(预留,默认0) + double block_trade_lower; ///<大宗交易价格下限(预留,默认0) + double convert_into_ration; ///<折合比例 + XTP_TRADE_STATUS trade_status : 8; ///<交易状态 + XTP_SECURITY_LEVEL security_level : 8; ///<证券级别 + XTP_TRADE_TYPE trade_type : 8; ///<交易类型 + XTP_SUSPEND_FLAG suspend_flag : 8; ///<停牌标志 + XTP_EX_DIVIDEND_FLAG ex_dividend_flag : 8; ///<除权除息标志 + XTP_SECURITY_LAYER_TYPE layer_type : 8; ///<分层信息 + int32_t reserved1 : 16; ///<保留字段 + char trade_places[3]; ///<交易场所 预留 + char is_rzbd; ///<是否融资标的 Y是 N否 + char is_rqbd; ///<是否融券标的 Y是 N否 + char is_drrz; ///<是否当日可融资 Y是 N否 + char is_drrq; ///<是否当日可融券 Y是 N否 + char reserved; ///<保留字段 + uint64_t unknown[3]; ///<保留字段 +}XTPNQFI; + + +#pragma pack() + +#endif diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_api_data_type.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_api_data_type.h index c49b0d1..7407997 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_api_data_type.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_api_data_type.h @@ -1,739 +1,739 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 每个PBU最多被10个TGW使用。 -#define MAX_TGW_CNT_PER_PBU 10 - -/// 存放版本号的字符串长度 -#define XTP_VERSION_LEN 16 -/// 版本号类型 -typedef char XTPVersionType[XTP_VERSION_LEN]; -/// 可交易日字符串长度 -#define XTP_TRADING_DAY_LEN 9 -/// 存放证券代码的字符串长度 -#define XTP_TICKER_LEN 16 -/// 存放证券名称的字符串长度 -#define XTP_TICKER_NAME_LEN 64 -/// 本地报单编号的字符串长度 -#define XTP_LOCAL_ORDER_LEN 11 -/// 交易所单号的字符串长度 -#define XTP_ORDER_EXCH_LEN 17 -/// 成交执行编号的字符串长度 -#define XTP_EXEC_ID_LEN 18 -/// 交易所交易员代码字符串长度 -#define XTP_BRANCH_PBU_LEN 7 -/// 用户资金账户的字符串长度 -#define XTP_ACCOUNT_NAME_LEN 16 -/// 信用业务合约负债编号长度 -#define XTP_CREDIT_DEBT_ID_LEN 33 -/// IP地址的字符串长度 -#define XTP_INET_ADDRESS_STR_LEN 64 -/// MAC地址的字符串长度 -#define XTP_MAC_ADDRESS_LEN 16 -/// 硬盘序列号的字符串长度 -#define XTP_HARDDISK_SN_LEN 24 -/// MacOS系统序列号的字符串长度 -#define XTP_MACOS_SNO_LEN 21 - -/// 期权组合策略最多腿数 -#define XTP_STRATEGE_LEG_NUM 4 -/// 期权组合策略代码字符串长度 -#define XTP_STRATEGY_ID_LEN 10 -/// 期权组合策略名称字符串长度 -#define XTP_STRATEGY_NAME_LEN 32 -/// 期权组合策略组合编码字符串长度 -#define XTP_SECONDARY_ORDER_ID_LEN 18 - -/// 期权合约可支持的组合策略列表字符串长度 -#define XTP_CNTRT_COMB_STRA_LIST_LEN 2048 - -/// 期权行权合并最多成分合约数量 -#define XTP_COMBINED_EXECUTION_LEG_NUM 2 - -///////////////////////////////////////////////////////////////////////// -///@brief XTP_LOG_LEVEL是日志输出级别类型 -///////////////////////////////////////////////////////////////////////// -typedef enum XTP_LOG_LEVEL { - XTP_LOG_LEVEL_FATAL, ///<严重错误级别 - XTP_LOG_LEVEL_ERROR, ///<错误级别 - XTP_LOG_LEVEL_WARNING, ///<警告级别 - XTP_LOG_LEVEL_INFO, /// -#endif - -#include "xtp_api_data_type.h" - -#pragma pack(8) - -///错误信息的字符串长度 -#define XTP_ERR_MSG_LEN 124 -///响应信息 -typedef struct XTPRspInfoStruct -{ - ///错误代码 - int32_t error_id; - ///错误信息 - char error_msg[XTP_ERR_MSG_LEN]; -} XTPRI; - -#pragma pack() - -#endif // !_XTP_API_STRUCT_COMMON_H_ +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xtp_api_struct_common.h +///@brief 定义业务公共数据结构 +///////////////////////////////////////////////////////////////////////// + +#ifndef _XTP_API_STRUCT_COMMON_H_ +#define _XTP_API_STRUCT_COMMON_H_ + +#if defined(_MSC_VER) && _MSC_VER<1600 +typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; +#else +#include +#endif + +#include "xtp_api_data_type.h" + +#pragma pack(8) + +///错误信息的字符串长度 +#define XTP_ERR_MSG_LEN 124 +///响应信息 +typedef struct XTPRspInfoStruct +{ + ///错误代码 + int32_t error_id; + ///错误信息 + char error_msg[XTP_ERR_MSG_LEN]; +} XTPRI; + +#pragma pack() + +#endif // !_XTP_API_STRUCT_COMMON_H_ diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_quote_api.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_quote_api.h index 79829ce..ef1890a 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_quote_api.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_quote_api.h @@ -1,528 +1,528 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_quote_api.h -///@brief 定义行情订阅客户端接口 -///////////////////////////////////////////////////////////////////////// - -#ifndef _XTP_QUOTE_API_H_ -#define _XTP_QUOTE_API_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "xtp_api_struct.h" - -#if defined(ISLIB) && defined(WIN32) -#ifdef LIB_MD_API_EXPORT -#define MD_API_EXPORT __declspec(dllexport) -#else -#define MD_API_EXPORT __declspec(dllimport) -#endif -#else -#define MD_API_EXPORT -#endif - -/*! -* \class XTP::API::QuoteSpi -* -* \brief 行情回调类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - class QuoteSpi - { - public: - - ///当客户端与行情后台通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。可以在此函数中调用Login重新登录。注意用户重新登录后,需要重新订阅行情 - virtual void OnDisconnected(int reason) {}; - - - ///错误应答 - ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 - virtual void OnError(XTPRI *error_info) {}; - - ///逐笔丢包应答 - ///@param begin_seq 当逐笔出现丢包时,丢包区间下限(可能与上限一致) - ///@param end_seq 当逐笔出现丢包时,丢包区间上限(可能与下限一致) - ///@remark 此函数只有在逐笔发生丢包时才会有调用,如果丢包的上下限一致,表示仅丢失了一个包,注意此包仅为数据包,包含1个或者多个逐笔数据 - virtual void OnTickByTickLossRange(int begin_seq, int end_seq) {}; - - ///订阅行情应答,包括股票、指数和期权 - ///@param ticker 详细的合约订阅情况 - ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///退订行情应答,包括股票、指数和期权 - ///@param ticker 详细的合约取消订阅情况 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///深度行情通知,包含买一卖一队列 - ///@param market_data 行情数据 - ///@param bid1_qty 买一队列数据 - ///@param bid1_count 买一队列的有效委托笔数,即bid1_qty数组的长度,最大为50 - ///@param max_bid1_count 买一队列总委托笔数 - ///@param ask1_qty 卖一队列数据 - ///@param ask1_count 卖一队列的有效委托笔数,即ask1_qty数组的长度,最大为50 - ///@param max_ask1_count 卖一队列总委托笔数 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) {}; - - /// ETF的IOPV通知 - /// @param iopv ETF的参考单位基金净值数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnETFIOPVData(IOPV *iopv) {}; - - ///订阅行情订单簿应答,包括股票、债券 - ///@param ticker 详细的合约订阅情况 - ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///退订行情订单簿应答,包括股票、债券 - ///@param ticker 详细的合约取消订阅情况 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///行情订单簿通知,包括股票、债券 - ///@param order_book 行情订单簿数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnOrderBook(XTPOB *order_book) {}; - - ///订阅逐笔行情应答,包括股票、债券 - ///@param ticker 详细的合约订阅情况 - ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///退订逐笔行情应答,包括股票、债券 - ///@param ticker 详细的合约取消订阅情况 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; - - ///逐笔行情通知,包括股票、债券 - ///@param tbt_data 逐笔行情数据,包括逐笔委托和逐笔成交,此为共用结构体,需要根据type来区分是逐笔委托还是逐笔成交,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnTickByTick(XTPTBT *tbt_data) {}; - - ///订阅全市场的股票行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的股票行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的股票行情订单簿应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的股票行情订单簿应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的股票逐笔行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的股票逐笔行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - - ///查询合约部分静态信息的应答 - ///@param ticker_info 合约部分静态信息 - ///@param error_info 查询合约部分静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询合约部分静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///查询合约的最新价格信息应答 - ///@param ticker_info 合约的最新价格信息 - ///@param error_info 查询合约的最新价格信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///订阅全市场的期权行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的期权行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的期权行情订单簿应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的期权行情订单簿应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///订阅全市场的期权逐笔行情应答 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///退订全市场的期权逐笔行情应答 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - - ///查询沪深2市合约完整静态信息的应答 - ///@param ticker_info 合约完整静态信息 - ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryAllTickersFullInfo(XTPQFI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///查询新三板合约完整静态信息的应答 - ///@param ticker_info 合约完整静态信息 - ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - virtual void OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last) {}; - - ///当客户端与回补行情服务器通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。回补服务器会在无消息交互后会定时断线,请注意仅在需要回补数据时才保持连接,无回补需求时,无需登陆。 - virtual void OnRebuildQuoteServerDisconnected(int reason) {}; - - ///请求回补指定频道的逐笔行情的总体结果应答 - ///@param rebuild_result 当回补结束时被调用,如果回补结果失败,则msg参数表示失败原因 - ///@remark 需要快速返回,仅在回补数据发送结束后调用,如果请求数据太多,一次性无法回补完,那么rebuild_result.result_code = XTP_REBUILD_RET_PARTLY,此时需要根据回补结果继续发起回补数据请求 - virtual void OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) {}; - - ///回补的逐笔行情数据 - ///@param tbt_data 回补的逐笔行情数据 - ///@remark 需要快速返回,此函数调用与OnTickByTick不在一个线程内,会在OnRequestRebuildQuote()之前回调 - virtual void OnRebuildTickByTick(XTPTBT *tbt_data) {}; - - ///回补的快照行情数据 - ///@param md_data 回补的快照行情数据 - ///@remark 需要快速返回,此函数调用与OnDepthMarketData不在一个线程内,会在OnRequestRebuildQuote()之前回调 - virtual void OnRebuildMarketData(XTPMD *md_data) {}; - - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility push(default) -#endif -#endif - -/*! -* \class XTP::API::QuoteApi -* -* \brief 行情订阅接口类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - class MD_API_EXPORT QuoteApi - { - public: - ///创建QuoteApi - ///@param client_id (必须输入)用于区分同一用户的不同客户端,由用户自定义 - ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个有可写权限的真实存在的路径,如果路径不存在的话,可能会因为写冲突而造成断线 - ///@param log_level 日志输出级别 - ///@return 创建出的UserApi - ///@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接 - static QuoteApi *CreateQuoteApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level=XTP_LOG_LEVEL_DEBUG); - - ///删除接口对象本身 - ///@remark 不再使用本接口对象时,调用该函数删除接口对象 - virtual void Release() = 0; - - - ///获取当前交易日 - ///@return 获取到的交易日 - ///@remark 只有登录成功后,才能得到正确的交易日 - virtual const char *GetTradingDay() = 0; - - ///获取API的发行版本号 - ///@return 返回api发行版本号 - virtual const char* GetApiVersion() = 0; - - ///获取API的系统错误 - ///@return 返回的错误信息,可以在Login、Logout、订阅、取消订阅失败时调用,获取失败的原因 - ///@remark 可以在调用api接口失败时调用,例如login失败时 - virtual XTPRI *GetApiLastError() = 0; - - ///设置采用UDP方式连接时的单个队列接收缓冲区大小,目前可能最大使用4个缓冲区队列 - ///@remark 需要在Login之前调用,默认大小和最小设置均为64MB。此缓存大小单位为MB,请输入2的次方数,例如128MB请输入128。 - virtual void SetUDPBufferSize(uint32_t buff_size) = 0; - - - ///注册回调接口 - ///@param spi 派生自回调接口类的实例,请在登录之前设定 - virtual void RegisterSpi(QuoteSpi *spi) = 0; - - ///设置心跳检测时间间隔,单位为秒 - ///@param interval 心跳检测时间间隔,单位为秒 - ///@remark 此函数必须在Login之前调用 - virtual void SetHeartBeatInterval(uint32_t interval) = 0; - - ///使用UDP接收行情时,设置接收行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPRecvThreadAffinityArray函数 - ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu - ///@remark 此版本不建议使用,请替换使用SetUDPRecvThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPRecvThreadAffinityArray一起使用时,仅第一个被调用的生效 - virtual void SetUDPRecvThreadAffinity(int32_t cpu_no) = 0; - - ///使用UDP接收行情时,设置接收行情线程绑定的cpu集合 - ///@param cpu_no_array 设置绑定的cpu集合数组 - ///@param count cpu集合数组长度 - ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 - virtual void SetUDPRecvThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; - - ///使用UDP接收行情时,设置解析行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPParseThreadAffinityArray函数 - ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu - ///@remark 此版本不建议使用,请替换使用SetUDPParseThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPParseThreadAffinityArray一起使用时,仅第一个被调用的生效 - virtual void SetUDPParseThreadAffinity(int32_t cpu_no) = 0; - - ///使用UDP接收行情时,设置解析行情线程绑定的cpu集合 - ///@param cpu_no_array 设置绑定的cpu集合数组 - ///@param count cpu集合数组长度 - ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 - virtual void SetUDPParseThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; - - ///设定UDP收行情时是否输出异步日志 - ///@param flag 是否输出标识,默认为true,如果不想输出“udpseq”开头的异步日志,请设置此参数为false - ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 - virtual void SetUDPSeqLogOutPutFlag(bool flag = true) = 0; - - ///订阅行情,包括股票、指数、期权、债券等。 - ///@return 订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 - virtual int SubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///退订行情,包括股票、指数、期权、债券等。 - ///@return 取消订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情接口配套使用 - virtual int UnSubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///订阅行情订单簿,包括股票、债券等。(新三板暂不支持) - ///@return 订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情(仅支持深交所) - virtual int SubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///退订行情订单簿,包括股票、债券等。(新三板暂不支持) - ///@return 取消订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情订单簿接口配套使用 - virtual int UnSubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///订阅逐笔行情,包括股票、债券等。(新三板暂不支持) - ///@return 订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 - virtual int SubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///退订逐笔行情,包括股票、债券等。(新三板暂不支持) - ///@return 取消订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要订阅/退订行情订单簿的合约个数 - ///@param exchange_id 交易所代码 - ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅逐笔行情接口配套使用 - virtual int UnSubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///订阅全市场的股票、债券、指数等行情 - ///@return 订阅全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订行情接口配套使用 - virtual int SubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的股票、债券、指数等行情 - ///@return 退订全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场行情接口配套使用 - virtual int UnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的股票、债券等行情订单簿(新三板暂不支持) - ///@return 订阅全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订行情订单簿接口配套使用 - virtual int SubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的股票、债券等行情订单簿(新三板暂不支持) - ///@return 退订全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场行情订单簿接口配套使用 - virtual int UnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的股票、债券等逐笔行情(新三板暂不支持) - ///@return 订阅全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订逐笔行情接口配套使用 - virtual int SubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的股票、债券等逐笔行情(新三板暂不支持) - ///@return 退订全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场逐笔行情接口配套使用 - virtual int UnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///用户登录请求 - ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 - ///@param ip 服务器ip地址,类似“127.0.0.1” - ///@param port 服务器端口号 - ///@param user 登陆用户名 - ///@param password 登陆密码 - ///@param sock_type “1”代表TCP,“2”代表UDP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取沪深2市当前交易日合约部分静态信息 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 - virtual int QueryAllTickers(XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///获取合约的最新价格信息 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 - ///@param count 要查询的合约个数 - ///@param exchange_id 交易所代码 - virtual int QueryTickersPriceInfo(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///获取所有合约的最新价格信息 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - virtual int QueryAllTickersPriceInfo() = 0; - - ///订阅全市场的期权行情(目前暂无此数据) - ///@return 订阅全市期权场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订期权行情接口配套使用 - virtual int SubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的期权行情(目前暂无此数据) - ///@return 退订全市场期权行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场期权行情接口配套使用 - virtual int UnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的期权行情订单簿(目前暂无此数据) - ///@return 订阅全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订期权行情订单簿接口配套使用 - virtual int SubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的期权行情订单簿(目前暂无此数据) - ///@return 退订全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场期权行情订单簿接口配套使用 - virtual int UnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///订阅全市场的期权逐笔行情(目前暂无此数据) - ///@return 订阅全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与全市场退订期权逐笔行情接口配套使用 - virtual int SubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///退订全市场的期权逐笔行情(目前暂无此数据) - ///@return 退订全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - ///获取沪深2市所有合约的详细静态信息,包括指数等非可交易的,不包括新三板 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 - virtual int QueryAllTickersFullInfo(XTP_EXCHANGE_TYPE exchange_id) = 0; - - ///获取新三板所有合约的详细静态信息,包括指数等非可交易的 - ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 - virtual int QueryAllNQTickersFullInfo() = 0; - - ///用户登录回补服务器请求 - ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 - ///@param ip 服务器ip地址,类似“127.0.0.1” - ///@param port 服务器端口号 - ///@param user 登陆用户名 - ///@param password 登陆密码 - ///@param sock_type “1”代表TCP,“2”代表UDP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接。回补服务器会在无消息交互后定时断线,请注意仅在需要回补数据时才保持连接,回补完成后请及时logout - virtual int LoginToRebuildQuoteServer(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - ///登出回补服务器请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int LogoutFromRebuildQuoteServer() = 0; - - ///请求回补指定行情,包括快照和逐笔 - ///@return 请求回补指定频道的逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 - ///@param rebuild_param 指定回补的参数信息,注意一次性回补最多1000个数据,超过1000需要分批次请求,一次只能指定一种类型的数据 - ///@remark 仅在逐笔行情丢包时或者确实快照行情时使用,回补的行情数据将从OnRebuildTickByTick或者OnRebuildMarketData()接口回调提供,与订阅的行情数据不在同一个线程内 - virtual int RequestRebuildQuote(XTPQuoteRebuildReq* rebuild_param) = 0; - - - protected: - ~QuoteApi() {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xtp_quote_api.h +///@brief 定义行情订阅客户端接口 +///////////////////////////////////////////////////////////////////////// + +#ifndef _XTP_QUOTE_API_H_ +#define _XTP_QUOTE_API_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "xtp_api_struct.h" + +#if defined(ISLIB) && defined(WIN32) +#ifdef LIB_MD_API_EXPORT +#define MD_API_EXPORT __declspec(dllexport) +#else +#define MD_API_EXPORT __declspec(dllimport) +#endif +#else +#define MD_API_EXPORT +#endif + +/*! +* \class XTP::API::QuoteSpi +* +* \brief 行情回调类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + class QuoteSpi + { + public: + + ///当客户端与行情后台通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。可以在此函数中调用Login重新登录。注意用户重新登录后,需要重新订阅行情 + virtual void OnDisconnected(int reason) {}; + + + ///错误应答 + ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 + virtual void OnError(XTPRI *error_info) {}; + + ///逐笔丢包应答 + ///@param begin_seq 当逐笔出现丢包时,丢包区间下限(可能与上限一致) + ///@param end_seq 当逐笔出现丢包时,丢包区间上限(可能与下限一致) + ///@remark 此函数只有在逐笔发生丢包时才会有调用,如果丢包的上下限一致,表示仅丢失了一个包,注意此包仅为数据包,包含1个或者多个逐笔数据 + virtual void OnTickByTickLossRange(int begin_seq, int end_seq) {}; + + ///订阅行情应答,包括股票、指数和期权 + ///@param ticker 详细的合约订阅情况 + ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///退订行情应答,包括股票、指数和期权 + ///@param ticker 详细的合约取消订阅情况 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnUnSubMarketData(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///深度行情通知,包含买一卖一队列 + ///@param market_data 行情数据 + ///@param bid1_qty 买一队列数据 + ///@param bid1_count 买一队列的有效委托笔数,即bid1_qty数组的长度,最大为50 + ///@param max_bid1_count 买一队列总委托笔数 + ///@param ask1_qty 卖一队列数据 + ///@param ask1_count 卖一队列的有效委托笔数,即ask1_qty数组的长度,最大为50 + ///@param max_ask1_count 卖一队列总委托笔数 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t bid1_count, int32_t max_bid1_count, int64_t ask1_qty[], int32_t ask1_count, int32_t max_ask1_count) {}; + + /// ETF的IOPV通知 + /// @param iopv ETF的参考单位基金净值数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnETFIOPVData(IOPV *iopv) {}; + + ///订阅行情订单簿应答,包括股票、债券 + ///@param ticker 详细的合约订阅情况 + ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///退订行情订单簿应答,包括股票、债券 + ///@param ticker 详细的合约取消订阅情况 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnUnSubOrderBook(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///行情订单簿通知,包括股票、债券 + ///@param order_book 行情订单簿数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnOrderBook(XTPOB *order_book) {}; + + ///订阅逐笔行情应答,包括股票、债券 + ///@param ticker 详细的合约订阅情况 + ///@param error_info 订阅合约发生错误时的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条订阅的合约均对应一条订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///退订逐笔行情应答,包括股票、债券 + ///@param ticker 详细的合约取消订阅情况 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次取消订阅的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 每条取消订阅的合约均对应一条取消订阅应答,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnUnSubTickByTick(XTPST *ticker, XTPRI *error_info, bool is_last) {}; + + ///逐笔行情通知,包括股票、债券 + ///@param tbt_data 逐笔行情数据,包括逐笔委托和逐笔成交,此为共用结构体,需要根据type来区分是逐笔委托还是逐笔成交,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnTickByTick(XTPTBT *tbt_data) {}; + + ///订阅全市场的股票行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的股票行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的股票行情订单簿应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的股票行情订单簿应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的股票逐笔行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的股票逐笔行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + + ///查询合约部分静态信息的应答 + ///@param ticker_info 合约部分静态信息 + ///@param error_info 查询合约部分静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询合约部分静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryAllTickers(XTPQSI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///查询合约的最新价格信息应答 + ///@param ticker_info 合约的最新价格信息 + ///@param error_info 查询合约的最新价格信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///订阅全市场的期权行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的期权行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的期权行情订单簿应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的期权行情订单簿应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///订阅全市场的期权逐笔行情应答 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///退订全市场的期权逐笔行情应答 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 需要快速返回 + virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; + + ///查询沪深2市合约完整静态信息的应答 + ///@param ticker_info 合约完整静态信息 + ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryAllTickersFullInfo(XTPQFI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///查询新三板合约完整静态信息的应答 + ///@param ticker_info 合约完整静态信息 + ///@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + virtual void OnQueryAllNQTickersFullInfo(XTPNQFI* ticker_info, XTPRI *error_info, bool is_last) {}; + + ///当客户端与回补行情服务器通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。回补服务器会在无消息交互后会定时断线,请注意仅在需要回补数据时才保持连接,无回补需求时,无需登陆。 + virtual void OnRebuildQuoteServerDisconnected(int reason) {}; + + ///请求回补指定频道的逐笔行情的总体结果应答 + ///@param rebuild_result 当回补结束时被调用,如果回补结果失败,则msg参数表示失败原因 + ///@remark 需要快速返回,仅在回补数据发送结束后调用,如果请求数据太多,一次性无法回补完,那么rebuild_result.result_code = XTP_REBUILD_RET_PARTLY,此时需要根据回补结果继续发起回补数据请求 + virtual void OnRequestRebuildQuote(XTPQuoteRebuildResultRsp* rebuild_result) {}; + + ///回补的逐笔行情数据 + ///@param tbt_data 回补的逐笔行情数据 + ///@remark 需要快速返回,此函数调用与OnTickByTick不在一个线程内,会在OnRequestRebuildQuote()之前回调 + virtual void OnRebuildTickByTick(XTPTBT *tbt_data) {}; + + ///回补的快照行情数据 + ///@param md_data 回补的快照行情数据 + ///@remark 需要快速返回,此函数调用与OnDepthMarketData不在一个线程内,会在OnRequestRebuildQuote()之前回调 + virtual void OnRebuildMarketData(XTPMD *md_data) {}; + + }; + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility push(default) +#endif +#endif + +/*! +* \class XTP::API::QuoteApi +* +* \brief 行情订阅接口类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + class MD_API_EXPORT QuoteApi + { + public: + ///创建QuoteApi + ///@param client_id (必须输入)用于区分同一用户的不同客户端,由用户自定义 + ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个有可写权限的真实存在的路径,如果路径不存在的话,可能会因为写冲突而造成断线 + ///@param log_level 日志输出级别 + ///@return 创建出的UserApi + ///@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接 + static QuoteApi *CreateQuoteApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level=XTP_LOG_LEVEL_DEBUG); + + ///删除接口对象本身 + ///@remark 不再使用本接口对象时,调用该函数删除接口对象 + virtual void Release() = 0; + + + ///获取当前交易日 + ///@return 获取到的交易日 + ///@remark 只有登录成功后,才能得到正确的交易日 + virtual const char *GetTradingDay() = 0; + + ///获取API的发行版本号 + ///@return 返回api发行版本号 + virtual const char* GetApiVersion() = 0; + + ///获取API的系统错误 + ///@return 返回的错误信息,可以在Login、Logout、订阅、取消订阅失败时调用,获取失败的原因 + ///@remark 可以在调用api接口失败时调用,例如login失败时 + virtual XTPRI *GetApiLastError() = 0; + + ///设置采用UDP方式连接时的单个队列接收缓冲区大小,目前可能最大使用4个缓冲区队列 + ///@remark 需要在Login之前调用,默认大小和最小设置均为64MB。此缓存大小单位为MB,请输入2的次方数,例如128MB请输入128。 + virtual void SetUDPBufferSize(uint32_t buff_size) = 0; + + + ///注册回调接口 + ///@param spi 派生自回调接口类的实例,请在登录之前设定 + virtual void RegisterSpi(QuoteSpi *spi) = 0; + + ///设置心跳检测时间间隔,单位为秒 + ///@param interval 心跳检测时间间隔,单位为秒 + ///@remark 此函数必须在Login之前调用 + virtual void SetHeartBeatInterval(uint32_t interval) = 0; + + ///使用UDP接收行情时,设置接收行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPRecvThreadAffinityArray函数 + ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu + ///@remark 此版本不建议使用,请替换使用SetUDPRecvThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPRecvThreadAffinityArray一起使用时,仅第一个被调用的生效 + virtual void SetUDPRecvThreadAffinity(int32_t cpu_no) = 0; + + ///使用UDP接收行情时,设置接收行情线程绑定的cpu集合 + ///@param cpu_no_array 设置绑定的cpu集合数组 + ///@param count cpu集合数组长度 + ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 + virtual void SetUDPRecvThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; + + ///使用UDP接收行情时,设置解析行情线程绑定的cpu,此版本不建议使用,只为跟之前的版本兼容,请替换使用SetUDPParseThreadAffinityArray函数 + ///@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu + ///@remark 此版本不建议使用,请替换使用SetUDPParseThreadAffinityArray函数,如果调用则必须在Login之前调用,否则不会生效,与SetUDPParseThreadAffinityArray一起使用时,仅第一个被调用的生效 + virtual void SetUDPParseThreadAffinity(int32_t cpu_no) = 0; + + ///使用UDP接收行情时,设置解析行情线程绑定的cpu集合 + ///@param cpu_no_array 设置绑定的cpu集合数组 + ///@param count cpu集合数组长度 + ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 + virtual void SetUDPParseThreadAffinityArray(int32_t cpu_no_array[], int32_t count) = 0; + + ///设定UDP收行情时是否输出异步日志 + ///@param flag 是否输出标识,默认为true,如果不想输出“udpseq”开头的异步日志,请设置此参数为false + ///@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 + virtual void SetUDPSeqLogOutPutFlag(bool flag = true) = 0; + + ///订阅行情,包括股票、指数、期权、债券等。 + ///@return 订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 + virtual int SubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///退订行情,包括股票、指数、期权、债券等。 + ///@return 取消订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情接口配套使用 + virtual int UnSubscribeMarketData(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///订阅行情订单簿,包括股票、债券等。(新三板暂不支持) + ///@return 订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情(仅支持深交所) + virtual int SubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///退订行情订单簿,包括股票、债券等。(新三板暂不支持) + ///@return 取消订阅行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅行情订单簿接口配套使用 + virtual int UnSubscribeOrderBook(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///订阅逐笔行情,包括股票、债券等。(新三板暂不支持) + ///@return 订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性订阅同一证券交易所的多个合约,无论用户因为何种问题需要重新登录行情服务器,都需要重新订阅行情 + virtual int SubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///退订逐笔行情,包括股票、债券等。(新三板暂不支持) + ///@return 取消订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要订阅/退订行情订单簿的合约个数 + ///@param exchange_id 交易所代码 + ///@remark 可以一次性取消订阅同一证券交易所的多个合约,需要与订阅逐笔行情接口配套使用 + virtual int UnSubscribeTickByTick(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///订阅全市场的股票、债券、指数等行情 + ///@return 订阅全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订行情接口配套使用 + virtual int SubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的股票、债券、指数等行情 + ///@return 退订全市场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场行情接口配套使用 + virtual int UnSubscribeAllMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的股票、债券等行情订单簿(新三板暂不支持) + ///@return 订阅全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订行情订单簿接口配套使用 + virtual int SubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的股票、债券等行情订单簿(新三板暂不支持) + ///@return 退订全市场行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场行情订单簿接口配套使用 + virtual int UnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的股票、债券等逐笔行情(新三板暂不支持) + ///@return 订阅全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订逐笔行情接口配套使用 + virtual int SubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的股票、债券等逐笔行情(新三板暂不支持) + ///@return 退订全市场逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场逐笔行情接口配套使用 + virtual int UnSubscribeAllTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///用户登录请求 + ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 + ///@param ip 服务器ip地址,类似“127.0.0.1” + ///@param port 服务器端口号 + ///@param user 登陆用户名 + ///@param password 登陆密码 + ///@param sock_type “1”代表TCP,“2”代表UDP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 + virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + + ///登出请求 + ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 + virtual int Logout() = 0; + + ///获取沪深2市当前交易日合约部分静态信息 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 + virtual int QueryAllTickers(XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///获取合约的最新价格信息 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + ///@param ticker 合约ID数组,注意合约代码必须以'\0'结尾,不包含空格 + ///@param count 要查询的合约个数 + ///@param exchange_id 交易所代码 + virtual int QueryTickersPriceInfo(char *ticker[], int count, XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///获取所有合约的最新价格信息 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + virtual int QueryAllTickersPriceInfo() = 0; + + ///订阅全市场的期权行情(目前暂无此数据) + ///@return 订阅全市期权场行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订期权行情接口配套使用 + virtual int SubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的期权行情(目前暂无此数据) + ///@return 退订全市场期权行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场期权行情接口配套使用 + virtual int UnSubscribeAllOptionMarketData(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的期权行情订单簿(目前暂无此数据) + ///@return 订阅全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订期权行情订单簿接口配套使用 + virtual int SubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的期权行情订单簿(目前暂无此数据) + ///@return 退订全市场期权行情订单簿接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场期权行情订单簿接口配套使用 + virtual int UnSubscribeAllOptionOrderBook(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///订阅全市场的期权逐笔行情(目前暂无此数据) + ///@return 订阅全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与全市场退订期权逐笔行情接口配套使用 + virtual int SubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///退订全市场的期权逐笔行情(目前暂无此数据) + ///@return 退订全市场期权逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param exchange_id 表示当前退订的市场,如果为XTP_EXCHANGE_UNKNOWN,表示沪深全市场(不包括新三板),XTP_EXCHANGE_SH表示为上海全市场,XTP_EXCHANGE_SZ表示为深圳全市场,XTP_EXCHANGE_NQ表示新三板 + ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 + virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; + + ///获取沪深2市所有合约的详细静态信息,包括指数等非可交易的,不包括新三板 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + ///@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 + virtual int QueryAllTickersFullInfo(XTP_EXCHANGE_TYPE exchange_id) = 0; + + ///获取新三板所有合约的详细静态信息,包括指数等非可交易的 + ///@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + virtual int QueryAllNQTickersFullInfo() = 0; + + ///用户登录回补服务器请求 + ///@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 + ///@param ip 服务器ip地址,类似“127.0.0.1” + ///@param port 服务器端口号 + ///@param user 登陆用户名 + ///@param password 登陆密码 + ///@param sock_type “1”代表TCP,“2”代表UDP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接。回补服务器会在无消息交互后定时断线,请注意仅在需要回补数据时才保持连接,回补完成后请及时logout + virtual int LoginToRebuildQuoteServer(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + ///登出回补服务器请求 + ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 + virtual int LogoutFromRebuildQuoteServer() = 0; + + ///请求回补指定行情,包括快照和逐笔 + ///@return 请求回补指定频道的逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + ///@param rebuild_param 指定回补的参数信息,注意一次性回补最多1000个数据,超过1000需要分批次请求,一次只能指定一种类型的数据 + ///@remark 仅在逐笔行情丢包时或者确实快照行情时使用,回补的行情数据将从OnRebuildTickByTick或者OnRebuildMarketData()接口回调提供,与订阅的行情数据不在同一个线程内 + virtual int RequestRebuildQuote(XTPQuoteRebuildReq* rebuild_param) = 0; + + + protected: + ~QuoteApi() {}; + }; + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif diff --git a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_trader_api.h b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_trader_api.h index f8f5b69..6b301cf 100644 --- a/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_trader_api.h +++ b/source/Windows/xtp_api_python3_2.2.39.3/xtpapi/xtp_trader_api.h @@ -1,1189 +1,1189 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_trader_api.h -///@brief 定义客户端交易接口 -///////////////////////////////////////////////////////////////////////// - -#ifndef _XTP_TRADER_API_H_ -#define _XTP_TRADER_API_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "xtp_api_struct.h" -#include "algo_api_struct.h" - -#if defined(ISLIB) && defined(WIN32) -#ifdef LIB_TRADER_API_EXPORT -#define TRADER_API_EXPORT __declspec(dllexport) -#else -#define TRADER_API_EXPORT __declspec(dllimport) -#endif -#else -#define TRADER_API_EXPORT -#endif - -/*! -* \class XTP::API::TraderSpi -* -* \brief 交易接口响应类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - - class TraderSpi - { - public: - - ///当客户端的某个连接与交易后台通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 用户主动调用logout导致的断线,不会触发此函数。api不会自动重连,当断线发生时,请用户自行选择后续操作,可以在此函数中调用Login重新登录,并更新session_id,此时用户收到的数据跟断线之前是连续的 - virtual void OnDisconnected(uint64_t session_id, int reason) {}; - - ///错误应答 - ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 - virtual void OnError(XTPRI *error_info) {}; - - ///请求查询用户在本节点上可交易市场的响应 - ///@param trade_location 查询到的交易市场信息,按位来看,从低位开始数,第0位表示沪市,即如果(trade_location&0x01) == 0x01,代表可交易沪市,第1位表示深市,即如果(trade_location&0x02) == 0x02,表示可交易深市,如果第0位和第1位均是1,即(trade_location&(0x01|0x02)) == 0x03,就表示可交易沪深2个市场 - ///@param error_info 查询可交易市场发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此查询只会有一个结果 - virtual void OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///报单通知 - ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 - ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 - virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; - - ///成交通知 - ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 - virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) {}; - - ///撤单出错响应 - ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id - ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此响应只会在撤单发生错误时被回调 - virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询报单响应-新版本接口 - ///@param order_info 查询到的一个报单信息 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询报单响应-新版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询成交响应 - ///@param trade_info 查询到的一个成交回报 - ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询成交响应 - ///@param trade_info 查询到的一个成交信息 - ///@param req_count 分页请求的最大数量 - ///@param trade_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询投资者持仓响应 - ///@param position 查询到的一只股票的持仓情况 - ///@param error_info 查询账户持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询资金账户响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param asset 查询到的资金账户情况 - ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询分级基金信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 查询到的分级基金情况 - ///@param error_info 查询分级基金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询资金划拨订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_transfer_info 查询到的资金账户情况 - ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///资金划拨通知 - ///@param fund_transfer_info 资金划拨通知的具体信息,用户可以通过fund_transfer_info.serial_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 资金划拨订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当资金划拨方向为一号两中心节点之间划拨,且error_info.error_id=11000384时,error_info.error_msg中含有对方结点中可用于划拨的资金(以整数为准),用户需解析后进行stringToInt的转化,可据此填写合适的资金,再次发起划拨请求 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当资金划拨订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的资金划拨通知。 - virtual void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询其他节点可用资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 查询到的其他节点可用资金情况 - ///@param error_info 查询其他节点可用资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///请求查询ETF清单文件的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param etf_info 查询到的ETF清单文件情况 - ///@param error_info 查询ETF清单文件发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询ETF股票篮的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param etf_component_info 查询到的ETF合约的相关成分股信息 - ///@param error_info 查询ETF股票篮发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询今日新股申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param ipo_info 查询到的今日新股申购的一只股票信息 - ///@param error_info 查询今日新股申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询用户新股申购额度信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param quota_info 查询到的用户某个市场的今日新股申购额度信息 - ///@param error_info 查查询用户新股申购额度信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询今日可转债申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param ipo_info 查询到的今日可转债申购的一只可转债信息 - ///@param error_info 查询今日可转债申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询用户可转债转股信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param swap_stock_info 查询到某条可转债转股信息 - ///@param error_info 查查询可转债转股信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权合约的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param option_info 查询到的期权合约情况 - ///@param error_info 查询期权合约发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///融资融券业务中现金直接还款的响应 - ///@param cash_repay_info 现金直接还款通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 现金还款发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; - - ///融资融券业务中现金还息的响应 - ///@param cash_repay_info 现金还息通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 现金还息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询融资融券业务中的现金直接还款报单的响应 - ///@param cash_repay_info 查询到的某一笔现金直接还款通知的具体信息 - ///@param error_info 查询现金直接报单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo *cash_repay_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询信用账户额外信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 查询到的信用账户额外信息情况 - ///@param error_info 查询信用账户额外信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditFundInfo(XTPCrdFundInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///请求查询信用账户负债信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param debt_info 查询到的信用账户合约负债情况 - ///@param error_info 查询信用账户负债信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditDebtInfo(XTPCrdDebtInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询信用账户指定证券负债未还信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param debt_info 查询到的信用账户指定证券负债未还信息情况 - ///@param error_info 查询信用账户指定证券负债未还信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询信用账户待还资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param remain_amount 查询到的信用账户待还资金 - ///@param error_info 查询信用账户待还资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///请求查询信用账户可融券头寸信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param assign_info 查询到的信用账户可融券头寸信息 - ///@param error_info 查询信用账户可融券头寸信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo *assign_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///融资融券业务中请求查询指定余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param stock_info 查询到的余券信息 - ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///融资融券业务中请求查询余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param stock_info 查询到的余券信息 - ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id, bool is_last) {}; - - ///融资融券业务中负债合约展期的通知 - ///@param debt_extend_info 负债合约展期通知的具体信息,用户可以通过debt_extend_info.xtpid来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - ///@param error_info 负债合约展期订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当负债合约展期订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的负债合约展期通知。 - virtual void OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, uint64_t session_id) {}; - - ///查询融资融券业务中负债合约展期订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param debt_extend_info 查询到的负债合约展期情况 - ///@param error_info 查询负债合约展期发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当error_info.error_id=11000350时,表明没有记录,当为其他非0值时,表明合约发生拒单时的错误原因 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///查询融资融券业务中信用账户附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 信用账户附加信息 - ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; - - ///查询融资融券业务中信用账户指定证券的附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - ///@param fund_info 信用账户指定证券的附加信息 - ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///期权组合策略报单通知 - ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 - ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 - virtual void OnOptionCombinedOrderEvent(XTPOptCombOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; - - ///期权组合策略成交通知 - ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 - virtual void OnOptionCombinedTradeEvent(XTPOptCombTradeReport *trade_info, uint64_t session_id) {}; - - ///期权组合策略撤单出错响应 - ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id - ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此响应只会在撤单发生错误时被回调 - virtual void OnCancelOptionCombinedOrderError(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; - - ///请求查询期权组合策略报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略报单响应-新版本接口 - ///@param order_info 查询到的一个报单 - ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询期权组合策略报单响应-旧版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询期权组合策略报单响应-新版本接口 - ///@param order_info 查询到的一个报单 - ///@param req_count 分页请求的最大数量 - ///@param order_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略成交响应 - ///@param trade_info 查询到的一个成交回报 - ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual void OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///分页请求查询期权组合策略成交响应 - ///@param trade_info 查询到的一个成交信息 - ///@param req_count 分页请求的最大数量 - ///@param trade_sequence 分页请求的当前回报数量 - ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略持仓响应 - ///@param position_info 查询到的一个持仓信息 - ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///请求查询期权组合策略信息响应 - ///@param strategy_info 查询到的一个组合策略信息 - ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp *strategy_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///查询期权行权合并头寸的响应 - ///@param position_info 查询到的一个行权合并头寸信息 - ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - virtual void OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; - - ///algo业务中查询策略列表的响应 - ///@param strategy_info 策略具体信息 - ///@param strategy_param 此策略中包含的参数,如果error_info.error_id为0时,有意义 - ///@param error_info 查询查询策略列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; - - ///algo业务中策略运行时策略状态通知 - ///@param strategy_state 用户策略运行情况的状态通知 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state, uint64_t session_id) {}; - - ///algo业务中用户建立算法通道的消息响应 - ///@param user 用户名 - ///@param error_info 建立算法通道发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误,即算法通道成功 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 算法通道建立成功后,才能对用户创建策略等操作,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立 - virtual void OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id) {}; - - ///algo业务中报送策略单的响应 - ///@param strategy_info 用户报送的策略单的具体信息 - ///@param error_info 报送策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; - - ///algo业务中撤销策略单的响应 - ///@param strategy_info 用户撤销的策略单的具体信息 - ///@param error_info 撤销策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; - - ///当客户端与AlgoBus通信连接断开时,该方法被调用。 - ///@param reason 错误原因,请与错误代码表对应 - ///@remark 请不要堵塞此线程,否则会影响algo的登录,与Algo之间的连接,断线后会自动重连,用户无需做其他操作 - virtual void OnAlgoDisconnected(int reason) {}; - - ///当客户端与AlgoBus断线后重新连接时,该方法被调用,仅在断线重连成功后会被调用。 - virtual void OnAlgoConnected() {}; - - ///algo业务中策略运行时策略指定证券执行状态通知 - ///@param strategy_symbol_state 用户策略指定证券运行情况的状态通知 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) {}; - - ///algo业务中报送母单创建时的推送消息(包括其他客户端创建的母单) - ///@param strategy_info 策略具体信息 - ///@param strategy_param 此策略中包含的参数 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id) {}; - - ///algo业务中算法推荐的响应 - ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,与请求一致,如果此参数为true,那么请以返回的strategy_param为准 - ///@param recommendation_info 推荐算法的具体信息,当basket_flag=true时,此结构体中的market和ticker将没有意义,此时请以strategy_param为准 - ///@param strategy_param 算法参数,可直接用来创建母单,如果error_info.error_id为0时,有意义 - ///@param error_info 请求推荐算法发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param request_id 此消息响应函数对应的请求ID - ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; - - ///algo业务中修改已有策略单的响应 - ///@param strategy_info 用户修改后策略单的具体信息 - ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - virtual void OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility push(default) -#endif -#endif - -/*! -* \class XTP::API::TraderApi -* -* \brief 交易接口类 -* -* \author 中泰证券股份有限公司 -* \date 十月 2015 -*/ -namespace XTP { - namespace API { - - class TRADER_API_EXPORT TraderApi - { - public: - ///创建TraderApi - ///@param client_id (必须输入)客户端id,用于区分同一用户的不同客户端,由用户自定义,普通用户必须使用1-99之间的数值 - ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个真实存在的有可写权限的路径 - ///@param log_level 日志输出级别 - ///@return 创建出的UserApi - ///@remark 只能创建一次,如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接。系统不支持过夜,请确保每天开盘前重新启动 - static TraderApi *CreateTraderApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level = XTP_LOG_LEVEL_DEBUG); - - ///删除接口对象本身 - ///@remark 不再使用本接口对象时,调用该函数删除接口对象 - virtual void Release() = 0; - - ///获取当前交易日 - ///@return 获取到的交易日 - ///@remark 只有登录成功后,才能得到正确的交易日 - virtual const char *GetTradingDay() = 0; - - ///注册回调接口 - ///@param spi 派生自回调接口类的实例,请在登录之前设定 - virtual void RegisterSpi(TraderSpi *spi) = 0; - - ///获取API的系统错误 - ///@return 返回的错误信息,可以在Login、InsertOrder、CancelOrder返回值为0时调用,获取失败的原因 - ///@remark 可以在调用api接口失败时调用,例如login失败时 - virtual XTPRI *GetApiLastError() = 0; - - ///获取API的发行版本号 - ///@return 返回api发行版本号 - virtual const char* GetApiVersion() = 0; - - ///通过报单在xtp系统中的ID获取下单的客户端id - ///@return 返回客户端id,可以用此方法过滤自己下的订单 - ///@param order_xtp_id 报单在xtp系统中的ID - ///@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 - virtual uint8_t GetClientIDByXTPID(uint64_t order_xtp_id) = 0; - - ///通过报单在xtp系统中的ID获取相关资金账户名 - ///@return 返回资金账户名 - ///@param order_xtp_id 报单在xtp系统中的ID - ///@remark 只有资金账户登录成功后,才能得到正确的信息 - virtual const char* GetAccountByXTPID(uint64_t order_xtp_id) = 0; - - ///订阅公共流。 - ///@param resume_type 公共流(订单响应、成交回报)重传方式 - /// XTP_TERT_RESTART:从本交易日开始重传 - /// XTP_TERT_RESUME:(保留字段,此方式暂未支持)从上次收到的续传 - /// XTP_TERT_QUICK:只传送登录后公共流的内容 - ///@remark 该方法要在Login方法前调用。若不调用则不会收到公共流的数据。注意在用户断线后,如果不登出就login(),公共流订阅方式不会起作用。用户只会收到断线后的所有消息。如果先logout()再login(),那么公共流订阅方式会起作用,用户收到的数据会根据用户的选择方式而定。 - virtual void SubscribePublicTopic(XTP_TE_RESUME_TYPE resume_type) = 0; - - ///设置软件开发版本号 - ///@param version 用户开发软件版本号,非api发行版本号,长度不超过15位,以'\0'结尾 - ///@remark 此函数必须在Login之前调用,标识的是客户端版本号,而不是API的版本号,由用户自定义 - virtual void SetSoftwareVersion(const char* version) = 0; - - ///设置软件开发Key - ///@param key 用户开发软件Key,用户申请开户时给予,以'\0'结尾 - ///@remark 此函数必须在Login之前调用 - virtual void SetSoftwareKey(const char* key) = 0; - - ///设置心跳检测时间间隔,单位为秒 - ///@param interval 心跳检测时间间隔,单位为秒 - ///@remark 此函数必须在Login之前调用 - virtual void SetHeartBeatInterval(uint32_t interval) = 0; - - ///用户登录请求 - ///@return session_id表明此资金账号登录是否成功,“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,非“0”表示登录成功,此时需要记录下这个返回值session_id,与登录的资金账户对应 - ///@param ip 服务器地址,类似“127.0.0.1” - ///@param port 服务器端口号 - ///@param user 登录用户名 - ///@param password 登录密码 - ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api可支持多个账户连接,但是同一个账户同一个client_id只能有一个session连接,后面的登录在前一个session存续期间,无法连接 - virtual uint64_t Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,“-1”表示登出失败 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual int Logout(uint64_t session_id) = 0; - - ///服务器是否重启过 - ///@return “true”表示重启过,“false”表示没有重启过 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数必须在Login之后调用 - virtual bool IsServerRestart(uint64_t session_id) = 0; - - ///修改已登录用户的硬件信息,仅限授权系统使用 - ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param info 需要修改成的用户硬件信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数必须在Login之后调用,且仅限授权系统使用,一般客户无需使用 - virtual int ModifyUserTerminalInfo(const XTPUserTerminalInfoReq* info, uint64_t session_id) = 0; - - ///查询用户在本节点上的可交易市场类型 - ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数必须在Login之后调用,对应的响应函数是OnQueryAccountTradeMarket() - virtual int QueryAccountTradeMarket(uint64_t session_id, int request_id) = 0; - - ///为用户获取一个新的订单XTPID,用于报单 - ///@return 生成的订单XTPID,非“0”表示获取成功,“0”表示获取失败,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数必须在Login之后调用,通过这个函数获取的order_xtp_id仅用于对应的用户报单,如果设置错误,将会导致下单失败 - virtual uint64_t GetANewOrderXTPID(uint64_t session_id) = 0; - - ///报单录入请求 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOrder(XTPOrderInsertInfo *order, uint64_t session_id) = 0; - - ///已经提前设置order_xtp_id的报单录入请求,与GetANewOrderXTPID()配合使用 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOrderExtra(XTPOrderInsertInfo *order, uint64_t session_id) = 0; - - ///报单操作请求 - ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order_xtp_id 需要撤销的委托单在XTP系统中的ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 如果撤单成功,会在报单响应函数OnOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 - virtual uint64_t CancelOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; - - ///根据报单ID请求查询报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOrders(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询未完结报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryUnfinishedOrders(uint64_t session_id, int request_id) = 0; - - ///分页请求查询报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOrdersByPage(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///根据报单ID请求查询报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOrdersEx(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询未完结报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; - - ///分页请求查询报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOrdersByPageEx(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///根据委托编号请求查询相关成交 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数查询出的结果可能对应多个查询结果响应 - virtual int QueryTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询已成交 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryTrades(XTPQueryTraderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询成交回报 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryTradesByPage(const XTPQueryTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询投资者持仓 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param ticker 需要查询持仓的合约代码,可以为NULL,表示查询全市场,如果不为NULL,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓 - ///@param market 需要查询持仓的合约所在市场,默认为0,仅在合约代码不为NULL的时候,才会使用。market不指定或者为非0的其他非有效值情况下,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓。如果想正确查询指定持仓,请指定market - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id, XTP_MARKET_TYPE market = XTP_MKT_INIT) = 0; - - ///请求查询资产 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryAsset(uint64_t session_id, int request_id) = 0; - - ///请求查询分级基金 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的分级基金筛选条件,其中母基金代码可以为空,则默认所有存在的母基金,如果不为空,请不带空格,并以'\0'结尾,其中交易市场不能为空 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数查询出的结果可能对应多个查询结果响应 - virtual int QueryStructuredFund(XTPQueryStructuredFundInfoReq *query_param, uint64_t session_id, int request_id) = 0; - - ///资金划拨请求 - ///@return 资金划拨订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param fund_transfer 资金划拨的请求信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数支持一号两中心节点之间的资金划拨,注意资金划拨的方向。 - virtual uint64_t FundTransfer(XTPFundTransferReq *fund_transfer, uint64_t session_id) = 0; - - ///请求查询资金划拨 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的资金划拨订单筛选条件,其中serial_id可以为0,则默认所有资金划拨订单,如果不为0,则请求特定的资金划拨订单 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryFundTransfer(XTPQueryFundTransferLogReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询其他节点可用资金 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 查询时需要提供的信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOtherServerFund(XTPFundQueryReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询ETF清单文件 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的ETF清单文件的筛选条件,其中合约代码可以为空,则默认所有存在的ETF合约代码,market字段也可以为初始值,则默认所有市场的ETF合约 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryETF(XTPQueryETFBaseReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询ETF股票篮 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询股票篮的的ETF合约,其中合约代码不可以为空,market字段也必须指定 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryETFTickerBasket(XTPQueryETFComponentReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询今日新股申购信息列表 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryIPOInfoList(uint64_t session_id, int request_id) = 0; - - ///请求查询用户新股申购额度信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryIPOQuotaInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询今日可转债申购信息列表 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryBondIPOInfoList(uint64_t session_id, int request_id) = 0; - - ///请求查询可转债转股的基本信息 - ///@return 查询是否发送成功,“0”表示发送成功,非“0”表示发送出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的可转债转股信息的筛选条件,可以为NULL(为NULL表示查询所有的可转债转股信息),此参数中合约代码可以为空字符串,如果为空字符串,则查询所有可转债转股信息,如果不为空字符串,请不带空格,并以'\0'结尾,且必须与market匹配 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryBondSwapStockInfo(XTPQueryBondSwapStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询期权合约 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的期权合约的筛选条件,可以为NULL(为NULL表示查询所有的期权合约) - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionAuctionInfo(XTPQueryOptionAuctionInfoReq *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中现金直接还款请求 - ///@return 现金直接还款订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param amount 现金还款的金额 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditCashRepay(double amount, uint64_t session_id) = 0; - - ///融资融券业务中现金还指定负债合约息费请求 - ///@return 现金还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param debt_id 指定的负债合约编号 - ///@param amount 现金还息的金额 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditCashRepayDebtInterestFee(const char* debt_id, double amount, uint64_t session_id) = 0; - - ///融资融券业务中卖券还指定负债合约息费请求 - ///@return 卖券还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order 卖券的报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 - ///@param debt_id 指定的负债合约编号 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditSellStockRepayDebtInterestFee(XTPOrderInsertInfo* order, const char* debt_id, uint64_t session_id) = 0; - - ///请求查询融资融券业务中的现金直接还款报单 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditCashRepayInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户特有信息,除资金账户以外的信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditFundInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户负债合约信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditDebtInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询指定证券负债未还信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的指定证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditTickerDebtInfo(XTPClientQueryCrdDebtStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户待还资金信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditAssetDebtInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询信用账户可融券头寸信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中请求查询指定证券的余券 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的余券信息,不可以为空,需要明确指定 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法中用户必须提供了证券代码和所在市场 - virtual int QueryCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中请求查询余券 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的余券信息。若填入市场和股票代码,返回单支股票信息;若市场代码为空,股票代码非空,是无效查询,会在SPI中返回错误;若市场和股票代码均为空,返回全市场信息;若市场代码非空,股票代码为空,返回单市场信息。 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; - - ///融资融券业务中请求负债合约展期 - ///@return 负债合约展期订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param debt_extend 负债合约展期的请求信息 - ///@param session_id 资金账户对应的session_id,登录时得到 - virtual uint64_t CreditExtendDebtDate(XTPCreditDebtExtendReq *debt_extend, uint64_t session_id) = 0; - - ///融资融券业务中请求查询负债合约展期 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param xtp_id 需要查询的负债合约展期订单筛选条件,xtp_id可以为0,则默认所有负债合约展期订单,如果不为0,则请求特定的负债合约展期订单 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditExtendDebtDateOrders(uint64_t xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询融资融券业务中账戶的附加信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditFundExtraInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询融资融券业务中账戶指定证券的附加信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要指定的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryCreditPositionExtraInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; - - ///期权组合策略报单录入请求 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOptionCombinedOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOptionCombinedOrder(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; - - ///已经提前设置order_xtp_id的期权组合策略报单录入请求,与GetANewOrderXTPID()配合使用 - ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id - ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - virtual uint64_t InsertOptionCombinedOrderExtra(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; - - ///期权组合策略报单撤单请求 - ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - ///@param order_xtp_id 需要撤销的期权组合策略委托单在XTP系统中的ID - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 如果撤单成功,会在报单响应函数OnOptionCombinedOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 - virtual uint64_t CancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; - - ///请求查询期权组合策略未完结报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id) = 0; - - ///根据报单ID请求查询期权组合策略报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOptionCombinedOrders(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询期权组合策略报单-旧版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOptionCombinedOrdersByPage(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略未完结报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; - - ///根据报单ID请求查询期权组合策略报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - virtual int QueryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOptionCombinedOrdersEx(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询期权组合策略报单-新版本接口 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOptionCombinedOrdersByPageEx(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///根据期权组合策略委托编号请求查询相关成交 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此函数查询出的结果可能对应多个查询结果响应 - virtual int QueryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略的成交回报 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - virtual int QueryOptionCombinedTrades(const XTPQueryOptCombTraderReq *query_param, uint64_t session_id, int request_id) = 0; - - ///分页请求查询期权组合策略成交回报 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - virtual int QueryOptionCombinedTradesByPage(const XTPQueryOptCombTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询投资者期权组合策略持仓 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询持仓的筛选条件,其中组合策略代码可以初始化为空,表示查询所有,如果不为空,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能导致查询不到所需的持仓 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 - virtual int QueryOptionCombinedPosition(const XTPQueryOptCombPositionReq* query_param, uint64_t session_id, int request_id) = 0; - - ///请求查询期权组合策略信息 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法仅支持精确查询,不支持模糊查询 - virtual int QueryOptionCombinedStrategyInfo(uint64_t session_id, int request_id) = 0; - - ///请求查询期权行权合并头寸 - ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param query_param 需要查询的行权合并的筛选条件,其中market为0会默认查询全市场,成分合约代码可以初始化为空,如果不为空,请不带空格,并以'\0'结尾,注意所有填写的条件都会进行匹配 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法可能对应多条响应消息 - virtual int QueryOptionCombinedExecPosition(const XTPQueryOptCombExecPosReq* query_param, uint64_t session_id, int request_id) = 0; - - ///用户登录algo服务器请求 - ///@return 表明此资金账号登录是否成功,非“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,“0”表示登录成功 - ///@param ip algo服务器地址,类似“127.0.0.1” - ///@param port algo服务器端口号 - ///@param user 登录用户名 - ///@param password 登录密码 - ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP - ///@param local_ip 本地网卡地址,类似“127.0.0.1” - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只需调用一次,所有用户共用即可 - virtual int LoginALGO(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; - - ///algo业务中查询用户策略请求 - ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param strategy_type 需要查询的策略类型,可填0 - ///@param client_strategy_id 需要查询的策略用户自定义id,可填0 - ///@param xtp_strategy_id 需要查询的策略在xtp系统中的id,如果指定,就一定按指定查询,如果填0,则按其他筛选条件查询 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark xtp_strategy_id条件的优先级最高,只有当xtp_strategy_id为0时,其他条件才生效,此条请求可能对应多条回应消息 - virtual int QueryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id) = 0; - - ///用户请求使用algo服务器建立算法通道 - ///@return 表明此资金账号建立算法通道请求消息发送是否成功,非“0”表示发送失败,可以调用GetApiLastError()来获取错误代码,“0”表示发送成功 - ///@param oms_ip oms服务器地址,类似“127.0.0.1”,非algo服务器地址 - ///@param oms_port oms服务器端口号,非algo服务器端口号 - ///@param user 登录用户名 - ///@param password 登录密码 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 此函数为异步方式,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立,在使用算法前,请先建立算法通道 - virtual int ALGOUserEstablishChannel(const char* oms_ip, int oms_port, const char* user, const char* password, uint64_t session_id) = 0; - - ///algo业务中用户报算法单请求 - ///@return 算法报单请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param strategy_type 需要创建的策略类型 - ///@param client_strategy_id 用户自定义id,帮助用户定位 - ///@param strategy_param 策略参数 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 仅能在用户建立算法通道后使用,算法单的异步通知 - virtual int InsertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, char* strategy_param, uint64_t session_id) = 0; - - ///algo业务中用户撤销算法单请求 - ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param cancel_flag 是否需要算法去处理已下的算法子单标志,true-交给算法自行处理,包括撤单、平仓等,算法处理完成后会通知客户;false-立即停止算法母单的执行,此时算法平台会对已下的子单做撤单操作,其余的平仓等操作需要客户自己处理 - ///@param xtp_strategy_id 需要撤销的算法单在xtp algobus系统中的id - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 仅能在用户建立算法通道后调用 - virtual int CancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id) = 0; - - ///获取算法单的母单ID - ///@return 返回算法单的母单ID,如果返回为0表示不是算法单 - ///@param order_xtp_id 算法单对应的xtp id - ///@param order_client_id 算法单对应的自定义ID,不可随意填写 - ///@remark 返回为0表示,不是算法单,如果传入的参数不对的话,可能会得不到正确结果,此函数调用不依赖于是否登录 - virtual uint64_t GetAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id) = 0; - - ///algo业务中请求推荐算法 - ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,true-打包 - ///@param basket_param 需要算法推荐的证券列表,为json字串,具体格式参考说明文档或咨询运营人员 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 此条请求可能对应多条回应消息,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 - virtual int StrategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id) = 0; - - ///algo业务中修改已有的算法单 - ///@return 算法单修改请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@param xtp_strategy_id xtp算法单策略ID - ///@param strategy_param 修改后的策略参数 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 - virtual int ModifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id) = 0; - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif +///////////////////////////////////////////////////////////////////////// +///@author 中泰证券股份有限公司 +///@file xtp_trader_api.h +///@brief 定义客户端交易接口 +///////////////////////////////////////////////////////////////////////// + +#ifndef _XTP_TRADER_API_H_ +#define _XTP_TRADER_API_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "xtp_api_struct.h" +#include "algo_api_struct.h" + +#if defined(ISLIB) && defined(WIN32) +#ifdef LIB_TRADER_API_EXPORT +#define TRADER_API_EXPORT __declspec(dllexport) +#else +#define TRADER_API_EXPORT __declspec(dllimport) +#endif +#else +#define TRADER_API_EXPORT +#endif + +/*! +* \class XTP::API::TraderSpi +* +* \brief 交易接口响应类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + + class TraderSpi + { + public: + + ///当客户端的某个连接与交易后台通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 用户主动调用logout导致的断线,不会触发此函数。api不会自动重连,当断线发生时,请用户自行选择后续操作,可以在此函数中调用Login重新登录,并更新session_id,此时用户收到的数据跟断线之前是连续的 + virtual void OnDisconnected(uint64_t session_id, int reason) {}; + + ///错误应答 + ///@param error_info 当服务器响应发生错误时的具体的错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 + virtual void OnError(XTPRI *error_info) {}; + + ///请求查询用户在本节点上可交易市场的响应 + ///@param trade_location 查询到的交易市场信息,按位来看,从低位开始数,第0位表示沪市,即如果(trade_location&0x01) == 0x01,代表可交易沪市,第1位表示深市,即如果(trade_location&0x02) == 0x02,表示可交易深市,如果第0位和第1位均是1,即(trade_location&(0x01|0x02)) == 0x03,就表示可交易沪深2个市场 + ///@param error_info 查询可交易市场发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此查询只会有一个结果 + virtual void OnQueryAccountTradeMarket(int trade_location, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///报单通知 + ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 + ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 + virtual void OnOrderEvent(XTPOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; + + ///成交通知 + ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 + virtual void OnTradeEvent(XTPTradeReport *trade_info, uint64_t session_id) {}; + + ///撤单出错响应 + ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id + ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此响应只会在撤单发生错误时被回调 + virtual void OnCancelOrderError(XTPOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOrder(XTPQueryOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询报单响应-新版本接口 + ///@param order_info 查询到的一个报单信息 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryOrderEx(XTPOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOrderByPage(XTPQueryOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询报单响应-新版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOrderByPageEx(XTPOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询成交响应 + ///@param trade_info 查询到的一个成交回报 + ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryTrade(XTPQueryTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询成交响应 + ///@param trade_info 查询到的一个成交信息 + ///@param req_count 分页请求的最大数量 + ///@param trade_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryTradeByPage(XTPQueryTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询投资者持仓响应 + ///@param position 查询到的一只股票的持仓情况 + ///@param error_info 查询账户持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryPosition(XTPQueryStkPositionRsp *position, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询资金账户响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param asset 查询到的资金账户情况 + ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryAsset(XTPQueryAssetRsp *asset, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询分级基金信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 查询到的分级基金情况 + ///@param error_info 查询分级基金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryStructuredFund(XTPStructuredFundInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询资金划拨订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_transfer_info 查询到的资金账户情况 + ///@param error_info 查询资金账户发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///资金划拨通知 + ///@param fund_transfer_info 资金划拨通知的具体信息,用户可以通过fund_transfer_info.serial_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 资金划拨订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当资金划拨方向为一号两中心节点之间划拨,且error_info.error_id=11000384时,error_info.error_msg中含有对方结点中可用于划拨的资金(以整数为准),用户需解析后进行stringToInt的转化,可据此填写合适的资金,再次发起划拨请求 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当资金划拨订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的资金划拨通知。 + virtual void OnFundTransfer(XTPFundTransferNotice *fund_transfer_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询其他节点可用资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 查询到的其他节点可用资金情况 + ///@param error_info 查询其他节点可用资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryOtherServerFund(XTPFundQueryRsp *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///请求查询ETF清单文件的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param etf_info 查询到的ETF清单文件情况 + ///@param error_info 查询ETF清单文件发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryETF(XTPQueryETFBaseRsp *etf_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询ETF股票篮的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param etf_component_info 查询到的ETF合约的相关成分股信息 + ///@param error_info 查询ETF股票篮发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryETFBasket(XTPQueryETFComponentRsp *etf_component_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询今日新股申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param ipo_info 查询到的今日新股申购的一只股票信息 + ///@param error_info 查询今日新股申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询用户新股申购额度信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param quota_info 查询到的用户某个市场的今日新股申购额度信息 + ///@param error_info 查查询用户新股申购额度信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryIPOQuotaInfo(XTPQueryIPOQuotaRsp *quota_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询今日可转债申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param ipo_info 查询到的今日可转债申购的一只可转债信息 + ///@param error_info 查询今日可转债申购信息列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryBondIPOInfoList(XTPQueryIPOTickerRsp *ipo_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询用户可转债转股信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param swap_stock_info 查询到某条可转债转股信息 + ///@param error_info 查查询可转债转股信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryBondSwapStockInfo(XTPQueryBondSwapStockRsp *swap_stock_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权合约的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param option_info 查询到的期权合约情况 + ///@param error_info 查询期权合约发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryOptionAuctionInfo(XTPQueryOptionAuctionInfoRsp *option_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///融资融券业务中现金直接还款的响应 + ///@param cash_repay_info 现金直接还款通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 现金还款发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnCreditCashRepay(XTPCrdCashRepayRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; + + ///融资融券业务中现金还息的响应 + ///@param cash_repay_info 现金还息通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 现金还息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnCreditCashRepayDebtInterestFee(XTPCrdCashRepayDebtInterestFeeRsp *cash_repay_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询融资融券业务中的现金直接还款报单的响应 + ///@param cash_repay_info 查询到的某一笔现金直接还款通知的具体信息 + ///@param error_info 查询现金直接报单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditCashRepayInfo(XTPCrdCashRepayInfo *cash_repay_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询信用账户额外信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 查询到的信用账户额外信息情况 + ///@param error_info 查询信用账户额外信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditFundInfo(XTPCrdFundInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///请求查询信用账户负债信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param debt_info 查询到的信用账户合约负债情况 + ///@param error_info 查询信用账户负债信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditDebtInfo(XTPCrdDebtInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询信用账户指定证券负债未还信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param debt_info 查询到的信用账户指定证券负债未还信息情况 + ///@param error_info 查询信用账户指定证券负债未还信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditTickerDebtInfo(XTPCrdDebtStockInfo *debt_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询信用账户待还资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param remain_amount 查询到的信用账户待还资金 + ///@param error_info 查询信用账户待还资金发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditAssetDebtInfo(double remain_amount, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///请求查询信用账户可融券头寸信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param assign_info 查询到的信用账户可融券头寸信息 + ///@param error_info 查询信用账户可融券头寸信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStkInfo *assign_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///融资融券业务中请求查询指定余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param stock_info 查询到的余券信息 + ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///融资融券业务中请求查询余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param stock_info 查询到的余券信息 + ///@param error_info 查询信用账户余券信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkRspInfo* stock_info, XTPRI *error_info, int request_id, uint64_t session_id, bool is_last) {}; + + ///融资融券业务中负债合约展期的通知 + ///@param debt_extend_info 负债合约展期通知的具体信息,用户可以通过debt_extend_info.xtpid来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + ///@param error_info 负债合约展期订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当负债合约展期订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的负债合约展期通知。 + virtual void OnCreditExtendDebtDate(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, uint64_t session_id) {}; + + ///查询融资融券业务中负债合约展期订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param debt_extend_info 查询到的负债合约展期情况 + ///@param error_info 查询负债合约展期发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误。当error_info.error_id=11000350时,表明没有记录,当为其他非0值时,表明合约发生拒单时的错误原因 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditExtendDebtDateOrders(XTPCreditDebtExtendNotice *debt_extend_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///查询融资融券业务中信用账户附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 信用账户附加信息 + ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditFundExtraInfo(XTPCrdFundExtraInfo *fund_info, XTPRI *error_info, int request_id, uint64_t session_id) {}; + + ///查询融资融券业务中信用账户指定证券的附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + ///@param fund_info 信用账户指定证券的附加信息 + ///@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryCreditPositionExtraInfo(XTPCrdPositionExtraInfo *fund_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///期权组合策略报单通知 + ///@param order_info 订单响应具体信息,用户可以通过order_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,order_info.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。order_info.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 + ///@param error_info 订单被拒绝或者发生错误时错误代码和错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 + virtual void OnOptionCombinedOrderEvent(XTPOptCombOrderInfo *order_info, XTPRI *error_info, uint64_t session_id) {}; + + ///期权组合策略成交通知 + ///@param trade_info 成交回报的具体信息,用户可以通过trade_info.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 + virtual void OnOptionCombinedTradeEvent(XTPOptCombTradeReport *trade_info, uint64_t session_id) {}; + + ///期权组合策略撤单出错响应 + ///@param cancel_info 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id + ///@param error_info 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此响应只会在撤单发生错误时被回调 + virtual void OnCancelOptionCombinedOrderError(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) {}; + + ///请求查询期权组合策略报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOptionCombinedOrders(XTPQueryOptCombOrderRsp *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略报单响应-新版本接口 + ///@param order_info 查询到的一个报单 + ///@param error_info 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOptionCombinedOrdersEx(XTPOptCombOrderInfoEx *order_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询期权组合策略报单响应-旧版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedOrdersByPage(XTPQueryOptCombOrderRsp *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询期权组合策略报单响应-新版本接口 + ///@param order_info 查询到的一个报单 + ///@param req_count 分页请求的最大数量 + ///@param order_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedOrdersByPageEx(XTPOptCombOrderInfoEx *order_info, int64_t req_count, int64_t order_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略成交响应 + ///@param trade_info 查询到的一个成交回报 + ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual void OnQueryOptionCombinedTrades(XTPQueryOptCombTradeRsp *trade_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///分页请求查询期权组合策略成交响应 + ///@param trade_info 查询到的一个成交信息 + ///@param req_count 分页请求的最大数量 + ///@param trade_sequence 分页请求的当前回报数量 + ///@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedTradesByPage(XTPQueryOptCombTradeRsp *trade_info, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略持仓响应 + ///@param position_info 查询到的一个持仓信息 + ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedPosition(XTPQueryOptCombPositionRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///请求查询期权组合策略信息响应 + ///@param strategy_info 查询到的一个组合策略信息 + ///@param error_info 查询成交回报发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedStrategyInfo(XTPQueryCombineStrategyInfoRsp *strategy_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///查询期权行权合并头寸的响应 + ///@param position_info 查询到的一个行权合并头寸信息 + ///@param error_info 查询持仓发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + virtual void OnQueryOptionCombinedExecPosition(XTPQueryOptCombExecPosRsp *position_info, XTPRI *error_info, int request_id, bool is_last, uint64_t session_id) {}; + + ///algo业务中查询策略列表的响应 + ///@param strategy_info 策略具体信息 + ///@param strategy_param 此策略中包含的参数,如果error_info.error_id为0时,有意义 + ///@param error_info 查询查询策略列表发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnQueryStrategy(XTPStrategyInfoStruct* strategy_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; + + ///algo业务中策略运行时策略状态通知 + ///@param strategy_state 用户策略运行情况的状态通知 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnStrategyStateReport(XTPStrategyStateReportStruct* strategy_state, uint64_t session_id) {}; + + ///algo业务中用户建立算法通道的消息响应 + ///@param user 用户名 + ///@param error_info 建立算法通道发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误,即算法通道成功 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 算法通道建立成功后,才能对用户创建策略等操作,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立 + virtual void OnALGOUserEstablishChannel(char* user, XTPRI* error_info, uint64_t session_id) {}; + + ///algo业务中报送策略单的响应 + ///@param strategy_info 用户报送的策略单的具体信息 + ///@param error_info 报送策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnInsertAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; + + ///algo业务中撤销策略单的响应 + ///@param strategy_info 用户撤销的策略单的具体信息 + ///@param error_info 撤销策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnCancelAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; + + ///当客户端与AlgoBus通信连接断开时,该方法被调用。 + ///@param reason 错误原因,请与错误代码表对应 + ///@remark 请不要堵塞此线程,否则会影响algo的登录,与Algo之间的连接,断线后会自动重连,用户无需做其他操作 + virtual void OnAlgoDisconnected(int reason) {}; + + ///当客户端与AlgoBus断线后重新连接时,该方法被调用,仅在断线重连成功后会被调用。 + virtual void OnAlgoConnected() {}; + + ///algo业务中策略运行时策略指定证券执行状态通知 + ///@param strategy_symbol_state 用户策略指定证券运行情况的状态通知 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnStrategySymbolStateReport(XTPStrategySymbolStateReport* strategy_symbol_state, uint64_t session_id) {}; + + ///algo业务中报送母单创建时的推送消息(包括其他客户端创建的母单) + ///@param strategy_info 策略具体信息 + ///@param strategy_param 此策略中包含的参数 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnNewStrategyCreateReport(XTPStrategyInfoStruct* strategy_info, char* strategy_param, uint64_t session_id) {}; + + ///algo业务中算法推荐的响应 + ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,与请求一致,如果此参数为true,那么请以返回的strategy_param为准 + ///@param recommendation_info 推荐算法的具体信息,当basket_flag=true时,此结构体中的market和ticker将没有意义,此时请以strategy_param为准 + ///@param strategy_param 算法参数,可直接用来创建母单,如果error_info.error_id为0时,有意义 + ///@param error_info 请求推荐算法发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnStrategyRecommendation(bool basket_flag, XTPStrategyRecommendationInfo* recommendation_info, char* strategy_param, XTPRI *error_info, int32_t request_id, bool is_last, uint64_t session_id) {}; + + ///algo业务中修改已有策略单的响应 + ///@param strategy_info 用户修改后策略单的具体信息 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnModifyAlgoOrder(XTPStrategyInfoStruct* strategy_info, XTPRI *error_info, uint64_t session_id) {}; + }; + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility push(default) +#endif +#endif + +/*! +* \class XTP::API::TraderApi +* +* \brief 交易接口类 +* +* \author 中泰证券股份有限公司 +* \date 十月 2015 +*/ +namespace XTP { + namespace API { + + class TRADER_API_EXPORT TraderApi + { + public: + ///创建TraderApi + ///@param client_id (必须输入)客户端id,用于区分同一用户的不同客户端,由用户自定义,普通用户必须使用1-99之间的数值 + ///@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个真实存在的有可写权限的路径 + ///@param log_level 日志输出级别 + ///@return 创建出的UserApi + ///@remark 只能创建一次,如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接。系统不支持过夜,请确保每天开盘前重新启动 + static TraderApi *CreateTraderApi(uint8_t client_id, const char *save_file_path, XTP_LOG_LEVEL log_level = XTP_LOG_LEVEL_DEBUG); + + ///删除接口对象本身 + ///@remark 不再使用本接口对象时,调用该函数删除接口对象 + virtual void Release() = 0; + + ///获取当前交易日 + ///@return 获取到的交易日 + ///@remark 只有登录成功后,才能得到正确的交易日 + virtual const char *GetTradingDay() = 0; + + ///注册回调接口 + ///@param spi 派生自回调接口类的实例,请在登录之前设定 + virtual void RegisterSpi(TraderSpi *spi) = 0; + + ///获取API的系统错误 + ///@return 返回的错误信息,可以在Login、InsertOrder、CancelOrder返回值为0时调用,获取失败的原因 + ///@remark 可以在调用api接口失败时调用,例如login失败时 + virtual XTPRI *GetApiLastError() = 0; + + ///获取API的发行版本号 + ///@return 返回api发行版本号 + virtual const char* GetApiVersion() = 0; + + ///通过报单在xtp系统中的ID获取下单的客户端id + ///@return 返回客户端id,可以用此方法过滤自己下的订单 + ///@param order_xtp_id 报单在xtp系统中的ID + ///@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 + virtual uint8_t GetClientIDByXTPID(uint64_t order_xtp_id) = 0; + + ///通过报单在xtp系统中的ID获取相关资金账户名 + ///@return 返回资金账户名 + ///@param order_xtp_id 报单在xtp系统中的ID + ///@remark 只有资金账户登录成功后,才能得到正确的信息 + virtual const char* GetAccountByXTPID(uint64_t order_xtp_id) = 0; + + ///订阅公共流。 + ///@param resume_type 公共流(订单响应、成交回报)重传方式 + /// XTP_TERT_RESTART:从本交易日开始重传 + /// XTP_TERT_RESUME:(保留字段,此方式暂未支持)从上次收到的续传 + /// XTP_TERT_QUICK:只传送登录后公共流的内容 + ///@remark 该方法要在Login方法前调用。若不调用则不会收到公共流的数据。注意在用户断线后,如果不登出就login(),公共流订阅方式不会起作用。用户只会收到断线后的所有消息。如果先logout()再login(),那么公共流订阅方式会起作用,用户收到的数据会根据用户的选择方式而定。 + virtual void SubscribePublicTopic(XTP_TE_RESUME_TYPE resume_type) = 0; + + ///设置软件开发版本号 + ///@param version 用户开发软件版本号,非api发行版本号,长度不超过15位,以'\0'结尾 + ///@remark 此函数必须在Login之前调用,标识的是客户端版本号,而不是API的版本号,由用户自定义 + virtual void SetSoftwareVersion(const char* version) = 0; + + ///设置软件开发Key + ///@param key 用户开发软件Key,用户申请开户时给予,以'\0'结尾 + ///@remark 此函数必须在Login之前调用 + virtual void SetSoftwareKey(const char* key) = 0; + + ///设置心跳检测时间间隔,单位为秒 + ///@param interval 心跳检测时间间隔,单位为秒 + ///@remark 此函数必须在Login之前调用 + virtual void SetHeartBeatInterval(uint32_t interval) = 0; + + ///用户登录请求 + ///@return session_id表明此资金账号登录是否成功,“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,非“0”表示登录成功,此时需要记录下这个返回值session_id,与登录的资金账户对应 + ///@param ip 服务器地址,类似“127.0.0.1” + ///@param port 服务器端口号 + ///@param user 登录用户名 + ///@param password 登录密码 + ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api可支持多个账户连接,但是同一个账户同一个client_id只能有一个session连接,后面的登录在前一个session存续期间,无法连接 + virtual uint64_t Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + + ///登出请求 + ///@return 登出是否成功,“0”表示登出成功,“-1”表示登出失败 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual int Logout(uint64_t session_id) = 0; + + ///服务器是否重启过 + ///@return “true”表示重启过,“false”表示没有重启过 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数必须在Login之后调用 + virtual bool IsServerRestart(uint64_t session_id) = 0; + + ///修改已登录用户的硬件信息,仅限授权系统使用 + ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param info 需要修改成的用户硬件信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数必须在Login之后调用,且仅限授权系统使用,一般客户无需使用 + virtual int ModifyUserTerminalInfo(const XTPUserTerminalInfoReq* info, uint64_t session_id) = 0; + + ///查询用户在本节点上的可交易市场类型 + ///@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数必须在Login之后调用,对应的响应函数是OnQueryAccountTradeMarket() + virtual int QueryAccountTradeMarket(uint64_t session_id, int request_id) = 0; + + ///为用户获取一个新的订单XTPID,用于报单 + ///@return 生成的订单XTPID,非“0”表示获取成功,“0”表示获取失败,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数必须在Login之后调用,通过这个函数获取的order_xtp_id仅用于对应的用户报单,如果设置错误,将会导致下单失败 + virtual uint64_t GetANewOrderXTPID(uint64_t session_id) = 0; + + ///报单录入请求 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOrder(XTPOrderInsertInfo *order, uint64_t session_id) = 0; + + ///已经提前设置order_xtp_id的报单录入请求,与GetANewOrderXTPID()配合使用 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOrderExtra(XTPOrderInsertInfo *order, uint64_t session_id) = 0; + + ///报单操作请求 + ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order_xtp_id 需要撤销的委托单在XTP系统中的ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 如果撤单成功,会在报单响应函数OnOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 + virtual uint64_t CancelOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; + + ///根据报单ID请求查询报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOrders(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询未完结报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryUnfinishedOrders(uint64_t session_id, int request_id) = 0; + + ///分页请求查询报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOrdersByPage(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///根据报单ID请求查询报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOrdersEx(const XTPQueryOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询未完结报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; + + ///分页请求查询报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOrdersByPageEx(const XTPQueryOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///根据委托编号请求查询相关成交 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数查询出的结果可能对应多个查询结果响应 + virtual int QueryTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询已成交 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryTrades(XTPQueryTraderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询成交回报 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryTradesByPage(const XTPQueryTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询投资者持仓 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param ticker 需要查询持仓的合约代码,可以为NULL,表示查询全市场,如果不为NULL,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓 + ///@param market 需要查询持仓的合约所在市场,默认为0,仅在合约代码不为NULL的时候,才会使用。market不指定或者为非0的其他非有效值情况下,可能由于证券代码沪深2个市场有重复,而导致查询不到所需的持仓。如果想正确查询指定持仓,请指定market + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 + virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id, XTP_MARKET_TYPE market = XTP_MKT_INIT) = 0; + + ///请求查询资产 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryAsset(uint64_t session_id, int request_id) = 0; + + ///请求查询分级基金 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的分级基金筛选条件,其中母基金代码可以为空,则默认所有存在的母基金,如果不为空,请不带空格,并以'\0'结尾,其中交易市场不能为空 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数查询出的结果可能对应多个查询结果响应 + virtual int QueryStructuredFund(XTPQueryStructuredFundInfoReq *query_param, uint64_t session_id, int request_id) = 0; + + ///资金划拨请求 + ///@return 资金划拨订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param fund_transfer 资金划拨的请求信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数支持一号两中心节点之间的资金划拨,注意资金划拨的方向。 + virtual uint64_t FundTransfer(XTPFundTransferReq *fund_transfer, uint64_t session_id) = 0; + + ///请求查询资金划拨 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的资金划拨订单筛选条件,其中serial_id可以为0,则默认所有资金划拨订单,如果不为0,则请求特定的资金划拨订单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryFundTransfer(XTPQueryFundTransferLogReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询其他节点可用资金 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 查询时需要提供的信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOtherServerFund(XTPFundQueryReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询ETF清单文件 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的ETF清单文件的筛选条件,其中合约代码可以为空,则默认所有存在的ETF合约代码,market字段也可以为初始值,则默认所有市场的ETF合约 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryETF(XTPQueryETFBaseReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询ETF股票篮 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询股票篮的的ETF合约,其中合约代码不可以为空,market字段也必须指定 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryETFTickerBasket(XTPQueryETFComponentReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询今日新股申购信息列表 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryIPOInfoList(uint64_t session_id, int request_id) = 0; + + ///请求查询用户新股申购额度信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryIPOQuotaInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询今日可转债申购信息列表 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryBondIPOInfoList(uint64_t session_id, int request_id) = 0; + + ///请求查询可转债转股的基本信息 + ///@return 查询是否发送成功,“0”表示发送成功,非“0”表示发送出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的可转债转股信息的筛选条件,可以为NULL(为NULL表示查询所有的可转债转股信息),此参数中合约代码可以为空字符串,如果为空字符串,则查询所有可转债转股信息,如果不为空字符串,请不带空格,并以'\0'结尾,且必须与market匹配 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryBondSwapStockInfo(XTPQueryBondSwapStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询期权合约 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的期权合约的筛选条件,可以为NULL(为NULL表示查询所有的期权合约) + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionAuctionInfo(XTPQueryOptionAuctionInfoReq *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中现金直接还款请求 + ///@return 现金直接还款订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param amount 现金还款的金额 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditCashRepay(double amount, uint64_t session_id) = 0; + + ///融资融券业务中现金还指定负债合约息费请求 + ///@return 现金还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param debt_id 指定的负债合约编号 + ///@param amount 现金还息的金额 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditCashRepayDebtInterestFee(const char* debt_id, double amount, uint64_t session_id) = 0; + + ///融资融券业务中卖券还指定负债合约息费请求 + ///@return 卖券还息订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order 卖券的报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 + ///@param debt_id 指定的负债合约编号 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditSellStockRepayDebtInterestFee(XTPOrderInsertInfo* order, const char* debt_id, uint64_t session_id) = 0; + + ///请求查询融资融券业务中的现金直接还款报单 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditCashRepayInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户特有信息,除资金账户以外的信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditFundInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户负债合约信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditDebtInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询指定证券负债未还信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的指定证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditTickerDebtInfo(XTPClientQueryCrdDebtStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户待还资金信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditAssetDebtInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询信用账户可融券头寸信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditTickerAssignInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中请求查询指定证券的余券 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的余券信息,不可以为空,需要明确指定 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法中用户必须提供了证券代码和所在市场 + virtual int QueryCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中请求查询余券 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的余券信息。若填入市场和股票代码,返回单支股票信息;若市场代码为空,股票代码非空,是无效查询,会在SPI中返回错误;若市场和股票代码均为空,返回全市场信息;若市场代码非空,股票代码为空,返回单市场信息。 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryMulCreditExcessStock(XTPClientQueryCrdSurplusStkReqInfo *query_param, uint64_t session_id, int request_id) = 0; + + ///融资融券业务中请求负债合约展期 + ///@return 负债合约展期订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param debt_extend 负债合约展期的请求信息 + ///@param session_id 资金账户对应的session_id,登录时得到 + virtual uint64_t CreditExtendDebtDate(XTPCreditDebtExtendReq *debt_extend, uint64_t session_id) = 0; + + ///融资融券业务中请求查询负债合约展期 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_id 需要查询的负债合约展期订单筛选条件,xtp_id可以为0,则默认所有负债合约展期订单,如果不为0,则请求特定的负债合约展期订单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditExtendDebtDateOrders(uint64_t xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询融资融券业务中账戶的附加信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditFundExtraInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询融资融券业务中账戶指定证券的附加信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要指定的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryCreditPositionExtraInfo(XTPClientQueryCrdPositionStockReq *query_param, uint64_t session_id, int request_id) = 0; + + ///期权组合策略报单录入请求 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,用户需要记录下返回的order_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOptionCombinedOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单。当然,如果你什么都不填,也是可以的。order.order_xtp_id字段无需用户填写,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOptionCombinedOrder(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; + + ///已经提前设置order_xtp_id的期权组合策略报单录入请求,与GetANewOrderXTPID()配合使用 + ///@return 报单在XTP系统中的ID,如果为‘0’表示报单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示报单发送成功,此时等同与传入的order_xtp_id + ///@param order 报单录入信息,其中order.order_client_id字段是用户自定义字段,用户输入什么值,订单响应OnOrderEvent()返回时就会带回什么值,类似于备注,方便用户自己定位订单,也可以什么都不填。order.order_xtp_id字段必须是通过GetANewOrderXTPID()获得的值,order.ticker必须不带空格,以'\0'结尾 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 使用设置好的order_xtp_id(通过GetANewOrderXTPID()获得)进行报单,注意此处如果order_xtp_id设置不对,将导致报单失败。交易所接收订单后,会在报单响应函数OnOptionCombinedOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + virtual uint64_t InsertOptionCombinedOrderExtra(XTPOptCombOrderInsertInfo *order, uint64_t session_id) = 0; + + ///期权组合策略报单撤单请求 + ///@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + ///@param order_xtp_id 需要撤销的期权组合策略委托单在XTP系统中的ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 如果撤单成功,会在报单响应函数OnOptionCombinedOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 + virtual uint64_t CancelOptionCombinedOrder(const uint64_t order_xtp_id, uint64_t session_id) = 0; + + ///请求查询期权组合策略未完结报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedUnfinishedOrders(uint64_t session_id, int request_id) = 0; + + ///根据报单ID请求查询期权组合策略报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedOrderByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOptionCombinedOrders(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询期权组合策略报单-旧版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOptionCombinedOrdersByPage(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略未完结报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedUnfinishedOrdersEx(uint64_t session_id, int request_id) = 0; + + ///根据报单ID请求查询期权组合策略报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + virtual int QueryOptionCombinedOrderByXTPIDEx(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOptionCombinedOrdersEx(const XTPQueryOptCombOrderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询期权组合策略报单-新版本接口 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOptionCombinedOrdersByPageEx(const XTPQueryOptCombOrderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///根据期权组合策略委托编号请求查询相关成交 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此函数查询出的结果可能对应多个查询结果响应 + virtual int QueryOptionCombinedTradesByXTPID(const uint64_t order_xtp_id, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略的成交回报 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + virtual int QueryOptionCombinedTrades(const XTPQueryOptCombTraderReq *query_param, uint64_t session_id, int request_id) = 0; + + ///分页请求查询期权组合策略成交回报 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + virtual int QueryOptionCombinedTradesByPage(const XTPQueryOptCombTraderByPageReq *query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询投资者期权组合策略持仓 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询持仓的筛选条件,其中组合策略代码可以初始化为空,表示查询所有,如果不为空,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能导致查询不到所需的持仓 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 + virtual int QueryOptionCombinedPosition(const XTPQueryOptCombPositionReq* query_param, uint64_t session_id, int request_id) = 0; + + ///请求查询期权组合策略信息 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法仅支持精确查询,不支持模糊查询 + virtual int QueryOptionCombinedStrategyInfo(uint64_t session_id, int request_id) = 0; + + ///请求查询期权行权合并头寸 + ///@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param query_param 需要查询的行权合并的筛选条件,其中market为0会默认查询全市场,成分合约代码可以初始化为空,如果不为空,请不带空格,并以'\0'结尾,注意所有填写的条件都会进行匹配 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 该方法可能对应多条响应消息 + virtual int QueryOptionCombinedExecPosition(const XTPQueryOptCombExecPosReq* query_param, uint64_t session_id, int request_id) = 0; + + ///用户登录algo服务器请求 + ///@return 表明此资金账号登录是否成功,非“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,“0”表示登录成功 + ///@param ip algo服务器地址,类似“127.0.0.1” + ///@param port algo服务器端口号 + ///@param user 登录用户名 + ///@param password 登录密码 + ///@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP + ///@param local_ip 本地网卡地址,类似“127.0.0.1” + ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只需调用一次,所有用户共用即可 + virtual int LoginALGO(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type, const char* local_ip = NULL) = 0; + + ///algo业务中查询用户策略请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param strategy_type 需要查询的策略类型,可填0 + ///@param client_strategy_id 需要查询的策略用户自定义id,可填0 + ///@param xtp_strategy_id 需要查询的策略在xtp系统中的id,如果指定,就一定按指定查询,如果填0,则按其他筛选条件查询 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark xtp_strategy_id条件的优先级最高,只有当xtp_strategy_id为0时,其他条件才生效,此条请求可能对应多条回应消息 + virtual int QueryStrategy(uint32_t strategy_type, uint64_t client_strategy_id, uint64_t xtp_strategy_id, uint64_t session_id, int32_t request_id) = 0; + + ///用户请求使用algo服务器建立算法通道 + ///@return 表明此资金账号建立算法通道请求消息发送是否成功,非“0”表示发送失败,可以调用GetApiLastError()来获取错误代码,“0”表示发送成功 + ///@param oms_ip oms服务器地址,类似“127.0.0.1”,非algo服务器地址 + ///@param oms_port oms服务器端口号,非algo服务器端口号 + ///@param user 登录用户名 + ///@param password 登录密码 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 此函数为异步方式,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立,在使用算法前,请先建立算法通道 + virtual int ALGOUserEstablishChannel(const char* oms_ip, int oms_port, const char* user, const char* password, uint64_t session_id) = 0; + + ///algo业务中用户报算法单请求 + ///@return 算法报单请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param strategy_type 需要创建的策略类型 + ///@param client_strategy_id 用户自定义id,帮助用户定位 + ///@param strategy_param 策略参数 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 仅能在用户建立算法通道后使用,算法单的异步通知 + virtual int InsertAlgoOrder(uint32_t strategy_type, uint64_t client_strategy_id, char* strategy_param, uint64_t session_id) = 0; + + ///algo业务中用户撤销算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param cancel_flag 是否需要算法去处理已下的算法子单标志,true-交给算法自行处理,包括撤单、平仓等,算法处理完成后会通知客户;false-立即停止算法母单的执行,此时算法平台会对已下的子单做撤单操作,其余的平仓等操作需要客户自己处理 + ///@param xtp_strategy_id 需要撤销的算法单在xtp algobus系统中的id + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 仅能在用户建立算法通道后调用 + virtual int CancelAlgoOrder(bool cancel_flag, uint64_t xtp_strategy_id, uint64_t session_id) = 0; + + ///获取算法单的母单ID + ///@return 返回算法单的母单ID,如果返回为0表示不是算法单 + ///@param order_xtp_id 算法单对应的xtp id + ///@param order_client_id 算法单对应的自定义ID,不可随意填写 + ///@remark 返回为0表示,不是算法单,如果传入的参数不对的话,可能会得不到正确结果,此函数调用不依赖于是否登录 + virtual uint64_t GetAlgorithmIDByOrder(uint64_t order_xtp_id, uint32_t order_client_id) = 0; + + ///algo业务中请求推荐算法 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,true-打包 + ///@param basket_param 需要算法推荐的证券列表,为json字串,具体格式参考说明文档或咨询运营人员 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 此条请求可能对应多条回应消息,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int StrategyRecommendation(bool basket_flag, char* basket_param, uint64_t session_id, int32_t request_id) = 0; + + ///algo业务中修改已有的算法单 + ///@return 算法单修改请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param strategy_param 修改后的策略参数 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int ModifyAlgoOrder(uint64_t xtp_strategy_id, char* strategy_param, uint64_t session_id) = 0; + + protected: + ~TraderApi() {}; + }; + + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif