diff --git a/README.md b/README.md index a637bcc..da5a373 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,26 @@ 本项目是中泰证券XTP极速交易PYTHON接口的开源实现,供客户在量化交易中使用PYTHON接口快速接入XTP系统。中泰证券XTP是为股票交易而生的极速交易系统,为投资者提供极速交易、极速行情、Level2行情。 -目前支持xtp版本为1.1.19.2,支持windows、linux平台运行 +目前xtp系统最新的api版本为2.2.42.1,支持windows、linux平台运行。 -请先到中泰证券xtp官方网站申请测试账号 https://xtp.zts.com.cn/register 及测试环境的连接ip、端口等信息 +请先到中泰证券xtp官方网站申请测试账号 https://xtp.zts.com.cn 及测试环境的连接ip、端口等信息。 -API参考官方C++版本的接口文档https://xtp.zts.com.cn/home +API参考官方C++版本的接口文档 https://xtp.zts.com.cn/doc/api/xtpDoc -由于python版api的封装用的是vs2010,如果未安装vs环境,运行时会提示ImportError:DLL load failed。需要根据python的位数选择对应的运行库,32位的选x86,64位选x64,下载链接分别 -x86网址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=5555 -x64网址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=14632 +python版本api封装使用的Visual Studio 2015,如果本地安装的vs是较低的vs2010版本,并且未安装vs环境,运行时会提示ImportError:DLL load failed。需根据python的位数选择对应Visual C++库的运行时组件,64位选vc_redist.x64.exe,执行程序参考文件包vs2015运行库。 + +官网下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=48145 ##事项说明: -1.当前xtp的api的python封装支持windows系统和Linux系统,在bin目录下有Linux文件夹下存放Linux下python2和python3的封装库,Windows文件夹下还分别包括32位和64位下的python2和python3的封装库。test文件夹下包含行情和交易的测试脚本。 +1.当前xtp的python api封装支持win7系统、win10系统和Linux系统,在bin目录下Linux文件夹中有python3封装库,Windows文件夹中有64位的python3封装库。test文件夹下包含行情和交易的测试脚本。 + +2.当前bin目录下编译时使用的 python3.9.13 + boost_1_80_0 版本,如果直接使用当前的封装库,请注意使用的python版本是否为3.9系列,如果您使用的python版本和我们编译时使用的版本不一致,会导致调用python封装库失败。 + +3.如果客户需要按自己的python版本编译封装库,可以使用source目录下的代码,根据自己的python的版本,及该python版本对应的编译后的boost库,自行编译所需的python封装库。(具体过程在doc文件夹下有编译过程文档,source文件夹下有源码,包括Linux和Windows下编译的python3封装库)。 -2.当前bin目录下编译时用的python2的版本为python2.7.15,python3用的版本的python3.6.5,在Windows下发现如果python的版本不对应时会导致调用python封装库会失败,如果使用当前的封装库请注意python的版本是否一致。 +4.XTP_API_20231222_2.2.42.1文件夹下存放最新的xtp系统的api,当前python封装库分别包含行情和交易库,python封装后的接口与当前xtp系统api的所有接口都保持一致,只有方法名有所区别,python封装后的接口方法名首字母小写,而xtp系统api的方法名首字母大写。 -3.如果客户需要按自己的python版本编译封装库,可以自行用source目录下的代码,根据自己的python的版本,及该python版本对应的编译后的boost库,可自行编译所需的python封装库。(具体过程在doc文件夹下有编译过程文档,source文件夹下有源码,包括Linux和Windows下编译python2和python3封装库) + 因此所有封装后的python接口方法使用和功能都可以参见xtp系统api的接口方法。请在xtp_quote_api.h、xtp_trader_api.h两个头文件中了解各个接口的使用及功能。 -4.XTP_API_1.1.19.2_20190627文件夹下存放最新的xtp系统的api,当前python封装库的分别包含行情和交易库,python封装后的接口与当前xtp系统的api的所有接口都保持一致,只有方法名有所区别,python封装后的接口方法名首字母小写,xtp的api的方法名首字母大写。因此所有封装后的python接口方法使用和功能都可以参见xtp的api的接口方法。既在以下两个头文件中了解各个方法使用及功能。 +5. python版本的sdk包,请在git下使用clone下载:https://github.com/ztsec/xtp_api_python.git。 \ No newline at end of file diff --git a/XTP_API_1.1.19.2_20190627/bin/include/xoms_api_struct.h b/XTP_API_1.1.19.2_20190627/bin/include/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/XTP_API_1.1.19.2_20190627/bin/include/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/XTP_API_1.1.19.2_20190627/bin/include/xtp_api_data_type.h b/XTP_API_1.1.19.2_20190627/bin/include/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/XTP_API_1.1.19.2_20190627/bin/include/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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, /// 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "xtp_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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/XTP_API_1.1.19.2_20190627/bin/linux_centos6/libxtpquoteapi.so b/XTP_API_1.1.19.2_20190627/bin/linux_centos6/libxtpquoteapi.so deleted file mode 100644 index 42288d8..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/linux_centos6/libxtpquoteapi.so and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/linux_centos6/libxtptraderapi.so b/XTP_API_1.1.19.2_20190627/bin/linux_centos6/libxtptraderapi.so deleted file mode 100644 index 839c180..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/linux_centos6/libxtptraderapi.so and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/linux_centos7/libxtpquoteapi.so b/XTP_API_1.1.19.2_20190627/bin/linux_centos7/libxtpquoteapi.so deleted file mode 100644 index b794911..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/linux_centos7/libxtpquoteapi.so and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/linux_centos7/libxtptraderapi.so b/XTP_API_1.1.19.2_20190627/bin/linux_centos7/libxtptraderapi.so deleted file mode 100644 index db1eff9..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/linux_centos7/libxtptraderapi.so and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/macosx/libxtpquoteapi.dylib b/XTP_API_1.1.19.2_20190627/bin/macosx/libxtpquoteapi.dylib deleted file mode 100644 index 30233a1..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/macosx/libxtpquoteapi.dylib and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/macosx/libxtptraderapi.dylib b/XTP_API_1.1.19.2_20190627/bin/macosx/libxtptraderapi.dylib deleted file mode 100644 index d484ce8..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/macosx/libxtptraderapi.dylib and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtpquoteapi.dll b/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtpquoteapi.dll deleted file mode 100644 index a1dda95..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtpquoteapi.dll and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtpquoteapi.lib b/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtpquoteapi.lib deleted file mode 100644 index 82d6330..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtpquoteapi.lib and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtptraderapi.dll b/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtptraderapi.dll deleted file mode 100644 index 6b3303f..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtptraderapi.dll and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtptraderapi.lib b/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtptraderapi.lib deleted file mode 100644 index e46eef4..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win32/dll/xtptraderapi.lib and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtpquoteapi.dll b/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtpquoteapi.dll deleted file mode 100644 index 8ae553e..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtpquoteapi.dll and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtpquoteapi.lib b/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtpquoteapi.lib deleted file mode 100644 index f4d7fdd..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtpquoteapi.lib and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtptraderapi.dll b/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtptraderapi.dll deleted file mode 100644 index 1b0c776..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtptraderapi.dll and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtptraderapi.lib b/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtptraderapi.lib deleted file mode 100644 index c78fe9a..0000000 Binary files a/XTP_API_1.1.19.2_20190627/bin/win64/dll/xtptraderapi.lib and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/changelist.txt b/XTP_API_1.1.19.2_20190627/changelist.txt deleted file mode 100644 index 9355e44..0000000 --- a/XTP_API_1.1.19.2_20190627/changelist.txt +++ /dev/null @@ -1,141 +0,0 @@ -version 1.1.19.2 -1޸IsServerRestart()ӿ޷ȷؽbug - -version 1.1.19.1 -1ֿ֧ƴҵ -2XTPQueryIPOTickerRspṹ֤ȯticker_type֤ȯֶ -3XTP_TICKER_TYPEöֵƴƱXTP_TICKER_TYPE_TECH_STOCK -4XTPQueryIPOQuotaRspṹϺƴ¹깺tech_quantityֶ - -version 1.1.18.32 -1TradeAPIҳѯӿQueryOrdersByPage()ԼӦӦӿOnQueryOrderByPage() -2TradeAPIҳѯɽӿQueryTradesByPage()ԼӦӦӿOnQueryTradeByPage() -3TradeAPIȷϷǷӿIsServerRestart() - -version 1.1.18.19 -1ŻUDP - -version 1.1.18.18 -1TradeAPI֧һ˺Ľڵ֮ʽ𻮲 -2XTP_FUND_TRANSFER_TYPEӽڵ֮ʽ𻮲öֵ - -version 1.1.18.14 -1TXTPTradeTypeType гʽɽöֵ XTP_TRDT_CROSS_MKT_CASH -2TradeAPIгETFҵ֧ - -version 1.1.18.13 -1޸QuoteAPIlinuxʹUDPӻcrashbug - -version 1.1.18.12 -1QuoteAPI޸ı󣬽exchage_idΪexchange_id -2޸ͷļ룬GB2312ΪUTF-8 - -version 1.1.18.9 -1TradeAPIȨҵ֧֣business_type = XTP_BUSINESS_TYPE_OPTION -2ѯֲֽṹXTPQueryStkPositionRspֶΣֲַposition_directionȨԼexecutable_optionlockable_positionȨexecutable_underlyinglocked_positionusable_locked_position -3TradeAPIѯȨԼӿOnQueryOptionAuctionInfo() -4XTP_SIDE_TYPEint32öͱΪuint8͵öֵ -5ṹXTPOrderInsertInfoXTPOrderInfoXTPTradeReportƽʶֶposition_effectȨҵͨƱҵposition_effect = XTP_POSITION_EFFECT_INIT -6XTP_PRICE_TYPEöֵȨ޼걨FOK XTP_PRICE_LIMIT_OR_CANCEL -7ѯʽṹXTPQueryAssetRspֶΣı֤frozen_marginȨʽfrozen_exec_cashȨfrozen_exec_fee渶ʽpay_laterԤ渶ʽpreadva_payorig_banlanceǰbanlancedeposit_withdrawսʽtrade_nettingʽʲcaptial_assetǿʽforce_freeze_amountȡʽpreferred_amount -8QuoteAPIȨ֧֣ԭеĵĺ -9QuoteAPIȫгĺУexchage_idûԽегȫˣexchage_id = XTP_EXCHANGE_UNKNOWN ʾȫгģԭеȫгĺֹ֧Ʊ -10QuoteAPIȨȫг鶩/ȡĺSubscribeAllOptionMarketData()/UnSubscribeAllOptionMarketData() -11QuoteAPIȨȫг鶩/ȡĺSubscribeAllOptionOrderBook()/UnSubscribeAllOptionOrderBook() -12QuoteAPIȨȫг鶩/ȡĺSubscribeAllOptionTickByTick()/UnSubscribeAllOptionTickByTick() - -version 1.1.16.20 -1ȥsodium -2޸ijЩ£޷ȡmacַcrashbug -3޸apiʹUDPʱڶʱᵼbug -4mac osϵͳ֧ - -version 1.1.16.13 -1޸ʹwin32汾Ŀвѯѯѯƥbug - -version 1.1.16.9 -1QuoteAPIUDPӷʽ -2QuoteAPIȫġȫ˶ӿ -3QuoteAPI֧OrderBooklevel2plusġ˶ -4QuoteAPI֧ί/ɽĶġ˶ -5QuoteAPIѯԼ¼۽ӿ -6QuoteSPIԭOnMarketData()ص -7QuoteSPIúһһеOnDepthMarketData()ص -8QuoteAPI޸ĬϻеĴСӿSetUDPBufferSize()λΪMBĬϴСΪ64MBɸΪ64MBСĻ棩 -9TradeAPI¹깺ȲѯӿQueryIPOQuotaInfo() -10TradeAPI¹깺ϢбѯӿQueryIPOInfoList() -11TradeAPIصӿsession_id -12TradeAPIQuoteAPIⳬʱʱýӿSetHeartBeatInterval() - -version 1.1.16.1 -1TradeAPIѯETF嵥ӿQueryETF -2TradeAPIѯETFƱӿQueryETFTickerBasket -3TradeAPI֧ETFҵbusiness_type = XTP_BUSINESS_TYPE_ETF side = XTP_SIDE_PURCHASEXTP_SIDE_REDEMPTION -4ѯʽرṹXTPQueryAssetRspӲֶ -5ѯֲֻرĽṹXTPQueryStkPositionRsp˲ֶ - -version 1.1.15.101 -1TradeAPIּҵbusiness_type = XTP_BUSINESS_TYPE_STRUCTURED_FUND_PURCHASE_REDEMPTIONside = XTP_SIDE_PURCHASEXTP_SIDE_REDEMPTION -2TradeAPIֺּϲҵbusiness_type = XTP_BUSINESS_TYPE_STRUCTURED_FUND_SPLIT_MERGEside = XTP_SIDE_SPLITXTP_SIDE_MERGE -3TradeAPIּѯQueryStructuredFund -4TradeAPIͻʽ𻮲ܽӿFundTransfer -5TradeAPIѯͻʽ𻮲ӿQueryFundTransfer - -version 1.1.14.1 -1XTP_BUSINESS_TYPE ҵ -2XTPϵͳ֧عҵ -3XTP_TICKER_TYPE֤ȯXTP_TICKER_TYPE_BONDծȯ - -version 1.1.13.10 -1ṹXTPQuoteStaticInfoһֶΣ - ///С䶯λ - double price_tick; - -version 1.1.13.8 -1ṹXTPQueryAssetRsp1ֶΣ - ///Ԥ۵ʽ𣨰ƱʱԤ۵Ľʽ+Ԥѣ - double withholding_amount; - -version 1.1.13.3 -1ṹXTPOrderInsertInfoXTPOrderInfoXTPTradeReportbusiness_typeֶ -2ṹXTPMarketDataStructвֶint32_tΪint64_t -3¹깺ҵ -4order_client_idֶΣȥ - -version 1.1.12.7 -1޸linuxʹ·߶̴߳־Ŀ¼³core dumpbug -2apiCreateӿӵ־ -3޸Release()³bug - -version 1.1.10.0 -1XTPQuoteAPIѯпɽ׺Լӿ -2ȥõݽṹͺ궨壺 - XTP_TICKER_LEN - XTP_TICKER_NAME_LEN - XTP_TICKERNAME_LEN - - XTP_API_TICKER_LEN - XTP_API_TICKER_NAME_LEN - - TXTPTickerType - TXTPTickerNameType - ͳһɣ - XTP_TICKER_LEN - XTP_TICKER_NAME_LEN - -version 1.1.8.2 -1û¼ûߣûߣʱûµ¼ʱܻᶪʧϢbug - -version 1.1.8.0 - (1) ޸ͨѶЭ - -version 1.1.7.2 -1Ŀ¼һǰ־ļ -2·ʱԴ· -3SetSoftwareKey()ӿڣkeyΪͻ뿪ʱ -4SetSoftwareCode()ӿ -5ȡmacַӲкʱǿԵ¼ʧ - -version 1.1.6.2 -1GetApiLastErrorӿڵķֵ int32_t Ϊ XTPRI* -2ѯֲӦӿ market ֶ \ No newline at end of file diff --git "a/XTP_API_1.1.19.2_20190627/demo/Demo\346\265\213\350\257\225\350\264\246\345\217\267\351\205\215\347\275\256.doc" "b/XTP_API_1.1.19.2_20190627/demo/Demo\346\265\213\350\257\225\350\264\246\345\217\267\351\205\215\347\275\256.doc" deleted file mode 100644 index 61668eb..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/demo/Demo\346\265\213\350\257\225\350\264\246\345\217\267\351\205\215\347\275\256.doc" and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/demo/XTPApiDemo-1.1.19.2.zip b/XTP_API_1.1.19.2_20190627/demo/XTPApiDemo-1.1.19.2.zip deleted file mode 100644 index 5ade627..0000000 Binary files a/XTP_API_1.1.19.2_20190627/demo/XTPApiDemo-1.1.19.2.zip and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/demo/\344\275\277\347\224\250cmake\347\224\237\346\210\220demo\345\267\245\347\250\213\346\226\207\344\273\266.doc" "b/XTP_API_1.1.19.2_20190627/demo/\344\275\277\347\224\250cmake\347\224\237\346\210\220demo\345\267\245\347\250\213\346\226\207\344\273\266.doc" deleted file mode 100644 index 957adbb..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/demo/\344\275\277\347\224\250cmake\347\224\237\346\210\220demo\345\267\245\347\250\213\346\226\207\344\273\266.doc" and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/doc/XTP API\345\270\270\350\247\201\351\227\256\351\242\230.doc" "b/XTP_API_1.1.19.2_20190627/doc/XTP API\345\270\270\350\247\201\351\227\256\351\242\230.doc" deleted file mode 100644 index 5f7e72f..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/doc/XTP API\345\270\270\350\247\201\351\227\256\351\242\230.doc" and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/doc/XTP QuoteAPI\344\275\277\347\224\250UDP\345\270\270\350\247\201\351\227\256\351\242\230.doc" "b/XTP_API_1.1.19.2_20190627/doc/XTP QuoteAPI\344\275\277\347\224\250UDP\345\270\270\350\247\201\351\227\256\351\242\230.doc" deleted file mode 100644 index d79e2db..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/doc/XTP QuoteAPI\344\275\277\347\224\250UDP\345\270\270\350\247\201\351\227\256\351\242\230.doc" and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/doc/XTP \345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224.pdf" "b/XTP_API_1.1.19.2_20190627/doc/XTP \345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224.pdf" deleted file mode 100644 index d42de93..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/doc/XTP \345\270\270\350\247\201\351\227\256\351\242\230\350\247\243\347\255\224.pdf" and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/doc/XTP\346\250\241\346\213\237\346\265\213\350\257\225\347\216\257\345\242\203\345\270\270\350\247\201\351\227\256\351\242\230.doc" "b/XTP_API_1.1.19.2_20190627/doc/XTP\346\250\241\346\213\237\346\265\213\350\257\225\347\216\257\345\242\203\345\270\270\350\247\201\351\227\256\351\242\230.doc" deleted file mode 100644 index c6dc116..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/doc/XTP\346\250\241\346\213\237\346\265\213\350\257\225\347\216\257\345\242\203\345\270\270\350\247\201\351\227\256\351\242\230.doc" and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/doc/XTP\351\207\221\350\236\215\351\243\216\346\216\247\346\214\207\346\240\207.doc" "b/XTP_API_1.1.19.2_20190627/doc/XTP\351\207\221\350\236\215\351\243\216\346\216\247\346\214\207\346\240\207.doc" deleted file mode 100644 index 2ccf1c2..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/doc/XTP\351\207\221\350\236\215\351\243\216\346\216\247\346\214\207\346\240\207.doc" and /dev/null differ diff --git "a/XTP_API_1.1.19.2_20190627/doc/XTP\351\224\231\350\257\257\344\273\243\347\240\201\351\200\237\346\237\245\350\241\250.doc" "b/XTP_API_1.1.19.2_20190627/doc/XTP\351\224\231\350\257\257\344\273\243\347\240\201\351\200\237\346\237\245\350\241\250.doc" deleted file mode 100644 index ee2c020..0000000 Binary files "a/XTP_API_1.1.19.2_20190627/doc/XTP\351\224\231\350\257\257\344\273\243\347\240\201\351\200\237\346\237\245\350\241\250.doc" and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/doc/html_quote_api_1.1.19.1.zip b/XTP_API_1.1.19.2_20190627/doc/html_quote_api_1.1.19.1.zip deleted file mode 100644 index c2335f9..0000000 Binary files a/XTP_API_1.1.19.2_20190627/doc/html_quote_api_1.1.19.1.zip and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/doc/html_trade_api_1.1.19.1.zip b/XTP_API_1.1.19.2_20190627/doc/html_trade_api_1.1.19.1.zip deleted file mode 100644 index 3ea7528..0000000 Binary files a/XTP_API_1.1.19.2_20190627/doc/html_trade_api_1.1.19.1.zip and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/doc/quote_api_1.1.19.1.pdf b/XTP_API_1.1.19.2_20190627/doc/quote_api_1.1.19.1.pdf deleted file mode 100644 index b1644a1..0000000 Binary files a/XTP_API_1.1.19.2_20190627/doc/quote_api_1.1.19.1.pdf and /dev/null differ diff --git a/XTP_API_1.1.19.2_20190627/doc/trade_api_1.1.19.1.pdf b/XTP_API_1.1.19.2_20190627/doc/trade_api_1.1.19.1.pdf deleted file mode 100644 index 5ac1bb6..0000000 Binary files a/XTP_API_1.1.19.2_20190627/doc/trade_api_1.1.19.1.pdf and /dev/null differ diff --git a/XTP_API_20240611_2.2.42.1/bin/include/algo_api_struct.h b/XTP_API_20240611_2.2.42.1/bin/include/algo_api_struct.h new file mode 100644 index 0000000..404ebc5 --- /dev/null +++ b/XTP_API_20240611_2.2.42.1/bin/include/algo_api_struct.h @@ -0,0 +1,103 @@ +///////////////////////////////////////////////////////////////////////// +///@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; + +///策略中的证券信息结构体 +typedef struct XTPStrategyTickerInfoStruct +{ + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 交易市场 +} XTPStrategyTickerInfo; + +#pragma pack() + +#endif //_XTP_ALGO_API_STRUCT_H_ diff --git a/XTP_API_20240611_2.2.42.1/bin/include/algo_data_type.h b/XTP_API_20240611_2.2.42.1/bin/include/algo_data_type.h new file mode 100644 index 0000000..f34a66c --- /dev/null +++ b/XTP_API_20240611_2.2.42.1/bin/include/algo_data_type.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////// +///@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 +#define XTP_STRATEGY_STATE_PARTPAUSE 9 +#define XTP_STRATEGY_STATE_PAUSE 10 +#define XTP_STRATEGY_STATE_RESUMING 11 +#define XTP_STRATEGY_STATE_RESUMED 12 + +#endif //_XTP_ALGO_DATA_TYPE_H_ diff --git a/XTP_API_1.1.19.2_20190627/bin/include/xoms_api_fund_struct.h b/XTP_API_20240611_2.2.42.1/bin/include/xoms_api_fund_struct.h similarity index 57% rename from XTP_API_1.1.19.2_20190627/bin/include/xoms_api_fund_struct.h rename to XTP_API_20240611_2.2.42.1/bin/include/xoms_api_fund_struct.h index 7b0168a..c685a70 100644 --- a/XTP_API_1.1.19.2_20190627/bin/include/xoms_api_fund_struct.h +++ b/XTP_API_20240611_2.2.42.1/bin/include/xoms_api_fund_struct.h @@ -1,42 +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 ; - -#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_20240611_2.2.42.1/bin/include/xoms_api_struct.h b/XTP_API_20240611_2.2.42.1/bin/include/xoms_api_struct.h new file mode 100644 index 0000000..5f35f12 --- /dev/null +++ b/XTP_API_20240611_2.2.42.1/bin/include/xoms_api_struct.h @@ -0,0 +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、NQ: 委托序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///委托价格 + double price; + ///SH: 剩余委托数量(balance) + ///SZ、NQ: 委托数量 + int64_t qty; + ///SH: 'B':买; 'S':卖 + ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 + ///NQ: '1':买; '2':卖; + char side; + ///SH: 'A': 增加; 'D': 删除 + ///SZ、NQ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 + char ord_type; + ///SH: 原始订单号 + ///SZ、NQ: 无意义 + int64_t order_no; +}; + +///逐笔成交 +struct XTPTickByTickTrade { + ///频道代码 + int32_t channel_no; + ///SH: 成交序号(成交单独编号, 同一channel_no内连续) + ///SZ、NQ: 成交序号(委托成交统一编号, 同一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、NQ: 成交标识('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、NQ: 无意义 + 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; + +///指数静态信息 +typedef struct XTPIndexPressStaticInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码(无意义) + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + char market_code; ///<市场代码 + char unknown[7]; ///<预留 +}XTPIPSI; + +///指数行情快照 +typedef struct XTPIndexPress { + ///数据来源, 7=指数通. + char data_source; + + // 代码 + ///交易所代码(无意义) + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 时间类,格式为YYYYMMDDHHMMSSsss + int64_t data_time; + + // 价格 + ///最新价 + double last_price; + ///昨收盘 + double pre_close_price; + ///今开盘 + double open_price; + ///最高价 + double high_price; + ///最低价 + double low_price; + ///今收盘 + double close_price; + + + // 量额数据 + ///总成交量 + int64_t qty; + ///总成交金额 + double turnover; + ///成交笔数 + int64_t trades_count; +}XTPIP; + + +#pragma pack() + +#endif diff --git a/XTP_API_20240611_2.2.42.1/bin/include/xtp_api_data_type.h b/XTP_API_20240611_2.2.42.1/bin/include/xtp_api_data_type.h new file mode 100644 index 0000000..e64f734 --- /dev/null +++ b/XTP_API_20240611_2.2.42.1/bin/include/xtp_api_data_type.h @@ -0,0 +1,743 @@ +///////////////////////////////////////////////////////////////////////// +///@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_1.1.19.2_20190627/bin/include/xtp_quote_api.h b/XTP_API_20240611_2.2.42.1/bin/include/xtp_quote_api.h similarity index 58% rename from XTP_API_1.1.19.2_20190627/bin/include/xtp_quote_api.h rename to XTP_API_20240611_2.2.42.1/bin/include/xtp_quote_api.h index 5867e8e..749e8e6 100644 --- a/XTP_API_1.1.19.2_20190627/bin/include/xtp_quote_api.h +++ b/XTP_API_20240611_2.2.42.1/bin/include/xtp_quote_api.h @@ -1,426 +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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 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_20240611_2.2.42.1/bin/include/xtp_trader_api.h b/XTP_API_20240611_2.2.42.1/bin/include/xtp_trader_api.h new file mode 100644 index 0000000..07d2f83 --- /dev/null +++ b/XTP_API_20240611_2.2.42.1/bin/include/xtp_trader_api.h @@ -0,0 +1,1225 @@ +///////////////////////////////////////////////////////////////////////// +///@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) {}; + + ///algo业务中暂停指定策略指定证券算法单的响应 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) {}; + + ///algo业务中重启指定策略指定证券算法单的响应 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, 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; + + ///algo业务中暂停指定策略中指定证券的算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int PauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, uint64_t session_id, int32_t request_id) = 0; + + ///algo业务中重启指定策略中指定证券的算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int ResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, uint64_t session_id, int32_t request_id) = 0; + + protected: + ~TraderApi() {}; + }; + + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif diff --git a/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.12/libxtpquoteapi.so b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.12/libxtpquoteapi.so new file mode 100644 index 0000000..60d73f5 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.12/libxtpquoteapi.so differ diff --git a/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.12/libxtptraderapi.so b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.12/libxtptraderapi.so new file mode 100644 index 0000000..213f80f Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.12/libxtptraderapi.so differ diff --git a/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.17/libxtpquoteapi.so b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.17/libxtpquoteapi.so new file mode 100644 index 0000000..8d653f5 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.17/libxtpquoteapi.so differ diff --git a/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.17/libxtptraderapi.so b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.17/libxtptraderapi.so new file mode 100644 index 0000000..8254df8 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/linux_glibc_2.17/libxtptraderapi.so differ diff --git a/XTP_API_20240611_2.2.42.1/bin/macosx/libxtpquoteapi.dylib b/XTP_API_20240611_2.2.42.1/bin/macosx/libxtpquoteapi.dylib new file mode 100644 index 0000000..b5f40fa Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/macosx/libxtpquoteapi.dylib differ diff --git a/XTP_API_20240611_2.2.42.1/bin/macosx/libxtptraderapi.dylib b/XTP_API_20240611_2.2.42.1/bin/macosx/libxtptraderapi.dylib new file mode 100644 index 0000000..1a5cd81 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/macosx/libxtptraderapi.dylib differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtpquoteapi.dll b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtpquoteapi.dll new file mode 100644 index 0000000..7882cdc Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtpquoteapi.dll differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtpquoteapi.lib b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtpquoteapi.lib new file mode 100644 index 0000000..8421f3c Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtpquoteapi.lib differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtptraderapi.dll b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtptraderapi.dll new file mode 100644 index 0000000..f5fb94b Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtptraderapi.dll differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtptraderapi.lib b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtptraderapi.lib new file mode 100644 index 0000000..b479fee Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win32/dll/xtptraderapi.lib differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtpquoteapi.dll b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtpquoteapi.dll new file mode 100644 index 0000000..891d206 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtpquoteapi.dll differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtpquoteapi.lib b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtpquoteapi.lib new file mode 100644 index 0000000..9c8efd5 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtpquoteapi.lib differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtptraderapi.dll b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtptraderapi.dll new file mode 100644 index 0000000..75bcf02 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtptraderapi.dll differ diff --git a/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtptraderapi.lib b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtptraderapi.lib new file mode 100644 index 0000000..d8b2520 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/bin/win64/dll/xtptraderapi.lib differ diff --git a/XTP_API_20240611_2.2.42.1/changelist.txt b/XTP_API_20240611_2.2.42.1/changelist.txt new file mode 100644 index 0000000..c71fb47 --- /dev/null +++ b/XTP_API_20240611_2.2.42.1/changelist.txt @@ -0,0 +1,353 @@ +version 2.2.42.1 +1Trader APIͣ㷨ĸӿPauseAlgoOrderԼӦӿOnPauseAlgoOrder +2Trader API㷨ĸӿResumeAlgoOrderԼӦӿOnResumeAlgoOrder +3ͷļпʽLOF羳LOF + +version 2.2.41.2 +1ȫĺеĻȫгĹ޸ +2QuoteApi֧飺ġȡ + +version 2.2.41.1 +1޸bug + +version 2.2.39.3 +1޸quoteЭ鲻һµcrashbug + +version 2.2.39.2 +1QuoteSpi鶪֪ͨOnTickByTickLossRange() +2QuoteSpiETFIOPVصOnETFIOPVData() + +version 2.2.38.1 +1XTP_SECURITY_TYPEƷڻETF XTP_SECURITY_ETF_COMMODITY_FUTURES = 22öֵ + +version 2.2.37.1 +1XTP_SECURITY_TYPEֽծȯETFXTP_SECURITY_TYPE_ETF_CASH_BONDöֵ +2TraderApiծϢѯӿQueryBondIPOInfoListԼӦӿOnQueryBondIPOInfoList + + +version 2.2.36.1 +1ȫ̬ϢṹXTPNQFIñֶΣֲϢlayer_typeǷʱis_rzbdǷȯis_rqbdǷտis_drrzǷտȯis_drrqֶ +2TraderApi޸е㷨ӿModifyAlgoOrder() +3TraderSpi޸вԵӦӿOnModifyAlgoOrder() + +version 2.2.35.1 +1TraderApiծתϢѯӿQueryBondSwapStockInfo() +2TraderSpiծתϢѯӦӦӿOnQueryBondSwapStockInfo() + +version 2.2.32.10 +1ѯֲֽṹXTPQueryStkPositionRspֲֵmarket_valueɱlast_buy_costӯɱlast_profit_cost +2XTP_BUSINESS_TYPE֤ȯҵծתҵXTP_BUSINESS_TYPE_BOND_SWAP_STOCKöֵ + +version 2.2.34.9 +1޸quote libеʱ޷ȷͿݵbug + +version 2.2.34.8 +1޸trader libзҳѯϲȨɽĽӿûȷ͵bug + +version 2.2.34.7 +1ȯ˻ϢṹXTPCrdFundExtraInfoԤֶΣ֤ȯֵsecurity_capitalʸծfinancing_debtsȯծshort_sell_debtsܶcontract_debts_load4ֶ +2TraderApiƼ㷨ӿStrategyRecommendation() +3TraderSpiƼ㷨ӦӿOnStrategyRecommendation() +4TraderSpiĸʱϢӦӿOnNewStrategyCreateReport() + +version 2.2.34.6 +1޸xtp idûаԤɵbug + +version 2.2.34.5 +1Ż֧Ȩ±ĵ + +version 2.2.34.3 +1XTP_MARKET_TYPE 2öֵA XTP_MKT_BJ_A۹ XTP_MKT_HK + +version 2.2.34.2 +1ծȯݽṹXTPMarketDataBondExData2ֶΣƥɽɽ(SZ)match_qtyƥɽɽ(SZ)match_turnover + +version 2.2.34.1 +1QuoteApi֧飺ġȡġѯ +2QuoteApiѯԼ̬ϢQueryAllNQTickersFullInfo() +3QuoteSpiѯԼ̬ϢӦصOnQueryAllNQTickersFullInfo() +4ѯֲֽṹXTPQueryStkPositionRspռñ֤marginֶ +5ѯȨϲԳֲϢṹXTPQueryOptCombPositionRspռù˾֤secu_comb_marginֶ + +version 2.2.33.4 +1޸bug + +version 2.2.33.3 +1QuoteSpiزϿĻص OnRebuildQuoteServerDisconnected() +2QuoteSpiزӦOnRequestRebuildQuote() +3QuoteSpiݻزӦOnRebuildTickByTick() +4QuoteSpiݻزӦOnRebuildMarketData() +5QuoteApi½زLoginToRebuildQuoteServer() +6QuoteApidzزLogoutFromRebuildQuoteServer() +7QuoteApiزָӿںRequestRebuildQuote() + +version 2.2.33.2 +1TradeAPIԤȻȡxtp_idӿGetANewOrderXTPID() +2TradeAPIԤxtpidıӿInsertOrderExtra() +3TradeAPIԤxtpidϲȨӿInsertOptionCombinedOrderExtra() + +version 2.2.33.1 +1ծȯݽṹXTPMarketDataBondExDataƥɽ(SZ)match_lastpx ծȯȨƽ۸(SH)ma_bond_priceվavg_priceɱֶ +2ɽTXTPTradeTypeTypeöֵʽɽXTP_TRDT_HK_MKT_CASHǻʽɽXTP_TRDT_NON_SHSZ_MKT_CASH + +version 2.2.32.9 +1Algoĸ֪ͨOnNewStrategyCreateReport()صӦ + +version 2.2.32.8 +1Algo⵱ѯĸerror_codeΪ0ʱǿstr_paramΪNULLֹûʹ + +version 2.2.32.7 +1AlgoûͬʱѯĸʱΪֲѯ + +version 2.2.32.4 +1Algoָ֤ȯֹͣԽӿStopStrategyByTicker() +2Algoָ֤ȯٲԽӿDestroyStrategyByTicker() +3Algoָ֤ȯֹͣԻصӿOnStopStrategyByTicker() +4Algoָ֤ȯٲԻصӿOnDestroyStrategyByTicker() +5Algoָ֤ȯִ״̬֪ͨӿOnStrategySymbolStateReport() + +version 2.2.32.2 +1޸bug + +version 2.2.31.2 +1ϢṹXTPTBT״̬ṹXTPTickByTickStatusΪ׼ +2XTP_TBT_TYPEö XTP_TBT_STATE ״̬ + +version 2.2.31.1 +1TradeAPI°ݱIDѯͨӿQueryOrderByXTPIDEx() +2TradeAPI°ѯͨӿQueryOrdersEx() +3TradeAPI°ѯδͨӿQueryUnfinishedOrdersEx() +4TradeAPI°ѯͨؽӿڶӦĻصӿOnQueryOrderEx()ΪûṩḻIJѯϢܵԭ +5TradeAPI°ҳѯͨӿQueryOrdersByPageEx() +6TradeAPI°ҳѯͨӿڶӦĻصӿOnQueryOrderByPageEx()ΪûṩḻIJѯϢܵԭ +7TradeAPI°ѯϲȨӿQueryOptionCombinedOrdersEx() +8TradeAPI°ݱIDѯϲȨӿQueryOptionCombinedOrderByXTPIDEx() +9TradeAPI°ѯϲȨδᱨӿQueryOptionCombinedUnfinishedOrdersEx() +10TradeAPI°ѯϲȨؽӿڶӦĻصӿOnQueryOptionCombinedOrdersEx()ΪûṩḻIJѯϢܵԭ +11TradeAPI°ҳѯϲȨӿQueryOptionCombinedOrdersByPageEx() +12TradeAPI°ҳѯϲȨӿڶӦĻصӿOnQueryOptionCombinedOrdersByPageEx()ΪûṩḻIJѯϢܵԭ + +version 2.2.30.6 +1XTP_SECURITY_TYPE XTP_SECURITY_ETF_CROSS_BORDER_STOCK 羳ETF +2XTP羳ETFҵҵݲ֧֣ +3Algo libѯȯҵָĹծԼϢӿQueryCreditOrderInvolvedDebtInfo() + +version 2.2.30.5 +1޸QuoteAPIUDPʹõĺһЧʱ޷ȷUDPӵbug + +version 2.2.30.3 +1ѯֲֽṹXTPQueryStkPositionRspֲposition_security_typeֶΣûôֲֳֶǷΪծ + +version 2.2.30.2 +1QuoteAPI趨̰߳CPUӿSetUDPRecvThreadAffinityArray֧4ˣʹõĺʵ +2QuoteAPI趨̰߳CPUӿSetUDPParseThreadAffinityArray֧4ˣʹõĺʵ +3QuoteAPIԭеSetUDPRecvThreadAffinitySetUDPParseThreadAffinityãΪ˼Իʹ +4QuoteAPISetUDPBufferSize()ñǰСһЩˣQuoteAPIռõڴܱǰ +5ίнṹXTPTickByTickEntrustԭʼorder_noֶΣϺίӲ˵ +6ȫ̬ϢṹXTPQuoteFullInfo֤ȯ״̬security_statusֶΣַվʾ + +version 2.2.27.6 +1QuoteAPI޸bug - ȫ/ȫȡȨʱ޷ȷصȫ/ȫȡӦ +2ѯʽӦṹXTPQueryAssetRsp2Ȩ˻רֶΣȨ汾֧֣Է汾Ϊ׼ʵʱնexchange_cur_risk_degree ˾ʵʱնcompany_cur_risk_degree + +version 2.2.27.5 +1TraderAPIѯڵʽӿ QueryOtherServerFund() +1TraderSPIѯڵʽӦӿ OnQueryOtherServerFund() + +version 2.2.27.4 +1ѯȨȨϲͷṹXTPQueryOptCombExecPosRspȨϲavl_qtyֶ + +version 2.2.27.2 +1ѯֲֽṹXTPQueryStkPositionRspӯɱprofit_costɱbuy_cost2ֶ +2TradeAPIȨȨϲͷѯӿQueryOptionCombinedExecPosition() + +version 2.2.26.3 +1ѯֲֽṹXTPQueryStkPositionRspprofit_priceӯɱֶ + +version 2.2.25.7 +1ûնϢXTPUserTerminalInfoReqṹͻ˰汾client_versionֶκͽMacOSϵͳʹõmacos_snoֶ + +version 2.2.25.5 +1XTPQuoteFullInfoṹuintֶ޸Ϊuniֶ + +version 2.2.25.4 +1QuoteAPIѯԼȫ̬ݽӿQueryAllTickersFullInfo() + +version 2.2.25.3 +1TradeAPIϲȨعܽӿ +2XTP_SIDE_TYPEȨϲҵöֵ +3XTP_BUSINESS_TYPEȨϲҵöֵϲʱʹã +4TradeAPIȨϲԱ¼ӿInsertOptionCombinedOrder() +5TradeAPIȨϲԳӿCancelOptionCombinedOrder() +6TradeAPIȨϲԲѯδᱨӿQueryOptionCombinedUnfinishedOrders() +7TradeAPIȨϲԸݱIDѯӿQueryOptionCombinedOrderByXTPID() +8TradeAPIȨϲԲѯӿQueryOptionCombinedOrders() +9TradeAPIȨϲԷҳѯӿQueryOptionCombinedOrdersByPage() +10TradeAPIȨϲԸݱIDѯɽӿQueryOptionCombinedTradesByXTPID +11TradeAPIȨϲԲѯɽرӿQueryOptionCombinedTrades() +12TradeAPIȨϲԷҳѯɽرӿQueryOptionCombinedTradesByPage() +13TradeAPIȨϲԲѯֲֽӿQueryOptionCombinedPosition() +14TradeAPIȨϲԲѯϲϢӿQueryOptionCombinedStrategyInfo + +version 2.2.24.2 +1QuoteAPḬ߳CPUӿSetUDPRecvThreadAffinity() +2QuoteAPḬ߳CPUӿSetUDPParseThreadAffinity() +3QuoteAPI趨첽־ǷĽӿSetUDPSeqLogOutPutFlag() +4TradeAPIѯδᶩӿQueryUnfinishedOrders() +5TradeAPIѯ˻ȯϢӿQueryMulCreditExcessStock() +6TradeAPIѯҳӿQueryOrdersByPage() +7TradeAPIɽرҳѯӿQueryTradesByPage() + +version 2.2.23.2 +1TradeAPIծԼչڽӿCreditExtendDebtDate() +2TradeAPIѯȯҵˑĸϢӿQueryCreditFundExtraInfo() +3TradeAPIѯȯҵˑָ֤ȯĸϢӿQueryCreditPositionExtraInfo() +4TradeAPIѯȯҵиծԼչڽӿQueryCreditExtendDebtDateOrders() +5ṹXTPCrdDebtStockInfoе remain_quantity ֶθΪ stock_repay_quantity +6¹깺ѯṹXTPQueryIPOTickerRspԿƴ¹ɵ֧ +7¹깺ȲѯṹXTPQueryIPOQuotaRspƴ + +version 2.2.15.1 +1ŻUDP + +version 2.2.14.2 +1TradeAPI֧һ˺Ľڵ֮ʽ𻮲 +2XTP_FUND_TRANSFER_TYPEӽڵ֮ʽ𻮲öֵ + +version 2.2.14.1 +1ȯծ¼ϢṹXTPCrdDebtInfoֶΣӦȨdue_right_qty + +version 2.2.13.2 +1TradeAPIȯҵ֧ +2ѯʽṹXTPQueryAssetRsp˻רֶΣȯʽrepay_stock_aval_banlance +3XTP_SIDE_TYPEҵöֵ +4XTP_POSITION_EFFECT_TYPEҵöֵǿƽʱʹã +5TradeAPIȯҵֱֽӻӿCreditCashRepay() +6TradeAPIѯȯҵֱֽӻӿQueryCreditCashRepayInfo() +7TradeAPIѯ˻ϢӿQueryCreditFundInfo() +8TradeAPIѯ˻ծԼϢӿQueryCreditDebtInfo() +9TradeAPIѯָ֤ȯծδϢӿQueryCreditTickerDebtInfo() +10TradeAPIѯ˻ʽϢӿQueryCreditAssetDebtInfo() +11TradeAPIѯ˻ȯͷϢӿQueryCreditTickerAssignInfo() +12TradeAPIȯҵѯָ֤ȯȯӿQueryCreditExcessStock() + +version 1.1.18.14 +1TXTPTradeTypeType гʽɽöֵ XTP_TRDT_CROSS_MKT_CASH +2TradeAPIгETFҵ֧ + +version 1.1.18.13 +1޸QuoteAPIlinuxʹUDPӻcrashbug + +version 1.1.18.12 +1QuoteAPI޸ı󣬽exchage_idΪΪexchange_id +2޸ͷļ룬GB2312ΪUTF-8 + +version 1.1.18.9 +1TradeAPIȨҵ֧֣business_type = XTP_BUSINESS_TYPE_OPTION +2ѯֲֽṹXTPQueryStkPositionRspֶΣֲַposition_directionȨԼexecutable_optionlockable_positionȨexecutable_underlyinglocked_positionusable_locked_position +3TradeAPIѯȨԼӿOnQueryOptionAuctionInfo() +4XTP_SIDE_TYPEint32öͱΪuint8͵öֵ +5ṹXTPOrderInsertInfoXTPOrderInfoXTPTradeReportƽʶֶposition_effectȨҵͨƱҵposition_effect = XTP_POSITION_EFFECT_INIT +6XTP_PRICE_TYPEöֵȨ޼걨FOK XTP_PRICE_LIMIT_OR_CANCEL +7ѯʽṹXTPQueryAssetRspֶΣı֤frozen_marginȨʽfrozen_exec_cashȨfrozen_exec_fee渶ʽpay_laterԤ渶ʽpreadva_payorig_banlanceǰbanlancedeposit_withdrawսʽtrade_nettingʽʲcaptial_assetǿʽforce_freeze_amountȡʽpreferred_amount +8QuoteAPIȨ֧֣ԭеĵĺ +9QuoteAPIȫгĺУexchage_idûԽегȫˣexchage_id = XTP_EXCHANGE_UNKNOWN ʾȫгģԭеȫгĺֹ֧Ʊ +10QuoteAPIȨȫг鶩/ȡĺSubscribeAllOptionMarketData()/UnSubscribeAllOptionMarketData() +11QuoteAPIȨȫг鶩/ȡĺSubscribeAllOptionOrderBook()/UnSubscribeAllOptionOrderBook() +12QuoteAPIȨȫг鶩/ȡĺSubscribeAllOptionTickByTick()/UnSubscribeAllOptionTickByTick() + +version 1.1.16.20 +1ȥsodium +2޸ijЩ£޷ȡmacַcrashbug +3޸apiʹUDPʱڶʱᵼbug +4mac osϵͳ֧ + +version 1.1.16.13 +1޸ʹwin32汾Ŀвѯѯѯƥbug + +version 1.1.16.9 +1QuoteAPIUDPӷʽ +2QuoteAPIȫġȫ˶ӿ +3QuoteAPI֧OrderBooklevel2plusġ˶ +4QuoteAPI֧ί/ɽĶġ˶ +5QuoteAPIѯԼ¼۽ӿ +6QuoteSPIԭOnMarketData()ص +7QuoteSPIúһһеOnDepthMarketData()ص +8QuoteAPI޸ĬϻеĴСӿSetUDPBufferSize()λΪMBĬϴСΪ64MBɸΪ64MBСĻ棩 +9TradeAPI¹깺ȲѯӿQueryIPOQuotaInfo() +10TradeAPI¹깺ϢбѯӿQueryIPOInfoList() +11TradeAPIصӿsession_id +12TradeAPIQuoteAPIⳬʱʱýӿSetHeartBeatInterval() + +version 1.1.16.1 +1TradeAPIѯETF嵥ӿQueryETF +2TradeAPIѯETFƱӿQueryETFTickerBasket +3TradeAPI֧ETFҵbusiness_type = XTP_BUSINESS_TYPE_ETF side = XTP_SIDE_PURCHASEXTP_SIDE_REDEMPTION +4ѯʽرṹXTPQueryAssetRspӲֶ +5ѯֲֻرĽṹXTPQueryStkPositionRsp˲ֶ + +version 1.1.15.101 +1TradeAPIּҵbusiness_type = XTP_BUSINESS_TYPE_STRUCTURED_FUND_PURCHASE_REDEMPTIONside = XTP_SIDE_PURCHASEXTP_SIDE_REDEMPTION +2TradeAPIֺּϲҵbusiness_type = XTP_BUSINESS_TYPE_STRUCTURED_FUND_SPLIT_MERGEside = XTP_SIDE_SPLITXTP_SIDE_MERGE +3TradeAPIּѯQueryStructuredFund +4TradeAPIͻʽ𻮲ܽӿFundTransfer +5TradeAPIѯͻʽ𻮲ӿQueryFundTransfer + +version 1.1.14.1 +1XTP_BUSINESS_TYPE ҵ +2XTPϵͳ֧عҵ +3XTP_TICKER_TYPE֤ȯXTP_TICKER_TYPE_BONDծȯ + +version 1.1.13.10 +1ṹXTPQuoteStaticInfoһֶΣ + ///С䶯λ + double price_tick; + +version 1.1.13.8 +1ṹXTPQueryAssetRsp1ֶΣ + ///Ԥ۵ʽ𣨰ƱʱԤ۵Ľʽ+Ԥѣ + double withholding_amount; + +version 1.1.13.3 +1ṹXTPOrderInsertInfoXTPOrderInfoXTPTradeReportbusiness_typeֶ +2ṹXTPMarketDataStructвֶint32_tΪint64_t +3¹깺ҵ +4order_client_idֶΣȥ + +version 1.1.12.7 +1޸linuxʹ·߶̴߳־Ŀ¼³core dumpbug +2apiCreateӿӵ־ +3޸Release()³bug + +version 1.1.10.0 +1XTPQuoteAPIѯпɽ׺Լӿ +2ȥõݽṹͺ궨壺 + XTP_TICKER_LEN + XTP_TICKER_NAME_LEN + XTP_TICKERNAME_LEN + + XTP_API_TICKER_LEN + XTP_API_TICKER_NAME_LEN + + TXTPTickerType + TXTPTickerNameType + ͳһɣ + XTP_TICKER_LEN + XTP_TICKER_NAME_LEN + +version 1.1.8.2 +1û¼ûߣûߣʱûµ¼ʱܻᶪʧϢbug + +version 1.1.8.0 + (1) ޸ͨѶЭ + +version 1.1.7.2 +1Ŀ¼һǰ־ļ +2·ʱԴ· +3SetSoftwareKey()ӿڣkeyΪͻ뿪ʱ +4SetSoftwareCode()ӿ +5ȡmacַӲкʱǿԵ¼ʧ + +version 1.1.6.2 +1GetApiLastErrorӿڵķֵ int32_t Ϊ XTPRI* +2ѯֲӦӿ market ֶ \ No newline at end of file diff --git "a/XTP_API_20240611_2.2.42.1/demo/Demo\346\265\213\350\257\225\350\264\246\345\217\267\351\205\215\347\275\256.pdf" "b/XTP_API_20240611_2.2.42.1/demo/Demo\346\265\213\350\257\225\350\264\246\345\217\267\351\205\215\347\275\256.pdf" new file mode 100644 index 0000000..f0278da Binary files /dev/null and "b/XTP_API_20240611_2.2.42.1/demo/Demo\346\265\213\350\257\225\350\264\246\345\217\267\351\205\215\347\275\256.pdf" differ diff --git a/XTP_API_20240611_2.2.42.1/demo/XTPApiDemo-2.2.42.1.zip b/XTP_API_20240611_2.2.42.1/demo/XTPApiDemo-2.2.42.1.zip new file mode 100644 index 0000000..1954a92 Binary files /dev/null and b/XTP_API_20240611_2.2.42.1/demo/XTPApiDemo-2.2.42.1.zip differ diff --git "a/XTP_API_1.1.19.2_20190627/demo/demo\347\274\226\350\257\221\347\233\270\345\205\263\351\227\256\351\242\230.doc" "b/XTP_API_20240611_2.2.42.1/demo/demo\347\274\226\350\257\221\347\233\270\345\205\263\351\227\256\351\242\230.doc" similarity index 68% rename from "XTP_API_1.1.19.2_20190627/demo/demo\347\274\226\350\257\221\347\233\270\345\205\263\351\227\256\351\242\230.doc" rename to "XTP_API_20240611_2.2.42.1/demo/demo\347\274\226\350\257\221\347\233\270\345\205\263\351\227\256\351\242\230.doc" index a538d4f..66df3cc 100644 Binary files "a/XTP_API_1.1.19.2_20190627/demo/demo\347\274\226\350\257\221\347\233\270\345\205\263\351\227\256\351\242\230.doc" and "b/XTP_API_20240611_2.2.42.1/demo/demo\347\274\226\350\257\221\347\233\270\345\205\263\351\227\256\351\242\230.doc" differ diff --git "a/XTP_API_20240611_2.2.42.1/demo/\344\275\277\347\224\250cmake\347\224\237\346\210\220demo\345\267\245\347\250\213\346\226\207\344\273\266.pdf" "b/XTP_API_20240611_2.2.42.1/demo/\344\275\277\347\224\250cmake\347\224\237\346\210\220demo\345\267\245\347\250\213\346\226\207\344\273\266.pdf" new file mode 100644 index 0000000..54a78dd Binary files /dev/null and "b/XTP_API_20240611_2.2.42.1/demo/\344\275\277\347\224\250cmake\347\224\237\346\210\220demo\345\267\245\347\250\213\346\226\207\344\273\266.pdf" differ diff --git "a/XTP_API_1.1.19.2_20190627/demo/\345\205\254\347\275\221\346\265\213\350\257\225\347\216\257\345\242\203\350\257\267\344\275\277\347\224\250TCP\350\277\236\346\216\245\357\274\214UPD\344\274\232\346\224\266\344\270\215\345\210\260\346\225\260\346\215\256.txt" "b/XTP_API_20240611_2.2.42.1/demo/\345\205\254\347\275\221\346\265\213\350\257\225\347\216\257\345\242\203\350\257\267\344\275\277\347\224\250TCP\350\277\236\346\216\245\357\274\214UDP\344\274\232\346\224\266\344\270\215\345\210\260\346\225\260\346\215\256.txt" similarity index 100% rename from "XTP_API_1.1.19.2_20190627/demo/\345\205\254\347\275\221\346\265\213\350\257\225\347\216\257\345\242\203\350\257\267\344\275\277\347\224\250TCP\350\277\236\346\216\245\357\274\214UPD\344\274\232\346\224\266\344\270\215\345\210\260\346\225\260\346\215\256.txt" rename to "XTP_API_20240611_2.2.42.1/demo/\345\205\254\347\275\221\346\265\213\350\257\225\347\216\257\345\242\203\350\257\267\344\275\277\347\224\250TCP\350\277\236\346\216\245\357\274\214UDP\344\274\232\346\224\266\344\270\215\345\210\260\346\225\260\346\215\256.txt" diff --git "a/XTP\347\232\204API\345\234\250python\344\270\213\347\232\204\345\260\201\350\243\205\350\257\264\346\230\216\346\226\207\346\241\243.docx" "b/XTP\347\232\204API\345\234\250python\344\270\213\347\232\204\345\260\201\350\243\205\350\257\264\346\230\216\346\226\207\346\241\243.docx" index a5287ba..05d17cf 100644 Binary files "a/XTP\347\232\204API\345\234\250python\344\270\213\347\232\204\345\260\201\350\243\205\350\257\264\346\230\216\346\226\207\346\241\243.docx" and "b/XTP\347\232\204API\345\234\250python\344\270\213\347\232\204\345\260\201\350\243\205\350\257\264\346\230\216\346\226\207\346\241\243.docx" differ diff --git a/bin/Linux/Linux+python2.7/libxtpquoteapi.so b/bin/Linux/Linux+python2.7/libxtpquoteapi.so deleted file mode 100644 index 42288d8..0000000 Binary files a/bin/Linux/Linux+python2.7/libxtpquoteapi.so and /dev/null differ diff --git a/bin/Linux/Linux+python2.7/libxtptraderapi.so b/bin/Linux/Linux+python2.7/libxtptraderapi.so deleted file mode 100644 index 839c180..0000000 Binary files a/bin/Linux/Linux+python2.7/libxtptraderapi.so and /dev/null differ diff --git a/bin/Linux/Linux+python2.7/vnxtpquote.so b/bin/Linux/Linux+python2.7/vnxtpquote.so deleted file mode 100644 index 177d238..0000000 Binary files a/bin/Linux/Linux+python2.7/vnxtpquote.so and /dev/null differ diff --git a/bin/Linux/Linux+python2.7/vnxtptrader.so b/bin/Linux/Linux+python2.7/vnxtptrader.so deleted file mode 100644 index 7212710..0000000 Binary files a/bin/Linux/Linux+python2.7/vnxtptrader.so and /dev/null differ diff --git a/bin/Linux/Linux+python3.6/libxtpquoteapi.so b/bin/Linux/Linux+python3.6/libxtpquoteapi.so deleted file mode 100644 index 42288d8..0000000 Binary files a/bin/Linux/Linux+python3.6/libxtpquoteapi.so and /dev/null differ diff --git a/bin/Linux/Linux+python3.6/libxtptraderapi.so b/bin/Linux/Linux+python3.6/libxtptraderapi.so deleted file mode 100644 index 839c180..0000000 Binary files a/bin/Linux/Linux+python3.6/libxtptraderapi.so and /dev/null differ diff --git a/bin/Linux/Linux+python3.6/vnxtpquote.so b/bin/Linux/Linux+python3.6/vnxtpquote.so deleted file mode 100644 index 32776cd..0000000 Binary files a/bin/Linux/Linux+python3.6/vnxtpquote.so and /dev/null differ diff --git a/bin/Linux/Linux+python3.6/vnxtptrader.so b/bin/Linux/Linux+python3.6/vnxtptrader.so deleted file mode 100644 index 630a862..0000000 Binary files a/bin/Linux/Linux+python3.6/vnxtptrader.so and /dev/null differ diff --git a/bin/Linux/centos7+python3.9/libxtpquoteapi.so b/bin/Linux/centos7+python3.9/libxtpquoteapi.so new file mode 100644 index 0000000..8d653f5 Binary files /dev/null and b/bin/Linux/centos7+python3.9/libxtpquoteapi.so differ diff --git a/bin/Linux/centos7+python3.9/libxtptraderapi.so b/bin/Linux/centos7+python3.9/libxtptraderapi.so new file mode 100644 index 0000000..8254df8 Binary files /dev/null and b/bin/Linux/centos7+python3.9/libxtptraderapi.so differ diff --git a/bin/Linux/centos7+python3.9/vnxtpquote.so b/bin/Linux/centos7+python3.9/vnxtpquote.so new file mode 100644 index 0000000..ef4388c Binary files /dev/null and b/bin/Linux/centos7+python3.9/vnxtpquote.so differ diff --git a/bin/Linux/centos7+python3.9/vnxtptrader.so b/bin/Linux/centos7+python3.9/vnxtptrader.so new file mode 100644 index 0000000..5bca351 Binary files /dev/null and b/bin/Linux/centos7+python3.9/vnxtptrader.so differ diff --git a/bin/Windows/win32+python2.7/vnxtpquote.dll b/bin/Windows/win32+python2.7/vnxtpquote.dll deleted file mode 100644 index bad123f..0000000 Binary files a/bin/Windows/win32+python2.7/vnxtpquote.dll and /dev/null differ diff --git a/bin/Windows/win32+python2.7/vnxtpquote.pyd b/bin/Windows/win32+python2.7/vnxtpquote.pyd deleted file mode 100644 index bad123f..0000000 Binary files a/bin/Windows/win32+python2.7/vnxtpquote.pyd and /dev/null differ diff --git a/bin/Windows/win32+python2.7/vnxtptrader.dll b/bin/Windows/win32+python2.7/vnxtptrader.dll deleted file mode 100644 index 12257a7..0000000 Binary files a/bin/Windows/win32+python2.7/vnxtptrader.dll and /dev/null differ diff --git a/bin/Windows/win32+python2.7/vnxtptrader.pyd b/bin/Windows/win32+python2.7/vnxtptrader.pyd deleted file mode 100644 index 12257a7..0000000 Binary files a/bin/Windows/win32+python2.7/vnxtptrader.pyd and /dev/null differ diff --git a/bin/Windows/win32+python2.7/xtpquoteapi.dll b/bin/Windows/win32+python2.7/xtpquoteapi.dll deleted file mode 100644 index a1dda95..0000000 Binary files a/bin/Windows/win32+python2.7/xtpquoteapi.dll and /dev/null differ diff --git a/bin/Windows/win32+python2.7/xtpquoteapi.lib b/bin/Windows/win32+python2.7/xtpquoteapi.lib deleted file mode 100644 index 82d6330..0000000 Binary files a/bin/Windows/win32+python2.7/xtpquoteapi.lib and /dev/null differ diff --git a/bin/Windows/win32+python2.7/xtptraderapi.dll b/bin/Windows/win32+python2.7/xtptraderapi.dll deleted file mode 100644 index 6b3303f..0000000 Binary files a/bin/Windows/win32+python2.7/xtptraderapi.dll and /dev/null differ diff --git a/bin/Windows/win32+python2.7/xtptraderapi.lib b/bin/Windows/win32+python2.7/xtptraderapi.lib deleted file mode 100644 index e46eef4..0000000 Binary files a/bin/Windows/win32+python2.7/xtptraderapi.lib and /dev/null differ diff --git a/bin/Windows/win32+python3.6/vnxtpquote.dll b/bin/Windows/win32+python3.6/vnxtpquote.dll deleted file mode 100644 index ad5be7a..0000000 Binary files a/bin/Windows/win32+python3.6/vnxtpquote.dll and /dev/null differ diff --git a/bin/Windows/win32+python3.6/vnxtpquote.pyd b/bin/Windows/win32+python3.6/vnxtpquote.pyd deleted file mode 100644 index ad5be7a..0000000 Binary files a/bin/Windows/win32+python3.6/vnxtpquote.pyd and /dev/null differ diff --git a/bin/Windows/win32+python3.6/vnxtptrader.dll b/bin/Windows/win32+python3.6/vnxtptrader.dll deleted file mode 100644 index b94adc8..0000000 Binary files a/bin/Windows/win32+python3.6/vnxtptrader.dll and /dev/null differ diff --git a/bin/Windows/win32+python3.6/vnxtptrader.pyd b/bin/Windows/win32+python3.6/vnxtptrader.pyd deleted file mode 100644 index b94adc8..0000000 Binary files a/bin/Windows/win32+python3.6/vnxtptrader.pyd and /dev/null differ diff --git a/bin/Windows/win32+python3.6/xtpquoteapi.dll b/bin/Windows/win32+python3.6/xtpquoteapi.dll deleted file mode 100644 index a1dda95..0000000 Binary files a/bin/Windows/win32+python3.6/xtpquoteapi.dll and /dev/null differ diff --git a/bin/Windows/win32+python3.6/xtpquoteapi.lib b/bin/Windows/win32+python3.6/xtpquoteapi.lib deleted file mode 100644 index 82d6330..0000000 Binary files a/bin/Windows/win32+python3.6/xtpquoteapi.lib and /dev/null differ diff --git a/bin/Windows/win32+python3.6/xtptraderapi.dll b/bin/Windows/win32+python3.6/xtptraderapi.dll deleted file mode 100644 index 6b3303f..0000000 Binary files a/bin/Windows/win32+python3.6/xtptraderapi.dll and /dev/null differ diff --git a/bin/Windows/win32+python3.6/xtptraderapi.lib b/bin/Windows/win32+python3.6/xtptraderapi.lib deleted file mode 100644 index e46eef4..0000000 Binary files a/bin/Windows/win32+python3.6/xtptraderapi.lib and /dev/null differ diff --git a/bin/Windows/win64+python2.7/vnxtpquote.dll b/bin/Windows/win64+python2.7/vnxtpquote.dll deleted file mode 100644 index fc6b743..0000000 Binary files a/bin/Windows/win64+python2.7/vnxtpquote.dll and /dev/null differ diff --git a/bin/Windows/win64+python2.7/vnxtpquote.pyd b/bin/Windows/win64+python2.7/vnxtpquote.pyd deleted file mode 100644 index fc6b743..0000000 Binary files a/bin/Windows/win64+python2.7/vnxtpquote.pyd and /dev/null differ diff --git a/bin/Windows/win64+python2.7/vnxtptrader.dll b/bin/Windows/win64+python2.7/vnxtptrader.dll deleted file mode 100644 index 944e436..0000000 Binary files a/bin/Windows/win64+python2.7/vnxtptrader.dll and /dev/null differ diff --git a/bin/Windows/win64+python2.7/vnxtptrader.pyd b/bin/Windows/win64+python2.7/vnxtptrader.pyd deleted file mode 100644 index 944e436..0000000 Binary files a/bin/Windows/win64+python2.7/vnxtptrader.pyd and /dev/null differ diff --git a/bin/Windows/win64+python2.7/xtpquoteapi.dll b/bin/Windows/win64+python2.7/xtpquoteapi.dll deleted file mode 100644 index 8ae553e..0000000 Binary files a/bin/Windows/win64+python2.7/xtpquoteapi.dll and /dev/null differ diff --git a/bin/Windows/win64+python2.7/xtpquoteapi.lib b/bin/Windows/win64+python2.7/xtpquoteapi.lib deleted file mode 100644 index f4d7fdd..0000000 Binary files a/bin/Windows/win64+python2.7/xtpquoteapi.lib and /dev/null differ diff --git a/bin/Windows/win64+python2.7/xtptraderapi.dll b/bin/Windows/win64+python2.7/xtptraderapi.dll deleted file mode 100644 index 1b0c776..0000000 Binary files a/bin/Windows/win64+python2.7/xtptraderapi.dll and /dev/null differ diff --git a/bin/Windows/win64+python2.7/xtptraderapi.lib b/bin/Windows/win64+python2.7/xtptraderapi.lib deleted file mode 100644 index c78fe9a..0000000 Binary files a/bin/Windows/win64+python2.7/xtptraderapi.lib and /dev/null differ diff --git a/bin/Windows/win64+python3.6/vnxtpquote.dll b/bin/Windows/win64+python3.6/vnxtpquote.dll deleted file mode 100644 index 76eb949..0000000 Binary files a/bin/Windows/win64+python3.6/vnxtpquote.dll and /dev/null differ diff --git a/bin/Windows/win64+python3.6/vnxtpquote.pyd b/bin/Windows/win64+python3.6/vnxtpquote.pyd deleted file mode 100644 index 76eb949..0000000 Binary files a/bin/Windows/win64+python3.6/vnxtpquote.pyd and /dev/null differ diff --git a/bin/Windows/win64+python3.6/vnxtptrader.dll b/bin/Windows/win64+python3.6/vnxtptrader.dll deleted file mode 100644 index 3c3353e..0000000 Binary files a/bin/Windows/win64+python3.6/vnxtptrader.dll and /dev/null differ diff --git a/bin/Windows/win64+python3.6/vnxtptrader.pyd b/bin/Windows/win64+python3.6/vnxtptrader.pyd deleted file mode 100644 index 3c3353e..0000000 Binary files a/bin/Windows/win64+python3.6/vnxtptrader.pyd and /dev/null differ diff --git a/bin/Windows/win64+python3.6/xtpquoteapi.dll b/bin/Windows/win64+python3.6/xtpquoteapi.dll deleted file mode 100644 index 8ae553e..0000000 Binary files a/bin/Windows/win64+python3.6/xtpquoteapi.dll and /dev/null differ diff --git a/bin/Windows/win64+python3.6/xtpquoteapi.lib b/bin/Windows/win64+python3.6/xtpquoteapi.lib deleted file mode 100644 index f4d7fdd..0000000 Binary files a/bin/Windows/win64+python3.6/xtpquoteapi.lib and /dev/null differ diff --git a/bin/Windows/win64+python3.6/xtptraderapi.dll b/bin/Windows/win64+python3.6/xtptraderapi.dll deleted file mode 100644 index 1b0c776..0000000 Binary files a/bin/Windows/win64+python3.6/xtptraderapi.dll and /dev/null differ diff --git a/bin/Windows/win64+python3.6/xtptraderapi.lib b/bin/Windows/win64+python3.6/xtptraderapi.lib deleted file mode 100644 index c78fe9a..0000000 Binary files a/bin/Windows/win64+python3.6/xtptraderapi.lib and /dev/null differ diff --git a/bin/Windows/win64+python3.9/vnxtpquote.dll b/bin/Windows/win64+python3.9/vnxtpquote.dll new file mode 100644 index 0000000..d17c215 Binary files /dev/null and b/bin/Windows/win64+python3.9/vnxtpquote.dll differ diff --git a/bin/Windows/win64+python3.9/vnxtpquote.lib b/bin/Windows/win64+python3.9/vnxtpquote.lib new file mode 100644 index 0000000..17c2bd1 Binary files /dev/null and b/bin/Windows/win64+python3.9/vnxtpquote.lib differ diff --git a/bin/Windows/win64+python3.9/vnxtpquote.pyd b/bin/Windows/win64+python3.9/vnxtpquote.pyd new file mode 100644 index 0000000..d17c215 Binary files /dev/null and b/bin/Windows/win64+python3.9/vnxtpquote.pyd differ diff --git a/bin/Windows/win64+python3.9/vnxtptrader.dll b/bin/Windows/win64+python3.9/vnxtptrader.dll new file mode 100644 index 0000000..5a061e4 Binary files /dev/null and b/bin/Windows/win64+python3.9/vnxtptrader.dll differ diff --git a/bin/Windows/win64+python3.9/vnxtptrader.lib b/bin/Windows/win64+python3.9/vnxtptrader.lib new file mode 100644 index 0000000..df2efd4 Binary files /dev/null and b/bin/Windows/win64+python3.9/vnxtptrader.lib differ diff --git a/bin/Windows/win64+python3.9/vnxtptrader.pyd b/bin/Windows/win64+python3.9/vnxtptrader.pyd new file mode 100644 index 0000000..5a061e4 Binary files /dev/null and b/bin/Windows/win64+python3.9/vnxtptrader.pyd differ diff --git a/bin/Windows/win64+python3.9/xtpquoteapi.dll b/bin/Windows/win64+python3.9/xtpquoteapi.dll new file mode 100644 index 0000000..891d206 Binary files /dev/null and b/bin/Windows/win64+python3.9/xtpquoteapi.dll differ diff --git a/bin/Windows/win64+python3.9/xtpquoteapi.lib b/bin/Windows/win64+python3.9/xtpquoteapi.lib new file mode 100644 index 0000000..9c8efd5 Binary files /dev/null and b/bin/Windows/win64+python3.9/xtpquoteapi.lib differ diff --git a/bin/Windows/win64+python3.9/xtptraderapi.dll b/bin/Windows/win64+python3.9/xtptraderapi.dll new file mode 100644 index 0000000..75bcf02 Binary files /dev/null and b/bin/Windows/win64+python3.9/xtptraderapi.dll differ diff --git a/bin/Windows/win64+python3.9/xtptraderapi.lib b/bin/Windows/win64+python3.9/xtptraderapi.lib new file mode 100644 index 0000000..d8b2520 Binary files /dev/null and b/bin/Windows/win64+python3.9/xtptraderapi.lib differ diff --git a/bin/test/tradertest.py b/bin/test/tradertest.py deleted file mode 100644 index d5c374b..0000000 --- a/bin/test/tradertest.py +++ /dev/null @@ -1,840 +0,0 @@ -# encoding: UTF-8 - -import os -from time import sleep - -from vnxtptrader import * - - -def printFuncName(*args): - """""" - print('*' * 50) - print(args) - print('*' * 50) - - -class TestApi(TraderApi): - """""" - - def __init__(self): - """Constructor""" - super(TestApi, self).__init__() - - #当客户端的某个连接与交易后台通信连接断开时,该方法被调用。 - #@param reason 错误原因,请与错误代码表对应 - #@param session_id 资金账户对应的session_id,登录时得到 - #@remark 用户主动调用logout导致的断线,不会触发此函数。api不会自动重连,当断线发生时,请用户自行选择后续操作,可以在此函数中调用Login重新登录,并更新session_id,此时用户收到的数据跟断线之前是连续的 - def onDisconnected(self, reason): - """""" - printFuncName("onDisconnected", reason) - - #错误应答 - #@param error 当服务器响应发生错误时的具体的错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 - def onError(self, data): - """""" - printFuncName('onError', data) - - #报单通知 - #@param data 订单响应具体信息,用户可以通过data.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,data.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。data.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 - #@param error 订单被拒绝或者发生错误时错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param session 资金账户对应的session,登录时得到 - #@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 - def onOrderEvent(self, data, error,session): - """""" - printFuncName('onOrderEvent', data, error,session) - print("data['cancel_time']:",data['cancel_time'])#撤销时间 - print("data['update_time']:",data['update_time'])#最后修改时间 - print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 - print("data['order_client_id']:",data['order_client_id'])#报单引用 - print("data['trade_amount']:",data['trade_amount'])#成交金额 - print("data['price_type']:",data['price_type'])#报单价格条件 - print("data['order_type']:",data['order_type'])#报单类型 - print("data['price']:",data['price'])#价格 - print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 - print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 - print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - print("data['side']:",data['side'])#买卖方向 - print("data['position_effect']:",data['position_effect'])#开平标志 - print("data['reserved1']:",data['reserved1'])#预留字段1 - print("data['reserved2']:",data['reserved2'])#预留字段2 - print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 - print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss - print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 - print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - print("data['ticker']:",data['ticker'])#合约代码 - print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 - print("data['business_type']:",data['business_type'])#业务类型 - print("error['error_id']:",error['error_id'])# - print("error['error_msg']:",error['error_msg'])# - - #成交通知 - #@param data 成交回报的具体信息,用户可以通过data.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 - #@param session 资金账户对应的session,登录时得到 - #@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 - def onTradeEvent(self, data,session): - """""" - printFuncName('onTradeEvent', data,session) - print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 - print("data['trade_amount']:",data['trade_amount'])#成交金额,此次成交的总金额 = price*quantity - print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 - print("data['trade_type']:",data['trade_type'])#成交类型 --成交回报中的执行类型 - print("data['order_client_id']:",data['order_client_id'])#报单引用 - print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 - print("data['price']:",data['price'])#价格,此次成交的价格 - print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 - print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss - print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 - print("data['ticker']:",data['ticker'])#合约代码 - print("data['side']:",data['side'])#买卖方向 - print("data['position_effect']:",data['position_effect'])#开平标志 - print("data['reserved1']:",data['reserved1'])#预留字段 - print("data['reserved2']:",data['reserved2'])#预留字段 - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 - print("data['business_type']:",data['business_type'])#业务类型 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #撤单出错响应 - #@param data 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id - #@param error 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error为空,或者error.error_id为0时,表明没有错误 - #@param session 资金账户对应的session,登录时得到 - #@remark 此响应只会在撤单发生错误时被回调 - def onCancelOrderError(self, data, error,session): - """""" - printFuncName('onCancelOrderError', data, error,session) - - #请求查询报单响应 - #@param data 查询到的一个报单 - #@param error 查询报单时发生错误时,返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - def onQueryOrder(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryOrder', data, error, reqid, last,session) - print("data['cancel_time']:",data['cancel_time'])#撤销时间 - print("data['update_time']:",data['update_time'])#最后修改时间 - print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 - print("data['order_client_id']:",data['order_client_id'])#报单引用 - print("data['trade_amount']:",data['trade_amount'])#成交金额 - print("data['price_type']:",data['price_type'])#报单价格条件 - print("data['order_type']:",data['order_type'])#报单类型 - print("data['price']:",data['price'])#价格 - print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 - print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 - print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - print("data['side']:",data['side'])#买卖方向 - print("data['position_effect']:",data['position_effect'])#开平标志 - print("data['reserved1']:",data['reserved1'])#预留字段1 - print("data['reserved2']:",data['reserved2'])#预留字段2 - print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 - print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss - print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 - print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - print("data['ticker']:",data['ticker'])#合约代码 - print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 - print("data['business_type']:",data['business_type'])#业务类型 - print("error['error_id']:",error['error_id'])# - print("error['error_msg']:",error['error_msg'])# - - #分页请求查询报单响应 - #@param data 查询到的一个报单 - #@param req_count 分页请求的最大数量 - #@param order_sequence 分页请求的当前回报数量 - #@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - def onQueryOrderByPage(self, data, req_count,order_sequence,query_reference, reqid, last,session): - """""" - printFuncName('onQueryOrderByPage', data, req_count,order_sequence,query_reference, reqid, last,session) - print("data['cancel_time']:",data['cancel_time'])#撤销时间 - print("data['update_time']:",data['update_time'])#最后修改时间 - print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 - print("data['order_client_id']:",data['order_client_id'])#报单引用 - print("data['trade_amount']:",data['trade_amount'])#成交金额 - print("data['price_type']:",data['price_type'])#报单价格条件 - print("data['order_type']:",data['order_type'])#报单类型 - print("data['price']:",data['price'])#价格 - print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 - print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 - print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 - print("data['side']:",data['side'])#买卖方向 - print("data['position_effect']:",data['position_effect'])#开平标志 - print("data['reserved1']:",data['reserved1'])#预留字段1 - print("data['reserved2']:",data['reserved2'])#预留字段2 - print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 - print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss - print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 - print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 - print("data['ticker']:",data['ticker'])#合约代码 - print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 - print("req_count:",req_count)#分页请求的最大数量 - print("order_sequence:",order_sequence)#分页请求的当前回报数量 - print("query_reference:",query_reference)#当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - print("reqid:",reqid)#此消息响应函数对应的请求ID - print("last:",last)#此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - print("session:",session)#资金账户对应的session,登录时得到 - - #请求查询成交响应 - #@param data 查询到的一个成交回报 - #@param error 查询成交回报发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - def onQueryTrade(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryTrade', data, error, reqid, last,session) - print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 - print("data['trade_amount']:",data['trade_amount'])#成交金额,此次成交的总金额 = price*quantity - print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 - print("data['trade_type']:",data['trade_type'])#成交类型 --成交回报中的执行类型 - print("data['order_client_id']:",data['order_client_id'])#报单引用 - print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 - print("data['price']:",data['price'])#价格,此次成交的价格 - print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 - print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss - print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 - print("data['ticker']:",data['ticker'])#合约代码 - print("data['side']:",data['side'])#买卖方向 - print("data['position_effect']:",data['position_effect'])#开平标志 - print("data['reserved1']:",data['reserved1'])#预留字段 - print("data['reserved2']:",data['reserved2'])#预留字段 - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 - print("data['business_type']:",data['business_type'])#业务类型 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #分页请求查询成交响应 - #@param data 查询到的一个成交回报 - #@param req_count 分页请求的最大数量 - #@param trade_sequence 分页请求的当前回报数量 - #@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 - def onQueryTradeByPage(self, data, req_count, trade_sequence, query_reference, reqid, last,session): - """""" - printFuncName('onQueryTradeByPage', data, req_count, trade_sequence, query_reference, reqid, last,session) - print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 - print("data['trade_amount']:",data['trade_amount'])#成交金额,此次成交的总金额 = price*quantity - print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 - print("data['trade_type']:",data['trade_type'])#成交类型 --成交回报中的执行类型 - print("data['order_client_id']:",data['order_client_id'])#报单引用 - print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 - print("data['price']:",data['price'])#价格,此次成交的价格 - print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 - print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss - print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 - print("data['ticker']:",data['ticker'])#合约代码 - print("data['side']:",data['side'])#买卖方向 - print("data['position_effect']:",data['position_effect'])#开平标志 - print("data['reserved1']:",data['reserved1'])#预留字段 - print("data['reserved2']:",data['reserved2'])#预留字段 - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 - print("data['business_type']:",data['business_type'])#业务类型 - print("req_count:",req_count)#分页请求的最大数量 - print("trade_sequence:",trade_sequence)#分页请求的当前回报数量 - print("query_reference:",query_reference)#当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 - print("reqid:",reqid)#此消息响应函数对应的请求ID - print("last:",last)#此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - print("session:",session)#资金账户对应的session,登录时得到 - - #请求查询投资者持仓响应 - #@param data 查询到的一只股票的持仓情况 - #@param error 查询账户持仓发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryPosition(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryPosition', data, error, reqid, last,session) - print("data['ticker']:",data['ticker'])#证券代码 - print("data['ticker_name']:",data['ticker_name'])#证券名称 - print("data['market']:",data['market'])#交易市场 - print("data['total_qty']:",data['total_qty'])#总持仓 - print("data['sellable_qty']:",data['sellable_qty'])#可卖持仓 - print("data['avg_price']:",data['avg_price'])#持仓成本 - print("data['unrealized_pnl']:",data['unrealized_pnl'])#浮动盈亏(保留字段) - print("data['yesterday_position']:",data['yesterday_position'])#昨日持仓 - print("data['purchase_redeemable_qty']:",data['purchase_redeemable_qty'])#今日申购赎回数量(申购和赎回数量不可能同时存在,因此可以共用一个字段) - print("data['position_direction']:",data['position_direction'])#持仓方向 - print("data['reserved1']:",data['reserved1'])#保留字段 - print("data['executable_option']:",data['executable_option'])#可行权合约 - print("data['lockable_position']:",data['lockable_position'])#可锁定标的 - print("data['executable_underlying']:",data['executable_underlying'])#可行权标的 - print("data['locked_position']:",data['locked_position'])#已锁定标的 - print("data['usable_locked_position']:",data['usable_locked_position'])#可用已锁定标的 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - - #请求查询资金账户响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的资金账户情况 - #@param error 查询资金账户发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryAsset(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryAsset', data, error, reqid, reqid, last,session) - print("data['total_asset']:",data['total_asset'])#总资产(=可用资金 + 证券资产(目前为0)+ 预扣的资金) - print("data['buying_power']:",data['buying_power'])#可用资金 - print("data['security_asset']:",data['security_asset'])#证券资产(保留字段,目前为0) - print("data['fund_buy_amount']:",data['fund_buy_amount'])#累计买入成交证券占用资金 - print("data['fund_buy_fee']:",data['fund_buy_fee'])#累计买入成交交易费用 - print("data['fund_sell_amount']:",data['fund_sell_amount'])#累计卖出成交证券所得资金 - print("data['fund_sell_fee']:",data['fund_sell_fee'])#累计卖出成交交易费用 - print("data['withholding_amount']:",data['withholding_amount'])#XTP系统预扣的资金(包括购买卖股票时预扣的交易资金+预扣手续费) - print("data['account_type']:",data['account_type'])#账户类型 - print("data['frozen_margin']:",data['frozen_margin'])#冻结的保证金 - print("data['frozen_exec_cash']:",data['frozen_exec_cash'])#行权冻结资金 - print("data['frozen_exec_fee']:",data['frozen_exec_fee'])#行权费用 - print("data['pay_later']:",data['pay_later'])#垫付资金 - print("data['preadva_pay']:",data['preadva_pay'])#预垫付资金 - print("data['orig_banlance']:",data['orig_banlance'])#昨日余额 - print("data['banlance']:",data['banlance'])#当前余额 - print("data['deposit_withdraw']:",data['deposit_withdraw'])#当天出入金 - print("data['trade_netting']:",data['trade_netting'])#当日交易资金轧差 - print("data['captial_asset']:",data['captial_asset'])#资金资产 - print("data['force_freeze_amount']:",data['force_freeze_amount'])#强锁资金 - print("data['preferred_amount']:",data['preferred_amount'])#可取资金 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #请求查询分级基金信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的分级基金情况 - #@param error 查询分级基金发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryStructuredFund(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryStructuredFund', data, error, reqid, last,session) - print("data['exchange_id']:",data['exchange_id'])#交易所代码 - print("data['sf_ticker']:",data['sf_ticker'])#分级基金母基金代码 - print("data['sf_ticker_name']:",data['sf_ticker_name'])#分级基金母基金名称 - print("data['ticker']:",data['ticker'])#分级基金子基金代码 - print("data['ticker_name']:",data['ticker_name'])#分级基金子基金名称 - print("data['split_merge_status']:",data['split_merge_status'])#基金允许拆分合并状态 - print("data['ratio']:",data['ratio'])#拆分合并比例 - print("data['min_split_qty']:",data['min_split_qty'])#最小拆分数量 - print("data['min_merge_qty']:",data['min_merge_qty'])#最小合并数量 - print("data['net_price']:",data['net_price'])#基金净值 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #请求查询资金划拨订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的资金账户情况 - #@param error 查询资金账户发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryFundTransfer(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryFundTransfer', data, error, reqid, last,session) - print("data['serial_id']:",data['serial_id'])#资金内转编号 - print("data['transfer_type']:",data['transfer_type'])#内转类型 - print("data['amount']:",data['amount'])#金额 - print("data['oper_status']:",data['oper_status'])#操作结果 - print("data['transfer_time']:",data['transfer_time'])#操作时间 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #资金划拨通知 - #@param data 资金划拨通知的具体信息,用户可以通过data.serial_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 - #@param error 资金划拨订单被拒绝或者发生错误时错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误。当资金划拨方向为一号两中心节点之间划拨,且error.error_id=11000382时,error.error_msg为结点中可用于划拨的资金(以整数为准),用户需进行stringToInt的转化,可据此填写合适的资金,再次发起划拨请求 - #@param session 资金账户对应的session,登录时得到 - #@remark 当资金划拨订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的资金划拨通知。 - def onFundTransfer(self, data, error,session): - """""" - printFuncName('onFundTransfer', data, error,session) - print("data['serial_id']:",data['serial_id'])#资金内转编号 - print("data['transfer_type']:",data['transfer_type'])#内转类型 - print("data['amount']:",data['amount'])#金额 - print("data['oper_status']:",data['oper_status'])#操作结果 - print("data['transfer_time']:",data['transfer_time'])#操作时间 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #请求查询ETF清单文件的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的ETF清单文件情况 - #@param error 查询ETF清单文件发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryETF(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryETF', data, error, reqid, last,session) - print("data['market']:",data['market'])#交易市场 - print("data['etf']:",data['etf'])#etf代码,买卖,申赎统一使用该代码 - print("data['subscribe_redemption_ticker']:",data['subscribe_redemption_ticker'])#etf申购赎回代码 - print("data['unit']:",data['unit'])#最小申购赎回单位对应的ETF份数,例如上证"50ETF"就是900000 - print("data['subscribe_status']:",data['subscribe_status'])#是否允许申购,1-允许,0-禁止 - print("data['redemption_status']:",data['redemption_status'])#是否允许赎回,1-允许,0-禁止 - print("data['max_cash_ratio']:",data['max_cash_ratio'])#最大现金替代比例,小于1的数值 TODO 是否采用double - print("data['estimate_amount']:",data['estimate_amount'])#T日预估金额 - print("data['cash_component']:",data['cash_component'])#T-X日现金差额 - print("data['net_value']:",data['net_value'])#基金单位净值 - print("data['total_amount']:",data['total_amount'])#最小申赎单位净值总金额=net_value*unit - print("error['error_id']:",error['error_id'])# - print("error['error_msg']:",error['error_msg'])# - - #请求查询ETF股票篮的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的ETF合约的相关成分股信息 - #@param error 查询ETF股票篮发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryETFBasket(self, data, error, reqid, last, session): - """""" - printFuncName('onQueryETFBasket', data, error, reqid, last, session) - print("data['market']:",data['market'])#交易市场 - print("data['ticker']:",data['ticker'])#ETF代码 - print("data['component_ticker']:",data['component_ticker'])#成份股代码 - print("data['component_name']:",data['component_name'])#成份股名称 - print("data['quantity']:",data['quantity'])#成份股数量 - print("data['component_market']:",data['component_market'])#成份股交易市场 - print("data['replace_type']:",data['replace_type'])#成份股替代标识 - print("data['premium_ratio']:",data['premium_ratio'])#溢价比例 - print("data['amount']:",data['amount'])#成分股替代标识为必须现金替代时候的总金额 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #请求查询今日新股申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的今日新股申购的一只股票信息 - #@param error 查询今日新股申购信息列表发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reqid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryIPOInfoList(self, data, error, reqid, last,session): - """""" - printFuncName('onQueryIPOInfoList', data, error, reqid, last,session) - print("data['market']:",data['market'])#交易市场 - print("data['ticker']:",data['ticker'])#申购代码 - print("data['ticker_name']:",data['ticker_name'])#申购股票名称 - print("data['price']:",data['price'])#申购价格 - print("data['unit']:",data['unit'])#申购单元 - print("data['qty_upper_limit']:",data['qty_upper_limit'])#最大允许申购数量 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #请求查询用户新股申购额度信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的用户某个市场的今日新股申购额度信息 - #@param error 查查询用户新股申购额度信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryIPOQuotaInfo(self, data, error, reid, last,session): - """""" - printFuncName('onQueryIPOQuotaInfo', data, error, reqid, last,session) - print("data['market']:",data['market'])#交易市场 - print("data['quantity']:",data['quantity'])#可申购额度 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - #请求查询期权合约的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - #@param data 查询到的期权合约情况 - #@param error 查查询用户新股申购额度信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 - #@param reid 此消息响应函数对应的请求ID - #@param last 此消息响应函数是否为reid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 - #@param session 资金账户对应的session,登录时得到 - #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 - def onQueryOptionAuctionInfo(self, data, error, reid, last,session): - """""" - printFuncName('onQueryOptionAuctionInfo', data, error, reqid, last,session) - print("data['ticker']:",data['ticker'])#合约编码,报单ticker采用本字段 - print("data['security_id_source']:",data['security_id_source'])#证券代码源 - print("data['symbol']:",data['symbol'])#合约简称 - print("data['contract_id']:",data['contract_id'])#合约交易代码 - print("data['underlying_security_id']:",data['underlying_security_id'])#基础证券代码 - print("data['underlying_security_id_source']:",data['underlying_security_id_source'])#基础证券代码源 - - print("data['list_date']:",data['list_date'])#上市日期,格式为YYYYMMDD - print("data['last_trade_date']:",data['last_trade_date'])#最后交易日,格式为YYYYMMDD - print("data['ticker_type']:",data['ticker_type'])#证券类别 - print("data['day_trading']:",data['day_trading'])#是否支持当日回转交易,1-允许,0-不允许 - - print("data['call_or_put']:",data['call_or_put'])#认购或认沽 - print("data['delivery_day']:",data['delivery_day'])#行权交割日,格式为YYYYMMDD - print("data['delivery_month']:",data['delivery_month'])#交割月份,格式为YYYYMM - - print("data['exercise_type']:",data['exercise_type'])#行权方式 - print("data['exercise_begin_date']:",data['exercise_begin_date'])#行权起始日期,格式为YYYYMMDD - print("data['exercise_end_date']:",data['exercise_end_date'])#行权结束日期,格式为YYYYMMDD - print("data['exercise_price']:",data['exercise_price'])#行权价格 - - print("data['qty_unit']:",data['qty_unit'])#数量单位,对于某一证券申报的委托,其委托数量字段必须为该证券数量单位的整数倍 - print("data['contract_unit']:",data['contract_unit'])#合约单位 - print("data['contract_position']:",data['contract_position'])#合约持仓量 - print("data['prev_close_price']:",data['prev_close_price'])#合约前收盘价 - print("data['prev_clearing_price']:",data['prev_clearing_price'])#合约前结算价 - print("data['lmt_buy_max_qty']:",data['lmt_buy_max_qty'])#限价买最大量 - print("data['lmt_buy_min_qty']:",data['lmt_buy_min_qty'])#限价买最小量 - print("data['lmt_sell_max_qty']:",data['lmt_sell_max_qty'])#限价卖最大量 - print("data['lmt_sell_min_qty']:",data['lmt_sell_min_qty'])#限价卖最小量 - print("data['mkt_buy_max_qty']:",data['mkt_buy_max_qty'])#市价买最大量 - print("data['mkt_buy_min_qty']:",data['mkt_buy_min_qty'])#市价买最小量 - print("data['mkt_sell_max_qty']:",data['mkt_sell_max_qty'])#市价卖最大量 - print("data['mkt_sell_min_qty']:",data['mkt_sell_min_qty'])#市价卖最小量 - print("data['price_tick']:",data['price_tick'])#最小报价单位 - print("data['upper_limit_price']:",data['upper_limit_price'])#涨停价 - print("data['lower_limit_price']:",data['lower_limit_price'])#跌停价 - print("data['sell_margin']:",data['sell_margin'])#今卖开每张保证金 - print("data['margin_ratio_param1']:",data['margin_ratio_param1'])#交易所保证金比例计算参数一 - print("data['margin_ratio_param2']:",data['margin_ratio_param2'])#交易所保证金比例计算参数二 - print("error['error_id']:",error['error_id']) - print("error['error_msg']:",error['error_msg']) - - -if __name__ == '__main__': - ip = '120.27.164.69' - port = 6001 - user = 'user' - password = 'password' - reqid = 0 - - #创建TraderApi - #@param client_id (必须输入)客户端id,用于区分同一用户的不同客户端,由用户自定义 - #@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个真实存在的有可写权限的路径 - #@param log_level 日志输出级别“0”代表严重错误级别,“1”代表错误级别,“2”代表警告级别,“3”代表info级别,“4”代表debug级别,“5”代表trace级别 - #@return 创建出的UserApi - #@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接。系统不支持过夜,请确保每天开盘前重新启动 - api = TestApi() - createTraderApi = api.createTraderApi(1, os.getcwd(),4) - printFuncName('createTraderApi', createTraderApi) - - #订阅公共流。 - #@param resume_type 公共流(订单响应、成交回报)重传方式 - # XTP_TERT_RESTART(0):从本交易日开始重传 - # XTP_TERT_RESUME(1):(保留字段,此方式暂未支持)从上次收到的续传 - # XTP_TERT_QUICK(2):只传送登录后公共流的内容 - #@remark 该方法要在Login方法前调用。若不调用则不会收到公共流的数据。注意在用户断线后,如果不登出就login(),公共流订阅方式不会起作用。用户只会收到断线后的所有消息。如果先logout()再login(),那么公共流订阅方式会起作用,用户收到的数据会根据用户的选择方式而定。 - subscribePublicTopic = api.subscribePublicTopic(0) - printFuncName('subscribePublicTopic', subscribePublicTopic) - - #设置软件开发Key - #@param key 用户开发软件Key - #@remark 此函数必须在Login之前调用 - setSoftwareKey = api.setSoftwareKey("b8aa7173bba3470e390d787219b2112e") - printFuncName('setSoftwareKey', setSoftwareKey) - - #设置软件开发版本号 - #@param version 用户开发软件版本号,非api发行版本号,长度不超过15位 - #@remark 此函数必须在Login之前调用,标识的是客户端版本号,而不是API的版本号,由用户自定义 - setSoftwareVersion = api.setSoftwareVersion("test") - printFuncName('setSoftwareVersion', setSoftwareVersion) - - #用户登录请求 - #@return session表明此资金账号登录是否成功,“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,非“0”表示登录成功,此时需要记录下这个返回值session,与登录的资金账户对应 - #@param ip 服务器地址,类似“127.0.0.1” - #@param port 服务器端口号 - #@param user 登录用户名 - #@param password 登录密码 - #@param sock_type “1”代表TCP,“2”代表UDP,目前暂时只支持TCP - #@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api可支持多个账户连接,但是同一个账户同一个client_id只能有一个session连接,后面的登录在前一个session存续期间,无法连接 - session = api.login(ip, port, user, password, 1) - printFuncName('login', session) - - #服务器是否重启过 - #@return “true”表示重启过,“false”表示没有重启过 - #@param session_id 资金账户对应的session_id,登录时得到 - #@remark 此函数必须在Login之后调用 - retIsServerRestart = api.isServerRestart(session) - printFuncName('isServerRestart', retIsServerRestart) - - #获取当前交易日 - #return 获取到的交易日 - #@remark 只有登录成功后,才能得到正确的交易日 - retGetTradingDay = api.getTradingDay() - printFuncName('getTradingDay', retGetTradingDay) - - #获取API的发行版本号 - #@return 返回api发行版本号 - retGetApiVersion = api.getApiVersion() - printFuncName('getApiVersion',retGetApiVersion) - - #获取API的系统错误 - #@return 返回的错误信息,可以在Login、InsertOrder、CancelOrder返回值为0时调用,获取失败的原因 - #@remark 可以在调用api接口失败时调用,例如login失败时 - retGetApiLastError = api.getApiLastError() - printFuncName('getApiLastError',retGetApiLastError) - - #通过报单在xtp系统中的ID获取下单的客户端id - #@return 返回客户端id,可以用此方法过滤自己下的订单 - #@param order_xtp_id 报单在xtp系统中的ID - #@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 - order_xtp_id = 36989101307593706 - retGetClientIdByXTPID = api.getClientIDByXTPID(order_xtp_id) - printFuncName('getClientIDByXTPID',retGetClientIdByXTPID) - - #通过报单在xtp系统中的ID获取相关资金账户名 - #@return 返回资金账户名 - #@param order_xtp_id 报单在xtp系统中的ID - #@remark 只有资金账户登录成功后,才能得到正确的信息 - retGetAccountByXTPID = api.getAccountByXTPID(order_xtp_id) - printFuncName('getAccountByXTPID',retGetAccountByXTPID) - - #报单录入请求 - #@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 资金账户对应的session,登录时得到 - #@remark 交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 - - sleep(2) - order = {} - order['ticker'] = '000001' # 平安银行 - order['market'] = 1 # 深圳A股 - order['price'] = 8.5 - order['quantity'] = 100 - order['price_type'] = 1 # 限价单 - order['side'] = 1 # 买 - order['position_effect'] = 1 # 开仓 - order['business_type'] = 0 # 普通股票业务(股票买卖,ETF买卖等) - - retInsertOrder = api.insertOrder(order, session) - printFuncName('insertOrder', retInsertOrder) - - #报单操作请求 - #@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - #@param retInsertOrder 需要撤销的委托单在XTP系统中的ID - #@param session 资金账户对应的session,登录时得到 - #@remark 如果撤单成功,会在报单响应函数OnOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 - sleep(2) - retCancelOrder = api.cancelOrder(retInsertOrder, session) - printFuncName('cancelOrder',retCancelOrder) - - #根据报单ID请求查询报单 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - reqid += 1 - retQueryOrderByXTPID = api.queryOrderByXTPID(order_xtp_id,session,reqid) - printFuncName('queryOrderByXTPID',retQueryOrderByXTPID) - - #请求查询报单 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param queryOrdersInfo 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - queryOrdersInfo = {} - queryOrdersInfo['ticker'] = '000001' - queryOrdersInfo['begin_time'] = 0 - queryOrdersInfo['end_time'] = 0 - sleep(1) - reqid += 1 - retQueryOrders = api.queryOrders(queryOrdersInfo, session, reqid) - printFuncName('queryOrders',retQueryOrders) - - #分页请求查询报单 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 - #@param session_id 资金账户对应的session_id,登录时得到 - #@param request_id 用于用户定位查询响应的ID,由用户自定义 - #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 sleep(1) - queryOrderByPageReq = {} - queryOrderByPageReq['req_count'] = 10 #需要查询的成交回报条数 - queryOrderByPageReq['reference'] = 0 #上一次收到的查询订单结果中带回来的索引,如果是从头查询,请置0 - queryOrderByPageReq['reserved'] = 0 #保留字段 - sleep(1) - reqid += 1 - retQueryOrdersByPage = api.queryOrdersByPage(queryOrderByPageReq, session, reqid) - printFuncName('queryOrdersByPage', retQueryOrdersByPage) - - #根据委托编号请求查询相关成交 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - #@remark 此函数查询出的结果可能对应多个查询结果响应 - sleep(1) - reqid += 1 - retQueryTradesByXTPID = api.queryTradesByXTPID(order_xtp_id, session, reqid) - printFuncName('queryTradesByXTPID', retQueryTradesByXTPID) - - sleep(1) - #请求查询已成交 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param queryTradesInfo 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 - queryTradesInfo = {} - queryTradesInfo['ticker'] = '000001' - queryTradesInfo['begin_time'] = 0 - queryTradesInfo['end_time'] = 0 - reqid += 1 - retQueryTrades = api.queryTrades(queryTradesInfo, session, reqid) - printFuncName('queryTrades',retQueryTrades) - - sleep(1) - #分页请求查询成交回报 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 - #@param session_id 资金账户对应的session_id,登录时得到 - #@param request_id 用于用户定位查询响应的ID,由用户自定义 - #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 - queryTraderByPageReq = {} - queryTraderByPageReq['req_count'] = 10 #需要查询的成交回报条数 - queryTraderByPageReq['reference'] = 0 #上一次收到的查询成交回报结果中带回来的索引,如果是从头查询,请置0 - queryTraderByPageReq['reserved'] = 0 #保留字段 - sleep(1) - reqid += 1 - retQueryTradesByPage = api.queryTradesByPage(queryTraderByPageReq, session, reqid) - printFuncName('queryTradesByPage', retQueryTradesByPage) - - sleep(1) - #请求查询投资者持仓 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param ticker 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格 - #@param session_id 资金账户对应的session_id,登录时得到 - #@param request_id 用于用户定位查询响应的ID,由用户自定义 - #@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - reqid += 1 - retQueryPosition = api.queryPosition('', session, reqid) - printFuncName('queryPosition',retQueryPosition) - - sleep(1) - #请求查询资产 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - reqid += 1 - retQueryAsset = api.queryAsset(session, reqid) - printFuncName('queryAsset',retQueryAsset) - - sleep(1) - #请求查询分级基金 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param query_param 需要查询的分级基金筛选条件,其中母基金代码可以为空,则默认所有存在的母基金,如果不为空,请不带空格,其中交易市场不能为空 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - #@remark 此函数查询出的结果可能对应多个查询结果响应 - reqid += 1 - retQueryStructuredFund = api.queryStructuredFund({},session, reqid) - printFuncName('queryStructuredFund',retQueryStructuredFund) - - sleep(1) - #资金划拨请求 - #@return 资金划拨订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 - #@param fundTransferInfo 资金划拨的请求信息 - #@param session 资金账户对应的session,登录时得到 - #@remark 此函数支持一号两中心节点之间的资金划拨,注意资金划拨的方向。 - reqid += 1 - fundTransferInfo = {} - fundTransferInfo['serial_id'] = 30000 - fundTransferInfo['fund_account'] = '15006594' - fundTransferInfo['password'] = 'SitHAKln' - fundTransferInfo['amount'] = 20000 - fundTransferInfo['transfer_type'] = 0 - retFundTransfer = api.fundTransfer(fundTransferInfo, session) - printFuncName('fundTransfer', retFundTransfer) - - sleep(1) - #请求查询资金划拨 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param query_param 需要查询的资金划拨订单筛选条件,其中serial_id可以为0,则默认所有资金划拨订单,如果不为0,则请求特定的资金划拨订单 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - reqid += 1 - retQueryFundTransfer = api.queryFundTransfer({'amount': 20000}, session, reqid) - printFuncName('queryFundTransfer', retQueryFundTransfer) - - sleep(1) - #请求查询ETF清单文件 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param queryETFInfo 需要查询的ETF清单文件的筛选条件,其中合约代码可以为空,则默认所有存在的ETF合约代码,market字段也可以为初始值,则默认所有市场的ETF合约 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - queryETFInfo = {} - queryETFInfo['ticker'] = '510050' - queryETFInfo['market'] = 2 - reqid += 1 - retQueryETF = api.queryETF(queryETFInfo, session, reqid) - printFuncName('queryETF', retQueryETF) - - sleep(1) - #请求查询ETF股票篮 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param queryETFTickerBasketInfo 需要查询股票篮的的ETF合约,其中合约代码不可以为空,market字段也必须指定 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - queryETFTickerBasketInfo = {} - queryETFTickerBasketInfo['ticker'] = '510050' - queryETFTickerBasketInfo['market'] = 2 - reqid += 1 - retQueryETFTickerBasket = api.queryETFTickerBasket(queryETFInfo,session, reqid) - printFuncName('queryETFTickerBasket',retQueryETFTickerBasket) - - #请求查询今日新股申购信息列表 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - reqid += 1 - retQueryIPOInfoList = api.queryIPOInfoList(session, reqid) - printFuncName('queryIPOInfoList',retQueryIPOInfoList) - - #请求查询用户新股申购额度信息 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param session 资金账户对应的session_id,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - reqid += 1 - retQueryIPOQuotaInfo = api.queryIPOQuotaInfo(session, reqid) - printFuncName('queryIPOQuotaInfo',retQueryIPOQuotaInfo) - - #请求查询期权合约 - #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 - #@param query_param 需要查询的期权合约的筛选条件,可以为NULL(为NULL表示查询所有的期权合约) - #@param session 资金账户对应的session,登录时得到 - #@param reqid 用于用户定位查询响应的ID,由用户自定义 - queryOptionAuctionInfo = {} - queryOptionAuctionInfo['ticker'] = '10000001' - queryOptionAuctionInfo['market'] = 2 - reqid += 1 - retQueryOptionAuctionInfo = api.queryOptionAuctionInfo(queryOptionAuctionInfo,session, reqid) - printFuncName('queryOptionAuctionInfo',retQueryOptionAuctionInfo) - - #sleep为了删除接口对象前将回调数据输出,不sleep直接删除回调对象会自动析构,无法返回回调的数据 - sleep(5) - - #登出请求 - #@return 登出是否成功,“0”表示登出成功,“-1”表示登出失败 - #@param session 资金账户对应的session,登录时得到 - logout = api.logout(session) - printFuncName('logout:',logout ) - - #删除接口对象本身 - #@remark 不再使用本接口对象时,调用该函数删除接口对象 - release = api.release() - printFuncName('release', release) - - exit = api.exit() - printFuncName('exit', exit) - diff --git "a/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" "b/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" new file mode 100644 index 0000000..10dc093 Binary files /dev/null and "b/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" differ diff --git "a/doc/Linux+boost+python3+gcc\347\274\226\350\257\221\350\257\264\346\230\216\346\226\207\346\241\243.docx" "b/doc/Linux+boost+python3+gcc\347\274\226\350\257\221\350\257\264\346\230\216\346\226\207\346\241\243.docx" deleted file mode 100644 index d7c0cd7..0000000 Binary files "a/doc/Linux+boost+python3+gcc\347\274\226\350\257\221\350\257\264\346\230\216\346\226\207\346\241\243.docx" and /dev/null differ 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" new file mode 100644 index 0000000..7cefaf9 Binary files /dev/null and "b/doc/boost.python\347\274\226\350\257\221\350\257\264\346\230\216.docx" differ diff --git "a/doc/win7+boost+python3+vs2010\347\274\226\350\257\221\350\257\264\346\230\216\346\226\207\346\241\243.docx" "b/doc/win7+boost+python3+vs2010\347\274\226\350\257\221\350\257\264\346\230\216\346\226\207\346\241\243.docx" deleted file mode 100644 index 4010226..0000000 Binary files "a/doc/win7+boost+python3+vs2010\347\274\226\350\257\221\350\257\264\346\230\216\346\226\207\346\241\243.docx" and /dev/null differ diff --git a/source/Linux/xtp_python3_18.19/CMakeLists.txt b/source/Linux/xtp_api_python3_2.2.42.1/CMakeLists.txt similarity index 77% rename from source/Linux/xtp_python3_18.19/CMakeLists.txt rename to source/Linux/xtp_api_python3_2.2.42.1/CMakeLists.txt index f933ab7..7e03c1a 100644 --- a/source/Linux/xtp_python3_18.19/CMakeLists.txt +++ b/source/Linux/xtp_api_python3_2.2.42.1/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8) -project(vn_xtp_api) +project(vn_xtp_api) # 设置使用的编译器 set(CMAKE_BUILD_TYPE "Release") @@ -54,27 +54,27 @@ endif() # 设置Python所在的目录 set(PYTHON_LIBRARY ) if (WIN32) - set(PYTHON_INCLUDE_PATH D:/xtpIDE/Python/Python36-32/include) - link_directories(D:/xtpIDE/Python/Python36-32/libs) + 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.6m/) + set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.9/) include_directories(${PYTHON_INCLUDE_PATH}) endif() -# 链接boost库,anaconda /python3用的是python3.6没有用Anaconda +# 链接boost库,anaconda /python3用的是python3.9没有用Anaconda set(BOOST_ROOT ) if (WIN32) - set(BOOST_ROOT D:/xtp/soft/boost_1_57_0_python3_32/boost_1_57_0/) + set(BOOST_ROOT D:/MyThird/boost_1_80_0) set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 - link_directories(D:/xtp/soft/boost_1_57_0_python3_32/boost_1_57_0/stage/lib) + link_directories(D:/MyThird/boost_1_80_0/stage/lib) include_directories(${BOOST_ROOT}) elseif(UNIX) set(Boost_USE_MULTITHREADED ON) - set(BOOST_ROOT /home/likunliang/boost_1_66_0_python3/) - find_package(Boost 1.66.0 COMPONENTS python3 thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 + 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() @@ -87,17 +87,17 @@ 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/vnxtpquote) + 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/vnxtpquote.cpp) + 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/vnxtptrader/) + 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/vnxtptrader.cpp) + set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader.cpp) add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) endif() @@ -111,7 +111,7 @@ 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") +set(MD_DLL ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.dll) if (EXISTS ${MD_DLL}) file(RENAME ${MD_DLL} ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.pyd) endif() diff --git a/source/Linux/xtp_api_python3_2.2.42.1/README.md b/source/Linux/xtp_api_python3_2.2.42.1/README.md new file mode 100644 index 0000000..8f7ceab --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/README.md @@ -0,0 +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封装库)。 + +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/Linux/xtp_python2_18.19/build.sh b/source/Linux/xtp_api_python3_2.2.42.1/build.sh similarity index 100% rename from source/Linux/xtp_python2_18.19/build.sh rename to source/Linux/xtp_api_python3_2.2.42.1/build.sh diff --git a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/ReadMe.txt b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/ReadMe.txt similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/ReadMe.txt rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/ReadMe.txt diff --git a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/dllmain.cpp b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/dllmain.cpp similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/dllmain.cpp rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/dllmain.cpp diff --git a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/libsodium.dll b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/libsodium.dll similarity index 100% rename from source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/libsodium.dll rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/libsodium.dll diff --git a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/stdafx.cpp b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.cpp similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/stdafx.cpp rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.cpp diff --git a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/stdafx.h b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.h similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/stdafx.h rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.h diff --git a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/targetver.h b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/targetver.h similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/targetver.h rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/targetver.h diff --git a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/vnxtpquote.cpp b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.cpp similarity index 63% rename from source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/vnxtpquote.cpp rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.cpp index 2f080af..1616eb0 100644 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/vnxtpquote.cpp +++ b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.cpp @@ -33,6 +33,32 @@ void getDouble(dict d, string key, double *value) } }; +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)) @@ -69,6 +95,11 @@ void getChar(dict d, string key, char *value) } }; +string addEndingChar(char *value){ + string endStr = value; + return endStr; +} + ///------------------------------------------------------------------------------------- ///C++Ļصݱ浽 ///------------------------------------------------------------------------------------- @@ -96,6 +127,15 @@ void QuoteApi::OnError(XTPRI *error_info) 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(); @@ -180,6 +220,21 @@ void QuoteApi::OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t 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(); @@ -350,7 +405,7 @@ void QuoteApi::OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error void QuoteApi::OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) { Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLMARKETDATA; + task->task_name = ONUNSUBSCRIBEALLORDERBOOK; if (error_info) { @@ -440,6 +495,102 @@ void QuoteApi::OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, b }; +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) { @@ -688,6 +839,47 @@ void QuoteApi::processTask() 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; + } }; } }; @@ -709,7 +901,7 @@ void QuoteApi::processError(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -717,6 +909,13 @@ void QuoteApi::processError(Task *task) 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; @@ -725,7 +924,7 @@ void QuoteApi::processSubMarketData(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -734,7 +933,7 @@ void QuoteApi::processSubMarketData(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -750,7 +949,7 @@ void QuoteApi::processUnSubMarketData(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -759,7 +958,7 @@ void QuoteApi::processUnSubMarketData(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -775,7 +974,7 @@ void QuoteApi::processDepthMarketData(Task *task) { XTPMD *task_data = (XTPMD*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + 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; @@ -802,11 +1001,11 @@ void QuoteApi::processDepthMarketData(Task *task) data["trades_count"] = task_data->trades_count; char str_ticker_status[9] = {"\0"}; #ifdef _MSC_VER //WIN32 - strcpy_s(str_ticker_status, sizeof(task_data->ticker_status)+1, task_data->ticker_status); + 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"] = str_ticker_status; + data["ticker_status"] = addEndingChar(str_ticker_status); boost::python::list ask; boost::python::list bid; @@ -827,7 +1026,8 @@ void QuoteApi::processDepthMarketData(Task *task) data["ask_qty"] = ask_qty; data["data_type"] = (int)task_data->data_type; - if (task_data->data_type == XTP_MARKETDATA_ACTUAL){ + 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; @@ -860,13 +1060,45 @@ void QuoteApi::processDepthMarketData(Task *task) 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 == XTP_MARKETDATA_OPTION){ + }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; + //data["r4"] = task_data->r4; delete task->task_data; } @@ -899,6 +1131,24 @@ void QuoteApi::processDepthMarketData(Task *task) 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; @@ -907,7 +1157,7 @@ void QuoteApi::processSubOrderBook(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -916,7 +1166,7 @@ void QuoteApi::processSubOrderBook(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -932,7 +1182,7 @@ void QuoteApi::processUnSubOrderBook(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -941,7 +1191,7 @@ void QuoteApi::processUnSubOrderBook(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -957,7 +1207,7 @@ void QuoteApi::processOrderBook(Task *task) { XTPOB *task_data = (XTPOB*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); data["data_time"] = task_data->data_time; data["last_price"] = task_data->last_price; @@ -997,7 +1247,7 @@ void QuoteApi::processSubTickByTick(Task *task) { XTPST *task_data = (XTPST*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -1006,7 +1256,7 @@ void QuoteApi::processSubTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1022,7 +1272,7 @@ void QuoteApi::processUnSubTickByTick(Task *task) { XTPST *task_data = (XTPST*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -1031,7 +1281,7 @@ void QuoteApi::processUnSubTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1049,8 +1299,8 @@ void QuoteApi::processTickByTick(Task *task) data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; - //data["seq"] = task_data->seq; + 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; @@ -1062,8 +1312,9 @@ void QuoteApi::processTickByTick(Task *task) 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 + else if(task_data->type == XTP_TBT_TRADE) { data["channel_no"] = task_data->trade.channel_no; data["seq"] = task_data->trade.seq; @@ -1074,6 +1325,12 @@ void QuoteApi::processTickByTick(Task *task) 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; } @@ -1090,7 +1347,7 @@ void QuoteApi::processSubscribeAllMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } this->onSubscribeAllMarketData(task->exchange_id,error); @@ -1105,7 +1362,7 @@ void QuoteApi::processUnSubscribeAllMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1121,7 +1378,7 @@ void QuoteApi::processSubscribeAllOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1137,7 +1394,7 @@ void QuoteApi::processUnSubscribeAllOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1153,7 +1410,7 @@ void QuoteApi::processSubscribeAllTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1169,7 +1426,7 @@ void QuoteApi::processUnSubscribeAllTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1187,8 +1444,8 @@ void QuoteApi::processQueryAllTickers(Task *task) { XTPQSI *task_data = (XTPQSI*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; + 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; @@ -1205,7 +1462,7 @@ void QuoteApi::processQueryAllTickers(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1223,7 +1480,7 @@ void QuoteApi::processQueryTickersPriceInfo(Task *task) { XTPTPI *task_data = (XTPTPI*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); data["last_price"] = task_data->last_price; delete task->task_data; @@ -1234,7 +1491,7 @@ void QuoteApi::processQueryTickersPriceInfo(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1254,7 +1511,7 @@ void QuoteApi::processSubscribeAllOptionMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1270,7 +1527,7 @@ void QuoteApi::processUnSubscribeAllOptionMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1286,7 +1543,7 @@ void QuoteApi::processSubscribeAllOptionOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1302,7 +1559,7 @@ void QuoteApi::processUnSubscribeAllOptionOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1318,7 +1575,7 @@ void QuoteApi::processSubscribeAllOptionTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1334,13 +1591,353 @@ void QuoteApi::processUnSubscribeAllOptionTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + 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; +} + + ///------------------------------------------------------------------------------------- /// ///------------------------------------------------------------------------------------- @@ -1410,9 +2007,58 @@ 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->UnSubscribeAllTickByTick((XTP_EXCHANGE_TYPE)exchange); }; -int QuoteApi::login(string ip, int port, string user, string password, int socktype) +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); + 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; }; @@ -1574,6 +2230,8 @@ int QuoteApi::queryAllTickers(int exchange) 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->QueryAllTickersFullInfo((XTP_EXCHANGE_TYPE) exchange); + return i; +} +int QuoteApi::queryAllNQTickersFullInfo() + { + return this->api->QueryAllNQTickersFullInfo(); +} int QuoteApi::subscribeAllOptionMarketData(int exchange) { @@ -1636,6 +2302,41 @@ int QuoteApi::unSubscribeAllOptionTickByTick(int 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װ ///------------------------------------------------------------------------------------- @@ -1666,6 +2367,18 @@ struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > } }; + 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 @@ -1702,6 +2415,18 @@ struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > } }; + 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 @@ -1944,12 +2669,84 @@ struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > 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 + //PyEval_InitThreads(); //ʱУ֤ȴGIL + Py_Initialize(); class_("QuoteApi") .def("createQuoteApi", &QuoteApiWrap::createQuoteApi) @@ -1960,6 +2757,11 @@ BOOST_PYTHON_MODULE(vnxtpquote) .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) @@ -1977,20 +2779,26 @@ BOOST_PYTHON_MODULE(vnxtpquote) .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)) @@ -2005,6 +2813,12 @@ BOOST_PYTHON_MODULE(vnxtpquote) .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)) diff --git a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/vnxtpquote.h b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.h similarity index 79% rename from source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/vnxtpquote.h rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.h index 9ca9074..cd09dc2 100644 --- a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/vnxtpquote.h +++ b/source/Linux/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.h @@ -56,6 +56,15 @@ using namespace boost; #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 @@ -109,15 +118,15 @@ class ConcurrentQueue { private: queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost + mutable boost::mutex the_mutex; //boost + boost::condition_variable the_condition_variable; //boost public: //µ void push(Data const& data) { - mutex::scoped_lock lock(the_mutex); //ȡ + boost::mutex::scoped_lock lock(the_mutex); //ȡ the_queue.push(data); //д lock.unlock(); //ͷ the_condition_variable.notify_one(); //֪ͨȴ߳ @@ -126,14 +135,14 @@ class ConcurrentQueue //ǷΪ bool empty() const { - mutex::scoped_lock lock(the_mutex); + boost::mutex::scoped_lock lock(the_mutex); return the_queue.empty(); } //ȡ Data wait_and_pop() { - mutex::scoped_lock lock(the_mutex); + boost::mutex::scoped_lock lock(the_mutex); while (the_queue.empty()) //Ϊʱ { @@ -160,6 +169,10 @@ 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Ļصʵ @@ -170,14 +183,14 @@ class QuoteApi : public XTP::API::QuoteSpi { private: XTP::API::QuoteApi* api; //API - thread *task_thread; //ָ߳루pythonݣ + boost::thread *task_thread; //ָ߳루pythonݣ ConcurrentQueue task_queue; // public: QuoteApi() { function0 f = boost::bind(&QuoteApi::processTask, this); - thread t(f); + boost::thread t(f); this->task_thread = &t; }; @@ -200,6 +213,12 @@ class QuoteApi : public XTP::API::QuoteSpi ///@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ʱûд @@ -225,6 +244,10 @@ class QuoteApi : public XTP::API::QuoteSpi ///@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ʱûд @@ -342,6 +365,38 @@ class QuoteApi : public XTP::API::QuoteSpi ///@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 //------------------------------------------------------------------------------------- @@ -352,12 +407,16 @@ class QuoteApi : public XTP::API::QuoteSpi 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); @@ -386,7 +445,17 @@ class QuoteApi : public XTP::API::QuoteSpi 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); @@ -412,12 +481,16 @@ class QuoteApi : public XTP::API::QuoteSpi 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) {}; @@ -446,7 +519,17 @@ class QuoteApi : public XTP::API::QuoteSpi 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) {}; @@ -464,7 +547,7 @@ class QuoteApi : public XTP::API::QuoteSpi //req:ֵ //------------------------------------------------------------------------------------- - void createQuoteApi(int clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); + void createQuoteApi(int clientid, string path, int log_level); void release(); @@ -480,6 +563,16 @@ class QuoteApi : public XTP::API::QuoteSpi 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); @@ -504,7 +597,7 @@ class QuoteApi : public XTP::API::QuoteSpi int unSubscribeAllTickByTick(int exchange = 3); - int login(string ip, int port, string user, string password, int socktype); + int login(string ip, int port, string user, string password, int socktype,string local_ip); int logout(); @@ -514,8 +607,9 @@ class QuoteApi : public XTP::API::QuoteSpi int queryAllTickersPriceInfo(); + int queryAllTickersFullInfo(int exchange); - + int queryAllNQTickersFullInfo(); int subscribeAllOptionMarketData(int exchange = XTP_EXCHANGE_UNKNOWN); @@ -528,4 +622,10 @@ class QuoteApi : public XTP::API::QuoteSpi 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/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/dllmain.cpp b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/dllmain.cpp similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/dllmain.cpp rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/dllmain.cpp diff --git a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/stdafx.cpp b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.cpp similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/stdafx.cpp rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.cpp diff --git a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/stdafx.h b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.h similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/stdafx.h rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.h diff --git a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/targetver.h b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/targetver.h similarity index 100% rename from source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/targetver.h rename to source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/targetver.h diff --git a/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.cpp b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.cpp new file mode 100644 index 0000000..6ef9ff1 --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.cpp @@ -0,0 +1,5797 @@ +// 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) +{ + string endStr = value; + 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(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONCANCELOPTIONCOMBINEDORDERERROR; + + if (cancel_info) { + XTPOptCombOrderCancelInfo *task_data = new XTPOptCombOrderCancelInfo(); + *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); +} + +void TraderApi::OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONPAUSEALGOORDER; + task->addtional_int_two = xtp_strategy_id; + + if (ticker_info) { + XTPStrategyTickerInfo *task_data = new XTPStrategyTickerInfo(); + *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_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONRESUMEALGOORDER; + task->addtional_int_two = xtp_strategy_id; + + if (ticker_info) { + XTPStrategyTickerInfo *task_data = new XTPStrategyTickerInfo(); + *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_id = request_id; + 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; + } + case ONPAUSEALGOORDER: + { + this->processPauseAlgoOrder(task); + break; + } + case ONRESUMEALGOORDER: + { + this->processResumeAlgoOrder(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; + data["strategy_id"] = addEndingChar(task_data->strategy_id); + 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::processPauseAlgoOrder(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyTickerInfo *task_data = (XTPStrategyTickerInfo*)task->task_data; + data["m_ticker"] = addEndingChar(task_data->m_ticker); + data["m_market"] = (int)task_data->m_market; + } + + 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->onPauseAlgoOrder(task->addtional_int_two, data, error, task->task_id, task->addtional_int); + delete task; +} + +void TraderApi::processResumeAlgoOrder(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyTickerInfo *task_data = (XTPStrategyTickerInfo*)task->task_data; + data["m_ticker"] = addEndingChar(task_data->m_ticker); + data["m_market"] = (int)task_data->m_market; + } + + 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->onResumeAlgoOrder(task->addtional_int_two, data, error, task->task_id, 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)); + getStr(req, "fund_account", query_param.fund_account); + getStr(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); +}; + +int TraderApi::pauseAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id) +{ + XTPStrategyTickerInfo myreq = XTPStrategyTickerInfo(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "m_ticker", myreq.m_ticker); + + int m_market = XTP_MKT_INIT; + getInt(req, "m_market", &m_market); + myreq.m_market = (XTP_MARKET_TYPE)m_market; + + return this->api->PauseAlgoOrder(xtp_strategy_id, &myreq, session_id, request_id); +}; + +int TraderApi::resumeAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id) +{ + XTPStrategyTickerInfo myreq = XTPStrategyTickerInfo(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "m_ticker", myreq.m_ticker); + + int m_market = XTP_MKT_INIT; + getInt(req, "m_market", &m_market); + myreq.m_market = (XTP_MARKET_TYPE)m_market; + + return this->api->ResumeAlgoOrder(xtp_strategy_id, &myreq, session_id, request_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; + + try { + this->get_override("onQueryStrategy")(data,strategy_param, error_info, request_id,is_last,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + 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(); + } + }; + + virtual void onPauseAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onPauseAlgoOrder")(xtp_strategy_id, data, error_info, request_id, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onResumeAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onResumeAlgoOrder")(xtp_strategy_id, data, error_info, request_id, 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("pauseAlgoOrder", &TraderApiWrap::pauseAlgoOrder) + .def("resumeAlgoOrder", &TraderApiWrap::resumeAlgoOrder) + + ////////////////////////ص/////////////////////// + .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)) + .def("onPauseAlgoOrde", pure_virtual(&TraderApiWrap::onPauseAlgoOrder)) + .def("onResumeAlgoOrder", pure_virtual(&TraderApiWrap::onResumeAlgoOrder)) + ; +}; diff --git a/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.h b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.h new file mode 100644 index 0000000..32377be --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.h @@ -0,0 +1,1242 @@ +//˵ + +//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 +#define ONPAUSEALGOORDER 63 +#define ONRESUMEALGOORDER 64 + +///------------------------------------------------------------------------------------- +///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); + + ///algoҵָָ֤ͣȯ㷨Ӧ + ///@param xtp_strategy_id xtp㷨ID + ///@param ticker_info ָ֤ȯϢΪnullΪnullʾָ֤ͣȯ㷨 + ///@param error_info ޸IJԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id); + + ///algoҵָָ֤ȯ㷨Ӧ + ///@param xtp_strategy_id xtp㷨ID + ///@param ticker_info ָ֤ȯϢΪnullΪnullʾָ֤ȯ㷨 + ///@param error_info ޸IJԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, 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); + + void processPauseAlgoOrder(Task *task); + + void processResumeAlgoOrder(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) {}; + + virtual void onPauseAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, uint64_t session_id) {}; + + virtual void onResumeAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, 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); + + int pauseAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id); + + int resumeAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id); + +}; diff --git a/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/algo_api_struct.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/algo_api_struct.h new file mode 100644 index 0000000..404ebc5 --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/algo_api_struct.h @@ -0,0 +1,103 @@ +///////////////////////////////////////////////////////////////////////// +///@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; + +///策略中的证券信息结构体 +typedef struct XTPStrategyTickerInfoStruct +{ + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 交易市场 +} XTPStrategyTickerInfo; + +#pragma pack() + +#endif //_XTP_ALGO_API_STRUCT_H_ diff --git a/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/algo_data_type.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/algo_data_type.h new file mode 100644 index 0000000..f34a66c --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/algo_data_type.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////// +///@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 +#define XTP_STRATEGY_STATE_PARTPAUSE 9 +#define XTP_STRATEGY_STATE_PAUSE 10 +#define XTP_STRATEGY_STATE_RESUMING 11 +#define XTP_STRATEGY_STATE_RESUMED 12 + +#endif //_XTP_ALGO_DATA_TYPE_H_ diff --git a/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/config.json b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/config.json new file mode 100644 index 0000000..5984bbe --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/config.json @@ -0,0 +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" + } +} \ No newline at end of file diff --git a/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/libxtpquoteapi.so b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/libxtpquoteapi.so new file mode 100644 index 0000000..8d653f5 Binary files /dev/null and b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/libxtpquoteapi.so differ diff --git a/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/libxtptraderapi.so b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/libxtptraderapi.so new file mode 100644 index 0000000..8254df8 Binary files /dev/null and b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/libxtptraderapi.so differ diff --git a/source/Linux/xtp_python3_18.19/xtpapi/xoms_api_fund_struct.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_fund_struct.h similarity index 57% rename from source/Linux/xtp_python3_18.19/xtpapi/xoms_api_fund_struct.h rename to source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_fund_struct.h index 7b0168a..c685a70 100644 --- a/source/Linux/xtp_python3_18.19/xtpapi/xoms_api_fund_struct.h +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_fund_struct.h @@ -1,42 +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 ; - -#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/Linux/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_struct.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_struct.h new file mode 100644 index 0000000..5f35f12 --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_struct.h @@ -0,0 +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、NQ: 委托序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///委托价格 + double price; + ///SH: 剩余委托数量(balance) + ///SZ、NQ: 委托数量 + int64_t qty; + ///SH: 'B':买; 'S':卖 + ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 + ///NQ: '1':买; '2':卖; + char side; + ///SH: 'A': 增加; 'D': 删除 + ///SZ、NQ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 + char ord_type; + ///SH: 原始订单号 + ///SZ、NQ: 无意义 + int64_t order_no; +}; + +///逐笔成交 +struct XTPTickByTickTrade { + ///频道代码 + int32_t channel_no; + ///SH: 成交序号(成交单独编号, 同一channel_no内连续) + ///SZ、NQ: 成交序号(委托成交统一编号, 同一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、NQ: 成交标识('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、NQ: 无意义 + 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; + +///指数静态信息 +typedef struct XTPIndexPressStaticInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码(无意义) + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + char market_code; ///<市场代码 + char unknown[7]; ///<预留 +}XTPIPSI; + +///指数行情快照 +typedef struct XTPIndexPress { + ///数据来源, 7=指数通. + char data_source; + + // 代码 + ///交易所代码(无意义) + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 时间类,格式为YYYYMMDDHHMMSSsss + int64_t data_time; + + // 价格 + ///最新价 + double last_price; + ///昨收盘 + double pre_close_price; + ///今开盘 + double open_price; + ///最高价 + double high_price; + ///最低价 + double low_price; + ///今收盘 + double close_price; + + + // 量额数据 + ///总成交量 + int64_t qty; + ///总成交金额 + double turnover; + ///成交笔数 + int64_t trades_count; +}XTPIP; + + +#pragma pack() + +#endif diff --git a/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_api_data_type.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_api_data_type.h new file mode 100644 index 0000000..e64f734 --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_api_data_type.h @@ -0,0 +1,743 @@ +///////////////////////////////////////////////////////////////////////// +///@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/Linux/xtp_python2_18.19/xtpapi/xtp_quote_api.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_quote_api.h similarity index 58% rename from source/Linux/xtp_python2_18.19/xtpapi/xtp_quote_api.h rename to source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_quote_api.h index 5867e8e..749e8e6 100644 --- a/source/Linux/xtp_python2_18.19/xtpapi/xtp_quote_api.h +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_quote_api.h @@ -1,426 +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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 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/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_trader_api.h b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_trader_api.h new file mode 100644 index 0000000..07d2f83 --- /dev/null +++ b/source/Linux/xtp_api_python3_2.2.42.1/xtpapi/xtp_trader_api.h @@ -0,0 +1,1225 @@ +///////////////////////////////////////////////////////////////////////// +///@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) {}; + + ///algo业务中暂停指定策略指定证券算法单的响应 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) {}; + + ///algo业务中重启指定策略指定证券算法单的响应 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, 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; + + ///algo业务中暂停指定策略中指定证券的算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int PauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, uint64_t session_id, int32_t request_id) = 0; + + ///algo业务中重启指定策略中指定证券的算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int ResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, uint64_t session_id, int32_t request_id) = 0; + + protected: + ~TraderApi() {}; + }; + + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif diff --git a/source/Linux/xtp_python2_18.19/CMakeLists.txt b/source/Linux/xtp_python2_18.19/CMakeLists.txt deleted file mode 100644 index 81ca4bd..0000000 --- a/source/Linux/xtp_python2_18.19/CMakeLists.txt +++ /dev/null @@ -1,107 +0,0 @@ -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) - #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") - #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") -endif() - -# 设置C++ API源文件的所在目录 -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_LIBRARY ) -find_library(XTPAPI_MD_LIBRARY - NAMES libxtpquoteapi.so - PATHS ${XTPAPI_PATH}) -find_library(XTPAPI_TD_LIBRARY - NAMES libxtptraderapi.so - PATHS ${XTPAPI_PATH}) - - -# 设置编译源文件 -set (vnxtpquote ) -set (vnxtptrader ) - -option(BUILD_XTP_MD "build xtp md" ON) -if (BUILD_XTP_MD) - add_definitions(-DBUILD_XTP_MD) - set(XTP_MD_PATH vnxtpquote/vnxtpquote) - include_directories(XTP_MD_PATH) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/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(-DBUILD_XTP_TD) - set(XTP_TD_PATH vnxtptrader/vnxtptrader) - include_directories(XTP_TD_PATH) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader/vnxtptrader.cpp) - add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) -endif() - -# 设置Python所在的目录 -set(PYTHON_LIBRARY ) -if (WIN32) -set(PYTHON_INCLUDE_PATH C:/Python27/include) -find_library(PYTHON_LIBRARY - NAMES python27 - PATHS C:/Python27/libs) -include_directories(${PYTHON_INCLUDE_PATH}) -else() -set(PYTHON_INCLUDE_PATH /usr/include/python2.7/) -find_library(PYTHON_LIBRARY - NAMES python2.7 - PATHS /usr/lib/x86_64-linux-gnu) -include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda -if (WIN32) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 -endif() -set(Boost_USE_MULTITHREADED ON) -set(BOOST_ROOT /home/likunliang/boost_1_66_0_python2_32/) -find_package(Boost 1.66.0 COMPONENTS python thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) -endif() - -# 去掉生成的so文件名中前缀的lib -set_target_properties(vnxtpquote PROPERTIES PREFIX "") - -# 链接生成.so文件 -target_link_libraries(vnxtpquote ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_MD_LIBRARY}) - -# 将生成的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 "") -target_link_libraries(vnxtptrader ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_TD_LIBRARY}) -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/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/vnxtpquote.cpp b/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/vnxtpquote.cpp deleted file mode 100644 index 2f080af..0000000 --- a/source/Linux/xtp_python2_18.19/vnxtpquote/vnxtpquote/vnxtpquote.cpp +++ /dev/null @@ -1,2016 +0,0 @@ -// 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 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; - } - } -}; - -///------------------------------------------------------------------------------------- -///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::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::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 = 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::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::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; - } - }; - } -}; - - - -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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = 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"] = 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"] = 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 - strcpy_s(str_ticker_status, sizeof(task_data->ticker_status)+1, task_data->ticker_status); -#elif __GNUC__ - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#endif - data["ticker_status"] = 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; - if (task_data->data_type == XTP_MARKETDATA_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 == XTP_MARKETDATA_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; - } - - 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::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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - //data["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; - } - else - { - 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; - } - - 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_error->error_msg; - delete task->task_error; - } - - this->onUnSubscribeAllOptionTickByTick(task->exchange_id,error); - 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); -}; - -int QuoteApi::subscribeMarketData(boost::python::list tickerList,int count, int exchange) -{ - int listLength = boost::python::len(tickerList); - 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) -{ - int i = this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); - 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); - //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::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; -}; - -///------------------------------------------------------------------------------------- -///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 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 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(); - } - }; -}; - - -BOOST_PYTHON_MODULE(vnxtpquote) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("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("subscribeAllOptionMarketData", &QuoteApiWrap::subscribeAllOptionMarketData) - .def("unSubscribeAllOptionMarketData", &QuoteApiWrap::unSubscribeAllOptionMarketData) - .def("subscribeAllOptionOrderBook", &QuoteApiWrap::subscribeAllOptionOrderBook) - .def("unSubscribeAllOptionOrderBook", &QuoteApiWrap::unSubscribeAllOptionOrderBook) - .def("subscribeAllOptionTickByTick", &QuoteApiWrap::subscribeAllOptionTickByTick) - .def("unSubscribeAllOptionTickByTick", &QuoteApiWrap::unSubscribeAllOptionTickByTick) - - - .def("onDisconnected", pure_virtual(&QuoteApiWrap::onDisconnected)) - .def("onError", pure_virtual(&QuoteApiWrap::onError)) - .def("onSubMarketData", pure_virtual(&QuoteApiWrap::onSubMarketData)) - .def("onUnSubMarketData", pure_virtual(&QuoteApiWrap::onUnSubMarketData)) - .def("onDepthMarketData", pure_virtual(&QuoteApiWrap::onDepthMarketData)) - .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("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/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/ReadMe.txt b/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/ReadMe.txt deleted file mode 100644 index b7db244..0000000 --- a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - DYNAMIC LINK LIBRARY : vnxtptrader Project Overview -======================================================================== - -AppWizard has created this vnxtptrader DLL for you. - -This file contains a summary of what you will find in each of the files that -make up your vnxtptrader application. - - -vnxtptrader.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. - -vnxtptrader.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). - -vnxtptrader.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 vnxtptrader.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/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/vnxtptrader.cpp b/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/vnxtptrader.cpp deleted file mode 100644 index 670300d..0000000 --- a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/vnxtptrader.cpp +++ /dev/null @@ -1,1933 +0,0 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.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 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; - } - } -}; - - -///------------------------------------------------------------------------------------- -///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::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::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::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::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); -} -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪ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 ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(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 ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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::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"] = 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"] = 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::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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["reserved1"] = task_data->reserved1; - 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; - - 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"] = 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; - 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"] = 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"] = task_data->sf_ticker; - data["sf_ticker_name"] = task_data->sf_ticker_name; - data["ticker"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = task_data->etf; - data["subscribe_redemption_ticker"] = 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"] = 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"] = task_data->ticker; - data["component_ticker"] = task_data->component_ticker; - data["component_name"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; - 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"] = 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; - 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"] = 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::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = task_data->ticker; - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = task_data->symbol; - data["contract_id"] = task_data->contract_id; - data["underlying_security_id"] = 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"] = 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::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"] = 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) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - - -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::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::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::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::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); -}; - -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::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); -}; - -///------------------------------------------------------------------------------------- -///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 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 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 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 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(); - } - }; - -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("insertOrder", &TraderApiWrap::insertOrder) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrders", &TraderApiWrap::queryOrders) - .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("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .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("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("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - ; -}; diff --git a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/vnxtptrader.h b/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/vnxtptrader.h deleted file mode 100644 index 1892f59..0000000 --- a/source/Linux/xtp_python2_18.19/vnxtptrader/vnxtptrader/vnxtptrader.h +++ /dev/null @@ -1,496 +0,0 @@ -//˵ - -//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 ONQUERYORDERBYPAGE 18 -#define ONQUERYTRADEBYPAGE 19 -///------------------------------------------------------------------------------------- -///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; //ǷΪ󷵻 - uint64_t addtional_int; //ֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - -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 - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - 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 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 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 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 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); - - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderByPage(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 processQueryOptionAuctionInfo(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - 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 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 onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool 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 onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); - - 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); - - int logout(uint64_t sessionid); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, 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 queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); -}; diff --git a/source/Linux/xtp_python2_18.19/xtpapi/CMakeLists.txt b/source/Linux/xtp_python2_18.19/xtpapi/CMakeLists.txt deleted file mode 100644 index cdd82f5..0000000 --- a/source/Linux/xtp_python2_18.19/xtpapi/CMakeLists.txt +++ /dev/null @@ -1,108 +0,0 @@ -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) - #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") - #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") -endif() - -# 设置C++ API源文件的所在目录 -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_LIBRARY ) -find_library(XTPAPI_MD_LIBRARY - NAMES libxtpquoteapiD.so - PATHS ${XTPAPI_PATH}) -find_library(XTPAPI_TD_LIBRARY - NAMES libxtptraderapiD.so - PATHS ${XTPAPI_PATH}) - - -# 设置编译源文件 -set (vnxtpquote ) -set (vnxtptrader ) - -option(BUILD_XTP_MD "build xtp md" ON) -if (BUILD_XTP_MD) - add_definitions(-DBUILD_XTP_MD) - set(XTP_MD_PATH vnxtpquote/vnxtpquote) - include_directories(XTP_MD_PATH) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/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(-DBUILD_XTP_TD) - set(XTP_TD_PATH vnxtptrader/vnxtptrader) - include_directories(XTP_TD_PATH) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader/vnxtptrader.cpp) - add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) -endif() - -# 设置Python所在的目录 -set(PYTHON_LIBRARY ) -if (WIN32) -set(PYTHON_INCLUDE_PATH C:/Python27/include) -find_library(PYTHON_LIBRARY - NAMES python27 - PATHS C:/Python27/libs) -include_directories(${PYTHON_INCLUDE_PATH}) -else() -set(PYTHON_INCLUDE_PATH /usr/include/python2.7/) -find_library(PYTHON_LIBRARY - NAMES python2.7 - PATHS /usr/lib/x86_64-linux-gnu) -include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda -if (WIN32) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 -endif() -set(Boost_USE_MULTITHREADED ON) -set(Boost_INCLUDE_DIRS /home/likunliang/boost_1_66_0_python2_32/) -set(Boost_LIBRARIES /home/likunliang/boost_1_66_0_python2_32//stage/lib/) -find_package(Boost 1.66.0 COMPONENTS python thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) -endif() - -# 去掉生成的so文件名中前缀的lib -set_target_properties(vnxtpquote PROPERTIES PREFIX "") - -# 链接生成.so文件 -target_link_libraries(vnxtpquote ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_MD_LIBRARY}) - -# 将生成的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 "") -target_link_libraries(vnxtptrader ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_TD_LIBRARY}) -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/Linux/xtp_python2_18.19/xtpapi/libxtpquoteapi.so b/source/Linux/xtp_python2_18.19/xtpapi/libxtpquoteapi.so deleted file mode 100644 index 42288d8..0000000 Binary files a/source/Linux/xtp_python2_18.19/xtpapi/libxtpquoteapi.so and /dev/null differ diff --git a/source/Linux/xtp_python2_18.19/xtpapi/libxtptraderapi.so b/source/Linux/xtp_python2_18.19/xtpapi/libxtptraderapi.so deleted file mode 100644 index 839c180..0000000 Binary files a/source/Linux/xtp_python2_18.19/xtpapi/libxtptraderapi.so and /dev/null differ diff --git a/source/Linux/xtp_python2_18.19/xtpapi/xoms_api_fund_struct.h b/source/Linux/xtp_python2_18.19/xtpapi/xoms_api_fund_struct.h deleted file mode 100644 index 7b0168a..0000000 --- a/source/Linux/xtp_python2_18.19/xtpapi/xoms_api_fund_struct.h +++ /dev/null @@ -1,42 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 ; - -#pragma pack() - -#endif \ No newline at end of file diff --git a/source/Linux/xtp_python2_18.19/xtpapi/xoms_api_struct.h b/source/Linux/xtp_python2_18.19/xtpapi/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/source/Linux/xtp_python2_18.19/xtpapi/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/source/Linux/xtp_python2_18.19/xtpapi/xtp_api_data_type.h b/source/Linux/xtp_python2_18.19/xtpapi/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/source/Linux/xtp_python2_18.19/xtpapi/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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_ diff --git a/source/Linux/xtp_python2_18.19/xtpapi/xtp_trader_api.h b/source/Linux/xtp_python2_18.19/xtpapi/xtp_trader_api.h deleted file mode 100644 index 01f39c6..0000000 --- a/source/Linux/xtp_python2_18.19/xtpapi/xtp_trader_api.h +++ /dev/null @@ -1,456 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/vnxtpquote.cpp b/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/vnxtpquote.cpp deleted file mode 100644 index 2f080af..0000000 --- a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/vnxtpquote.cpp +++ /dev/null @@ -1,2016 +0,0 @@ -// 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 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; - } - } -}; - -///------------------------------------------------------------------------------------- -///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::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::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 = 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::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::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; - } - }; - } -}; - - - -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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = 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"] = 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"] = 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 - strcpy_s(str_ticker_status, sizeof(task_data->ticker_status)+1, task_data->ticker_status); -#elif __GNUC__ - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#endif - data["ticker_status"] = 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; - if (task_data->data_type == XTP_MARKETDATA_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 == XTP_MARKETDATA_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; - } - - 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::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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - //data["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; - } - else - { - 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; - } - - 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_error->error_msg; - delete task->task_error; - } - - this->onUnSubscribeAllOptionTickByTick(task->exchange_id,error); - 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); -}; - -int QuoteApi::subscribeMarketData(boost::python::list tickerList,int count, int exchange) -{ - int listLength = boost::python::len(tickerList); - 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) -{ - int i = this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); - 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); - //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::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; -}; - -///------------------------------------------------------------------------------------- -///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 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 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(); - } - }; -}; - - -BOOST_PYTHON_MODULE(vnxtpquote) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("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("subscribeAllOptionMarketData", &QuoteApiWrap::subscribeAllOptionMarketData) - .def("unSubscribeAllOptionMarketData", &QuoteApiWrap::unSubscribeAllOptionMarketData) - .def("subscribeAllOptionOrderBook", &QuoteApiWrap::subscribeAllOptionOrderBook) - .def("unSubscribeAllOptionOrderBook", &QuoteApiWrap::unSubscribeAllOptionOrderBook) - .def("subscribeAllOptionTickByTick", &QuoteApiWrap::subscribeAllOptionTickByTick) - .def("unSubscribeAllOptionTickByTick", &QuoteApiWrap::unSubscribeAllOptionTickByTick) - - - .def("onDisconnected", pure_virtual(&QuoteApiWrap::onDisconnected)) - .def("onError", pure_virtual(&QuoteApiWrap::onError)) - .def("onSubMarketData", pure_virtual(&QuoteApiWrap::onSubMarketData)) - .def("onUnSubMarketData", pure_virtual(&QuoteApiWrap::onUnSubMarketData)) - .def("onDepthMarketData", pure_virtual(&QuoteApiWrap::onDepthMarketData)) - .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("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/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/vnxtptrader.cpp b/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/vnxtptrader.cpp deleted file mode 100644 index 670300d..0000000 --- a/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/vnxtptrader.cpp +++ /dev/null @@ -1,1933 +0,0 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.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 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; - } - } -}; - - -///------------------------------------------------------------------------------------- -///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::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::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::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::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); -} -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪ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 ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(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 ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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::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"] = 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"] = 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::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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["reserved1"] = task_data->reserved1; - 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; - - 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"] = 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; - 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"] = 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"] = task_data->sf_ticker; - data["sf_ticker_name"] = task_data->sf_ticker_name; - data["ticker"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = task_data->etf; - data["subscribe_redemption_ticker"] = 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"] = 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"] = task_data->ticker; - data["component_ticker"] = task_data->component_ticker; - data["component_name"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; - 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"] = 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; - 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"] = 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::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = task_data->ticker; - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = task_data->symbol; - data["contract_id"] = task_data->contract_id; - data["underlying_security_id"] = 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"] = 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::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"] = 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) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - - -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::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::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::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::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); -}; - -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::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); -}; - -///------------------------------------------------------------------------------------- -///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 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 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 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 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(); - } - }; - -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("insertOrder", &TraderApiWrap::insertOrder) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrders", &TraderApiWrap::queryOrders) - .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("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .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("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("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - ; -}; diff --git a/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/vnxtptrader.h b/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/vnxtptrader.h deleted file mode 100644 index 1892f59..0000000 --- a/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/vnxtptrader.h +++ /dev/null @@ -1,496 +0,0 @@ -//˵ - -//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 ONQUERYORDERBYPAGE 18 -#define ONQUERYTRADEBYPAGE 19 -///------------------------------------------------------------------------------------- -///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; //ǷΪ󷵻 - uint64_t addtional_int; //ֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - -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 - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - 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 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 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 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 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); - - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderByPage(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 processQueryOptionAuctionInfo(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - 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 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 onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool 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 onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); - - 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); - - int logout(uint64_t sessionid); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, 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 queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); -}; diff --git a/source/Linux/xtp_python3_18.19/xtpapi/CMakeLists.txt b/source/Linux/xtp_python3_18.19/xtpapi/CMakeLists.txt deleted file mode 100644 index cdd82f5..0000000 --- a/source/Linux/xtp_python3_18.19/xtpapi/CMakeLists.txt +++ /dev/null @@ -1,108 +0,0 @@ -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) - #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") - #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") -endif() - -# 设置C++ API源文件的所在目录 -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_LIBRARY ) -find_library(XTPAPI_MD_LIBRARY - NAMES libxtpquoteapiD.so - PATHS ${XTPAPI_PATH}) -find_library(XTPAPI_TD_LIBRARY - NAMES libxtptraderapiD.so - PATHS ${XTPAPI_PATH}) - - -# 设置编译源文件 -set (vnxtpquote ) -set (vnxtptrader ) - -option(BUILD_XTP_MD "build xtp md" ON) -if (BUILD_XTP_MD) - add_definitions(-DBUILD_XTP_MD) - set(XTP_MD_PATH vnxtpquote/vnxtpquote) - include_directories(XTP_MD_PATH) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/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(-DBUILD_XTP_TD) - set(XTP_TD_PATH vnxtptrader/vnxtptrader) - include_directories(XTP_TD_PATH) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader/vnxtptrader.cpp) - add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) -endif() - -# 设置Python所在的目录 -set(PYTHON_LIBRARY ) -if (WIN32) -set(PYTHON_INCLUDE_PATH C:/Python27/include) -find_library(PYTHON_LIBRARY - NAMES python27 - PATHS C:/Python27/libs) -include_directories(${PYTHON_INCLUDE_PATH}) -else() -set(PYTHON_INCLUDE_PATH /usr/include/python2.7/) -find_library(PYTHON_LIBRARY - NAMES python2.7 - PATHS /usr/lib/x86_64-linux-gnu) -include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda -if (WIN32) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 -endif() -set(Boost_USE_MULTITHREADED ON) -set(Boost_INCLUDE_DIRS /home/likunliang/boost_1_66_0_python2_32/) -set(Boost_LIBRARIES /home/likunliang/boost_1_66_0_python2_32//stage/lib/) -find_package(Boost 1.66.0 COMPONENTS python thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) -endif() - -# 去掉生成的so文件名中前缀的lib -set_target_properties(vnxtpquote PROPERTIES PREFIX "") - -# 链接生成.so文件 -target_link_libraries(vnxtpquote ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_MD_LIBRARY}) - -# 将生成的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 "") -target_link_libraries(vnxtptrader ${Boost_LIBRARIES} ${PYTHON_LIBRARY} ${XTPAPI_TD_LIBRARY}) -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/Linux/xtp_python3_18.19/xtpapi/libxtpquoteapi.so b/source/Linux/xtp_python3_18.19/xtpapi/libxtpquoteapi.so deleted file mode 100644 index 42288d8..0000000 Binary files a/source/Linux/xtp_python3_18.19/xtpapi/libxtpquoteapi.so and /dev/null differ diff --git a/source/Linux/xtp_python3_18.19/xtpapi/libxtptraderapi.so b/source/Linux/xtp_python3_18.19/xtpapi/libxtptraderapi.so deleted file mode 100644 index 839c180..0000000 Binary files a/source/Linux/xtp_python3_18.19/xtpapi/libxtptraderapi.so and /dev/null differ diff --git a/source/Linux/xtp_python3_18.19/xtpapi/xoms_api_struct.h b/source/Linux/xtp_python3_18.19/xtpapi/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/source/Linux/xtp_python3_18.19/xtpapi/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/source/Linux/xtp_python3_18.19/xtpapi/xtp_api_data_type.h b/source/Linux/xtp_python3_18.19/xtpapi/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/source/Linux/xtp_python3_18.19/xtpapi/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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, /// 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "xtp_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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python2_32/CMakeLists.txt b/source/Windows/xtp_18.19_python2_32/CMakeLists.txt deleted file mode 100644 index c4bd453..0000000 --- a/source/Windows/xtp_18.19_python2_32/CMakeLists.txt +++ /dev/null @@ -1,129 +0,0 @@ -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 E:/xtpIDE/Python/Python27_32/include) - link_directories(E:/xtpIDE/Python/Python27_32/libs) - include_directories(${PYTHON_INCLUDE_PATH}) -elseif(UNIX) - set(PYTHON_LIBRARY /usr/local/python3/lib/) - set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.6m/) - include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda /python3用的是python3.6没有用Anaconda -set(BOOST_ROOT ) -if (WIN32) - set(BOOST_ROOT E:/xtp/soft/boost_1_57_0_python2_32/boost_1_57_0/) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 - link_directories(E:/xtp/soft/boost_1_57_0_python2_32/boost_1_57_0/stage/lib) - include_directories(${BOOST_ROOT}) -elseif(UNIX) - set(Boost_USE_MULTITHREADED ON) - set(BOOST_ROOT /home/likunliang/boost_1_66_0_python3/) - find_package(Boost 1.66.0 COMPONENTS python3 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/vnxtpquote) - include_directories(${XTP_MD_PATH}) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/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/vnxtptrader/) - include_directories(${XTP_TD_PATH}) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/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_18.19_python2_32/vnxtpquote/vnxtpquote/ReadMe.txt b/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/ReadMe.txt deleted file mode 100644 index 0838bff..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - 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_18.19_python2_32/vnxtpquote/vnxtpquote/dllmain.cpp b/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python2_32/vnxtpquote/vnxtpquote/stdafx.cpp b/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/stdafx.cpp deleted file mode 100644 index 926d762..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python2_32/vnxtpquote/vnxtpquote/stdafx.h b/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python2_32/vnxtpquote/vnxtpquote/targetver.h b/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python2_32/vnxtpquote/vnxtpquote/vnxtpquote.h b/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/vnxtpquote.h deleted file mode 100644 index 9ca9074..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtpquote/vnxtpquote/vnxtpquote.h +++ /dev/null @@ -1,531 +0,0 @@ -//˵ - -//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 - -///------------------------------------------------------------------------------------- -///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 mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - - -///------------------------------------------------------------------------------------- -///C++ SPIĻصʵ -///------------------------------------------------------------------------------------- - -//APIļ̳ʵ -class QuoteApi : public XTP::API::QuoteSpi -{ -private: - XTP::API::QuoteApi* api; //API - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - QuoteApi() - { - function0 f = boost::bind(&QuoteApi::processTask, this); - 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 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); - - ///鶩Ӧ - ///@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); - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processSubMarketData(Task *task); - - void processUnSubMarketData(Task *task); - - void processDepthMarketData(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 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 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 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 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 = XTP_LOG_LEVEL_DEBUG); - - void release(); - - int exit(); - - string getTradingDay(); - - string getApiVersion(); - - dict getApiLastError(); - - void setUDPBufferSize(int size); - - void setHeartBeatInterval(int interval); - - 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); - - int logout(); - - int queryAllTickers(int exchange); - - int queryTickersPriceInfo(boost::python::list tickerList, int count, int exchange); - - int queryAllTickersPriceInfo(); - - - - - 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); -}; diff --git a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/ReadMe.txt b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/ReadMe.txt deleted file mode 100644 index b7db244..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - DYNAMIC LINK LIBRARY : vnxtptrader Project Overview -======================================================================== - -AppWizard has created this vnxtptrader DLL for you. - -This file contains a summary of what you will find in each of the files that -make up your vnxtptrader application. - - -vnxtptrader.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. - -vnxtptrader.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). - -vnxtptrader.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 vnxtptrader.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_18.19_python2_32/vnxtptrader/vnxtptrader/dllmain.cpp b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python2_32/vnxtptrader/vnxtptrader/stdafx.cpp b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/stdafx.cpp deleted file mode 100644 index 44a05bf..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python2_32/vnxtptrader/vnxtptrader/stdafx.h b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python2_32/vnxtptrader/vnxtptrader/targetver.h b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python2_32/vnxtptrader/vnxtptrader/vnxtptrader.cpp b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/vnxtptrader.cpp deleted file mode 100644 index 670300d..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/vnxtptrader.cpp +++ /dev/null @@ -1,1933 +0,0 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.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 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; - } - } -}; - - -///------------------------------------------------------------------------------------- -///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::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::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::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::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); -} -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪ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 ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(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 ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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::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"] = 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"] = 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::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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["reserved1"] = task_data->reserved1; - 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; - - 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"] = 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; - 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"] = 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"] = task_data->sf_ticker; - data["sf_ticker_name"] = task_data->sf_ticker_name; - data["ticker"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = task_data->etf; - data["subscribe_redemption_ticker"] = 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"] = 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"] = task_data->ticker; - data["component_ticker"] = task_data->component_ticker; - data["component_name"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; - 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"] = 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; - 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"] = 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::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = task_data->ticker; - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = task_data->symbol; - data["contract_id"] = task_data->contract_id; - data["underlying_security_id"] = 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"] = 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::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"] = 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) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - - -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::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::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::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::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); -}; - -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::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); -}; - -///------------------------------------------------------------------------------------- -///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 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 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 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 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(); - } - }; - -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("insertOrder", &TraderApiWrap::insertOrder) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrders", &TraderApiWrap::queryOrders) - .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("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .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("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("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - ; -}; diff --git a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/vnxtptrader.h b/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/vnxtptrader.h deleted file mode 100644 index 1892f59..0000000 --- a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/vnxtptrader.h +++ /dev/null @@ -1,496 +0,0 @@ -//˵ - -//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 ONQUERYORDERBYPAGE 18 -#define ONQUERYTRADEBYPAGE 19 -///------------------------------------------------------------------------------------- -///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; //ǷΪ󷵻 - uint64_t addtional_int; //ֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - -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 - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - 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 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 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 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 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); - - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderByPage(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 processQueryOptionAuctionInfo(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - 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 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 onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool 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 onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); - - 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); - - int logout(uint64_t sessionid); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, 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 queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); -}; diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xoms_api_struct.h b/source/Windows/xtp_18.19_python2_32/xtpapi/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/source/Windows/xtp_18.19_python2_32/xtpapi/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xtp_api_data_type.h b/source/Windows/xtp_18.19_python2_32/xtpapi/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/source/Windows/xtp_18.19_python2_32/xtpapi/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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, /// 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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - - protected: - ~QuoteApi() {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xtp_trader_api.h b/source/Windows/xtp_18.19_python2_32/xtpapi/xtp_trader_api.h deleted file mode 100644 index 01f39c6..0000000 --- a/source/Windows/xtp_18.19_python2_32/xtpapi/xtp_trader_api.h +++ /dev/null @@ -1,456 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xtpquoteapi.dll b/source/Windows/xtp_18.19_python2_32/xtpapi/xtpquoteapi.dll deleted file mode 100644 index a1dda95..0000000 Binary files a/source/Windows/xtp_18.19_python2_32/xtpapi/xtpquoteapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xtpquoteapi.lib b/source/Windows/xtp_18.19_python2_32/xtpapi/xtpquoteapi.lib deleted file mode 100644 index 82d6330..0000000 Binary files a/source/Windows/xtp_18.19_python2_32/xtpapi/xtpquoteapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xtptraderapi.dll b/source/Windows/xtp_18.19_python2_32/xtpapi/xtptraderapi.dll deleted file mode 100644 index 6b3303f..0000000 Binary files a/source/Windows/xtp_18.19_python2_32/xtpapi/xtptraderapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xtptraderapi.lib b/source/Windows/xtp_18.19_python2_32/xtpapi/xtptraderapi.lib deleted file mode 100644 index e46eef4..0000000 Binary files a/source/Windows/xtp_18.19_python2_32/xtpapi/xtptraderapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_64/CMakeLists.txt b/source/Windows/xtp_18.19_python2_64/CMakeLists.txt deleted file mode 100644 index b6f733c..0000000 --- a/source/Windows/xtp_18.19_python2_64/CMakeLists.txt +++ /dev/null @@ -1,129 +0,0 @@ -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 E:/xtpIDE/Python/Python27_64/include) - link_directories(E:/xtpIDE/Python/Python27_64/libs) - include_directories(${PYTHON_INCLUDE_PATH}) -elseif(UNIX) - set(PYTHON_LIBRARY /usr/local/python3/lib/) - set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.6m/) - include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda /python3用的是python3.6没有用Anaconda -set(BOOST_ROOT ) -if (WIN32) - set(BOOST_ROOT E:/xtp/soft/boost_1_57_0_python2_64/boost_1_57_0/) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 - link_directories(E:/xtp/soft/boost_1_57_0_python2_64/boost_1_57_0/stage/lib) - include_directories(${BOOST_ROOT}) -elseif(UNIX) - set(Boost_USE_MULTITHREADED ON) - set(BOOST_ROOT /home/likunliang/boost_1_66_0_python3/) - find_package(Boost 1.66.0 COMPONENTS python3 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/vnxtpquote) - include_directories(${XTP_MD_PATH}) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/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/vnxtptrader/) - include_directories(${XTP_TD_PATH}) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/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_18.19_python2_64/vnxtpquote/vnxtpquote/ReadMe.txt b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/ReadMe.txt deleted file mode 100644 index 0838bff..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - 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_18.19_python2_64/vnxtpquote/vnxtpquote/dllmain.cpp b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python2_64/vnxtpquote/vnxtpquote/libsodium.dll b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/libsodium.dll deleted file mode 100644 index 8921bc3..0000000 Binary files a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/libsodium.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/stdafx.cpp b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/stdafx.cpp deleted file mode 100644 index 926d762..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python2_64/vnxtpquote/vnxtpquote/stdafx.h b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python2_64/vnxtpquote/vnxtpquote/targetver.h b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python2_64/vnxtpquote/vnxtpquote/vnxtpquote.h b/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/vnxtpquote.h deleted file mode 100644 index 9ca9074..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/vnxtpquote.h +++ /dev/null @@ -1,531 +0,0 @@ -//˵ - -//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 - -///------------------------------------------------------------------------------------- -///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 mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - - -///------------------------------------------------------------------------------------- -///C++ SPIĻصʵ -///------------------------------------------------------------------------------------- - -//APIļ̳ʵ -class QuoteApi : public XTP::API::QuoteSpi -{ -private: - XTP::API::QuoteApi* api; //API - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - QuoteApi() - { - function0 f = boost::bind(&QuoteApi::processTask, this); - 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 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); - - ///鶩Ӧ - ///@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); - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processSubMarketData(Task *task); - - void processUnSubMarketData(Task *task); - - void processDepthMarketData(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 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 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 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 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 = XTP_LOG_LEVEL_DEBUG); - - void release(); - - int exit(); - - string getTradingDay(); - - string getApiVersion(); - - dict getApiLastError(); - - void setUDPBufferSize(int size); - - void setHeartBeatInterval(int interval); - - 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); - - int logout(); - - int queryAllTickers(int exchange); - - int queryTickersPriceInfo(boost::python::list tickerList, int count, int exchange); - - int queryAllTickersPriceInfo(); - - - - - 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); -}; diff --git a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/ReadMe.txt b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/ReadMe.txt deleted file mode 100644 index b7db244..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - DYNAMIC LINK LIBRARY : vnxtptrader Project Overview -======================================================================== - -AppWizard has created this vnxtptrader DLL for you. - -This file contains a summary of what you will find in each of the files that -make up your vnxtptrader application. - - -vnxtptrader.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. - -vnxtptrader.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). - -vnxtptrader.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 vnxtptrader.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_18.19_python2_64/vnxtptrader/vnxtptrader/dllmain.cpp b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python2_64/vnxtptrader/vnxtptrader/libsodium.dll b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/libsodium.dll deleted file mode 100644 index 8921bc3..0000000 Binary files a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/libsodium.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/stdafx.cpp b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/stdafx.cpp deleted file mode 100644 index 44a05bf..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python2_64/vnxtptrader/vnxtptrader/stdafx.h b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python2_64/vnxtptrader/vnxtptrader/targetver.h b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python2_64/vnxtptrader/vnxtptrader/vnxtptrader.cpp b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/vnxtptrader.cpp deleted file mode 100644 index 670300d..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/vnxtptrader.cpp +++ /dev/null @@ -1,1933 +0,0 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.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 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; - } - } -}; - - -///------------------------------------------------------------------------------------- -///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::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::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::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::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); -} -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪ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 ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(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 ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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::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"] = 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"] = 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::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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["reserved1"] = task_data->reserved1; - 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; - - 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"] = 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; - 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"] = 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"] = task_data->sf_ticker; - data["sf_ticker_name"] = task_data->sf_ticker_name; - data["ticker"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = task_data->etf; - data["subscribe_redemption_ticker"] = 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"] = 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"] = task_data->ticker; - data["component_ticker"] = task_data->component_ticker; - data["component_name"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; - 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"] = 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; - 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"] = 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::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = task_data->ticker; - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = task_data->symbol; - data["contract_id"] = task_data->contract_id; - data["underlying_security_id"] = 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"] = 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::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"] = 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) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - - -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::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::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::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::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); -}; - -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::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); -}; - -///------------------------------------------------------------------------------------- -///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 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 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 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 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(); - } - }; - -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("insertOrder", &TraderApiWrap::insertOrder) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrders", &TraderApiWrap::queryOrders) - .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("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .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("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("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - ; -}; diff --git a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/vnxtptrader.h b/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/vnxtptrader.h deleted file mode 100644 index 1892f59..0000000 --- a/source/Windows/xtp_18.19_python2_64/vnxtptrader/vnxtptrader/vnxtptrader.h +++ /dev/null @@ -1,496 +0,0 @@ -//˵ - -//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 ONQUERYORDERBYPAGE 18 -#define ONQUERYTRADEBYPAGE 19 -///------------------------------------------------------------------------------------- -///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; //ǷΪ󷵻 - uint64_t addtional_int; //ֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - -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 - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - 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 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 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 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 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); - - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderByPage(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 processQueryOptionAuctionInfo(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - 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 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 onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool 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 onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); - - 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); - - int logout(uint64_t sessionid); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, 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 queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); -}; diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xoms_api_fund_struct.h b/source/Windows/xtp_18.19_python2_64/xtpapi/xoms_api_fund_struct.h deleted file mode 100644 index 7b0168a..0000000 --- a/source/Windows/xtp_18.19_python2_64/xtpapi/xoms_api_fund_struct.h +++ /dev/null @@ -1,42 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 ; - -#pragma pack() - -#endif \ No newline at end of file diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xoms_api_struct.h b/source/Windows/xtp_18.19_python2_64/xtpapi/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/source/Windows/xtp_18.19_python2_64/xtpapi/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_api_data_type.h b/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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_ diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_quote_api.h b/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_quote_api.h deleted file mode 100644 index 5867e8e..0000000 --- a/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_quote_api.h +++ /dev/null @@ -1,426 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - - protected: - ~QuoteApi() {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_trader_api.h b/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_trader_api.h deleted file mode 100644 index 01f39c6..0000000 --- a/source/Windows/xtp_18.19_python2_64/xtpapi/xtp_trader_api.h +++ /dev/null @@ -1,456 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtpquoteapi.dll b/source/Windows/xtp_18.19_python2_64/xtpapi/xtpquoteapi.dll deleted file mode 100644 index 8ae553e..0000000 Binary files a/source/Windows/xtp_18.19_python2_64/xtpapi/xtpquoteapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtpquoteapi.lib b/source/Windows/xtp_18.19_python2_64/xtpapi/xtpquoteapi.lib deleted file mode 100644 index f4d7fdd..0000000 Binary files a/source/Windows/xtp_18.19_python2_64/xtpapi/xtpquoteapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtptraderapi.dll b/source/Windows/xtp_18.19_python2_64/xtpapi/xtptraderapi.dll deleted file mode 100644 index 1b0c776..0000000 Binary files a/source/Windows/xtp_18.19_python2_64/xtpapi/xtptraderapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python2_64/xtpapi/xtptraderapi.lib b/source/Windows/xtp_18.19_python2_64/xtpapi/xtptraderapi.lib deleted file mode 100644 index c78fe9a..0000000 Binary files a/source/Windows/xtp_18.19_python2_64/xtpapi/xtptraderapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/ReadMe.txt b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/ReadMe.txt deleted file mode 100644 index 0838bff..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - 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_18.19_python3_32/vnxtpquote/vnxtpquote/dllmain.cpp b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python3_32/vnxtpquote/vnxtpquote/libsodium.dll b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/libsodium.dll deleted file mode 100644 index 8921bc3..0000000 Binary files a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/libsodium.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/stdafx.cpp b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/stdafx.cpp deleted file mode 100644 index 926d762..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python3_32/vnxtpquote/vnxtpquote/stdafx.h b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python3_32/vnxtpquote/vnxtpquote/targetver.h b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python3_32/vnxtpquote/vnxtpquote/vnxtpquote.cpp b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/vnxtpquote.cpp deleted file mode 100644 index 2f080af..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/vnxtpquote.cpp +++ /dev/null @@ -1,2016 +0,0 @@ -// 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 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; - } - } -}; - -///------------------------------------------------------------------------------------- -///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::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::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 = 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::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::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; - } - }; - } -}; - - - -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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = 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"] = 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"] = 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 - strcpy_s(str_ticker_status, sizeof(task_data->ticker_status)+1, task_data->ticker_status); -#elif __GNUC__ - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#endif - data["ticker_status"] = 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; - if (task_data->data_type == XTP_MARKETDATA_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 == XTP_MARKETDATA_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; - } - - 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::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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - //data["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; - } - else - { - 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; - } - - 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_error->error_msg; - delete task->task_error; - } - - this->onUnSubscribeAllOptionTickByTick(task->exchange_id,error); - 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); -}; - -int QuoteApi::subscribeMarketData(boost::python::list tickerList,int count, int exchange) -{ - int listLength = boost::python::len(tickerList); - 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) -{ - int i = this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); - 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); - //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::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; -}; - -///------------------------------------------------------------------------------------- -///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 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 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(); - } - }; -}; - - -BOOST_PYTHON_MODULE(vnxtpquote) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("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("subscribeAllOptionMarketData", &QuoteApiWrap::subscribeAllOptionMarketData) - .def("unSubscribeAllOptionMarketData", &QuoteApiWrap::unSubscribeAllOptionMarketData) - .def("subscribeAllOptionOrderBook", &QuoteApiWrap::subscribeAllOptionOrderBook) - .def("unSubscribeAllOptionOrderBook", &QuoteApiWrap::unSubscribeAllOptionOrderBook) - .def("subscribeAllOptionTickByTick", &QuoteApiWrap::subscribeAllOptionTickByTick) - .def("unSubscribeAllOptionTickByTick", &QuoteApiWrap::unSubscribeAllOptionTickByTick) - - - .def("onDisconnected", pure_virtual(&QuoteApiWrap::onDisconnected)) - .def("onError", pure_virtual(&QuoteApiWrap::onError)) - .def("onSubMarketData", pure_virtual(&QuoteApiWrap::onSubMarketData)) - .def("onUnSubMarketData", pure_virtual(&QuoteApiWrap::onUnSubMarketData)) - .def("onDepthMarketData", pure_virtual(&QuoteApiWrap::onDepthMarketData)) - .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("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_18.19_python3_32/vnxtpquote/vnxtpquote/vnxtpquote.h b/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/vnxtpquote.h deleted file mode 100644 index 9ca9074..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtpquote/vnxtpquote/vnxtpquote.h +++ /dev/null @@ -1,531 +0,0 @@ -//˵ - -//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 - -///------------------------------------------------------------------------------------- -///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 mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - - -///------------------------------------------------------------------------------------- -///C++ SPIĻصʵ -///------------------------------------------------------------------------------------- - -//APIļ̳ʵ -class QuoteApi : public XTP::API::QuoteSpi -{ -private: - XTP::API::QuoteApi* api; //API - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - QuoteApi() - { - function0 f = boost::bind(&QuoteApi::processTask, this); - 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 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); - - ///鶩Ӧ - ///@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); - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processSubMarketData(Task *task); - - void processUnSubMarketData(Task *task); - - void processDepthMarketData(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 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 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 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 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 = XTP_LOG_LEVEL_DEBUG); - - void release(); - - int exit(); - - string getTradingDay(); - - string getApiVersion(); - - dict getApiLastError(); - - void setUDPBufferSize(int size); - - void setHeartBeatInterval(int interval); - - 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); - - int logout(); - - int queryAllTickers(int exchange); - - int queryTickersPriceInfo(boost::python::list tickerList, int count, int exchange); - - int queryAllTickersPriceInfo(); - - - - - 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); -}; diff --git a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/ReadMe.txt b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/ReadMe.txt deleted file mode 100644 index b7db244..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - DYNAMIC LINK LIBRARY : vnxtptrader Project Overview -======================================================================== - -AppWizard has created this vnxtptrader DLL for you. - -This file contains a summary of what you will find in each of the files that -make up your vnxtptrader application. - - -vnxtptrader.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. - -vnxtptrader.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). - -vnxtptrader.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 vnxtptrader.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_18.19_python3_32/vnxtptrader/vnxtptrader/dllmain.cpp b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python3_32/vnxtptrader/vnxtptrader/libsodium.dll b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/libsodium.dll deleted file mode 100644 index 8921bc3..0000000 Binary files a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/libsodium.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/stdafx.cpp b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/stdafx.cpp deleted file mode 100644 index 44a05bf..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python3_32/vnxtptrader/vnxtptrader/stdafx.h b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python3_32/vnxtptrader/vnxtptrader/targetver.h b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python3_32/vnxtptrader/vnxtptrader/vnxtptrader.cpp b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/vnxtptrader.cpp deleted file mode 100644 index 670300d..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/vnxtptrader.cpp +++ /dev/null @@ -1,1933 +0,0 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.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 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; - } - } -}; - - -///------------------------------------------------------------------------------------- -///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::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::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::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::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); -} -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪ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 ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(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 ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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::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"] = 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"] = 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::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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["reserved1"] = task_data->reserved1; - 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; - - 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"] = 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; - 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"] = 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"] = task_data->sf_ticker; - data["sf_ticker_name"] = task_data->sf_ticker_name; - data["ticker"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = task_data->etf; - data["subscribe_redemption_ticker"] = 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"] = 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"] = task_data->ticker; - data["component_ticker"] = task_data->component_ticker; - data["component_name"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; - 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"] = 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; - 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"] = 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::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = task_data->ticker; - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = task_data->symbol; - data["contract_id"] = task_data->contract_id; - data["underlying_security_id"] = 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"] = 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::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"] = 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) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - - -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::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::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::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::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); -}; - -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::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); -}; - -///------------------------------------------------------------------------------------- -///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 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 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 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 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(); - } - }; - -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("insertOrder", &TraderApiWrap::insertOrder) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrders", &TraderApiWrap::queryOrders) - .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("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .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("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("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - ; -}; diff --git a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/vnxtptrader.h b/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/vnxtptrader.h deleted file mode 100644 index 1892f59..0000000 --- a/source/Windows/xtp_18.19_python3_32/vnxtptrader/vnxtptrader/vnxtptrader.h +++ /dev/null @@ -1,496 +0,0 @@ -//˵ - -//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 ONQUERYORDERBYPAGE 18 -#define ONQUERYTRADEBYPAGE 19 -///------------------------------------------------------------------------------------- -///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; //ǷΪ󷵻 - uint64_t addtional_int; //ֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - -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 - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - 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 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 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 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 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); - - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderByPage(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 processQueryOptionAuctionInfo(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - 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 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 onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool 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 onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); - - 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); - - int logout(uint64_t sessionid); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, 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 queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); -}; diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xoms_api_fund_struct.h b/source/Windows/xtp_18.19_python3_32/xtpapi/xoms_api_fund_struct.h deleted file mode 100644 index 7b0168a..0000000 --- a/source/Windows/xtp_18.19_python3_32/xtpapi/xoms_api_fund_struct.h +++ /dev/null @@ -1,42 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 ; - -#pragma pack() - -#endif \ No newline at end of file diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xoms_api_struct.h b/source/Windows/xtp_18.19_python3_32/xtpapi/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/source/Windows/xtp_18.19_python3_32/xtpapi/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_api_data_type.h b/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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_ diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_quote_api.h b/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_quote_api.h deleted file mode 100644 index 5867e8e..0000000 --- a/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_quote_api.h +++ /dev/null @@ -1,426 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - - protected: - ~QuoteApi() {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_trader_api.h b/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_trader_api.h deleted file mode 100644 index 01f39c6..0000000 --- a/source/Windows/xtp_18.19_python3_32/xtpapi/xtp_trader_api.h +++ /dev/null @@ -1,456 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtpquoteapi.dll b/source/Windows/xtp_18.19_python3_32/xtpapi/xtpquoteapi.dll deleted file mode 100644 index a1dda95..0000000 Binary files a/source/Windows/xtp_18.19_python3_32/xtpapi/xtpquoteapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtpquoteapi.lib b/source/Windows/xtp_18.19_python3_32/xtpapi/xtpquoteapi.lib deleted file mode 100644 index 82d6330..0000000 Binary files a/source/Windows/xtp_18.19_python3_32/xtpapi/xtpquoteapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtptraderapi.dll b/source/Windows/xtp_18.19_python3_32/xtpapi/xtptraderapi.dll deleted file mode 100644 index 6b3303f..0000000 Binary files a/source/Windows/xtp_18.19_python3_32/xtpapi/xtptraderapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/xtpapi/xtptraderapi.lib b/source/Windows/xtp_18.19_python3_32/xtpapi/xtptraderapi.lib deleted file mode 100644 index e46eef4..0000000 Binary files a/source/Windows/xtp_18.19_python3_32/xtpapi/xtptraderapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_64/CMakeLists.txt b/source/Windows/xtp_18.19_python3_64/CMakeLists.txt deleted file mode 100644 index f235b9c..0000000 --- a/source/Windows/xtp_18.19_python3_64/CMakeLists.txt +++ /dev/null @@ -1,129 +0,0 @@ -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 E:/xtpIDE/Python/Python36-64/include) - link_directories(E:/xtpIDE/Python/Python36-64/libs) - include_directories(${PYTHON_INCLUDE_PATH}) -elseif(UNIX) - set(PYTHON_LIBRARY /usr/local/python3/lib/) - set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.6m/) - include_directories(${PYTHON_INCLUDE_PATH}) -endif() - -# 链接boost库,anaconda /python3用的是python3.6没有用Anaconda -set(BOOST_ROOT ) -if (WIN32) - set(BOOST_ROOT E:/xtp/soft/boost_1_57_0_python3_64/boost_1_57_0/) - set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 - link_directories(E:/xtp/soft/boost_1_57_0_python3_64/boost_1_57_0/stage/lib) - include_directories(${BOOST_ROOT}) -elseif(UNIX) - set(Boost_USE_MULTITHREADED ON) - set(BOOST_ROOT /home/likunliang/boost_1_66_0_python3/) - find_package(Boost 1.66.0 COMPONENTS python3 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/vnxtpquote) - include_directories(${XTP_MD_PATH}) - set(VN_XTP_MD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtpquote/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/vnxtptrader/) - include_directories(${XTP_TD_PATH}) - set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/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_18.19_python3_64/vnxtpquote/vnxtpquote/ReadMe.txt b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/ReadMe.txt deleted file mode 100644 index 0838bff..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - 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_18.19_python3_64/vnxtpquote/vnxtpquote/dllmain.cpp b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python3_64/vnxtpquote/vnxtpquote/libsodium.dll b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/libsodium.dll deleted file mode 100644 index 8921bc3..0000000 Binary files a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/libsodium.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/stdafx.cpp b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/stdafx.cpp deleted file mode 100644 index 926d762..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python3_64/vnxtpquote/vnxtpquote/stdafx.h b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python3_64/vnxtpquote/vnxtpquote/targetver.h b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python3_64/vnxtpquote/vnxtpquote/vnxtpquote.cpp b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/vnxtpquote.cpp deleted file mode 100644 index 2f080af..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/vnxtpquote.cpp +++ /dev/null @@ -1,2016 +0,0 @@ -// 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 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; - } - } -}; - -///------------------------------------------------------------------------------------- -///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::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::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 = 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::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::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; - } - }; - } -}; - - - -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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = 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"] = 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"] = 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 - strcpy_s(str_ticker_status, sizeof(task_data->ticker_status)+1, task_data->ticker_status); -#elif __GNUC__ - strncpy(str_ticker_status, task_data->ticker_status, sizeof(task_data->ticker_status)); -#endif - data["ticker_status"] = 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; - if (task_data->data_type == XTP_MARKETDATA_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 == XTP_MARKETDATA_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; - } - - 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::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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - //data["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; - } - else - { - 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; - } - - 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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"] = task_error->error_msg; - delete task->task_error; - } - - this->onUnSubscribeAllOptionTickByTick(task->exchange_id,error); - 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); -}; - -int QuoteApi::subscribeMarketData(boost::python::list tickerList,int count, int exchange) -{ - int listLength = boost::python::len(tickerList); - 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) -{ - int i = this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); - 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); - //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::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; -}; - -///------------------------------------------------------------------------------------- -///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 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 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(); - } - }; -}; - - -BOOST_PYTHON_MODULE(vnxtpquote) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("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("subscribeAllOptionMarketData", &QuoteApiWrap::subscribeAllOptionMarketData) - .def("unSubscribeAllOptionMarketData", &QuoteApiWrap::unSubscribeAllOptionMarketData) - .def("subscribeAllOptionOrderBook", &QuoteApiWrap::subscribeAllOptionOrderBook) - .def("unSubscribeAllOptionOrderBook", &QuoteApiWrap::unSubscribeAllOptionOrderBook) - .def("subscribeAllOptionTickByTick", &QuoteApiWrap::subscribeAllOptionTickByTick) - .def("unSubscribeAllOptionTickByTick", &QuoteApiWrap::unSubscribeAllOptionTickByTick) - - - .def("onDisconnected", pure_virtual(&QuoteApiWrap::onDisconnected)) - .def("onError", pure_virtual(&QuoteApiWrap::onError)) - .def("onSubMarketData", pure_virtual(&QuoteApiWrap::onSubMarketData)) - .def("onUnSubMarketData", pure_virtual(&QuoteApiWrap::onUnSubMarketData)) - .def("onDepthMarketData", pure_virtual(&QuoteApiWrap::onDepthMarketData)) - .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("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_18.19_python3_64/vnxtpquote/vnxtpquote/vnxtpquote.h b/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/vnxtpquote.h deleted file mode 100644 index 9ca9074..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtpquote/vnxtpquote/vnxtpquote.h +++ /dev/null @@ -1,531 +0,0 @@ -//˵ - -//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 - -///------------------------------------------------------------------------------------- -///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 mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - - -///------------------------------------------------------------------------------------- -///C++ SPIĻصʵ -///------------------------------------------------------------------------------------- - -//APIļ̳ʵ -class QuoteApi : public XTP::API::QuoteSpi -{ -private: - XTP::API::QuoteApi* api; //API - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - QuoteApi() - { - function0 f = boost::bind(&QuoteApi::processTask, this); - 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 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); - - ///鶩Ӧ - ///@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); - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processSubMarketData(Task *task); - - void processUnSubMarketData(Task *task); - - void processDepthMarketData(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 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 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 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 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 = XTP_LOG_LEVEL_DEBUG); - - void release(); - - int exit(); - - string getTradingDay(); - - string getApiVersion(); - - dict getApiLastError(); - - void setUDPBufferSize(int size); - - void setHeartBeatInterval(int interval); - - 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); - - int logout(); - - int queryAllTickers(int exchange); - - int queryTickersPriceInfo(boost::python::list tickerList, int count, int exchange); - - int queryAllTickersPriceInfo(); - - - - - 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); -}; diff --git a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/ReadMe.txt b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/ReadMe.txt deleted file mode 100644 index b7db244..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/ReadMe.txt +++ /dev/null @@ -1,48 +0,0 @@ -======================================================================== - DYNAMIC LINK LIBRARY : vnxtptrader Project Overview -======================================================================== - -AppWizard has created this vnxtptrader DLL for you. - -This file contains a summary of what you will find in each of the files that -make up your vnxtptrader application. - - -vnxtptrader.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. - -vnxtptrader.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). - -vnxtptrader.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 vnxtptrader.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_18.19_python3_64/vnxtptrader/vnxtptrader/dllmain.cpp b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/dllmain.cpp deleted file mode 100644 index 69b5891..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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_18.19_python3_64/vnxtptrader/vnxtptrader/libsodium.dll b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/libsodium.dll deleted file mode 100644 index 8921bc3..0000000 Binary files a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/libsodium.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/stdafx.cpp b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/stdafx.cpp deleted file mode 100644 index 44a05bf..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// 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_18.19_python3_64/vnxtptrader/vnxtptrader/stdafx.h b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/stdafx.h deleted file mode 100644 index f3a0737..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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_18.19_python3_64/vnxtptrader/vnxtptrader/targetver.h b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#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_18.19_python3_64/vnxtptrader/vnxtptrader/vnxtptrader.cpp b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/vnxtptrader.cpp deleted file mode 100644 index 670300d..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/vnxtptrader.cpp +++ /dev/null @@ -1,1933 +0,0 @@ -// vnctpmd.cpp : DLL Ӧóĵ -// -//#include "stdafx.h" -#include "vnxtptrader.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 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; - } - } -}; - - -///------------------------------------------------------------------------------------- -///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::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::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::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::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); -} -///------------------------------------------------------------------------------------- -///̴߳ӶȡݣתΪ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 ONORDEREVENT: - { - this->processOrderEvent(task); - break; - } - - case ONTRADEEVENT: - { - this->processTradeEvent(task); - break; - } - - case ONCANCELORDERERROR: - { - this->processCancelOrderError(task); - break; - } - - case ONQUERYORDER: - { - this->processQueryOrder(task); - break; - } - - case ONQUERYORDERBYPAGE: - { - this->processQueryOrderByPage(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 ONQUERYOPTIONAUCTIONINFO: - { - this->processQueryOptionAuctionInfo(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"] = task_error->error_msg; - delete task->task_error; - } - - this->onError(error); - 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = 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"] = 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"] = 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::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"] = 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"] = 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::processQueryTrade(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryTradeRsp *task_data = (XTPQueryTradeRsp*)task->task_data; - data["branch_pbu"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = 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"] = task_data->branch_pbu; - data["trade_amount"] = task_data->trade_amount; - data["exec_id"] = task_data->exec_id; - data["trade_type"] = task_data->trade_type; - data["order_client_id"] = task_data->order_client_id; - data["order_exch_id"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = 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["reserved1"] = task_data->reserved1; - 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; - - 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"] = 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; - 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"] = 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"] = task_data->sf_ticker; - data["sf_ticker_name"] = task_data->sf_ticker_name; - data["ticker"] = task_data->ticker; - data["ticker_name"] = 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"] = 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"] = 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"] = 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"] = task_data->etf; - data["subscribe_redemption_ticker"] = 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"] = 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"] = task_data->ticker; - data["component_ticker"] = task_data->component_ticker; - data["component_name"] = 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"] = 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"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; - 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"] = 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; - 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"] = 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::processQueryOptionAuctionInfo(Task *task) -{ - PyLock lock; - dict data; - if (task->task_data) - { - XTPQueryOptionAuctionInfoRsp *task_data = (XTPQueryOptionAuctionInfoRsp*)task->task_data; - data["ticker"] = task_data->ticker; - data["security_id_source"] = (int)task_data->security_id_source; - data["symbol"] = task_data->symbol; - data["contract_id"] = task_data->contract_id; - data["underlying_security_id"] = 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"] = 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::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"] = 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) -{ - return this->api->Login(ip.c_str(), port, user.c_str(), password.c_str(), (XTP_PROTOCOL_TYPE)socktype); -}; - -int TraderApi::logout(uint64_t sessionid) -{ - return this->api->Logout(sessionid); -}; - - -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::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::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::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::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); -}; - -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::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); -}; - -///------------------------------------------------------------------------------------- -///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 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 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 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 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(); - } - }; - -}; - - -BOOST_PYTHON_MODULE(vnxtptrader) -{ - PyEval_InitThreads(); //ʱУ֤ȴGIL - - 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("insertOrder", &TraderApiWrap::insertOrder) - .def("cancelOrder", &TraderApiWrap::cancelOrder) - .def("queryOrderByXTPID", &TraderApiWrap::queryOrderByXTPID) - .def("queryOrders", &TraderApiWrap::queryOrders) - .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("queryOptionAuctionInfo", &TraderApiWrap::queryOptionAuctionInfo) - .def("queryOrdersByPage", &TraderApiWrap::queryOrdersByPage) - .def("queryTradesByPage", &TraderApiWrap::queryTradesByPage) - .def("isServerRestart", &TraderApiWrap::isServerRestart) - - .def("onDisconnected", pure_virtual(&TraderApiWrap::onDisconnected)) - .def("onError", pure_virtual(&TraderApiWrap::onError)) - .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("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("onQueryOptionAuctionInfo", pure_virtual(&TraderApiWrap::onQueryOptionAuctionInfo)) - .def("onQueryOrderByPage", pure_virtual(&TraderApiWrap::onQueryOrderByPage)) - .def("onQueryTradeByPage", pure_virtual(&TraderApiWrap::onQueryTradeByPage)) - ; -}; diff --git a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/vnxtptrader.h b/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/vnxtptrader.h deleted file mode 100644 index 1892f59..0000000 --- a/source/Windows/xtp_18.19_python3_64/vnxtptrader/vnxtptrader/vnxtptrader.h +++ /dev/null @@ -1,496 +0,0 @@ -//˵ - -//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 ONQUERYORDERBYPAGE 18 -#define ONQUERYTRADEBYPAGE 19 -///------------------------------------------------------------------------------------- -///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; //ǷΪ󷵻 - uint64_t addtional_int; //ֶ - int64_t addtional_int_two; //ֶ - int64_t addtional_int_three; //ֶ - int64_t addtional_int_four; //ֶ -}; - - -///̰߳ȫĶ -template - -class ConcurrentQueue -{ -private: - queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost - -public: - - //µ - void push(Data const& data) - { - mutex::scoped_lock lock(the_mutex); //ȡ - the_queue.push(data); //д - lock.unlock(); //ͷ - the_condition_variable.notify_one(); //֪ͨȴ߳ - } - - //ǷΪ - bool empty() const - { - mutex::scoped_lock lock(the_mutex); - return the_queue.empty(); - } - - //ȡ - Data wait_and_pop() - { - 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); - -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 - thread *task_thread; //ָ߳루pythonݣ - ConcurrentQueue task_queue; // - -public: - TraderApi() - { - function0 f = boost::bind(&TraderApi::processTask, this); - 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 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 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 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 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); - - - //------------------------------------------------------------------------------------- - //task - //------------------------------------------------------------------------------------- - - void processTask(); - - void processDisconnected(Task *task); - - void processError(Task *task); - - void processOrderEvent(Task *task); - - void processTradeEvent(Task *task); - - void processCancelOrderError(Task *task); - - void processQueryOrder(Task *task); - - void processQueryOrderByPage(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 processQueryOptionAuctionInfo(Task *task); - //------------------------------------------------------------------------------------- - //dataصֵ - //errorصĴֵ - //reqidid - //lastǷΪ󷵻 - //------------------------------------------------------------------------------------- - - virtual void onDisconnected(uint64_t session, int reason) {}; - - virtual void onError(dict data) {}; - - 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 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 onQueryOptionAuctionInfo(dict data, dict error, int reqid, bool 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 onQueryTradeByPage(dict data, int64_t req_count, int64_t trade_sequence, int64_t query_reference, int reqid, bool last, uint64_t session) {}; - - //------------------------------------------------------------------------------------- - //req:ֵ - //------------------------------------------------------------------------------------- - - void createTraderApi(uint8_t clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); - - 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); - - int logout(uint64_t sessionid); - - uint64_t insertOrder(dict req, uint64_t sessionid); - - uint64_t cancelOrder(uint64_t orderid, uint64_t sessionid); - - int queryOrderByXTPID(uint64_t orderid, uint64_t sessionid, int reqid); - - int queryOrders(dict req, 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 queryOptionAuctionInfo(dict req,uint64_t session_id, int request_id); - - int queryOrdersByPage(dict req, uint64_t sessionid, int reqid); - - int queryTradesByPage(dict req, uint64_t sessionid, int reqid); - - bool isServerRestart(uint64_t session_id); -}; diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xoms_api_fund_struct.h b/source/Windows/xtp_18.19_python3_64/xtpapi/xoms_api_fund_struct.h deleted file mode 100644 index 7b0168a..0000000 --- a/source/Windows/xtp_18.19_python3_64/xtpapi/xoms_api_fund_struct.h +++ /dev/null @@ -1,42 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 ; - -#pragma pack() - -#endif \ No newline at end of file diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xoms_api_struct.h b/source/Windows/xtp_18.19_python3_64/xtpapi/xoms_api_struct.h deleted file mode 100644 index 64e03b1..0000000 --- a/source/Windows/xtp_18.19_python3_64/xtpapi/xoms_api_struct.h +++ /dev/null @@ -1,680 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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{ - 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{ - 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; -}; - - - -///报单成交结构体 -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; - ///成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 - uint64_t report_index; - ///报单编号 --交易所单号,上交所为空,深交所有此字段 - char order_exch_id[XTP_ORDER_EXCH_LEN]; - ///成交类型 --成交回报中的执行类型 - TXTPTradeTypeType trade_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; - ///交易所交易员代码 - 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) - - ///(保留字段) - uint64_t unknown[43 - 12 - 1]; -}; - - - -////////////////////////////////////////////////////////////////////////// -///查询股票持仓情况 -////////////////////////////////////////////////////////////////////////// -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; - ///保留字段1 - uint32_t reserved1; - /// 可行权合约 - int64_t executable_option; - /// 可锁定标的 - int64_t lockable_position; - /// 可行权标的 - int64_t executable_underlying; - /// 已锁定标的 - int64_t locked_position; - /// 可用已锁定标的 - int64_t usable_locked_position; - - - ///(保留字段) - uint64_t unknown[50 - 6]; -}; - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水通知 -///////////////////////////////////////////////////////////////////////// -struct XTPFundTransferNotice -{ - ///资金内转编号 - uint64_t serial_id; - ///内转类型 - XTP_FUND_TRANSFER_TYPE transfer_type; - ///金额 - double amount; - ///操作结果 - XTP_FUND_OPER_STATUS oper_status; - ///操作时间 - uint64_t transfer_time; -}; - - - -///////////////////////////////////////////////////////////////////////// -///资金内转流水查询请求与响应 -///////////////////////////////////////////////////////////////////////// -struct XTPQueryFundTransferLogReq { - ///资金内转编号 - uint64_t serial_id; - -}; - -///////////////////////////////////////////////////////////////////////// -///资金内转流水记录结构体 -///////////////////////////////////////////////////////////////////////// -typedef struct XTPFundTransferNotice XTPFundTransferLog; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryStructuredFundInfoReq -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码,不可为空 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码,可以为空,如果为空,则默认查询所有的分级基金 -}; - -////////////////////////////////////////////////////////////////////////// -///查询分级基金信息响应结构体 -////////////////////////////////////////////////////////////////////////// -struct XTPStructuredFundInfo -{ - XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码 - char sf_ticker[XTP_TICKER_LEN]; ///<分级基金母基金代码 - char sf_ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金母基金名称 - char ticker[XTP_TICKER_LEN]; ///<分级基金子基金代码 - char ticker_name[XTP_TICKER_NAME_LEN]; ///<分级基金子基金名称 - XTP_SPLIT_MERGE_STATUS split_merge_status; ///<基金允许拆分合并状态 - uint32_t ratio; ///<拆分合并比例 - uint32_t min_split_qty;///<最小拆分数量 - uint32_t min_merge_qty; ///<最小合并数量 - double net_price;///<基金净值 -}; - - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--请求结构体, -///请求参数为多条件参数:1,不填则返回所有市场的ETF合约信息。 -/// 2,只填写market,返回该交易市场下结果 -/// 3,填写market及ticker参数,只返回该etf信息。 -////////////////////////////////////////////////////////////////////////// -struct XTPQueryETFBaseReq -{ - ///交易市场 - XTP_MARKET_TYPE market; - ///ETF买卖代码 - char ticker[XTP_TICKER_LEN]; -}; - -////////////////////////////////////////////////////////////////////////// -///查询股票ETF合约基本情况--响应结构体 -////////////////////////////////////////////////////////////////////////// -typedef struct XTPQueryETFBaseRsp -{ - XTP_MARKET_TYPE market; ///<交易市场 - char etf[XTP_TICKER_LEN]; /// -#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 XTPMarketDataOptionExData { - ///波段性中断参考价(SH) - double auction_price; - ///波段性中断集合竞价虚拟匹配量(SH) - int64_t auction_qty; - ///最近询价时间(SH) - int64_t last_enquiry_time; -}; - -enum XTP_MARKETDATA_TYPE { - XTP_MARKETDATA_ACTUAL = 0, // 现货(股票/基金/债券等) - XTP_MARKETDATA_OPTION = 1, // 期权 -}; - -///行情 -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; - ///昨日结算价 - double pre_settl_price; - ///今日结算价 - 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; - ///当日均价=(turnover/qty) - double avg_price; - - // 买卖盘 - ///十档申买价 - double bid[10]; - ///十档申卖价 - double ask[10]; - ///十档申买量 - int64_t bid_qty[10]; - ///十档申卖量 - int64_t ask_qty[10]; - - // 额外数据 - ///成交笔数 - int64_t trades_count; - ///当前交易状态说明 - char ticker_status[8]; - ///数据 - union { - XTPMarketDataStockExData stk; - XTPMarketDataOptionExData opt; - } ; - ///决定了union是哪种数据类型 - XTP_MARKETDATA_TYPE data_type; - ///预留 - int32_t r4; -} XTPMD; - - -///股票行情静态信息 -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; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - int64_t seq; - ///委托价格 - double price; - ///委托数量 - int64_t qty; - ///'1':买; '2':卖; 'G':借入; 'F':出借 - char side; - ///订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - char ord_type; -}; - -///逐笔成交 -struct XTPTickByTickTrade { - ///频道代码 - int32_t channel_no; - ///委托序号(在同一个channel_no内唯一,从1开始连续) - 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; -}; - -///逐笔数据信息 -typedef struct XTPTickByTickStruct { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///预留 - int64_t seq; - ///委托时间 or 成交时间 - int64_t data_time; - ///委托 or 成交 - XTP_TBT_TYPE type; - - union { - XTPTickByTickEntrust entrust; - XTPTickByTickTrade trade; - }; -} XTPTBT; - - -///供查询的最新信息 -typedef struct XTPTickerPriceInfo { - ///交易所代码 - XTP_EXCHANGE_TYPE exchange_id; - ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 - char ticker[XTP_TICKER_LEN]; - ///最新价 - double last_price; -} XTPTPI; - -#pragma pack() - -#endif diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_api_data_type.h b/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_api_data_type.h deleted file mode 100644 index ebf2b4e..0000000 --- a/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_api_data_type.h +++ /dev/null @@ -1,401 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@author 中泰证券股份有限公司 -///@file xtp_api_data_type.h -///@brief 定义兼容数据基本类型 -///////////////////////////////////////////////////////////////////////// -#ifndef _XTP_API_DATA_TYPE_H_ -#define _XTP_API_DATA_TYPE_H_ - -#pragma pack(8) - -/// 存放版本号的字符串长度 -#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 - -///////////////////////////////////////////////////////////////////////// -///@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_ diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_quote_api.h b/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_quote_api.h deleted file mode 100644 index 5867e8e..0000000 --- a/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_quote_api.h +++ /dev/null @@ -1,426 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 0; - - - protected: - ~QuoteApi() {}; - }; - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_trader_api.h b/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_trader_api.h deleted file mode 100644 index 01f39c6..0000000 --- a/source/Windows/xtp_18.19_python3_64/xtpapi/xtp_trader_api.h +++ /dev/null @@ -1,456 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -///@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" - -#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 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 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 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=11000382时,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) {}; - - ///请求查询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 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) {}; - - }; - } -} - -#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,用于区分同一用户的不同客户端,由用户自定义 - ///@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 - ///@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) = 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 报单在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; - - ///报单操作请求 - ///@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 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; - - ///根据委托编号请求查询相关成交 - ///@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 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格,并以'\0'结尾 - ///@param session_id 资金账户对应的session_id,登录时得到 - ///@param request_id 用于用户定位查询响应的ID,由用户自定义 - ///@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 - virtual int QueryPosition(const char *ticker, uint64_t session_id, int request_id) = 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; - - ///请求查询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 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; - - - protected: - ~TraderApi() {}; - }; - - } -} - -#ifndef WINDOWS -#if __GNUC__ >= 4 -#pragma GCC visibility pop -#endif -#endif - - -#endif diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtpquoteapi.dll b/source/Windows/xtp_18.19_python3_64/xtpapi/xtpquoteapi.dll deleted file mode 100644 index 8ae553e..0000000 Binary files a/source/Windows/xtp_18.19_python3_64/xtpapi/xtpquoteapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtpquoteapi.lib b/source/Windows/xtp_18.19_python3_64/xtpapi/xtpquoteapi.lib deleted file mode 100644 index f4d7fdd..0000000 Binary files a/source/Windows/xtp_18.19_python3_64/xtpapi/xtpquoteapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtptraderapi.dll b/source/Windows/xtp_18.19_python3_64/xtpapi/xtptraderapi.dll deleted file mode 100644 index 1b0c776..0000000 Binary files a/source/Windows/xtp_18.19_python3_64/xtpapi/xtptraderapi.dll and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_64/xtpapi/xtptraderapi.lib b/source/Windows/xtp_18.19_python3_64/xtpapi/xtptraderapi.lib deleted file mode 100644 index c78fe9a..0000000 Binary files a/source/Windows/xtp_18.19_python3_64/xtpapi/xtptraderapi.lib and /dev/null differ diff --git a/source/Windows/xtp_18.19_python3_32/CMakeLists.txt b/source/Windows/xtp_api_python3_2.2.42.1/CMakeLists.txt similarity index 77% rename from source/Windows/xtp_18.19_python3_32/CMakeLists.txt rename to source/Windows/xtp_api_python3_2.2.42.1/CMakeLists.txt index 54e7fc0..7e03c1a 100644 --- a/source/Windows/xtp_18.19_python3_32/CMakeLists.txt +++ b/source/Windows/xtp_api_python3_2.2.42.1/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8) -project(vn_xtp_api) +project(vn_xtp_api) # 设置使用的编译器 set(CMAKE_BUILD_TYPE "Release") @@ -54,26 +54,27 @@ endif() # 设置Python所在的目录 set(PYTHON_LIBRARY ) if (WIN32) - set(PYTHON_INCLUDE_PATH E:/xtpIDE/Python/Python36-32/include) - link_directories(E:/xtpIDE/Python/Python36-32/libs) + 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.6m/) + set(PYTHON_INCLUDE_PATH /usr/local/python3/include/python3.9/) + include_directories(${PYTHON_INCLUDE_PATH}) endif() -# 链接boost库,anaconda /python3用的是python3.6没有用Anaconda +# 链接boost库,anaconda /python3用的是python3.9没有用Anaconda set(BOOST_ROOT ) if (WIN32) - set(BOOST_ROOT E:/xtp/soft/boost_1_57_0_python3_32/boost_1_57_0/) + set(BOOST_ROOT D:/MyThird/boost_1_80_0) set(Boost_USE_STATIC_LIBS ON) #链接boost静态库 - link_directories(E:/xtp/soft/boost_1_57_0_python3_32/boost_1_57_0/stage/lib) + link_directories(D:/MyThird/boost_1_80_0/stage/lib) include_directories(${BOOST_ROOT}) elseif(UNIX) set(Boost_USE_MULTITHREADED ON) - set(BOOST_ROOT /home/likunliang/boost_1_66_0_python3/) - find_package(Boost 1.66.0 COMPONENTS python3 thread date_time system chrono REQUIRED) # 如果boost库没有完全编译,需要将编译的库明确地指出,否者message(${Boost_LIBRARIES})会出错 + 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() @@ -86,17 +87,17 @@ 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/vnxtpquote) + 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/vnxtpquote.cpp) + 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/vnxtptrader/) + 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/vnxtptrader.cpp) + set(VN_XTP_TD_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/vnxtptrader/vnxtptrader.cpp) add_library(vnxtptrader SHARED ${VN_XTP_TD_SOURCE}) endif() @@ -110,7 +111,7 @@ 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") +set(MD_DLL ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.dll) if (EXISTS ${MD_DLL}) file(RENAME ${MD_DLL} ${LIBRARY_OUTPUT_PATH}/Release/vnxtpquote.pyd) endif() diff --git a/source/Windows/xtp_api_python3_2.2.42.1/README.md b/source/Windows/xtp_api_python3_2.2.42.1/README.md new file mode 100644 index 0000000..8f7ceab --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/README.md @@ -0,0 +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封装库)。 + +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/Linux/xtp_python3_18.19/build.sh b/source/Windows/xtp_api_python3_2.2.42.1/build.sh similarity index 100% rename from source/Linux/xtp_python3_18.19/build.sh rename to source/Windows/xtp_api_python3_2.2.42.1/build.sh diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/ReadMe.txt b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/ReadMe.txt similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/ReadMe.txt rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/ReadMe.txt diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/dllmain.cpp b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/dllmain.cpp similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/dllmain.cpp rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/dllmain.cpp diff --git a/source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/libsodium.dll b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/libsodium.dll similarity index 100% rename from source/Windows/xtp_18.19_python2_32/vnxtptrader/vnxtptrader/libsodium.dll rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/libsodium.dll diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/stdafx.cpp b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.cpp similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/stdafx.cpp rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.cpp diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/stdafx.h b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.h similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/stdafx.h rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/stdafx.h diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/targetver.h b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/targetver.h similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/targetver.h rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/targetver.h diff --git a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/vnxtpquote.cpp b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.cpp similarity index 63% rename from source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/vnxtpquote.cpp rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.cpp index 2f080af..1616eb0 100644 --- a/source/Windows/xtp_18.19_python2_64/vnxtpquote/vnxtpquote/vnxtpquote.cpp +++ b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.cpp @@ -33,6 +33,32 @@ void getDouble(dict d, string key, double *value) } }; +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)) @@ -69,6 +95,11 @@ void getChar(dict d, string key, char *value) } }; +string addEndingChar(char *value){ + string endStr = value; + return endStr; +} + ///------------------------------------------------------------------------------------- ///C++Ļصݱ浽 ///------------------------------------------------------------------------------------- @@ -96,6 +127,15 @@ void QuoteApi::OnError(XTPRI *error_info) 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(); @@ -180,6 +220,21 @@ void QuoteApi::OnDepthMarketData(XTPMD *market_data, int64_t bid1_qty[], int32_t 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(); @@ -350,7 +405,7 @@ void QuoteApi::OnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error void QuoteApi::OnUnSubscribeAllOrderBook(XTP_EXCHANGE_TYPE exchage_id,XTPRI *error_info) { Task* task = new Task(); - task->task_name = ONUNSUBSCRIBEALLMARKETDATA; + task->task_name = ONUNSUBSCRIBEALLORDERBOOK; if (error_info) { @@ -440,6 +495,102 @@ void QuoteApi::OnQueryTickersPriceInfo(XTPTPI* ticker_info, XTPRI *error_info, b }; +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) { @@ -688,6 +839,47 @@ void QuoteApi::processTask() 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; + } }; } }; @@ -709,7 +901,7 @@ void QuoteApi::processError(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -717,6 +909,13 @@ void QuoteApi::processError(Task *task) 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; @@ -725,7 +924,7 @@ void QuoteApi::processSubMarketData(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -734,7 +933,7 @@ void QuoteApi::processSubMarketData(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -750,7 +949,7 @@ void QuoteApi::processUnSubMarketData(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -759,7 +958,7 @@ void QuoteApi::processUnSubMarketData(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -775,7 +974,7 @@ void QuoteApi::processDepthMarketData(Task *task) { XTPMD *task_data = (XTPMD*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + 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; @@ -802,11 +1001,11 @@ void QuoteApi::processDepthMarketData(Task *task) data["trades_count"] = task_data->trades_count; char str_ticker_status[9] = {"\0"}; #ifdef _MSC_VER //WIN32 - strcpy_s(str_ticker_status, sizeof(task_data->ticker_status)+1, task_data->ticker_status); + 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"] = str_ticker_status; + data["ticker_status"] = addEndingChar(str_ticker_status); boost::python::list ask; boost::python::list bid; @@ -827,7 +1026,8 @@ void QuoteApi::processDepthMarketData(Task *task) data["ask_qty"] = ask_qty; data["data_type"] = (int)task_data->data_type; - if (task_data->data_type == XTP_MARKETDATA_ACTUAL){ + 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; @@ -860,13 +1060,45 @@ void QuoteApi::processDepthMarketData(Task *task) 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 == XTP_MARKETDATA_OPTION){ + }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; + //data["r4"] = task_data->r4; delete task->task_data; } @@ -899,6 +1131,24 @@ void QuoteApi::processDepthMarketData(Task *task) 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; @@ -907,7 +1157,7 @@ void QuoteApi::processSubOrderBook(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -916,7 +1166,7 @@ void QuoteApi::processSubOrderBook(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -932,7 +1182,7 @@ void QuoteApi::processUnSubOrderBook(Task *task) { XTPST *task_data = (XTPST*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -941,7 +1191,7 @@ void QuoteApi::processUnSubOrderBook(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -957,7 +1207,7 @@ void QuoteApi::processOrderBook(Task *task) { XTPOB *task_data = (XTPOB*) task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); data["data_time"] = task_data->data_time; data["last_price"] = task_data->last_price; @@ -997,7 +1247,7 @@ void QuoteApi::processSubTickByTick(Task *task) { XTPST *task_data = (XTPST*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -1006,7 +1256,7 @@ void QuoteApi::processSubTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1022,7 +1272,7 @@ void QuoteApi::processUnSubTickByTick(Task *task) { XTPST *task_data = (XTPST*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); delete task->task_data; } @@ -1031,7 +1281,7 @@ void QuoteApi::processUnSubTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1049,8 +1299,8 @@ void QuoteApi::processTickByTick(Task *task) data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; - //data["seq"] = task_data->seq; + 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; @@ -1062,8 +1312,9 @@ void QuoteApi::processTickByTick(Task *task) 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 + else if(task_data->type == XTP_TBT_TRADE) { data["channel_no"] = task_data->trade.channel_no; data["seq"] = task_data->trade.seq; @@ -1074,6 +1325,12 @@ void QuoteApi::processTickByTick(Task *task) 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; } @@ -1090,7 +1347,7 @@ void QuoteApi::processSubscribeAllMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } this->onSubscribeAllMarketData(task->exchange_id,error); @@ -1105,7 +1362,7 @@ void QuoteApi::processUnSubscribeAllMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1121,7 +1378,7 @@ void QuoteApi::processSubscribeAllOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1137,7 +1394,7 @@ void QuoteApi::processUnSubscribeAllOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1153,7 +1410,7 @@ void QuoteApi::processSubscribeAllTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1169,7 +1426,7 @@ void QuoteApi::processUnSubscribeAllTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1187,8 +1444,8 @@ void QuoteApi::processQueryAllTickers(Task *task) { XTPQSI *task_data = (XTPQSI*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; - data["ticker_name"] = task_data->ticker_name; + 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; @@ -1205,7 +1462,7 @@ void QuoteApi::processQueryAllTickers(Task *task) { XTPRI *task_error = (XTPRI*) task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1223,7 +1480,7 @@ void QuoteApi::processQueryTickersPriceInfo(Task *task) { XTPTPI *task_data = (XTPTPI*)task->task_data; data["exchange_id"] = (int)task_data->exchange_id; - data["ticker"] = task_data->ticker; + data["ticker"] = addEndingChar(task_data->ticker); data["last_price"] = task_data->last_price; delete task->task_data; @@ -1234,7 +1491,7 @@ void QuoteApi::processQueryTickersPriceInfo(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1254,7 +1511,7 @@ void QuoteApi::processSubscribeAllOptionMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1270,7 +1527,7 @@ void QuoteApi::processUnSubscribeAllOptionMarketData(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1286,7 +1543,7 @@ void QuoteApi::processSubscribeAllOptionOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1302,7 +1559,7 @@ void QuoteApi::processUnSubscribeAllOptionOrderBook(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1318,7 +1575,7 @@ void QuoteApi::processSubscribeAllOptionTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + error["error_msg"] = addEndingChar(task_error->error_msg); delete task->task_error; } @@ -1334,13 +1591,353 @@ void QuoteApi::processUnSubscribeAllOptionTickByTick(Task *task) { XTPRI *task_error = (XTPRI*)task->task_error; error["error_id"] = task_error->error_id; - error["error_msg"] = task_error->error_msg; + 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; +} + + ///------------------------------------------------------------------------------------- /// ///------------------------------------------------------------------------------------- @@ -1410,9 +2007,58 @@ 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->UnSubscribeAllTickByTick((XTP_EXCHANGE_TYPE)exchange); }; -int QuoteApi::login(string ip, int port, string user, string password, int socktype) +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); + 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; }; @@ -1574,6 +2230,8 @@ int QuoteApi::queryAllTickers(int exchange) 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->QueryAllTickersFullInfo((XTP_EXCHANGE_TYPE) exchange); + return i; +} +int QuoteApi::queryAllNQTickersFullInfo() + { + return this->api->QueryAllNQTickersFullInfo(); +} int QuoteApi::subscribeAllOptionMarketData(int exchange) { @@ -1636,6 +2302,41 @@ int QuoteApi::unSubscribeAllOptionTickByTick(int 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װ ///------------------------------------------------------------------------------------- @@ -1666,6 +2367,18 @@ struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > } }; + 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 @@ -1702,6 +2415,18 @@ struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > } }; + 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 @@ -1944,12 +2669,84 @@ struct QuoteApiWrap : QuoteApi, wrapper < QuoteApi > 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 + //PyEval_InitThreads(); //ʱУ֤ȴGIL + Py_Initialize(); class_("QuoteApi") .def("createQuoteApi", &QuoteApiWrap::createQuoteApi) @@ -1960,6 +2757,11 @@ BOOST_PYTHON_MODULE(vnxtpquote) .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) @@ -1977,20 +2779,26 @@ BOOST_PYTHON_MODULE(vnxtpquote) .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)) @@ -2005,6 +2813,12 @@ BOOST_PYTHON_MODULE(vnxtpquote) .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)) diff --git a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/vnxtpquote.h b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.h similarity index 79% rename from source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/vnxtpquote.h rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.h index 9ca9074..cd09dc2 100644 --- a/source/Linux/xtp_python3_18.19/vnxtpquote/vnxtpquote/vnxtpquote.h +++ b/source/Windows/xtp_api_python3_2.2.42.1/vnxtpquote/vnxtpquote.h @@ -56,6 +56,15 @@ using namespace boost; #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 @@ -109,15 +118,15 @@ class ConcurrentQueue { private: queue the_queue; //׼ - mutable mutex the_mutex; //boost - condition_variable the_condition_variable; //boost + mutable boost::mutex the_mutex; //boost + boost::condition_variable the_condition_variable; //boost public: //µ void push(Data const& data) { - mutex::scoped_lock lock(the_mutex); //ȡ + boost::mutex::scoped_lock lock(the_mutex); //ȡ the_queue.push(data); //д lock.unlock(); //ͷ the_condition_variable.notify_one(); //֪ͨȴ߳ @@ -126,14 +135,14 @@ class ConcurrentQueue //ǷΪ bool empty() const { - mutex::scoped_lock lock(the_mutex); + boost::mutex::scoped_lock lock(the_mutex); return the_queue.empty(); } //ȡ Data wait_and_pop() { - mutex::scoped_lock lock(the_mutex); + boost::mutex::scoped_lock lock(the_mutex); while (the_queue.empty()) //Ϊʱ { @@ -160,6 +169,10 @@ 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Ļصʵ @@ -170,14 +183,14 @@ class QuoteApi : public XTP::API::QuoteSpi { private: XTP::API::QuoteApi* api; //API - thread *task_thread; //ָ߳루pythonݣ + boost::thread *task_thread; //ָ߳루pythonݣ ConcurrentQueue task_queue; // public: QuoteApi() { function0 f = boost::bind(&QuoteApi::processTask, this); - thread t(f); + boost::thread t(f); this->task_thread = &t; }; @@ -200,6 +213,12 @@ class QuoteApi : public XTP::API::QuoteSpi ///@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ʱûд @@ -225,6 +244,10 @@ class QuoteApi : public XTP::API::QuoteSpi ///@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ʱûд @@ -342,6 +365,38 @@ class QuoteApi : public XTP::API::QuoteSpi ///@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 //------------------------------------------------------------------------------------- @@ -352,12 +407,16 @@ class QuoteApi : public XTP::API::QuoteSpi 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); @@ -386,7 +445,17 @@ class QuoteApi : public XTP::API::QuoteSpi 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); @@ -412,12 +481,16 @@ class QuoteApi : public XTP::API::QuoteSpi 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) {}; @@ -446,7 +519,17 @@ class QuoteApi : public XTP::API::QuoteSpi 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) {}; @@ -464,7 +547,7 @@ class QuoteApi : public XTP::API::QuoteSpi //req:ֵ //------------------------------------------------------------------------------------- - void createQuoteApi(int clientid, string path, int log_level = XTP_LOG_LEVEL_DEBUG); + void createQuoteApi(int clientid, string path, int log_level); void release(); @@ -480,6 +563,16 @@ class QuoteApi : public XTP::API::QuoteSpi 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); @@ -504,7 +597,7 @@ class QuoteApi : public XTP::API::QuoteSpi int unSubscribeAllTickByTick(int exchange = 3); - int login(string ip, int port, string user, string password, int socktype); + int login(string ip, int port, string user, string password, int socktype,string local_ip); int logout(); @@ -514,8 +607,9 @@ class QuoteApi : public XTP::API::QuoteSpi int queryAllTickersPriceInfo(); + int queryAllTickersFullInfo(int exchange); - + int queryAllNQTickersFullInfo(); int subscribeAllOptionMarketData(int exchange = XTP_EXCHANGE_UNKNOWN); @@ -528,4 +622,10 @@ class QuoteApi : public XTP::API::QuoteSpi 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/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/dllmain.cpp b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/dllmain.cpp similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/dllmain.cpp rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/dllmain.cpp diff --git a/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/stdafx.cpp b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.cpp similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/stdafx.cpp rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.cpp diff --git a/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/stdafx.h b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.h similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/stdafx.h rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/stdafx.h diff --git a/source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/targetver.h b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/targetver.h similarity index 100% rename from source/Linux/xtp_python3_18.19/vnxtptrader/vnxtptrader/targetver.h rename to source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/targetver.h diff --git a/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.cpp b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.cpp new file mode 100644 index 0000000..6ef9ff1 --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.cpp @@ -0,0 +1,5797 @@ +// 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) +{ + string endStr = value; + 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(XTPOptCombOrderCancelInfo *cancel_info, XTPRI *error_info, uint64_t session_id) { + + Task* task = new Task(); + task->task_name = ONCANCELOPTIONCOMBINEDORDERERROR; + + if (cancel_info) { + XTPOptCombOrderCancelInfo *task_data = new XTPOptCombOrderCancelInfo(); + *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); +} + +void TraderApi::OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONPAUSEALGOORDER; + task->addtional_int_two = xtp_strategy_id; + + if (ticker_info) { + XTPStrategyTickerInfo *task_data = new XTPStrategyTickerInfo(); + *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_id = request_id; + task->addtional_int = session_id; + this->task_queue.push(task); +} + +void TraderApi::OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) +{ + Task* task = new Task(); + task->task_name = ONRESUMEALGOORDER; + task->addtional_int_two = xtp_strategy_id; + + if (ticker_info) { + XTPStrategyTickerInfo *task_data = new XTPStrategyTickerInfo(); + *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_id = request_id; + 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; + } + case ONPAUSEALGOORDER: + { + this->processPauseAlgoOrder(task); + break; + } + case ONRESUMEALGOORDER: + { + this->processResumeAlgoOrder(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; + data["strategy_id"] = addEndingChar(task_data->strategy_id); + 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::processPauseAlgoOrder(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyTickerInfo *task_data = (XTPStrategyTickerInfo*)task->task_data; + data["m_ticker"] = addEndingChar(task_data->m_ticker); + data["m_market"] = (int)task_data->m_market; + } + + 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->onPauseAlgoOrder(task->addtional_int_two, data, error, task->task_id, task->addtional_int); + delete task; +} + +void TraderApi::processResumeAlgoOrder(Task *task) +{ + PyLock lock; + + dict data; + if (task->task_data) + { + XTPStrategyTickerInfo *task_data = (XTPStrategyTickerInfo*)task->task_data; + data["m_ticker"] = addEndingChar(task_data->m_ticker); + data["m_market"] = (int)task_data->m_market; + } + + 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->onResumeAlgoOrder(task->addtional_int_two, data, error, task->task_id, 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)); + getStr(req, "fund_account", query_param.fund_account); + getStr(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); +}; + +int TraderApi::pauseAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id) +{ + XTPStrategyTickerInfo myreq = XTPStrategyTickerInfo(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "m_ticker", myreq.m_ticker); + + int m_market = XTP_MKT_INIT; + getInt(req, "m_market", &m_market); + myreq.m_market = (XTP_MARKET_TYPE)m_market; + + return this->api->PauseAlgoOrder(xtp_strategy_id, &myreq, session_id, request_id); +}; + +int TraderApi::resumeAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id) +{ + XTPStrategyTickerInfo myreq = XTPStrategyTickerInfo(); + memset(&myreq, 0, sizeof(myreq)); + getStr(req, "m_ticker", myreq.m_ticker); + + int m_market = XTP_MKT_INIT; + getInt(req, "m_market", &m_market); + myreq.m_market = (XTP_MARKET_TYPE)m_market; + + return this->api->ResumeAlgoOrder(xtp_strategy_id, &myreq, session_id, request_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; + + try { + this->get_override("onQueryStrategy")(data,strategy_param, error_info, request_id,is_last,session_id); + } catch (error_already_set const &) { + PyErr_Print(); + } + }; + + 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(); + } + }; + + virtual void onPauseAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onPauseAlgoOrder")(xtp_strategy_id, data, error_info, request_id, session_id); + } + catch (error_already_set const &) { + PyErr_Print(); + } + }; + + virtual void onResumeAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, uint64_t session_id) { + PyLock lock; + + try { + this->get_override("onResumeAlgoOrder")(xtp_strategy_id, data, error_info, request_id, 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("pauseAlgoOrder", &TraderApiWrap::pauseAlgoOrder) + .def("resumeAlgoOrder", &TraderApiWrap::resumeAlgoOrder) + + ////////////////////////ص/////////////////////// + .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)) + .def("onPauseAlgoOrde", pure_virtual(&TraderApiWrap::onPauseAlgoOrder)) + .def("onResumeAlgoOrder", pure_virtual(&TraderApiWrap::onResumeAlgoOrder)) + ; +}; diff --git a/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.h b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.h new file mode 100644 index 0000000..073e810 --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/vnxtptrader/vnxtptrader.h @@ -0,0 +1,1242 @@ +//˵ + +//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 +#define ONPAUSEALGOORDER 63 +#define ONRESUMEALGOORDER 64 + +///------------------------------------------------------------------------------------- +///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); + + ///algoҵָָ֤ͣȯ㷨Ӧ + ///@param xtp_strategy_id xtp㷨ID + ///@param ticker_info ָ֤ȯϢΪnullΪnullʾָ֤ͣȯ㷨 + ///@param error_info ޸IJԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id); + + ///algoҵָָ֤ȯ㷨Ӧ + ///@param xtp_strategy_id xtp㷨ID + ///@param ticker_info ָ֤ȯϢΪnullΪnullʾָ֤ȯ㷨 + ///@param error_info ޸IJԵʱصĴϢerror_infoΪգerror_info.error_idΪ0ʱûд + ///@param request_id ϢӦӦID + ///@param session_id ʽ˻Ӧsession_id¼ʱõ + ///@remark ҪٷأϢʱᴥ + virtual void OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, 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); + + void processPauseAlgoOrder(Task *task); + + void processResumeAlgoOrder(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) {}; + + virtual void onPauseAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, uint64_t session_id) {}; + + virtual void onResumeAlgoOrder(uint64_t xtp_strategy_id, dict data, dict error_info, int32_t request_id, 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); + + int pauseAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id); + + int resumeAlgoOrder(uint64_t xtp_strategy_id, dict req, uint64_t session_id, int32_t request_id); + +}; diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/algo_api_struct.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/algo_api_struct.h new file mode 100644 index 0000000..404ebc5 --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/algo_api_struct.h @@ -0,0 +1,103 @@ +///////////////////////////////////////////////////////////////////////// +///@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; + +///策略中的证券信息结构体 +typedef struct XTPStrategyTickerInfoStruct +{ + char m_ticker[XTP_TICKER_LEN]; ///< 证券代码 + XTP_MARKET_TYPE m_market; ///< 交易市场 +} XTPStrategyTickerInfo; + +#pragma pack() + +#endif //_XTP_ALGO_API_STRUCT_H_ diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/algo_data_type.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/algo_data_type.h new file mode 100644 index 0000000..f34a66c --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/algo_data_type.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////// +///@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 +#define XTP_STRATEGY_STATE_PARTPAUSE 9 +#define XTP_STRATEGY_STATE_PAUSE 10 +#define XTP_STRATEGY_STATE_RESUMING 11 +#define XTP_STRATEGY_STATE_RESUMED 12 + +#endif //_XTP_ALGO_DATA_TYPE_H_ diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/config.json b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/config.json new file mode 100644 index 0000000..5984bbe --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/config.json @@ -0,0 +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" + } +} \ No newline at end of file diff --git a/source/Windows/xtp_18.19_python2_32/xtpapi/xoms_api_fund_struct.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_fund_struct.h similarity index 57% rename from source/Windows/xtp_18.19_python2_32/xtpapi/xoms_api_fund_struct.h rename to source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_fund_struct.h index 7b0168a..c685a70 100644 --- a/source/Windows/xtp_18.19_python2_32/xtpapi/xoms_api_fund_struct.h +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_fund_struct.h @@ -1,42 +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 ; - -#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.42.1/xtpapi/xoms_api_struct.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_struct.h new file mode 100644 index 0000000..5f35f12 --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xoms_api_struct.h @@ -0,0 +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、NQ: 委托序号(委托成交统一编号, 同一channel_no内连续) + int64_t seq; + ///委托价格 + double price; + ///SH: 剩余委托数量(balance) + ///SZ、NQ: 委托数量 + int64_t qty; + ///SH: 'B':买; 'S':卖 + ///SZ: '1':买; '2':卖; 'G':借入; 'F':出借 + ///NQ: '1':买; '2':卖; + char side; + ///SH: 'A': 增加; 'D': 删除 + ///SZ、NQ: 订单类别: '1': 市价; '2': 限价; 'U': 本方最优 + char ord_type; + ///SH: 原始订单号 + ///SZ、NQ: 无意义 + int64_t order_no; +}; + +///逐笔成交 +struct XTPTickByTickTrade { + ///频道代码 + int32_t channel_no; + ///SH: 成交序号(成交单独编号, 同一channel_no内连续) + ///SZ、NQ: 成交序号(委托成交统一编号, 同一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、NQ: 成交标识('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、NQ: 无意义 + 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; + +///指数静态信息 +typedef struct XTPIndexPressStaticInfo { + XTP_EXCHANGE_TYPE exchange_id; ///<交易所代码(无意义) + char ticker[XTP_TICKER_LEN]; ///<证券代码 + char ticker_name[XTP_TICKER_NAME_LEN]; ///<证券名称 + char market_code; ///<市场代码 + char unknown[7]; ///<预留 +}XTPIPSI; + +///指数行情快照 +typedef struct XTPIndexPress { + ///数据来源, 7=指数通. + char data_source; + + // 代码 + ///交易所代码(无意义) + XTP_EXCHANGE_TYPE exchange_id; + ///合约代码(不包含交易所信息),不带空格,以'\0'结尾 + char ticker[XTP_TICKER_LEN]; + /// 时间类,格式为YYYYMMDDHHMMSSsss + int64_t data_time; + + // 价格 + ///最新价 + double last_price; + ///昨收盘 + double pre_close_price; + ///今开盘 + double open_price; + ///最高价 + double high_price; + ///最低价 + double low_price; + ///今收盘 + double close_price; + + + // 量额数据 + ///总成交量 + int64_t qty; + ///总成交金额 + double turnover; + ///成交笔数 + int64_t trades_count; +}XTPIP; + + +#pragma pack() + +#endif diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_api_data_type.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_api_data_type.h new file mode 100644 index 0000000..e64f734 --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_api_data_type.h @@ -0,0 +1,743 @@ +///////////////////////////////////////////////////////////////////////// +///@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/Linux/xtp_python3_18.19/xtpapi/xtp_quote_api.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_quote_api.h similarity index 58% rename from source/Linux/xtp_python3_18.19/xtpapi/xtp_quote_api.h rename to source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_quote_api.h index 5867e8e..749e8e6 100644 --- a/source/Linux/xtp_python3_18.19/xtpapi/xtp_quote_api.h +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_quote_api.h @@ -1,426 +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 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) {}; - - ///订阅行情订单簿应答,包括股票、指数和期权 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@param error_info 取消订阅合约时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 - ///@remark 需要快速返回 - virtual void OnUnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id, XTPRI *error_info) {}; - }; - } -} - -#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方式连接时的接收缓冲区大小 - ///@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; - - ///订阅行情,包括股票、指数和期权。 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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 - ///@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - virtual int Login(const char* ip, int port, const char* user, const char* password, XTP_PROTOCOL_TYPE sock_type) = 0; - - - ///登出请求 - ///@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 - ///@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 - virtual int Logout() = 0; - - ///获取当前交易日可交易合约 - ///@return 查询是否成功,“0”表示查询成功,非“0”表示查询不成功 - ///@param exchange_id 交易所代码 - 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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@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表示为深圳全市场 - ///@remark 需要与订阅全市场期权逐笔行情接口配套使用 - virtual int UnSubscribeAllOptionTickByTick(XTP_EXCHANGE_TYPE exchange_id = XTP_EXCHANGE_UNKNOWN) = 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.42.1/xtpapi/xtp_trader_api.h b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_trader_api.h new file mode 100644 index 0000000..07d2f83 --- /dev/null +++ b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtp_trader_api.h @@ -0,0 +1,1225 @@ +///////////////////////////////////////////////////////////////////////// +///@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) {}; + + ///algo业务中暂停指定策略指定证券算法单的响应 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnPauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, uint64_t session_id) {}; + + ///algo业务中重启指定策略指定证券算法单的响应 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + ///@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + ///@param request_id 此消息响应函数对应的请求ID + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + virtual void OnResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, XTPRI *error_info, int32_t request_id, 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; + + ///algo业务中暂停指定策略中指定证券的算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int PauseAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, uint64_t session_id, int32_t request_id) = 0; + + ///algo业务中重启指定策略中指定证券的算法单请求 + ///@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + ///@param xtp_strategy_id xtp算法单策略ID + ///@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + ///@param session_id 资金账户对应的session_id,登录时得到 + ///@param request_id 用于用户定位查询响应的ID,由用户自定义 + ///@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + virtual int ResumeAlgoOrder(uint64_t xtp_strategy_id, XTPStrategyTickerInfo* ticker_info, uint64_t session_id, int32_t request_id) = 0; + + protected: + ~TraderApi() {}; + }; + + } +} + +#ifndef WINDOWS +#if __GNUC__ >= 4 +#pragma GCC visibility pop +#endif +#endif + + +#endif diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtpquoteapi.dll b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtpquoteapi.dll new file mode 100644 index 0000000..891d206 Binary files /dev/null and b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtpquoteapi.dll differ diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtpquoteapi.lib b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtpquoteapi.lib new file mode 100644 index 0000000..9c8efd5 Binary files /dev/null and b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtpquoteapi.lib differ diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtptraderapi.dll b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtptraderapi.dll new file mode 100644 index 0000000..75bcf02 Binary files /dev/null and b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtptraderapi.dll differ diff --git a/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtptraderapi.lib b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtptraderapi.lib new file mode 100644 index 0000000..d8b2520 Binary files /dev/null and b/source/Windows/xtp_api_python3_2.2.42.1/xtpapi/xtptraderapi.lib differ diff --git a/bin/test/quotetest.py b/test/quotetest.py similarity index 53% rename from bin/test/quotetest.py rename to test/quotetest.py index 10b7aec..28c3d86 100644 --- a/bin/test/quotetest.py +++ b/test/quotetest.py @@ -31,6 +31,14 @@ def onError(self, data): """""" printFuncName('onError',data) + #逐笔丢包应答 + #@param begin_seq 当逐笔出现丢包时,丢包区间下限(可能与上限一致) + #@param end_seq 当逐笔出现丢包时,丢包区间上限(可能与下限一致) + #@remark 此函数只有在逐笔发生丢包时才会有调用,如果丢包的上下限一致,表示仅丢失了一个包,注意此包仅为数据包,包含1个或者多个逐笔数据 + def onTickByTickLossRange(self, begin_seq, end_seq): + """""" + printFuncName('onTickByTickLossRange',begin_seq, end_seq) + #订阅行情应答,包括股票、指数和期权 #@param data 详细的合约订阅情况 #@param error 订阅合约发生错误时的错误信息,当error为空,或者error.error_id为0时,表明没有错误 @@ -41,8 +49,8 @@ def onSubMarketData(self, data, error, last): printFuncName('onSubMarketData', data, error) print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码(不包含交易所信息)例如"600000" - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订行情应答,包括股票、指数和期权 #@param data 详细的合约取消订阅情况 @@ -54,8 +62,8 @@ def onUnSubMarketData(self, data, error, last): printFuncName('onUnSubMarketData', data, error, last) print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码(不包含交易所信息)例如"600000" - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #深度行情通知,包含买一卖一队列 #@param data 行情数据 @@ -96,7 +104,7 @@ def onDepthMarketData(self, data,bid1_qty_list,bid1_counts,max_bid1_count,ask1_q print("data['bid_qty']:",data['bid_qty'])#十档申买量 print("data['ask_qty']:",data['ask_qty'])#十档申卖量 print("data['data_type']:",data['data_type'])# 0-现货(股票/基金/债券等) 1-期权 - if data['data_type'] == 0 : + if data['data_type_v2'] == 2 :#现货 print("data['total_bid_qty']:",data['total_bid_qty'])#委托买入总量 print("data['total_ask_qty']:",data['total_ask_qty'])#委托卖出总量 print("data['ma_bid_price']:",data['ma_bid_price'])#加权平均委买价格 @@ -129,11 +137,51 @@ def onDepthMarketData(self, data,bid1_qty_list,bid1_counts,max_bid1_count,ask1_q print("data['pre_iopv']:",data['pre_iopv'])#基金T-1日净值(SZ) print("data['r1']:",data['r1'])#预留 print("data['r2']:",data['r2'])#预留 - else : + elif data['data_type_v2'] == 1: #期权 print("data['auction_price']:",data['auction_price'])# 波段性中断参考价(SH) print("data['auction_qty']:",data['auction_qty'])# 波段性中断集合竞价虚拟匹配量(SH) print("data['last_enquiry_time']:",data['last_enquiry_time'])# 最近询价时间(SH) - + elif data['data_type_v2'] == 3: #债券 + print("data['total_bid_qty']",data['total_bid_qty'])#委托买入总量(SH,SZ) + print("data['total_ask_qty']",data['total_ask_qty'])#委托卖出总量(SH,SZ) + print("data['ma_bid_price']",data['ma_bid_price'])#加权平均委买价格(SZ) + print("data['ma_ask_price']",data['ma_ask_price'])#加权平均委卖价格(SZ) + print("data['ma_bond_bid_price']",data['ma_bond_bid_price'])#债券加权平均委买价格(SH) + print("data['ma_bond_ask_price']",data['ma_bond_ask_price'])#债券加权平均委卖价格(SH) + print("data['yield_to_maturity']",data['yield_to_maturity'])#债券到期收益率(SH) + print("data['match_lastpx']",data['match_lastpx'])#匹配成交最近价(SZ) + print("data['ma_bond_price']",data['ma_bond_price'])#债券加权平均价格(SH) + print("data['match_qty']",data['match_qty'])#匹配成交成交量(SZ) + print("data['match_turnover']",data['match_turnover'])#配成交成交金额(SZ) + print("data['r4']",data['r4'])#预留 + print("data['r5']",data['r5'])#预留 + print("data['r6']",data['r6'])#预留 + print("data['r7']",data['r7'])#预留 + print("data['r8']",data['r8'])#预留 + print("data['cancel_buy_count']",data['cancel_buy_count'])#买入撤单笔数(SH) + print("data['cancel_sell_count']",data['cancel_sell_count'])#卖出撤单笔数(SH) + print("data['cancel_buy_qty']",data['cancel_buy_qty'])#买入撤单数量(SH) + print("data['cancel_sell_qty']",data['cancel_sell_qty'])#卖出撤单数量(SH) + print("data['cancel_buy_money']",data['cancel_buy_money'])#买入撤单金额(SH) + print("data['cancel_sell_money']",data['cancel_sell_money'])#卖出撤单金额(SH) + print("data['total_buy_count']",data['total_buy_count'])#买入总笔数(SH) + print("data['total_sell_count']",data['total_sell_count'])#卖出总笔数(SH) + print("data['duration_after_buy']",data['duration_after_buy'])#买入委托成交最大等待时间(SH) + print("data['duration_after_sell']",data['duration_after_sell'])#卖出委托成交最大等待时间(SH) + print("data['num_bid_orders']",data['num_bid_orders'])#买方委托价位数(SH) + print("data['num_ask_orders']",data['num_ask_orders'])#卖方委托价位数(SH) + print("data['instrument_status']",data['instrument_status'])#时段(SHL2),L1快照数据没有此字段,具体字段说明参阅《上海新债券Level2行情说明.doc》文档 + + #ETF的IOPV通知 + #@param iopv ETF的参考单位基金净值数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onETFIOPVData(self, data): + """""" + printFuncName('onETFIOPVData', data) + print("data['exchange_id']:",data['exchange_id'])#交易所代码 + print("data['ticker']:",data['ticker'])#合约代码(不包含交易所信息),不带空格,以'\0'结尾 + print("data['data_time']:",data['data_time']) + print("data['iopv']:",data['iopv']) + #订阅行情订单簿应答,包括股票、指数和期权 #@param data 详细的合约订阅情况 #@param error 订阅合约发生错误时的错误信息,当error为空,或者error.error_id为0时,表明没有错误 @@ -144,8 +192,8 @@ def onSubOrderBook(self, data, error, last): printFuncName('onSubOrderBook', data, error, last) print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码(不包含交易所信息)例如"600000" - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订行情订单簿应答,包括股票、指数和期权 #@param data 详细的合约取消订阅情况 @@ -157,8 +205,8 @@ def onUnSubOrderBook(self, data, error, last): printFuncName('onUnSubOrderBook', data, error, last) print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码(不包含交易所信息)例如"600000" - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #行情订单簿通知,包括股票、指数和期权 #@param data 行情订单簿数据,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 @@ -176,8 +224,6 @@ def onOrderBook(self, data): print("data['bid']:",data['bid'])#十档申买价 print("data['bid_qty']:",data['bid_qty'])#十档申买量 print("data['ask_qty']:",data['ask_qty'])#十档申卖量 - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) #订阅逐笔行情应答,包括股票、指数和期权 #@param data 详细的合约订阅情况 @@ -189,8 +235,8 @@ def onSubTickByTick(self, data, error, last): printFuncName('onSubTickByTick', data, error, last) print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码 - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订逐笔行情应答,包括股票、指数和期权 #@param data 详细的合约取消订阅情况 @@ -202,8 +248,8 @@ def onUnSubTickByTick(self, data, error, last): printFuncName('onUnSubTickByTick', data, error, last) print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码 - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #逐笔行情通知,包括股票、指数和期权 #@param data 逐笔行情数据,包括逐笔委托和逐笔成交,此为共用结构体,需要根据type来区分是逐笔委托还是逐笔成交,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 @@ -213,25 +259,30 @@ def onTickByTick(self, data): print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码 print("data['data_time']:",data['data_time'])#委托时间 or 成交时间 - print("data['type']:",data['type'])#1委托 or 2成交 + print("data['struct_seq']:",data['struct_seq'])#SH: 业务序号(委托成交统一编号,同一个channel_no内连续,此seq区别于联合体内的seq,channel_no等同于联合体内的channel_no);SZ: 无意义 + print("data['type']:",data['type'])#1委托 or 2成交 or 3逐笔状态订单,2.2.32版本新增字段,为上海新债券Level2行情中独有 if data['type'] == 1 : print("data['channel_no']:",data['channel_no'])#频道代码 - print("data['seq']:",data['seq'])#委托序号 + print("data['seq']:",data['seq'])#SH: 委托序号(委托单独编号, 同一channel_no内连续);SZ: 委托序号(委托成交统一编号, 同一channel_no内连续) print("data['price']:",data['price'])#委托价格 print("data['qty']:",data['qty'])#委托数量 print("data['side']:",data['side'])#'1':买; '2':卖; 'G':借入; 'F':出借 print("data['ord_type']:",data['ord_type'])#订单类别: '1': 市价; '2': 限价; 'U': 本方最优 - else : + print("data['order_no']:",data['order_no'])#SH: 原始订单号,SZ: 无意义 + elif data['type'] == 2 : print("data['channel_no']:",data['channel_no'])#频道代码 - print("data['seq']:",data['seq'])#委托序号(在同一个channel_no内唯一,从1开始连续) + print("data['seq']:",data['seq'])#SH: 成交序号(成交单独编号, 同一channel_no内连续,从1开始连续);SZ: 成交序号(委托成交统一编号, 同一channel_no内连续) print("data['price']:",data['price'])#成交价格 print("data['qty']:",data['qty'])#成交量 print("data['money']:",data['money'])#成交金额(仅适用上交所) print("data['bid_no']:",data['bid_no'])#买方订单号 print("data['ask_no']:",data['ask_no'])#卖方订单号 print("data['trade_flag']:",data['trade_flag'])#SH: 内外盘标识('B':主动买; 'S':主动卖; 'N':未知)SZ: 成交标识('4':撤; 'F':成交) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + else : + print("data['channel_no']:",data['channel_no'])#频道代码 + print("data['seq']:",data['seq'])#同一channel_no内连续 + print("data['flag']:",data['flag'])#状态信息 + #订阅全市场的股票行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -240,8 +291,8 @@ def onTickByTick(self, data): def onSubscribeAllMarketData(self,exchange_id, error): """""" printFuncName('onSubscribeAllMarketData', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订全市场的股票行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -250,8 +301,8 @@ def onSubscribeAllMarketData(self,exchange_id, error): def onUnSubscribeAllMarketData(self, exchange_id,error): """""" printFuncName('onUnSubscribeAllMarketData',exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #订阅全市场的股票行情订单簿应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -260,8 +311,8 @@ def onUnSubscribeAllMarketData(self, exchange_id,error): def onSubscribeAllOrderBook(self, exchange_id,error): """""" printFuncName('onSubscribeAllOrderBook', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订全市场的股票行情订单簿应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -270,8 +321,8 @@ def onSubscribeAllOrderBook(self, exchange_id,error): def onUnSubscribeAllOrderBook(self, exchange_id,error): """""" printFuncName('onUnSubscribeAllOrderBook', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #订阅全市场的股票逐笔行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -280,8 +331,8 @@ def onUnSubscribeAllOrderBook(self, exchange_id,error): def onSubscribeAllTickByTick(self, exchange_id,error): """""" printFuncName('onSubscribeAllTickByTick', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订全市场的股票逐笔行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -290,8 +341,8 @@ def onSubscribeAllTickByTick(self, exchange_id,error): def onUnSubscribeAllTickByTick(self,exchange_id, error): """""" printFuncName('onUnSubscribeAllTickByTick',exchange_id, error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #查询可交易合约的应答 #@param data 可交易合约信息 @@ -310,8 +361,9 @@ def onQueryAllTickers(self, data, error, last): print("data['price_tick']:",data['price_tick'])#最小变动价位 print("data['buy_qty_unit']:",data['buy_qty_unit'])#合约最小交易量 print("data['sell_qty_unit']:",data['sell_qty_unit'])#合约最小交易量 - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + if('error_id' in error): + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #查询合约的最新价格信息应答 #@param data 可交易合约信息 @@ -323,8 +375,8 @@ def onQueryTickersPriceInfo(self, data, error, last): print("data['exchange_id']:",data['exchange_id'])#交易所代码 print("data['ticker']:",data['ticker'])#合约代码 print("data['last_price']:",data['last_price'])#最新价 - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #订阅全市场的期权行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -333,8 +385,8 @@ def onQueryTickersPriceInfo(self, data, error, last): def onSubscribeAllOptionMarketData(self,exchange_id, error): """""" printFuncName('onSubscribeAllOptionMarketData',exchange_id, error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订全市场的期权行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -343,8 +395,8 @@ def onSubscribeAllOptionMarketData(self,exchange_id, error): def onUnSubscribeAllOptionMarketData(self,exchange_id, error): """""" printFuncName('onUnSubscribeAllMarketData', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #订阅全市场的期权行情订单簿应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -353,8 +405,8 @@ def onUnSubscribeAllOptionMarketData(self,exchange_id, error): def onSubscribeAllOptionOrderBook(self,exchange_id, error): """""" printFuncName('onSubscribeAllOptionOrderBook', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订全市场的期权行情订单簿应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -363,8 +415,8 @@ def onSubscribeAllOptionOrderBook(self,exchange_id, error): def onUnSubscribeAllOptionOrderBook(self,exchange_id, error): """""" printFuncName('onUnSubscribeAllOptionOrderBook', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #订阅全市场的期权逐笔行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -373,8 +425,8 @@ def onUnSubscribeAllOptionOrderBook(self,exchange_id, error): def onSubscribeAllOptionTickByTick(self,exchange_id, error): """""" printFuncName('onSubscribeAllOptionTickByTick', exchange_id,error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) #退订全市场的期权逐笔行情应答 #@param exchange_id 表示当前全订阅的市场,如果为XTP_EXCHANGE_UNKNOWN(3),表示沪深全市场,XTP_EXCHANGE_SH(1)表示为上海全市场,XTP_EXCHANGE_SZ(2)表示为深圳全市场 @@ -383,27 +435,318 @@ def onSubscribeAllOptionTickByTick(self,exchange_id, error): def onUnSubscribeAllOptionTickByTick(self,exchange_id,error): """""" printFuncName('onUnSubscribeAllOptionTickByTick',exchange_id, error) - print("error['error_id']):",error['error_id']) - print("error['error_msg']):",error['error_msg']) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #查询合约完整静态信息的应答 + #@param ticker_info 合约完整静态信息 + #@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + def onQueryAllTickersFullInfo(self,data, error, last): + """""" + printFuncName('onQueryAllTickersFullInfo', data, error, last) + print("data['exchange_id']:",data['exchange_id'])#交易所代码 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['ticker_name']:",data['ticker_name'])#证券名称 + print("data['security_type']:",data['security_type'])#合约详细类型 + print("data['ticker_qualification_class']:",data['ticker_qualification_class'])#合约适当性类别 + print("data['is_registration']:",data['is_registration'])#是否注册制(仅适用创业板股票,创新企业股票及存托凭证) + print("data['is_VIE']:",data['is_VIE'])#是否具有协议控制架构(仅适用创业板股票,创新企业股票及存托凭证) + print("data['is_noprofit']:",data['is_noprofit'])#是否尚未盈利(仅适用创业板股票,创新企业股票及存托凭证) + print("data['is_weighted_voting_rights']:",data['is_weighted_voting_rights'])#是否存在投票权差异(仅适用创业板股票,创新企业股票及存托凭证) + print("data['is_have_price_limit']:",data['is_have_price_limit'])#是否有涨跌幅限制(注:不提供具体幅度,可通过涨跌停价和昨收价来计算幅度) + print("data['upper_limit_price']:",data['upper_limit_price'])#涨停价(仅在有涨跌幅限制时有效) + print("data['lower_limit_price']:",data['lower_limit_price'])#跌停价(仅在有涨跌幅限制时有效) + print("data['pre_close_price']:",data['pre_close_price'])#昨收价 + print("data['price_tick']:",data['price_tick'])#价格最小变动价位 + print("data['bid_qty_upper_limit']:",data['bid_qty_upper_limit'])#限价买委托数量上限 + print("data['bid_qty_lower_limit']:",data['bid_qty_lower_limit'])#限价买委托数量下限 + print("data['bid_qty_unit']:",data['bid_qty_unit'])#限价买数量单位 + print("data['ask_qty_upper_limit']:",data['ask_qty_upper_limit'])#限价卖委托数量上限 + print("data['ask_qty_lower_limit']:",data['ask_qty_lower_limit'])#限价卖委托数量下限 + print("data['ask_qty_unit']:",data['ask_qty_unit'])#限价卖数量单位 + print("data['market_bid_qty_upper_limit']:",data['market_bid_qty_upper_limit'])#市价买委托数量上限 + print("data['market_bid_qty_lower_limit']:",data['market_bid_qty_lower_limit'])#市价买委托数量下限 + print("data['market_bid_qty_unit']:",data['market_bid_qty_unit'])#市价买数量单位 + print("data['market_ask_qty_upper_limit']:",data['market_ask_qty_upper_limit'])#市价卖委托数量上限 + print("data['market_ask_qty_lower_limit']:",data['market_ask_qty_lower_limit'])#市价卖委托数量下限 + print("data['market_ask_qty_unit']:",data['market_ask_qty_unit'])#市价卖数量单位 + print("data['security_status']:",data['security_status'])#证券状态 + if('error_id' in error): + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #查询新三板合约完整静态信息的应答 + #@param ticker_info 合约完整静态信息 + #@param error_info 查询合约完整静态信息时发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param is_last 是否此次查询合约完整静态信息的最后一个应答,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + def onQueryAllNQTickersFullInfo(self, data, error, last): + """""" + printFuncName('onQueryAllNQTickersFullInfo', data, error, last) + print("data['exchange_id']:",data['exchange_id'])#交易所代码 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['ticker_name']:",data['ticker_name'])#证券名称 + print("data['security_type']:",data['security_type'])#合约详细类型 + print("data['ticker_qualification_class']:",data['ticker_qualification_class'])#合约适当性类别 + print("data['ticker_abbr_en']:",data['ticker_abbr_en'])#英文简称 + print("data['base_ticker']:",data['base_ticker'])#基础证券 + print("data['currency_type']:",data['currency_type'])#行业种类 + print("data['security_type']:",data['security_type'])#货币种类 + print("data['trade_unit']:",data['trade_unit'])#交易单位 + print("data['hang_out_date']:",data['hang_out_date'])#挂牌日期 + print("data['value_date']:",data['value_date'])#起息日期 + print("data['maturity_date']:",data['maturity_date'])#到期日 + print("data['per_limit_vol']:",data['per_limit_vol'])#每笔限量 + print("data['buy_vol_unit']:",data['buy_vol_unit'])#买数量单位 + print("data['sell_vol_unit']:",data['sell_vol_unit'])#卖数量单位 + print("data['mini_declared_vol']:",data['mini_declared_vol'])#最小申报数量 + print("data['limit_price_attr']:",data['limit_price_attr'])#限价参数性质 + print("data['market_maker_quantity']:",data['market_maker_quantity'])#做市商数量 + print("data['price_gear']:",data['price_gear'])#价格档位 + print("data['first_limit_trans']:",data['first_limit_trans'])#首笔交易限价参数 + print("data['subsequent_limit_trans']:",data['subsequent_limit_trans'])#后续交易限价参数 + print("data['limit_upper_price']:",data['limit_upper_price'])#涨停价格 + print("data['limit_lower_price']:",data['limit_lower_price'])#跌停价格 + print("data['block_trade_upper']:",data['block_trade_upper'])#大宗交易价格上限(预留,默认0) + print("data['block_trade_lower']:",data['block_trade_lower'])#大宗交易价格下限(预留,默认0) + print("data['convert_into_ration']:",data['convert_into_ration'])#折合比例 + print("data['trade_status']:",data['trade_status'])#交易状态 + print("data['security_level']:",data['security_level'])#证券级别 + print("data['trade_type']:",data['trade_type'])#交易类型 + print("data['suspend_flag']:",data['suspend_flag'])#停牌标志 + print("data['ex_dividend_flag']:",data['ex_dividend_flag'])#除权除息标志 + print("data['layer_type']:",data['layer_type'])#分层信息 + print("data['reserved1']:",data['reserved1'])#保留字段 + print("data['trade_places']:",data['trade_places'])#交易场所 预留 + print("data['is_rzbd']:",data['is_rzbd'])#是否融资标的 Y是 N否 + print("data['is_rqbd']:",data['is_rqbd'])#是否融券标的 Y是 N否 + print("data['is_drrz']:",data['is_drrz'])#是否当日可融资 Y是 N否 + print("data['is_drrq']:",data['is_drrq'])#是否当日可融券 Y是 N否 + print("data['reserved']:",data['reserved'])#保留字段 + if('error_id' in error): + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + + #当客户端与回补行情服务器通信连接断开时,该方法被调用。 + #@param reason 错误原因,请与错误代码表对应 + #@remark api不会自动重连,当断线发生时,请用户自行选择后续操作。回补服务器会在无消息交互后会定时断线,请注意仅在需要回补数据时才保持连接,无回补需求时,无需登陆 + def onRebuildQuoteServerDisconnected(self, reason): + """""" + printFuncName('onRebuildQuoteServerDisconnected', reason) + + #请求回补指定频道的逐笔行情的总体结果应答 + #@param data 当回补结束时被调用,如果回补结果失败,则msg参数表示失败原因 + #@remark 需要快速返回,仅在回补数据发送结束后调用,如果请求数据太多,一次性无法回补完,data['result_code'] = XTP_REBUILD_RET_PARTLY,此时需要根据回补结果继续发起回补数据请求 + def onRequestRebuildQuote(self, data): + """""" + printFuncName('onRequestRebuildQuote',data) + print("data['request_id']",data['request_id'])#请求id 请求包带过来的id + print("data['exchange_id']",data['exchange_id'])#市场类型 上海 深圳 + print("data['size']",data['size'])#总共返回的数据条数 + print("data['channel_number']",data['channel_number'])#逐笔数据 通道号 + print("data['begin']",data['begin'])#逐笔 表示序列号begin; 快照 表示时间begin(格式为YYYYMMDDHHMMSSsss) + print("data['end']",data['end'])#逐笔 表示序列号end; 快照 表示时间end(格式为YYYYMMDDHHMMSSsss) + print("data['result_code']",data['result_code'])#结果类型码 + print("data['msg']",data['msg'])#结果信息文本 + + #回补的逐笔行情数据 + #@param data 回补的逐笔行情数据 + #@remark 需要快速返回,此函数调用与onTickByTick不在一个线程内,会在onRequestRebuildQuote()之前回调 + def onRebuildTickByTick(self, data): + """""" + printFuncName('onRebuildTickByTick', data) + print("data['exchange_id']:",data['exchange_id'])#交易所代码 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['data_time']:",data['data_time'])#委托时间 or 成交时间 + print("data['struct_seq']:",data['struct_seq'])#SH: 业务序号(委托成交统一编号,同一个channel_no内连续,此seq区别于联合体内的seq,channel_no等同于联合体内的channel_no);SZ: 无意义 + print("data['type']:",data['type'])#1委托 or 2成交 + if data['type'] == 1 : + print("data['channel_no']:",data['channel_no'])#频道代码 + print("data['seq']:",data['seq'])#SH: 委托序号(委托单独编号, 同一channel_no内连续);SZ: 委托序号(委托成交统一编号, 同一channel_no内连续) + print("data['price']:",data['price'])#委托价格 + print("data['qty']:",data['qty'])#委托数量 + print("data['side']:",data['side'])#'1':买; '2':卖; 'G':借入; 'F':出借 + print("data['ord_type']:",data['ord_type'])#订单类别: '1': 市价; '2': 限价; 'U': 本方最优 + print("data['order_no']:",data['order_no'])#SH: 原始订单号,SZ: 无意义 + elif data['type'] == 2 : + print("data['channel_no']:",data['channel_no'])#频道代码 + print("data['seq']:",data['seq'])#SH: 成交序号(成交单独编号, 同一channel_no内连续,从1开始连续);SZ: 成交序号(委托成交统一编号, 同一channel_no内连续) + print("data['price']:",data['price'])#成交价格 + print("data['qty']:",data['qty'])#成交量 + print("data['money']:",data['money'])#成交金额(仅适用上交所) + print("data['bid_no']:",data['bid_no'])#买方订单号 + print("data['ask_no']:",data['ask_no'])#卖方订单号 + print("data['trade_flag']:",data['trade_flag'])#SH: 内外盘标识('B':主动买; 'S':主动卖; 'N':未知)SZ: 成交标识('4':撤; 'F':成交) + else : + print("data['channel_no']:",data['channel_no'])#频道代码 + print("data['seq']:",data['seq'])#同一channel_no内连续 + print("data['flag']:",data['flag'])#状态信息 + + + #回补的快照行情数据 + #@param data 回补的逐笔行情数据 + #@remark 需要快速返回,此函数调用与onDepthMarketData不在一个线程内,会在onRequestRebuildQuote()之前回调 + def onRebuildMarketData(self, data): + """""" + printFuncName('onRebuildMarketData', data) + + print("data['exchange_id']:",data['exchange_id'])#交易所代码 + print("data['ticker']:",data['ticker'])#合约代码(不包含交易所信息) + print("data['last_price']:",data['last_price'])#最新价 + print("data['pre_close_price']:",data['pre_close_price'])#昨收盘价 + print("data['open_price']:",data['open_price'])#今开盘价 + print("data['high_price']:",data['high_price'])#最高价 + print("data['low_price']:",data['low_price'])#最低价 + print("data['close_price']:",data['close_price'])#今收盘价 + print("data['pre_total_long_positon']:",data['pre_total_long_positon'])#期权数据昨日持仓量 + print("data['total_long_positon']:",data['total_long_positon'])#持仓量 + print("data['pre_settl_price']:",data['pre_settl_price'])#昨日结算价 + print("data['settl_price']:",data['settl_price'])#今日结算价 + print("data['upper_limit_price']:",data['upper_limit_price'])#涨停价 + print("data['lower_limit_price']:",data['lower_limit_price'])#跌停价 + print("data['pre_delta']:",data['pre_delta'])#预留 + print("data['curr_delta']:",data['curr_delta'])#预留 + print("data['data_time']:",data['data_time'])#时间类,格式为YYYYMMDDHHMMSSsss + print("data['qty']:",data['qty'])#数量,为总成交量(单位股,与交易所一致) + print("data['turnover']:",data['turnover'])#成交金额,为总成交金额(单位元,与交易所一致) + print("data['avg_price']:",data['avg_price'])#当日均价 + print("data['trades_count']:",data['trades_count'])#成交笔数 + print("data['ticker_status']:",data['ticker_status'])#当前交易状态说明 + print("data['ask']:",data['ask'])#十档申卖价 + print("data['bid']:",data['bid'])#十档申买价 + print("data['bid_qty']:",data['bid_qty'])#十档申买量 + print("data['ask_qty']:",data['ask_qty'])#十档申卖量 + print("data['data_type']:",data['data_type'])# 0-现货(股票/基金/债券等) 1-期权 + if data['data_type_v2'] == 2 :#现货 + print("data['total_bid_qty']:",data['total_bid_qty'])#委托买入总量 + print("data['total_ask_qty']:",data['total_ask_qty'])#委托卖出总量 + print("data['ma_bid_price']:",data['ma_bid_price'])#加权平均委买价格 + print("data['ma_ask_price']:",data['ma_ask_price'])#加权平均委卖价格 + print("data['ma_bond_bid_price']:",data['ma_bond_bid_price'])#债券加权平均委买价格 + print("data['ma_bond_ask_price']:",data['ma_bond_ask_price'])#债券加权平均委卖价格 + print("data['yield_to_maturity']:",data['yield_to_maturity'])#债券到期收益率 + print("data['iopv']:",data['iopv'])#基金实时参考净值 + print("data['etf_buy_count']:",data['etf_buy_count'])#ETF申购笔数(SH) + print("data['etf_sell_count']:",data['etf_sell_count'])#ETF赎回笔数(SH) + print("data['etf_buy_qty']:",data['etf_buy_qty'])# ETF申购数量(SH) + print("data['etf_buy_money']:",data['etf_buy_money'])#ETF申购金额(SH) + print("data['etf_sell_qty']:",data['etf_sell_qty'])#ETF赎回数量(SH) + print("data['etf_sell_money']:",data['etf_sell_money'])#ETF赎回金额(SH) + print("data['total_warrant_exec_qty']:",data['total_warrant_exec_qty'])#权证执行的总数量(SH) + print("data['warrant_lower_price']:",data['warrant_lower_price'])#权证跌停价格(元)(SH) + print("data['warrant_upper_price']:",data['warrant_upper_price'])#权证涨停价格(元)(SH) + print("data['cancel_buy_count']:",data['cancel_buy_count'])#买入撤单笔数(SH) + print("data['cancel_sell_count']:",data['cancel_sell_count'])#卖出撤单笔数(SH) + print("data['cancel_buy_qty']:",data['cancel_buy_qty'])#买入撤单数量(SH) + print("data['cancel_sell_qty']:",data['cancel_sell_qty'])#卖出撤单数量(SH) + print("data['cancel_buy_money']:",data['cancel_buy_money'])# 买入撤单金额(SH) + print("data['cancel_sell_money']:",data['cancel_sell_money'])# 卖出撤单金额(SH) + print("data['total_buy_count']:",data['total_buy_count'])#买入总笔数(SH) + print("data['total_sell_count']:",data['total_sell_count'])#卖出总笔数(SH) + print("data['duration_after_buy']:",data['duration_after_buy'])#买入委托成交最大等待时间(SH) + print("data['duration_after_sell']:",data['duration_after_sell'])#卖出委托成交最大等待时间(SH) + print("data['num_bid_orders']:",data['num_bid_orders'])#买方委托价位数(SH) + print("data['num_ask_orders']:",data['num_ask_orders'])#卖方委托价位数(SH) + print("data['pre_iopv']:",data['pre_iopv'])#基金T-1日净值(SZ) + print("data['r1']:",data['r1'])#预留 + print("data['r2']:",data['r2'])#预留 + elif data['data_type_v2'] == 1: #期权 + print("data['auction_price']:",data['auction_price'])# 波段性中断参考价(SH) + print("data['auction_qty']:",data['auction_qty'])# 波段性中断集合竞价虚拟匹配量(SH) + print("data['last_enquiry_time']:",data['last_enquiry_time'])# 最近询价时间(SH) + elif data['data_type_v2'] == 3: #债券 + print("data['total_bid_qty']",data['total_bid_qty'])#委托买入总量(SH,SZ) + print("data['total_ask_qty']",data['total_ask_qty'])#委托卖出总量(SH,SZ) + print("data['ma_bid_price']",data['ma_bid_price'])#加权平均委买价格(SZ) + print("data['ma_ask_price']",data['ma_ask_price'])#加权平均委卖价格(SZ) + print("data['ma_bond_bid_price']",data['ma_bond_bid_price'])#债券加权平均委买价格(SH) + print("data['ma_bond_ask_price']",data['ma_bond_ask_price'])#债券加权平均委卖价格(SH) + print("data['yield_to_maturity']",data['yield_to_maturity'])#债券到期收益率(SH) + print("data['match_lastpx']",data['match_lastpx'])#匹配成交最近价(SZ) + print("data['ma_bond_price']",data['ma_bond_price'])#债券加权平均价格(SH) + print("data['match_qty']",data['match_qty'])#匹配成交成交量(SZ) + print("data['match_turnover']",data['match_turnover'])#配成交成交金额(SZ) + print("data['r4']",data['r4'])#预留 + print("data['r5']",data['r5'])#预留 + print("data['r6']",data['r6'])#预留 + print("data['r7']",data['r7'])#预留 + print("data['r8']",data['r8'])#预留 + print("data['cancel_buy_count']",data['cancel_buy_count'])#买入撤单笔数(SH) + print("data['cancel_sell_count']",data['cancel_sell_count'])#卖出撤单笔数(SH) + print("data['cancel_buy_qty']",data['cancel_buy_qty'])#买入撤单数量(SH) + print("data['cancel_sell_qty']",data['cancel_sell_qty'])#卖出撤单数量(SH) + print("data['cancel_buy_money']",data['cancel_buy_money'])#买入撤单金额(SH) + print("data['cancel_sell_money']",data['cancel_sell_money'])#卖出撤单金额(SH) + print("data['total_buy_count']",data['total_buy_count'])#买入总笔数(SH) + print("data['total_sell_count']",data['total_sell_count'])#卖出总笔数(SH) + print("data['duration_after_buy']",data['duration_after_buy'])#买入委托成交最大等待时间(SH) + print("data['duration_after_sell']",data['duration_after_sell'])#卖出委托成交最大等待时间(SH) + print("data['num_bid_orders']",data['num_bid_orders'])#买方委托价位数(SH) + print("data['num_ask_orders']",data['num_ask_orders'])#卖方委托价位数(SH) + print("data['instrument_status']",data['instrument_status'])#时段(SHL2),L1快照数据没有此字段,具体字段说明参阅《上海新债券Level2行情说明.doc》文档 + + if __name__ == '__main__': - ip = '120.27.164.138' + ip = '119.3.103.38' port = 6002 - user = 'user' + user = 'username' password = 'password' + local_ip = '10.25.61.57' + #创建QuoteApi #@param client_id (必须输入)用于区分同一用户的不同客户端,由用户自定义 #@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个有可写权限的真实存在的路径 - #@param log_level 日志输出级别 “0”代表严重错误级别,“1”代表错误级别,“2”代表警告级别,“3”代表info级别,“4”代表debug级别,“5”代表trace级别 + #@param log_level 日志输出级别 #@return 创建出的UserApi #@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接 api = TestApi() - createQuoteAp = api.createQuoteApi(1, os.getcwd(),4) - printFuncName("createQuoteAp", createQuoteAp) + api.createQuoteApi(1, os.getcwd(),4) + + # 1.1.6测试函数 + #设置心跳检测时间间隔,单位为秒 + #@param interval 心跳检测时间间隔,单位为秒 + #@remark 此函数必须在Login之前调用 + api.setHeartBeatInterval(15) + #设置采用UDP方式连接时的接收缓冲区大小 + #@remark 需要在Login之前调用,默认大小和最小设置均为64MB。此缓存大小单位为MB,请输入2的次方数,例如128MB请输入128。 + api.setUDPBufferSize(128) + + #使用UDP接收行情时,设置接收行情线程绑定的cpu + #@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu + #@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 + api.setUDPRecvThreadAffinity(2) + + #使用UDP接收行情时,设置接收行情线程绑定的cpu集合 + #@param cpu_no_array 设置绑定的cpu集合数组 + #@param count cpu集合数组长度 + #@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 + cpuRecvList = [{'cpu_no':'2'},{'cpu_no':'5'}] + api.setUDPRecvThreadAffinityArray(cpuRecvList,2) + + #使用UDP接收行情时,设置解析行情线程绑定的cpu + #@param cpu_no 设置绑定的cpu,例如绑定cpu 0,可以设置0,绑定cpu 2,可以设置2,建议绑定后面的cpu + #@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 + api.setUDPParseThreadAffinity(2) + + #使用UDP接收行情时,设置解析行情线程绑定的cpu集合 + #@param cpu_no_array 设置绑定的cpu集合数组 + #@param count cpu集合数组长度 + #@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效。绑核时,将从数组前面的核开始使用 + cpuParseList = [{'cpu_no':'3'},{'cpu_no':'4'}] + api.setUDPParseThreadAffinityArray(cpuParseList,2) + + #设定UDP收行情时是否输出异步日志 + #@param flag 是否输出标识,默认为true,如果不想输出“udpseq”开头的异步日志,请设置此参数为false + #@remark 此函数可不调用,如果调用则必须在Login之前调用,否则不会生效 + api.setUDPSeqLogOutPutFlag(1) + + #用户登录请求 #@return 登录是否成功,“0”表示登录成功,“-1”表示连接服务器出错,此时用户可以调用GetApiLastError()来获取错误代码,“-2”表示已存在连接,不允许重复登录,如果需要重连,请先logout,“-3”表示输入有错误 #@param ip 服务器ip地址,类似“127.0.0.1” @@ -411,27 +754,19 @@ def onUnSubscribeAllOptionTickByTick(self,exchange_id,error): #@param user 登陆用户名 #@param password 登陆密码 #@param sock_type “1”代表TCP,“2”代表UDP + #@param local_ip 本地网卡地址,类似“127.0.0.1” #@remark 此函数为同步阻塞式,不需要异步等待登录成功,当函数返回即可进行后续操作,此api只能有一个连接 - retLogin = api.login(ip, port, user, password, 1) + retLogin = api.login(ip, port, user, password, 1,local_ip) printFuncName('login', retLogin) - - # 1.1.6测试函数 - #设置心跳检测时间间隔,单位为秒 - #@param interval 心跳检测时间间隔,单位为秒 - #@remark 此函数必须在Login之前调用 - setHeartBeatInterval = api.setHeartBeatInterval(2) - printFuncName("setHeartBeatInterval", setHeartBeatInterval) - - #设置采用UDP方式连接时的接收缓冲区大小 - #@remark 需要在Login之前调用,默认大小和最小设置均为64MB。此缓存大小单位为MB,请输入2的次方数,例如128MB请输入128。 - setUDPBufferSize = api.setUDPBufferSize(64) - printFuncName("setUDPBufferSize", setUDPBufferSize) + if retLogin != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) #获取API的系统错误 #@return 返回的错误信息,可以在Login、Logout、订阅、取消订阅失败时调用,获取失败的原因 #@remark 可以在调用api接口失败时调用,例如login失败时 - getApiLastError = api.getApiLastError() - printFuncName("getApiLastError", getApiLastError) + #getApiLastError = api.getApiLastError() + #printFuncName("getApiLastError", getApiLastError) #获取API的发行版本号 #@return 返回api发行版本号 @@ -444,9 +779,11 @@ def onUnSubscribeAllOptionTickByTick(self,exchange_id,error): getTradingDay = api.getTradingDay() printFuncName("getTradingDay", getTradingDay) + tickerList = [{'ticker':'000001'},{'ticker':'000002'},{'ticker':'000004'}] count = 3 + #订阅行情,包括股票、指数和期权。 #@return 订阅接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 #@param tickerList 合约ID数组 @@ -485,6 +822,7 @@ def onUnSubscribeAllOptionTickByTick(self,exchange_id,error): sleep(1) retUnSubscribeOrderBook = api.unSubscribeOrderBook(tickerList,count, 2) printFuncName('unSubscribeOrderBook', retUnSubscribeOrderBook) + #订阅逐笔行情,包括股票、指数和期权。 #@return 订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 @@ -495,7 +833,7 @@ def onUnSubscribeAllOptionTickByTick(self,exchange_id,error): sleep(1) retSubscribeTickByTick = api.subscribeTickByTick(tickerList,count, 2) printFuncName('subscribeTickByTick', retSubscribeTickByTick) - + #退订逐笔行情,包括股票、指数和期权。 #@return 取消订阅逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 #@param tickerList 合约ID数组 @@ -624,10 +962,89 @@ def onUnSubscribeAllOptionTickByTick(self,exchange_id,error): sleep(1) unSubscribeAllOptionTickByTick = api.unSubscribeAllOptionTickByTick(2) printFuncName('unsubscribeAllOptionTickByTick', unSubscribeAllOptionTickByTick) + + #获取当前交易日合约的详细静态信息 + #@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + #@param exchange_id 交易所代码,必须提供 1-上海 2-深圳 + sleep(1) + queryAllTickersFullInfo = api.queryAllTickersFullInfo(2) + printFuncName('queryAllTickersFullInfo', queryAllTickersFullInfo) + + #获取新三板所有合约的详细静态信息,包括指数等非可交易的 + #@return 发送查询请求是否成功,“0”表示发送查询请求成功,非“0”表示发送查询请求不成功 + sleep(1) + retQueryAllNQTickersFullInfo = api.queryAllNQTickersFullInfo() + printFuncName('queryAllNQTickersFullInfo', retQueryAllNQTickersFullInfo) + if retQueryAllNQTickersFullInfo != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + ########行情回补部分 + sleep(1) + rebuild_ip = '10.25.134.104' + rebuild_port = 6662 + newuser = 'testshopt02tgt' + newpassword = '123456' + local_ip = '10.25.171.32' + + #用户登录回补服务器请求 + #@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 + retLoginToRebuildQuoteServer = api.loginToRebuildQuoteServer(rebuild_ip,rebuild_port,newuser,newpassword,1,local_ip) + printFuncName('loginToRebuildQuoteServer', retLoginToRebuildQuoteServer) + if retLoginToRebuildQuoteServer != 0 : + getApiLastError = api.getApiLastError() + printFuncName("getApiLastError", getApiLastError) + + rebuild_param = {} + rebuild_param['request_id'] = 1 + rebuild_param['data_type'] = 1 + rebuild_param['exchange_id'] = 1 + rebuild_param['ticker'] = '600000' + #请求回补快照行情 + rebuild_param['begin'] = 20221214101000000 + rebuild_param['end'] = 20221214103000000 + #请求回补逐笔行情 + #rebuild_param['channel_number'] = 801 + #rebuild_param['begin'] = 1000 + #rebuild_param['end'] = 1200 + #请求回补指定行情,包括快照和逐笔 + #@return 请求回补指定频道的逐笔行情接口调用是否成功,“0”表示接口调用成功,非“0”表示接口调用出错 + #@param rebuild_param 指定回补的参数信息,注意一次性回补最多1000个数据,超过1000需要分批次请求,一次只能指定一种类型的数据 + #@remark 仅在逐笔行情丢包时或者确实快照行情时使用,回补的行情数据将从OnRebuildTickByTick或者OnRebuildMarketData()接口回调提供,与订阅的行情数据不在同一个线程内 + rebuildquote = api.requestRebuildQuote(rebuild_param) + printFuncName('requestRebuildQuote', rebuildquote) + if rebuildquote != 0 : + getApiLastError = api.getApiLastError() + printFuncName("getApiLastError", getApiLastError) + + #登出回补服务器请求 + #@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 + logoutRebuildQuoteServer = api.logoutFromRebuildQuoteServer() + printFuncName('logoutFromRebuildQuoteServer', logoutRebuildQuoteServer) + + #sleep为了删除接口对象前将回调数据输出,不sleep直接删除回调对象会自动析构,无法返回回调的数据 - sleep(5) - + sleep(20) + + #登出请求 + #@return 登出是否成功,“0”表示登出成功,非“0”表示登出出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@remark 此函数为同步阻塞式,不需要异步等待登出,当函数返回即可进行后续操作 + logout = api.logout() + printFuncName('logout:',logout ) + #删除接口对象本身 #@remark 不再使用本接口对象时,调用该函数删除接口对象 - api.release() \ No newline at end of file + #release = api.release() + #printFuncName('release', release) + + exit = api.exit() + printFuncName('exit', exit) + diff --git a/test/tradertest.py b/test/tradertest.py new file mode 100644 index 0000000..f9981ab --- /dev/null +++ b/test/tradertest.py @@ -0,0 +1,2460 @@ +# encoding: UTF-8 + +import os +import uuid +from time import sleep + +from vnxtptrader import * + + +def printFuncName(*args): + """""" + print('*' * 50) + print(args) + print('*' * 50) + + +class TestApi(TraderApi): + """""" + + def __init__(self): + """Constructor""" + super(TestApi, self).__init__() + + #当客户端的某个连接与交易后台通信连接断开时,该方法被调用。 + #@param reason 错误原因,请与错误代码表对应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 用户主动调用logout导致的断线,不会触发此函数。api不会自动重连,当断线发生时,请用户自行选择后续操作,可以在此函数中调用Login重新登录,并更新session_id,此时用户收到的数据跟断线之前是连续的 + def onDisconnected(self,session_id, reason): + """""" + printFuncName("onDisconnected",session_id, reason) + + #错误应答 + #@param error 当服务器响应发生错误时的具体的错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@remark 此函数只有在服务器发生错误时才会调用,一般无需用户处理 + def onError(self, data): + """""" + printFuncName('onError', data) + + #请求查询用户在本节点上可交易市场的响应 + #@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 此查询只会有一个结果 + def onQueryAccountTradeMarket(self, trade_location, error, request_id, session_id): + """""" + printFuncName('onQueryAccountTradeMarket', trade_location, error, request_id, session_id) + print("error['error_id']:",error['error_id'])# + print("error['error_msg']:",error['error_msg'])# + + #报单通知 + #@param data 订单响应具体信息,用户可以通过data.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单,data.qty_left字段在订单为未成交、部成、全成、废单状态时,表示此订单还没有成交的数量,在部撤、全撤状态时,表示此订单被撤的数量。data.order_cancel_xtp_id为其所对应的撤单ID,不为0时表示此单被撤成功 + #@param error 订单被拒绝或者发生错误时错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 + def onOrderEvent(self, data, error,session_id): + """""" + printFuncName('onOrderEvent', data, error,session_id) + print("data['cancel_time']:",data['cancel_time'])#撤销时间 + print("data['update_time']:",data['update_time'])#最后修改时间 + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['trade_amount']:",data['trade_amount'])#成交金额 + print("data['price_type']:",data['price_type'])#报单价格条件 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['price']:",data['price'])#价格 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段1 + print("data['reserved2']:",data['reserved2'])#预留字段2 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['business_type']:",data['business_type'])#业务类型 + print("error['error_id']:",error['error_id'])# + print("error['error_msg']:",error['error_msg'])# + + #成交通知 + #@param data 成交回报的具体信息,用户可以通过data.order_xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。对于上交所,exec_id可以唯一标识一笔成交。当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交了。对于深交所,exec_id是唯一的,暂时无此判断机制。report_index+market字段可以组成唯一标识表示成交回报。 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 订单有成交发生的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的成交回报。相关订单为部成状态,需要用户通过成交回报的成交数量来确定,OnOrderEvent()不会推送部成状态。 + def onTradeEvent(self, data,session_id): + """""" + printFuncName('onTradeEvent', data,session_id) + print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 + print("data['trade_amount']:",data['trade_amount'])#成交金额,此次成交的总金额 = price*quantity + print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 + print("data['trade_type']:",data['trade_type'])#成交类型 --成交回报中的执行类型 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['price']:",data['price'])#价格,此次成交的价格 + print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 + print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 + print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段 + print("data['reserved2']:",data['reserved2'])#预留字段 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 + print("data['business_type']:",data['business_type'])#业务类型 + + #撤单出错响应 + #@param data 撤单具体信息,包括撤单的order_cancel_xtp_id和待撤单的order_xtp_id + #@param error 撤单被拒绝或者发生错误时错误代码和错误信息,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,当error为空,或者error.error_id为0时,表明没有错误 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 此响应只会在撤单发生错误时被回调 + def onCancelOrderError(self, data, error,session_id): + """""" + printFuncName('onCancelOrderError', data, error,session_id) + + #请求查询报单响应 + #@param data 查询到的一个报单 + #@param error 查询报单时发生错误时,返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + def onQueryOrder(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOrder', data, error, reqid, last,session_id) + print("data['cancel_time']:",data['cancel_time'])#撤销时间 + print("data['update_time']:",data['update_time'])#最后修改时间 + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['trade_amount']:",data['trade_amount'])#成交金额 + print("data['price_type']:",data['price_type'])#报单价格条件 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['price']:",data['price'])#价格 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段1 + print("data['reserved2']:",data['reserved2'])#预留字段2 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['business_type']:",data['business_type'])#业务类型 + print("error['error_id']:",error['error_id'])# + print("error['error_msg']:",error['error_msg'])# + + #请求查询报单响应-新版本接口 + #@param data 查询到的一个报单信息 + #@param error 查询报单时发生错误时,返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryOrderEx(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOrderEx', data, error, reqid, last,session_id) + print("data['cancel_time']:",data['cancel_time'])#撤销时间 + print("data['update_time']:",data['update_time'])#最后修改时间 + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['trade_amount']:",data['trade_amount'])#成交金额 + print("data['price_type']:",data['price_type'])#报单价格条件 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['price']:",data['price'])#价格 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段1 + print("data['reserved2']:",data['reserved2'])#预留字段2 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['error_id']:",data['error_id'])#订单的错误信息 + print("data['error_msg']:",data['error_msg'])#订单的错误信息 + print("error['error_id']:",error['error_id'])# + print("error['error_msg']:",error['error_msg'])# + + #分页请求查询报单响应 + #@param data 查询到的一个报单 + #@param req_count 分页请求的最大数量 + #@param order_sequence 分页请求的当前回报数量 + #@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOrderByPage(self, data, req_count,order_sequence,query_reference, reqid, last,session_id): + """""" + printFuncName('onQueryOrderByPage', data, req_count,order_sequence,query_reference, reqid, last,session_id) + print("data['cancel_time']:",data['cancel_time'])#撤销时间 + print("data['update_time']:",data['update_time'])#最后修改时间 + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['trade_amount']:",data['trade_amount'])#成交金额 + print("data['price_type']:",data['price_type'])#报单价格条件 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['price']:",data['price'])#价格 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段1 + print("data['reserved2']:",data['reserved2'])#预留字段2 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("req_count:",req_count)#分页请求的最大数量 + print("order_sequence:",order_sequence)#分页请求的当前回报数量 + print("query_reference:",query_reference)#当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + print("reqid:",reqid)#此消息响应函数对应的请求ID + print("last:",last)#此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + print("session_id:",session_id)#资金账户对应的session,登录时得到 + + #分页请求查询报单响应-新版本接口 + #@param data 查询到的一个报单 + #@param req_count 分页请求的最大数量 + #@param order_sequence 分页请求的当前回报数量 + #@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 当order_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果order_sequence等于req_count,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOrderByPageEx(self, data, req_count,order_sequence,query_reference, reqid, last,session_id): + """""" + printFuncName('onQueryOrderByPageEx', data, req_count,order_sequence,query_reference, reqid, last,session_id) + print("data['cancel_time']:",data['cancel_time'])#撤销时间 + print("data['update_time']:",data['update_time'])#最后修改时间 + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['trade_amount']:",data['trade_amount'])#成交金额 + print("data['price_type']:",data['price_type'])#报单价格条件 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['price']:",data['price'])#价格 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段1 + print("data['reserved2']:",data['reserved2'])#预留字段2 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,在XTP系统中唯一 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['error_id']:",data['error_id'])#订单的错误信息 + print("data['error_msg']:",data['error_msg'])#订单的错误信息 + print("req_count:",req_count)#分页请求的最大数量 + print("order_sequence:",order_sequence)#分页请求的当前回报数量 + print("query_reference:",query_reference)#当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + print("reqid:",reqid)#此消息响应函数对应的请求ID + print("last:",last)#此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + print("session_id:",session_id)#资金账户对应的session,登录时得到 + + + #请求查询成交响应 + #@param data 查询到的一个成交回报 + #@param error 查询成交回报发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + def onQueryTrade(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryTrade', data, error, reqid, last,session_id) + print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 + print("data['trade_amount']:",data['trade_amount'])#成交金额,此次成交的总金额 = price*quantity + print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 + print("data['trade_type']:",data['trade_type'])#成交类型 --成交回报中的执行类型 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['price']:",data['price'])#价格,此次成交的价格 + print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 + print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 + print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段 + print("data['reserved2']:",data['reserved2'])#预留字段 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 + print("data['business_type']:",data['business_type'])#业务类型 + print("error['error_id']:",error['error_id'])#错误代码 + print("error['error_msg']:",error['error_msg'])#错误信息 + + #分页请求查询成交响应 + #@param data 查询到的一个成交回报 + #@param req_count 分页请求的最大数量 + #@param trade_sequence 分页请求的当前回报数量 + #@param query_reference 当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 当trade_sequence为0,表明当次查询没有查到任何记录,当is_last为true时,如果trade_sequence等于req_count,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryTradeByPage(self, data, req_count, trade_sequence, query_reference, reqid, last,session_id): + """""" + printFuncName('onQueryTradeByPage', data, req_count, trade_sequence, query_reference, reqid, last,session_id) + print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 + print("data['trade_amount']:",data['trade_amount'])#成交金额,此次成交的总金额 = price*quantity + print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 + print("data['trade_type']:",data['trade_type'])#成交类型 --成交回报中的执行类型 + print("data['order_client_id']:",data['order_client_id'])#报单引用 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['price']:",data['price'])#价格,此次成交的价格 + print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 + print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 + print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,此成交回报相关的订单ID,在XTP系统中唯一 + print("data['ticker']:",data['ticker'])#合约代码 + print("data['side']:",data['side'])#买卖方向 + print("data['position_effect']:",data['position_effect'])#开平标志 + print("data['reserved1']:",data['reserved1'])#预留字段 + print("data['reserved2']:",data['reserved2'])#预留字段 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 + print("data['business_type']:",data['business_type'])#业务类型 + print("req_count:",req_count)#分页请求的最大数量 + print("trade_sequence:",trade_sequence)#分页请求的当前回报数量 + print("query_reference:",query_reference)#当前报单信息所对应的查询索引,需要记录下来,在进行下一次分页查询的时候需要用到 + print("reqid:",reqid)#此消息响应函数对应的请求ID + print("last:",last)#此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + print("session_id:",session_id)#资金账户对应的session,登录时得到 + + #请求查询投资者持仓响应 + #@param data 查询到的一只股票的持仓情况 + #@param error 查询账户持仓发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 由于用户可能持有多个股票,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryPosition(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryPosition', data, error, reqid, last,session_id) + print("data['ticker']:",data['ticker'])#证券代码 + print("data['ticker_name']:",data['ticker_name'])#证券名称 + print("data['market']:",data['market'])#交易市场 + print("data['total_qty']:",data['total_qty'])#总持仓 + print("data['sellable_qty']:",data['sellable_qty'])#可卖持仓 + print("data['avg_price']:",data['avg_price'])#持仓成本 + print("data['unrealized_pnl']:",data['unrealized_pnl'])#浮动盈亏(保留字段) + print("data['yesterday_position']:",data['yesterday_position'])#昨日持仓 + print("data['purchase_redeemable_qty']:",data['purchase_redeemable_qty'])#今日申购赎回数量(申购和赎回数量不可能同时存在,因此可以共用一个字段) + print("data['position_direction']:",data['position_direction'])#持仓方向 + print("data['position_security_type']:",data['position_security_type'])#持仓类型(此字段所有账户都可能用到,可以用来区分股份是否为配售) + print("data['executable_option']:",data['executable_option'])#可行权合约 + print("data['lockable_position']:",data['lockable_position'])#可锁定标的 + print("data['executable_underlying']:",data['executable_underlying'])#可行权标的 + print("data['locked_position']:",data['locked_position'])#已锁定标的 + print("data['usable_locked_position']:",data['usable_locked_position'])#可用已锁定标的 + print("data['profit_price']:",data['profit_price'])#盈亏成本价 + print("data['buy_cost']:",data['buy_cost'])#买入成本 + print("data['profit_cost']:",data['profit_cost'])#盈亏成本 + print("data['market_value']:",data['market_value'])#持仓市值(此字段目前只有期权账户有值,其他类型账户为0) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + + #请求查询资金账户响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的资金账户情况 + #@param error 查询资金账户发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryAsset(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryAsset', data, error, reqid, reqid, last,session_id) + print("data['total_asset']:",data['total_asset'])#总资产(=可用资金 + 证券资产(目前为0)+ 预扣的资金) + print("data['buying_power']:",data['buying_power'])#可用资金 + print("data['security_asset']:",data['security_asset'])#证券资产(保留字段,目前为0) + print("data['fund_buy_amount']:",data['fund_buy_amount'])#累计买入成交证券占用资金 + print("data['fund_buy_fee']:",data['fund_buy_fee'])#累计买入成交交易费用 + print("data['fund_sell_amount']:",data['fund_sell_amount'])#累计卖出成交证券所得资金 + print("data['fund_sell_fee']:",data['fund_sell_fee'])#累计卖出成交交易费用 + print("data['withholding_amount']:",data['withholding_amount'])#XTP系统预扣的资金(包括购买卖股票时预扣的交易资金+预扣手续费) + print("data['account_type']:",data['account_type'])#账户类型 + print("data['frozen_margin']:",data['frozen_margin'])#冻结的保证金 + print("data['frozen_exec_cash']:",data['frozen_exec_cash'])#行权冻结资金 + print("data['frozen_exec_fee']:",data['frozen_exec_fee'])#行权费用 + print("data['pay_later']:",data['pay_later'])#垫付资金 + print("data['preadva_pay']:",data['preadva_pay'])#预垫付资金 + print("data['orig_banlance']:",data['orig_banlance'])#昨日余额 + print("data['banlance']:",data['banlance'])#当前余额 + print("data['deposit_withdraw']:",data['deposit_withdraw'])#当天出入金 + print("data['trade_netting']:",data['trade_netting'])#当日交易资金轧差 + print("data['captial_asset']:",data['captial_asset'])#资金资产 + print("data['force_freeze_amount']:",data['force_freeze_amount'])#强锁资金 + print("data['preferred_amount']:",data['preferred_amount'])#可取资金 + print("data['repay_stock_aval_banlance']:",data['repay_stock_aval_banlance'])#融券卖出所得资金余额(仅限信用账户,只能用于买券还券) + print("data['fund_order_data_charges']:",data['fund_order_data_charges'])#累计订单流量费 + print("data['fund_cancel_data_charges']:",data['fund_cancel_data_charges'])#累计撤单流量费 + print("data['exchange_cur_risk_degree']:",data['exchange_cur_risk_degree'])#交易所实时风险度(仅限期权账户,后续服务器版本支持,目前为0) + print("data['company_cur_risk_degree']:",data['company_cur_risk_degree'])#公司实时风险度(仅限期权账户,后续服务器版本支持,目前为0) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询分级基金信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的分级基金情况 + #@param error 查询分级基金发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryStructuredFund(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryStructuredFund', data, error, reqid, last,session_id) + print("data['exchange_id']:",data['exchange_id'])#交易所代码 + print("data['sf_ticker']:",data['sf_ticker'])#分级基金母基金代码 + print("data['sf_ticker_name']:",data['sf_ticker_name'])#分级基金母基金名称 + print("data['ticker']:",data['ticker'])#分级基金子基金代码 + print("data['ticker_name']:",data['ticker_name'])#分级基金子基金名称 + print("data['split_merge_status']:",data['split_merge_status'])#基金允许拆分合并状态 + print("data['ratio']:",data['ratio'])#拆分合并比例 + print("data['min_split_qty']:",data['min_split_qty'])#最小拆分数量 + print("data['min_merge_qty']:",data['min_merge_qty'])#最小合并数量 + print("data['net_price']:",data['net_price'])#基金净值 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询资金划拨订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的资金账户情况 + #@param error 查询资金账户发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryFundTransfer(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryFundTransfer', data, error, reqid, last,session_id) + print("data['serial_id']:",data['serial_id'])#资金内转编号 + print("data['transfer_type']:",data['transfer_type'])#内转类型 + print("data['amount']:",data['amount'])#金额 + print("data['oper_status']:",data['oper_status'])#操作结果 + print("data['transfer_time']:",data['transfer_time'])#操作时间 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #资金划拨通知 + #@param data 资金划拨通知的具体信息,用户可以通过data.serial_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + #@param error 资金划拨订单被拒绝或者发生错误时错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误。当资金划拨方向为一号两中心节点之间划拨,且error.error_id=11000382时,error.error_msg为结点中可用于划拨的资金(以整数为准),用户需进行stringToInt的转化,可据此填写合适的资金,再次发起划拨请求 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 当资金划拨订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的资金划拨通知。 + def onFundTransfer(self, data, error,session_id): + """""" + printFuncName('onFundTransfer', data, error,session_id) + print("data['serial_id']:",data['serial_id'])#资金内转编号 + print("data['transfer_type']:",data['transfer_type'])#内转类型 + print("data['amount']:",data['amount'])#金额 + print("data['oper_status']:",data['oper_status'])#操作结果 + print("data['transfer_time']:",data['transfer_time'])#操作时间 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询ETF清单文件的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的ETF清单文件情况 + #@param error 查询ETF清单文件发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryETF(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryETF', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#交易市场 + print("data['etf']:",data['etf'])#etf代码,买卖,申赎统一使用该代码 + print("data['subscribe_redemption_ticker']:",data['subscribe_redemption_ticker'])#etf申购赎回代码 + print("data['unit']:",data['unit'])#最小申购赎回单位对应的ETF份数,例如上证"50ETF"就是900000 + print("data['subscribe_status']:",data['subscribe_status'])#是否允许申购,1-允许,0-禁止 + print("data['redemption_status']:",data['redemption_status'])#是否允许赎回,1-允许,0-禁止 + print("data['max_cash_ratio']:",data['max_cash_ratio'])#最大现金替代比例,小于1的数值 TODO 是否采用double + print("data['estimate_amount']:",data['estimate_amount'])#T日预估金额 + print("data['cash_component']:",data['cash_component'])#T-X日现金差额 + print("data['net_value']:",data['net_value'])#基金单位净值 + print("data['total_amount']:",data['total_amount'])#最小申赎单位净值总金额=net_value*unit + print("error['error_id']:",error['error_id'])# + print("error['error_msg']:",error['error_msg'])# + + #请求查询ETF股票篮的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的ETF合约的相关成分股信息 + #@param error 查询ETF股票篮发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryETFBasket(self, data, error, reqid, last, session_id): + """""" + printFuncName('onQueryETFBasket', data, error, reqid, last, session_id) + print("data['market']:",data['market'])#交易市场 + print("data['ticker']:",data['ticker'])#ETF代码 + print("data['component_ticker']:",data['component_ticker'])#成份股代码 + print("data['component_name']:",data['component_name'])#成份股名称 + print("data['quantity']:",data['quantity'])#成份股数量 + print("data['component_market']:",data['component_market'])#成份股交易市场 + print("data['replace_type']:",data['replace_type'])#成份股替代标识 + print("data['premium_ratio']:",data['premium_ratio'])#溢价比例 + print("data['amount']:",data['amount'])#成分股替代标识为必须现金替代时候的总金额 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询今日新股申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的今日新股申购的一只股票信息 + #@param error 查询今日新股申购信息列表发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryIPOInfoList(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryIPOInfoList', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#交易市场 + print("data['ticker']:",data['ticker'])#申购代码 + print("data['ticker_name']:",data['ticker_name'])#申购股票名称 + print("data['ticker_type']:",data['ticker_type'])#证券类别 + print("data['price']:",data['price'])#申购价格 + print("data['unit']:",data['unit'])#申购单元 + print("data['qty_upper_limit']:",data['qty_upper_limit'])#最大允许申购数量 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询用户新股申购额度信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的用户某个市场的今日新股申购额度信息 + #@param error 查查询用户新股申购额度信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryIPOQuotaInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryIPOQuotaInfo', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#可申购额度 + print("data['tech_quantity']:",data['tech_quantity'])#上海科创板额度 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询今日可转债申购信息列表的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@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 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryBondIPOInfoList(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryBondIPOInfoList', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#交易市场 + print("data['ticker']:",data['ticker'])#申购代码 + print("data['ticker_name']:",data['ticker_name'])#申购股票名称 + print("data['ticker_type']:",data['ticker_type'])#证券类别 + print("data['price']:",data['price'])#申购价格 + print("data['unit']:",data['unit'])#申购单元 + print("data['qty_upper_limit']:",data['qty_upper_limit'])#最大允许申购数量 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询用户可转债转股信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@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 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryBondSwapStockInfo(self, data, error, reqid, last, session_id): + """""" + printFuncName('onQueryBondSwapStockInfo', data, error, reqid, last, session_id) + print("data['market']:",data["market"])#交易市场 + print("data['ticker']:",data["ticker"])#债券证券代码 + print("data['underlying_ticker']:",data["underlying_ticker"])#转股后的股票证券代码 + print("data['unit']:",data["unit"])#转换数量单位(张) + print("data['qty_min']:",data["qty_min"])#最小下单量(张) + print("data['qty_max']:",data["qty_max"])#最大下单量(张) + print("data['swap_price']:",data["swap_price"])#转股价格 + print("data['swap_flag']:",data["swap_flag"])#是否处于转股期;0: 不可转股;1:可转股; + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询期权合约的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的期权合约情况 + #@param error 查查询用户新股申购额度信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param reid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryOptionAuctionInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionAuctionInfo', data, error, reqid, last,session_id) + print("data['ticker']:",data['ticker'])#合约编码,报单ticker采用本字段 + print("data['security_id_source']:",data['security_id_source'])#证券代码源 + print("data['symbol']:",data['symbol'])#合约简称 + print("data['contract_id']:",data['contract_id'])#合约交易代码 + print("data['underlying_security_id']:",data['underlying_security_id'])#基础证券代码 + print("data['underlying_security_id_source']:",data['underlying_security_id_source'])#基础证券代码源 + + print("data['list_date']:",data['list_date'])#上市日期,格式为YYYYMMDD + print("data['last_trade_date']:",data['last_trade_date'])#最后交易日,格式为YYYYMMDD + print("data['ticker_type']:",data['ticker_type'])#证券类别 + print("data['day_trading']:",data['day_trading'])#是否支持当日回转交易,1-允许,0-不允许 + + print("data['call_or_put']:",data['call_or_put'])#认购或认沽 + print("data['delivery_day']:",data['delivery_day'])#行权交割日,格式为YYYYMMDD + print("data['delivery_month']:",data['delivery_month'])#交割月份,格式为YYYYMM + + print("data['exercise_type']:",data['exercise_type'])#行权方式 + print("data['exercise_begin_date']:",data['exercise_begin_date'])#行权起始日期,格式为YYYYMMDD + print("data['exercise_end_date']:",data['exercise_end_date'])#行权结束日期,格式为YYYYMMDD + print("data['exercise_price']:",data['exercise_price'])#行权价格 + + print("data['qty_unit']:",data['qty_unit'])#数量单位,对于某一证券申报的委托,其委托数量字段必须为该证券数量单位的整数倍 + print("data['contract_unit']:",data['contract_unit'])#合约单位 + print("data['contract_position']:",data['contract_position'])#合约持仓量 + print("data['prev_close_price']:",data['prev_close_price'])#合约前收盘价 + print("data['prev_clearing_price']:",data['prev_clearing_price'])#合约前结算价 + print("data['lmt_buy_max_qty']:",data['lmt_buy_max_qty'])#限价买最大量 + print("data['lmt_buy_min_qty']:",data['lmt_buy_min_qty'])#限价买最小量 + print("data['lmt_sell_max_qty']:",data['lmt_sell_max_qty'])#限价卖最大量 + print("data['lmt_sell_min_qty']:",data['lmt_sell_min_qty'])#限价卖最小量 + print("data['mkt_buy_max_qty']:",data['mkt_buy_max_qty'])#市价买最大量 + print("data['mkt_buy_min_qty']:",data['mkt_buy_min_qty'])#市价买最小量 + print("data['mkt_sell_max_qty']:",data['mkt_sell_max_qty'])#市价卖最大量 + print("data['mkt_sell_min_qty']:",data['mkt_sell_min_qty'])#市价卖最小量 + print("data['price_tick']:",data['price_tick'])#最小报价单位 + print("data['upper_limit_price']:",data['upper_limit_price'])#涨停价 + print("data['lower_limit_price']:",data['lower_limit_price'])#跌停价 + print("data['sell_margin']:",data['sell_margin'])#今卖开每张保证金 + print("data['margin_ratio_param1']:",data['margin_ratio_param1'])#交易所保证金比例计算参数一 + print("data['margin_ratio_param2']:",data['margin_ratio_param2'])#交易所保证金比例计算参数二 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #融资融券业务中现金直接还款的响应 + #@param cash_repay_info 现金直接还款通知的具体信息,用户可以通过cash_repay_info.xtp_id来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + #@param error 现金还款发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onCreditCashRepay(self, data, error,session_id): + """""" + printFuncName('onCreditCashRepay', data, error,session_id) + print("data['xtp_id']:",data['xtp_id'])#直接还款操作的XTPID + print("data['request_amount']:",data['request_amount'])#直接还款的申请金额 + print("data['cash_repay_amount']:",data['cash_repay_amount'])#实际还款使用金额 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #融资融券业务中现金还息的响应 + #@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 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onCreditCashRepayDebtInterestFee(self, data, error,session_id): + """""" + printFuncName('onCreditCashRepayDebtInterestFee', data, error,session_id) + print("data['xtp_id']:",data['xtp_id'])#直接还款操作的XTPID + print("data['request_amount']:",data['request_amount'])#直接还款的申请金额 + print("data['cash_repay_amount']:",data['cash_repay_amount'])#实际还款使用金额 + print("data['debt_compact_id']:",data['debt_compact_id'])#指定的负债合约编号 + print("data['unknow']:",data['unknow'])#保留字段 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询融资融券业务中的现金直接还款报单的响应 + #@param cash_repay_info 查询到的某一笔现金直接还款通知的具体信息 + #@param error 查询现金直接报单发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditCashRepayInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryCreditCashRepayInfo', data, error, reqid, last,session_id) + print("data['xtp_id']:",data['xtp_id'])#直接还款操作的XTPID + print("data['status']:",data['status'])#直接还款处理状态0-初始、未处理状态,1-已成功处理状态,2-处理失败状态 + print("data['request_amount']:",data['request_amount'])#直接还款的申请金额 + print("data['cash_repay_amount']:",data['cash_repay_amount'])#实际还款使用金额 + print("data['position_effect']:",data['position_effect'])#强平标志 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询信用账户额外信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param fund_info 查询到的信用账户额外信息情况 + #@param error 查询信用账户额外信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditFundInfo(self, data, error, reqid,session_id): + """""" + printFuncName('onQueryCreditFundInfo', data, error, reqid,session_id) + print("data['maintenance_ratio']:",data['maintenance_ratio'])#维持担保品比例 + print("data['all_asset']:",data['all_asset'])#总资产 + print("data['all_debt']:",data['all_debt'])#总负债 + print("data['line_of_credit']:",data['line_of_credit'])#两融授信额度 + print("data['guaranty']:",data['guaranty'])#两融保证金可用数 + print("data['reserved']:",data['reserved'])#保留字段 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询信用账户负债信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param debt_info 查询到的信用账户合约负债情况 + #@param error 查询信用账户负债信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditDebtInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryCreditDebtInfo', data, error, reqid, last,session_id) + print("data['debt_type']:",data['debt_type'])#负债合约类型 + print("data['debt_id']:",data['debt_id'])#负债合约编号 + print("data['position_id']:",data['position_id'])#负债对应两融头寸编号 + print("data['order_xtp_id']:",data['order_xtp_id'])#生成负债的订单编号,非当日负债无此项 + print("data['debt_status']:",data['debt_status'])#负债合约状态 + print("data['market']:",data['market'])#市场 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['order_date']:",data['order_date'])#委托日期 + print("data['end_date']:",data['end_date'])#负债截止日期 + print("data['orig_end_date']:",data['orig_end_date'])#负债原始截止日期 + print("data['is_extended']:",data['is_extended'])#当日是否接收到展期请求 + print("data['remain_amt']:",data['remain_amt'])#未偿还金额 + print("data['remain_qty']:",data['remain_qty'])#未偿还融券数量 + print("data['remain_principal']:",data['remain_principal'])#未偿还本金金额 + print("data['due_right_qty']:",data['due_right_qty'])#应偿还权益数量 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询信用账户指定证券负债未还信息响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param debt_info 查询到的信用账户指定证券负债未还信息情况 + #@param error查询信用账户指定证券负债未还信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditTickerDebtInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryCreditTickerDebtInfo', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#市场 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['stock_repay_quantity']:",data['stock_repay_quantity'])#融券负债可还券数量 + print("data['reserved']:",data['reserved'])#保留字段 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询信用账户待还资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param remain_amount 查询到的信用账户待还资金 + #@param error 查询信用账户待还资金发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditAssetDebtInfo(self, remain_amount, error, reqid,session_id): + """""" + printFuncName('onQueryCreditAssetDebtInfo', remain_amount, error, reqid,session_id) + print("remain_amount:",remain_amount)#查询到的信用账户待还资金 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询信用账户可融券头寸信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param assign_info 查询到的信用账户可融券头寸信息 + #@param error 查询信用账户可融券头寸信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditTickerAssignInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryCreditTickerAssignInfo', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#市场 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['limit_qty']:",data['limit_qty'])#融券限量 + print("data['yesterday_qty']:",data['yesterday_qty'])#昨日日融券数量 + print("data['left_qty']:",data['left_qty'])#剩余可融券数量 + print("data['frozen_qty']:",data['frozen_qty'])#冻结融券数量 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #融资融券业务中请求查询指定余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param stock_info 查询到的余券信息 + #@param error 查询信用账户余券信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditExcessStock(self, data, error, reqid,session_id): + """""" + printFuncName('onQueryCreditExcessStock', data, error, reqid,session_id) + print("data['market']:",data['market'])#市场 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['transferable_quantity']:",data['transferable_quantity'])#可划转数量 + print("data['transferred_quantity']:",data['transferred_quantity'])#已划转数量 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #融资融券业务中请求查询指定余券信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param stock_info 查询到的余券信息 + #@param error 查询信用账户余券信息发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryMulCreditExcessStock(self, data, error, reqid,session_id): + """""" + printFuncName('onQueryMulCreditExcessStock', data, error, reqid,session_id) + print("data['market']:",data['market'])#市场 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['transferable_quantity']:",data['transferable_quantity'])#可划转数量 + print("data['transferred_quantity']:",data['transferred_quantity'])#已划转数量 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #融资融券业务中负债合约展期的通知 + #@param debt_extend_info 负债合约展期通知的具体信息,用户可以通过debt_extend_info.xtpid来管理订单,通过GetClientIDByXTPID() == client_id来过滤自己的订单。 + #@param error 负债合约展期订单被拒绝或者发生错误时错误代码和错误信息,当error为空,或者error.error_id为0时,表明没有错误。 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 当负债合约展期订单有状态变化的时候,会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。所有登录了此用户的客户端都将收到此用户的负债合约展期通知。 + def onCreditExtendDebtDate(self, data, error,session_id): + """""" + printFuncName('onCreditExtendDebtDate', data, error,session_id) + print("data['xtpid']:",data['xtpid'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['debt_id']:",data['debt_id'])#负债合约编号 + print("data['oper_status']:",data['oper_status'])#展期请求操作状态 + print("data['oper_time']:",data['oper_time'])#操作时间 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #查询融资融券业务中负债合约展期订单响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@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 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditExtendDebtDateOrders(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryCreditExtendDebtDateOrders', data, error, reqid, last,session_id) + print("data['xtpid']:",data['xtpid'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['debt_id']:",data['debt_id'])#负债合约编号 + print("data['oper_status']:",data['oper_status'])#展期请求操作状态 + print("data['oper_time']:",data['oper_time'])#操作时间 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #查询融资融券业务中信用账户附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param fund_info 信用账户附加信息 + #@param error_info 查询信用账户附加信息发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditFundExtraInfo(self, data, error, reqid,session_id): + """""" + printFuncName('onQueryCreditFundExtraInfo', data, error, reqid,session_id) + print("data['mf_rs_avl_used']:",data['mf_rs_avl_used'])#当前资金账户购买货币基金使用的融券卖出所得资金占用 + print("data['reserve']:",data['reserve'])#预留空间 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #查询融资融券业务中信用账户指定证券的附加信息的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@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 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryCreditPositionExtraInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryCreditPositionExtraInfo', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#证券市场 + print("data['ticker']:",data['ticker'])#证券代码 + print("data['mf_rs_avl_used']:",data['mf_rs_avl_used'])#购买货币基金使用的融券卖出所得资金占用 + print("data['reserve']:",data['reserve'])#预留空间 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #期权组合策略报单通知 + #@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 每次订单状态更新时,都会被调用,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线,在订单未成交、全部成交、全部撤单、部分撤单、已拒绝这些状态时会有响应,对于部分成交的情况,请由订单的成交回报来自行确认。所有登录了此用户的客户端都将收到此用户的订单响应 + def onOptionCombinedOrderEvent(self, data, error,session_id): + """""" + printFuncName('onOptionCombinedOrderEvent', data, error,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['update_time']:",data['update_time'])#最后修改时间,格式为YYYYMMDDHHMMSSsss + print("data['cancel_time']:",data['cancel_time'])#撤销时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #期权组合策略成交通知 + #@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()不会推送部成状态。 + def onOptionCombinedTradeEvent(self, data,session_id): + """""" + printFuncName('onOptionCombinedTradeEvent', data,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['market']:",data['market'])#交易市场 + print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 + print("data['side']:",data['side'])#组合方向 + print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 + print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 + print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + + #期权组合策略撤单出错响应 + #@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 此响应只会在撤单发生错误时被回调 + def onCancelOptionCombinedOrderError(self, data, error,session_id): + """""" + printFuncName('onCancelOptionCombinedOrderError', data, error,session_id) + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单XTPID + print("data['order_xtp_id']:",data['order_xtp_id'])#原始订单XTPID + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询期权组合策略报单响应 + #@param order_info 查询到的一个报单 + #@param error 查询报单时发生错误时,返回的错误信息,当error[error_id]为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + def onQueryOptionCombinedOrders(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionCombinedOrders', data, error, reqid, last,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['update_time']:",data['update_time'])#最后修改时间,格式为YYYYMMDDHHMMSSsss + print("data['cancel_time']:",data['cancel_time'])#撤销时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询期权组合策略报单响应-新版本接口 + #@param order_info 查询到的一个报单 + #@param error 查询报单时发生错误时,返回的错误信息,当error[error_id]为0时,表明没有错误 + #@param reqid 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为reqid这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 由于支持分时段查询,一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。此对应的请求函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + def onQueryOptionCombinedOrdersEx(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionCombinedOrdersEx', data, error, reqid, last,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['update_time']:",data['update_time'])#最后修改时间,格式为YYYYMMDDHHMMSSsss + print("data['cancel_time']:",data['cancel_time'])#撤销时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['error_id']:",data['error_id'])#报单的错误信息 + print("data['error_msg']:",data['error_msg'])#报单的错误信息 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #分页请求查询期权组合策略报单响应 + #@param data 查询到的一个报单 + #@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,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOptionCombinedOrdersByPage(self, data, req_count, order_sequence, query_reference,request_id,is_last,session_id): + """""" + printFuncName('onQueryOptionCombinedOrdersByPage', data, req_count, order_sequence, query_reference,request_id,is_last,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['update_time']:",data['update_time'])#最后修改时间,格式为YYYYMMDDHHMMSSsss + print("data['cancel_time']:",data['cancel_time'])#撤销时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + + #分页请求查询期权组合策略报单响应-新版本接口 + #@param data 查询到的一个报单 + #@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,那么表示还有报单,可以进行下一次分页查询,如果不等,表示所有报单已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOptionCombinedOrdersByPageEx(self, data, req_count, order_sequence, query_reference,request_id,is_last,session_id): + """""" + printFuncName('onQueryOptionCombinedOrdersByPageEx', data, req_count, order_sequence, query_reference,request_id,is_last,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['order_cancel_client_id']:",data['order_cancel_client_id'])#报单操作引用,用户自定义(暂未使用) + print("data['order_cancel_xtp_id']:",data['order_cancel_xtp_id'])#撤单在XTP系统中的id,在XTP系统中唯一 + print("data['market']:",data['market'])#交易市场 + print("data['quantity']:",data['quantity'])#数量,此订单的报单数量 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['qty_traded']:",data['qty_traded'])#今成交数量,为此订单累计成交数量 + print("data['qty_left']:",data['qty_left'])#剩余数量,当撤单成功时,表示撤单数量 + print("data['insert_time']:",data['insert_time'])#委托时间,格式为YYYYMMDDHHMMSSsss + print("data['update_time']:",data['update_time'])#最后修改时间,格式为YYYYMMDDHHMMSSsss + print("data['cancel_time']:",data['cancel_time'])#撤销时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['order_local_id']:",data['order_local_id'])#本地报单编号 OMS生成的单号,不等同于order_xtp_id,为服务器传到报盘的单号 + print("data['order_status']:",data['order_status'])#报单状态,订单响应中没有部分成交状态的推送,在查询订单结果中,会有部分成交状态 + print("data['order_submit_status']:",data['order_submit_status'])#报单提交状态,OMS内部使用,用户无需关心 + print("data['order_type']:",data['order_type'])#报单类型 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['error_id']:",data['error_id'])#报单错误信息 + print("data['error_msg']:",data['error_msg'])#报单错误信息 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + + + #请求查询期权组合策略成交响应 + #@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断线 + def onQueryOptionCombinedTrades(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionCombinedTrades', data, error, reqid, last,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['market']:",data['market'])#交易市场 + print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 + print("data['side']:",data['side'])#组合方向 + print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 + print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 + print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #分页请求查询期权组合策略成交响应 + #@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,那么表示还有回报,可以进行下一次分页查询,如果不等,表示所有回报已经查询完毕。一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOptionCombinedTradesByPage(self, data, req_count, trade_sequence, query_reference, request_id, is_last,session_id): + """""" + printFuncName('onQueryOptionCombinedTradesByPage', data, req_count, trade_sequence, query_reference, request_id, is_last,session_id) + print("data['order_xtp_id']:",data['order_xtp_id'])#XTP系统订单ID,无需用户填写,在XTP系统中唯一 + print("data['order_client_id']:",data['order_client_id'])#报单引用,用户自定义 + print("data['market']:",data['market'])#交易市场 + print("data['local_order_id']:",data['local_order_id'])#订单号,引入XTPID后,该字段实际和order_xtp_id重复。接口中暂时保留 + print("data['side']:",data['side'])#组合方向 + print("data['exec_id']:",data['exec_id'])#成交编号,深交所唯一,上交所每笔交易唯一,当发现2笔成交回报拥有相同的exec_id,则可以认为此笔交易自成交 + print("data['quantity']:",data['quantity'])#数量,此次成交的数量,不是累计数量 + print("data['trade_time']:",data['trade_time'])#成交时间,格式为YYYYMMDDHHMMSSsss + print("data['trade_amount']:",data['trade_amount'])#成交金额,组合拆分涉及的保证金 + print("data['report_index']:",data['report_index'])#成交序号 --回报记录号,每个交易所唯一,report_index+market字段可以组成唯一标识表示成交回报 + print("data['order_exch_id']:",data['order_exch_id'])#报单编号 --交易所单号,上交所为空,深交所有此字段 + print("data['side']:",data['side'])#组合方向 + print("data['business_type']:",data['business_type'])#业务类型 + print("data['branch_pbu']:",data['branch_pbu'])#交易所交易员代码 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + + #请求查询期权组合策略持仓响应 + #@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 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOptionCombinedPosition(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionCombinedPosition', data, error, reqid, last,session_id) + print("data['strategy_id']:",data['strategy_id'])#组合策略代码 + print("data['strategy_name']:",data['strategy_name'])#组合策略名称 + print("data['market']:",data['market'])#交易市场 + print("data['total_qty']:",data['total_qty'])#总持仓 + print("data['available_qty']:",data['available_qty'])#可拆分持仓 + print("data['yesterday_position']:",data['yesterday_position'])#昨日持仓 + print("data['strategy_id']:",data['strategy_id'])#组合策略代码,比如CNSJC认购牛市价差策略等 + print("data['comb_num']:",data['comb_num'])#组合编码,组合申报时,该字段为空;拆分申报时,填写拟拆分组合的组合编码。 + print("data['num_legs']:",data['num_legs'])#成分合约数 + for i in data['leg_detail']: + for key,value in i.items(): + print(key,value) + print("data['secu_comb_margin']:",data['secu_comb_margin'])#组合占用保证金(公司) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询期权组合策略信息响应 + #@param data 查询到的一个组合策略信息 + #@param error 查询成交回报发生错误时返回的错误信息,当error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param is_last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOptionCombinedStrategyInfo(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionCombinedStrategyInfo', data, error, reqid, last,session_id) + print("data['strategy_id']:",data['strategy_id'])#组合策略代码 + print("data['strategy_name']:",data['strategy_name'])#组合策略名称 + print("data['market']:",data['market'])#交易市场 + print("data['leg_num']:",data['leg_num'])# 成分合约个数,1-4个,即下面数组的实际大小 + for i in data['leg_strategy']: + for key,value in i.items(): + print(key,value) + print("data['expire_date_type']:",data['expire_date_type'])#到期日要求。枚举值为:同到期日,不同到期日,无到期日要求 + print("data['underlying_type']:",data['underlying_type'])#标的要求。枚举值为:相同标的,不同标的,无标的要求 + print("data['auto_sep_type']:",data['auto_sep_type'])#自动解除类型。枚举值为:-1:不适用;0:到期日自动解除;1:E-1日自动解除,依次类推 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #查询期权行权合并头寸的响应 + #@param data 查询到的一个行权合并头寸信息 + #@param error 查询持仓发生错误时返回的错误信息,当error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 一个查询请求可能对应多个响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线。 + def onQueryOptionCombinedExecPosition(self, data, error, reqid, last,session_id): + """""" + printFuncName('onQueryOptionCombinedExecPosition', data, error, reqid, last,session_id) + print("data['market']:",data['market'])#市场 + print("data['cntrt_code_1']:",data['cntrt_code_1'])#成分合约1代码 + print("data['cntrt_name_1']:",data['cntrt_name_1'])#成分合约1名称 + print("data['position_side_1']:",data['position_side_1'])# 成分合约1持仓方向 + print("data['call_or_put_1']:",data['call_or_put_1'])#成分合约1类型 + print("data['avl_qty_1']:",data['avl_qty_1'])#成分合约1可用持仓数量 + print("data['own_qty_1']:",data['own_qty_1'])#成分合约1当前持仓数量 + + print("data['cntrt_code_2']:",data['cntrt_code_2'])#成分合约1代码 + print("data['cntrt_name_2']:",data['cntrt_name_2'])#成分合约1名称 + print("data['position_side_2']:",data['position_side_2'])# 成分合约1持仓方向 + print("data['call_or_put_2']:",data['call_or_put_2'])#成分合约1类型 + print("data['avl_qty_2']:",data['avl_qty_2'])#成分合约1可用持仓数量 + print("data['own_qty_2']:",data['own_qty_2'])#成分合约1当前持仓数量 + + print("data['net_qty']:",data['net_qty'])#权利仓净头寸 + print("data['order_qty']:",data['order_qty'])#行权合并委托数量,不含已拒单已撤单 + print("data['confirm_qty']:",data['confirm_qty'])#行权合并已确认数量 + print("data['avl_qty']:",data['avl_qty'])#可行权合并数量 + + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #请求查询其他节点可用资金的响应,需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + #@param data 查询到的其他节点可用资金情况 + #@param error 查询其他节点可用资金发生错误时返回的错误信息,当error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryOtherServerFund(self, data, error, reqid,session_id): + """""" + printFuncName('onQueryOtherServerFund', data, error, reqid,session_id) + print("data['amount']:",data['amount'])#amount + print("data['query_type']:",data['query_type'])#查询类型 0-查询金证主柜台可转资金 1-查询一账号两中心设置时,对方节点的资金 + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #algo业务中查询策略列表的响应 + #@param data 策略具体信息 + #@param strategy_param 此策略中包含的参数,如果error_info.error_id为0时,有意义 + #@param error 查询查询策略列表发生错误时返回的错误信息,当error.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param last 此消息响应函数是否为request_id这条请求所对应的最后一个响应,当为最后一个的时候为true,如果为false,表示还有其他后续消息响应 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onQueryStrategy(self,data,strategy_param,error, reqid, last, session_id): + """""" + printFuncName('onQueryStrategy', data,strategy_param, error, reqid, last,session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 0-创建中,1-已创建,2-开始执行中,3-已执行,4-停止中,5-已停止,6-销毁中,7-已销毁,8-发生错误, + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略id + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #algo业务中策略运行时策略状态通知 + #@param data 用户策略运行情况的状态通知 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onStrategyStateReport(self,data, session_id): + """""" + printFuncName('onStrategyStateReport', data,session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 0-创建中,1-已创建,2-开始执行中,3-已执行,4-停止中,5-已停止,6-销毁中,7-已销毁,8-发生错误, + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略id + print("data['m_strategy_qty']:",data['m_strategy_qty'])#策略总量 + print("data['m_strategy_ordered_qty']:",data['m_strategy_ordered_qty'])#策略已委托数量 + print("data['m_strategy_cancelled_qty']:",data['m_strategy_cancelled_qty'])#策略已撤单数量 + print("data['m_strategy_execution_qty']:",data['m_strategy_execution_qty'])#策略已成交数量 + print("data['m_strategy_unclosed_qty']:",data['m_strategy_unclosed_qty'])#策略未平仓数量(T0卖出数量-买入数量) + print("data['m_strategy_asset']:",data['m_strategy_asset'])#策略总金额 + print("data['m_strategy_ordered_asset']:",data['m_strategy_ordered_asset'])#策略已委托金额 + print("data['m_strategy_execution_asset']:",data['m_strategy_execution_asset'])#策略已成交金额 + print("data['m_strategy_execution_price']:",data['m_strategy_execution_price'])#策略执行价格 + print("data['m_strategy_market_price']:",data['m_strategy_market_price'])#策略市场价 + print("data['m_strategy_price_diff']:",data['m_strategy_price_diff'])#策略执行价差 + print("data['m_strategy_asset_diff']:",data['m_strategy_asset_diff'])#策略执行绩效(T0资金预净收入) + print("data['error_id']:",data['error_id'])#错误代码 + print("data['error_msg']:",data['error_msg'])#错误信息 + + #algo业务中用户建立算法通道的消息响应 + #@param user 用户名 + #@param error 建立算法通道发生错误时返回的错误信息,error.error_id为0时,表明没有错误,即算法通道成功 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 算法通道建立成功后,才能对用户创建策略等操作,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立 + def onALGOUserEstablishChannel(self,user,error, session_id): + """""" + printFuncName('onALGOUserEstablishChannel',user, error,session_id) + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #algo业务中报送策略单的响应 + #@param data 用户报送的策略单的具体信息 + #@param error 报送策略单发生错误时返回的错误信息,当error为空,或者error.error_id为0时,表明没有错误 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onInsertAlgoOrder(self,data,error, session_id): + """""" + printFuncName('onInsertAlgoOrder',data, error,session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 0-创建中,1-已创建,2-开始执行中,3-已执行,4-停止中,5-已停止,6-销毁中,7-已销毁,8-发生错误, + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略id + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #algo业务中撤销策略单的响应 + #@param data 用户撤销的策略单的具体信息 + #@param error 撤销策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onCancelAlgoOrder(self,data,error, session_id): + """""" + printFuncName('onCancelAlgoOrder',data, error,session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 0-创建中,1-已创建,2-开始执行中,3-已执行,4-停止中,5-已停止,6-销毁中,7-已销毁,8-发生错误, + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略id + print("error['error_id']:",error['error_id']) + print("error['error_msg']:",error['error_msg']) + + #当客户端与AlgoBus通信连接断开时,该方法被调用。 + #@param reason 错误原因,请与错误代码表对应 + #@remark 请不要堵塞此线程,否则会影响algo的登录,与Algo之间的连接,断线后会自动重连,用户无需做其他操作 + def onAlgoDisconnected(reason): + """""" + printFuncName('onAlgoDisconnected',reason) + + #当客户端与AlgoBus断线后重新连接时,该方法被调用,仅在断线重连成功后会被调用。 + def onAlgoConnected(): + """""" + printFuncName('onAlgoConnected') + + #algo业务中策略运行时策略指定证券执行状态通知 + #@param data 用户策略指定证券运行情况的状态通知 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onStrategySymbolStateReport(self,data,session_id): + """""" + printFuncName('onStrategySymbolStateReport',data,session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略id + print("data['m_ticker']:",data['m_ticker'])#证券代码 + print("data['m_market']:",data['m_market'])#市场 + print("data['m_side']:",data['m_side'])#买卖方向,=0时为T0单 + print("data['m_strategy_qty']:",data['m_strategy_qty'])#策略总量 + print("data['m_strategy_ordered_qty']:",data['m_strategy_ordered_qty'])#策略已委托数量 + print("data['m_strategy_cancelled_qty']:",data['m_strategy_cancelled_qty'])#策略已撤单数量 + print("data['m_strategy_execution_qty']:",data['m_strategy_execution_qty'])#策略已成交数量 + print("data['m_strategy_buy_qty']:",data['m_strategy_buy_qty'])#策略已买入数量(T0) + print("data['m_strategy_sell_qty']:",data['m_strategy_sell_qty'])#策略已卖出数量(T0) + print("data['m_strategy_unclosed_qty']:",data['m_strategy_unclosed_qty'])#策略未平仓数量(T0卖出数量-买入数量) + print("data['m_strategy_asset']:",data['m_strategy_asset'])#策略总金额 + print("data['m_strategy_ordered_asset']:",data['m_strategy_ordered_asset'])#策略已委托金额 + print("data['m_strategy_execution_asset']:",data['m_strategy_execution_asset'])#策略已成交金额 + print("data['m_strategy_buy_asset']:",data['m_strategy_buy_asset'])#策略买入金额(T0) + print("data['m_strategy_sell_asset']:",data['m_strategy_sell_asset'])#策略卖出金额(TO) + print("data['m_strategy_unclosed_asset']:",data['m_strategy_unclosed_asset'])#策略未平仓金额(T0) + print("data['m_strategy_asset_diff']:",data['m_strategy_asset_diff'])#策略毛收益增强金额(T0) + print("data['m_strategy_execution_price']:",data['m_strategy_execution_price'])#策略执行价格 + print("data['m_strategy_market_price']:",data['m_strategy_market_price'])#策略市场价 + print("data['m_strategy_price_diff']:",data['m_strategy_price_diff'])#策略执行价差(T0时为毛增强收益率) + print("data['error_id']:",data['error_id'])#错误信息 + print("data['error_msg']:",data['error_msg'])#错误信息 + + #algo业务中报送母单创建时的推送消息(包括其他客户端创建的母单) + #@param strategy_info 策略具体信息 + #@param strategy_param 此策略中包含的参数 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onNewStrategyCreateReport(self, data, strategy_param, session_id): + """""" + printFuncName('onNewStrategyCreateReport', data, strategy_param, session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 0-创建中,1-已创建,2-开始执行中,3-已执行,4-停止中,5-已停止,6-销毁中,7-已销毁,8-发生错误, + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略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 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onStrategyRecommendation(self, addtional_bool, data, strategy_param, error, reqid, last, session_id): + """""" + printFuncName('onStrategyRecommendation', addtional_bool, data, strategy_param, error, reqid, last, session_id) + print("data['addtional_bool']:", addtional_bool)#是否将满足条件的推荐结果打包成母单篮的标志 + print("data['strategy_param']:",strategy_param)#算法参数 + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_market']:",data['m_market'])#交易市场 + print("data['m_ticker']:",data['m_ticker'])#证券代码 + print("data['m_reserved']:",data['m_reserved'])#保留域 + print("error['error_id']:",error['error_id'])#错误信息 + print("error['error_msg']:",error['error_msg'])#错误信息 + + #algo业务中修改已有策略单的响应 + #@param strategy_info 用户修改后策略单的具体信息 + #@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onModifyAlgoOrder(self, data, error, session_id): + """""" + printFuncName('onModifyAlgoOrder', data, error, session_id) + print("data['m_strategy_type']:",data['m_strategy_type'])#策略类型 + print("data['m_strategy_state']:",data['m_strategy_state'])#策略状态 0-创建中,1-已创建,2-开始执行中,3-已执行,4-停止中,5-已停止,6-销毁中,7-已销毁,8-发生错误, + print("data['m_client_strategy_id']:",data['m_client_strategy_id'])#客户策略id + print("data['m_xtp_strategy_id']:",data['m_xtp_strategy_id'])#xtp策略id + print("error['error_id']:",error['error_id'])#错误信息 + print("error['error_msg']:",error['error_msg'])#错误信息 + + #algo业务中暂停指定策略指定证券算法单的响应 + #@param xtp_strategy_id xtp算法单策略ID + #@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + #@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onPauseAlgoOrder(self, xtp_strategy_id, data, error, request_id, session_id): + """""" + printFuncName('onPauseAlgoOrder', xtp_strategy_id, data, error, request_id, session_id) + print("xtp_strategy_id:",xtp_strategy_id)#算法单策略ID + if('m_ticker' in data): + print("data['m_ticker']:", data['m_ticker'])#证券代码 + if('m_market' in data): + print("data['m_market']:", data['m_market'])#交易市场 + print("error['error_id']:",error['error_id'])#错误代码 + print("error['error_msg']:",error['error_msg'])#错误信息 + + #algo业务中重启指定策略指定证券算法单的响应 + #@param xtp_strategy_id xtp算法单策略ID + #@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + #@param error_info 修改策略单发生错误时返回的错误信息,当error_info为空,或者error_info.error_id为0时,表明没有错误 + #@param request_id 此消息响应函数对应的请求ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 需要快速返回,否则会堵塞后续消息,当堵塞严重时,会触发断线 + def onResumeAlgoOrder(self, xtp_strategy_id, data, error, request_id, session_id): + """""" + printFuncName('onResumeAlgoOrder', xtp_strategy_id, data, error, request_id, session_id) + print("xtp_strategy_id:",xtp_strategy_id)#算法单策略ID + if('m_ticker' in data): + print("data['m_ticker']:", data['m_ticker'])#证券代码 + if('m_market' in data): + print("data['m_market']:", data['m_market'])#交易市场 + print("error['error_id']:",error['error_id'])#错误代码 + print("error['error_msg']:",error['error_msg'])#错误信息 + +if __name__ == '__main__': + ip = '122.112.139.0' + port = 6202 + user = 'username' + password = 'password' + reqid = 0 + local_ip = '10.25.61.57' + + #创建TraderApi + #@param client_id (必须输入)客户端id,用于区分同一用户的不同客户端,由用户自定义 + #@param save_file_path (必须输入)存贮订阅信息文件的目录,请设定一个真实存在的有可写权限的路径 + #@param log_level 日志输出级别 + #@return 创建出的UserApi + #@remark 如果一个账户需要在多个客户端登录,请使用不同的client_id,系统允许一个账户同时登录多个客户端,但是对于同一账户,相同的client_id只能保持一个session连接,后面的登录在前一个session存续期间,无法连接。系统不支持过夜,请确保每天开盘前重新启动 + api = TestApi() + api.createTraderApi(2, os.getcwd(),4) + + #订阅公共流。 + #@param resume_type 公共流(订单响应、成交回报)重传方式 + # XTP_TERT_RESTART(0):从本交易日开始重传 + # XTP_TERT_RESUME(1):(保留字段,此方式暂未支持)从上次收到的续传 + # XTP_TERT_QUICK(2):只传送登录后公共流的内容 + #@remark 该方法要在Login方法前调用。若不调用则不会收到公共流的数据。注意在用户断线后,如果不登出就login(),公共流订阅方式不会起作用。用户只会收到断线后的所有消息。如果先logout()再login(),那么公共流订阅方式会起作用,用户收到的数据会根据用户的选择方式而定。 + subscribePublicTopic = api.subscribePublicTopic(2) + printFuncName('subscribePublicTopic', subscribePublicTopic) + + #设置软件开发Key + #@param key 用户开发软件Key + #@remark 此函数必须在Login之前调用 + api.setSoftwareKey("b8aa7173bba3470e390d787219b2112e") + + + #设置软件开发版本号 + #@param version 用户开发软件版本号,非api发行版本号,长度不超过15位 + #@remark 此函数必须在Login之前调用,标识的是客户端版本号,而不是API的版本号,由用户自定义 + api.setSoftwareVersion("test") + + #设置心跳检测时间间隔,单位为秒 + #@param interval 心跳检测时间间隔,单位为秒 + #@remark 此函数必须在Login之前调用 + setHeartBeatInterval = api.setHeartBeatInterval(15) + + #用户登录请求 + #@return session表明此资金账号登录是否成功,“0”表示登录失败,可以调用GetApiLastError()来获取错误代码,非“0”表示登录成功,此时需要记录下这个返回值session,与登录的资金账户对应 + #@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存续期间,无法连接 + session_id = api.login(ip, port, user, password, 1,local_ip) + printFuncName('login', session_id) + if session_id == 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + + #服务器是否重启过 + #@return “true”表示重启过,“false”表示没有重启过 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 此函数必须在Login之后调用 + retIsServerRestart = api.isServerRestart(session_id) + printFuncName('isServerRestart', retIsServerRestart) + + #获取当前交易日 + #return 获取到的交易日 + #@remark 只有登录成功后,才能得到正确的交易日 + retGetTradingDay = api.getTradingDay() + printFuncName('getTradingDay', retGetTradingDay) + + #获取API的发行版本号 + #@return 返回api发行版本号 + retGetApiVersion = api.getApiVersion() + printFuncName('getApiVersion',retGetApiVersion) + + #获取API的系统错误 + #@return 返回的错误信息,可以在Login、InsertOrder、CancelOrder返回值为0时调用,获取失败的原因 + #@remark 可以在调用api接口失败时调用,例如login失败时 + #retGetApiLastError = api.getApiLastError() + #printFuncName('getApiLastError',retGetApiLastError) + + #查询用户在本节点上的可交易市场类型 + #@return 发送消息是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用getApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 此函数必须在Login之后调用,对应的响应函数是onQueryAccountTradeMarket() + reqid += 1 + retQueryAccountTradeMarket = api.queryAccountTradeMarket(session_id, reqid) + printFuncName('queryAccountTradeMarket',retQueryAccountTradeMarket) + sleep(2) + + + #通过报单在xtp系统中的ID获取下单的客户端id + #@return 返回客户端id,可以用此方法过滤自己下的订单 + #@param order_xtp_id 报单在xtp系统中的ID + #@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 + + order_xtp_id = 36989101307593706 + retGetClientIdByXTPID = api.getClientIDByXTPID(order_xtp_id) + printFuncName('getClientIDByXTPID',retGetClientIdByXTPID) + + #通过报单在xtp系统中的ID获取相关资金账户名 + #@return 返回资金账户名 + #@param order_xtp_id 报单在xtp系统中的ID + #@remark 只有资金账户登录成功后,才能得到正确的信息 + retGetAccountByXTPID = api.getAccountByXTPID(order_xtp_id) + printFuncName('getAccountByXTPID',retGetAccountByXTPID) + + + + #报单录入请求 + #@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,登录时得到 + #@remark 交易所接收订单后,会在报单响应函数OnOrderEvent()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + + + sleep(2) + order = {} + order['ticker'] = '000001' # 平安银行 + order['market'] = 1 # 深圳A股 + order['price'] = 13.1 + order['quantity'] = 100 + order['price_type'] = 1 # 限价单 + order['side'] = 1 # 买 + order['position_effect'] = 0 # 开仓 + order['business_type'] = 0 # 普通股票业务(股票买卖,ETF买卖等) + order['order_client_id'] = 2 + + retInsertOrder = api.insertOrder(order, session_id) + printFuncName('insertOrder', retInsertOrder) + if retInsertOrder == 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + + #为用户获取一个新的订单XTPID,用于报单 + #@return 生成的订单XTPID,非“0”表示获取成功,“0”表示获取失败,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 此函数必须在Login之后调用,通过这个函数获取的order_xtp_id仅用于对应的用户报单,如果设置错误,将会导致下单失败 + sleep(2) + newxtpid = api.getANewOrderXTPID(session_id) + order['order_xtp_id'] = newxtpid + retInsertOrder = api.insertOrderExtra(order, session_id) + printFuncName('insertOrderExtra', retInsertOrder) + if retInsertOrder == 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError',retGetApiLastError) + + + #通过报单在xtp系统中的ID获取下单的客户端id + #@return 返回客户端id,可以用此方法过滤自己下的订单 + #@param order_xtp_id 报单在xtp系统中的ID + #@remark 由于系统允许同一用户在不同客户端上登录操作,每个客户端通过不同的client_id进行区分 + order_xtp_id = retInsertOrder + retGetClientIdByXTPID = api.getClientIDByXTPID(order_xtp_id) + printFuncName('getClientIDByXTPID',retGetClientIdByXTPID) + + #通过报单在xtp系统中的ID获取相关资金账户名 + #@return 返回资金账户名 + #@param order_xtp_id 报单在xtp系统中的ID + #@remark 只有资金账户登录成功后,才能得到正确的信息 + retGetAccountByXTPID = api.getAccountByXTPID(order_xtp_id) + printFuncName('getAccountByXTPID',retGetAccountByXTPID) + + + #分页请求查询报单 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 sleep(1) + queryOrderByPageReq = {} + queryOrderByPageReq['req_count'] = 10 #需要查询的成交回报条数 + queryOrderByPageReq['reference'] = 0 #上一次收到的查询订单结果中带回来的索引,如果是从头查询,请置0 + queryOrderByPageReq['reserved'] = 0 #保留字段 + sleep(1) + reqid += 1 + retQueryOrdersByPage = api.queryOrdersByPageEx(queryOrderByPageReq, session_id, reqid) + printFuncName('queryOrdersByPageEx', retQueryOrdersByPage) + if retQueryOrdersByPage != 0 : + retQueryOrdersByPageError = api.getApiLastError() + printFuncName('getApiLastError',retQueryOrdersByPageError) + + + #撤单操作请求 + #@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + #@param retInsertOrder 需要撤销的委托单在XTP系统中的ID + #@param session_id 资金账户对应的session,登录时得到 + #@remark 如果撤单成功,会在报单响应函数OnOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 + sleep(2) + retCancelOrder = api.cancelOrder(retInsertOrder, session_id) + printFuncName('cancelOrder',retCancelOrder) + if retCancelOrder == 0 : + retCancelOrderError = api.getApiLastError() + printFuncName('getApiLastError',retCancelOrderError) + + #根据报单ID请求查询报单 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + order_xtp_id = retInsertOrder + retQueryOrderByXTPID = api.queryOrderByXTPIDEx(order_xtp_id,session_id,reqid) + printFuncName('queryOrderByXTPIDEx',retQueryOrderByXTPID) + if retQueryOrderByXTPID != 0 : + retQueryOrderByXTPIDError = api.getApiLastError() + printFuncName('getApiLastError',retQueryOrderByXTPIDError) + + #请求查询报单 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param queryOrdersInfo 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + queryOrdersInfo = {} + queryOrdersInfo['ticker'] = '000001' + queryOrdersInfo['begin_time'] = 0 + queryOrdersInfo['end_time'] = 0 + sleep(1) + reqid += 1 + retQueryOrders = api.queryOrdersEx(queryOrdersInfo, session_id, reqid) + printFuncName('queryOrdersEx',retQueryOrders) + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError',retGetApiLastError) + + #根据委托编号请求查询相关成交 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + #@remark 此函数查询出的结果可能对应多个查询结果响应 + sleep(1) + reqid += 1 + retQueryTradesByXTPID = api.queryTradesByXTPID(order_xtp_id, session_id, reqid) + printFuncName('queryTradesByXTPID', retQueryTradesByXTPID) + + sleep(1) + #请求查询已成交 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param queryTradesInfo 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + queryTradesInfo = {} + queryTradesInfo['ticker'] = '000001' + queryTradesInfo['begin_time'] = 0 + queryTradesInfo['end_time'] = 0 + reqid += 1 + retQueryTrades = api.queryTrades(queryTradesInfo, session_id, reqid) + printFuncName('queryTrades',retQueryTrades) + + sleep(1) + #分页请求查询成交回报 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + queryTraderByPageReq = {} + queryTraderByPageReq['req_count'] = 10 #需要查询的成交回报条数 + queryTraderByPageReq['reference'] = 0 #上一次收到的查询成交回报结果中带回来的索引,如果是从头查询,请置0 + queryTraderByPageReq['reserved'] = 0 #保留字段 + sleep(1) + reqid += 1 + retQueryTradesByPage = api.queryTradesByPage(queryTraderByPageReq, session_id, reqid) + printFuncName('queryTradesByPage', retQueryTradesByPage) + + sleep(1) + #请求查询投资者持仓 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param ticker 需要查询的持仓合约代码,可以为空,如果不为空,请不带空格 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息,如果合约代码为空,则默认查询所有持仓信息 + reqid += 1 + retQueryPosition = api.queryPosition('', session_id, reqid) + printFuncName('queryPosition',retQueryPosition) + + sleep(1) + #请求查询资产 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryAsset = api.queryAsset(session_id, reqid) + printFuncName('queryAsset',retQueryAsset) + + sleep(1) + #请求查询分级基金 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的分级基金筛选条件,其中母基金代码可以为空,则默认所有存在的母基金,如果不为空,请不带空格,其中交易市场不能为空 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + #@remark 此函数查询出的结果可能对应多个查询结果响应 + reqid += 1 + retQueryStructuredFund = api.queryStructuredFund({},session_id, reqid) + printFuncName('queryStructuredFund',retQueryStructuredFund) + + sleep(1) + #资金划拨请求 + #@return 资金划拨订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + #@param fundTransferInfo 资金划拨的请求信息 + #@param session_id 资金账户对应的session,登录时得到 + #@remark 此函数支持一号两中心节点之间的资金划拨,注意资金划拨的方向。 + reqid += 1 + fundTransferInfo = {} + fundTransferInfo['serial_id'] = 30000 + fundTransferInfo['fund_account'] = '15006594' + fundTransferInfo['password'] = 'SitHAKln' + fundTransferInfo['amount'] = 20000 + fundTransferInfo['transfer_type'] = 0 + retFundTransfer = api.fundTransfer(fundTransferInfo, session_id) + printFuncName('fundTransfer', retFundTransfer) + + sleep(1) + #请求查询资金划拨 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的资金划拨订单筛选条件,其中serial_id可以为0,则默认所有资金划拨订单,如果不为0,则请求特定的资金划拨订单 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryFundTransfer = api.queryFundTransfer({'amount': 20000}, session_id, reqid) + printFuncName('queryFundTransfer', retQueryFundTransfer) + + sleep(1) + #请求查询ETF清单文件 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param queryETFInfo 需要查询的ETF清单文件的筛选条件,其中合约代码可以为空,则默认所有存在的ETF合约代码,market字段也可以为初始值,则默认所有市场的ETF合约 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + queryETFInfo = {} + queryETFInfo['ticker'] = '510050' + queryETFInfo['market'] = 2 + reqid += 1 + retQueryETF = api.queryETF(queryETFInfo, session_id, reqid) + printFuncName('queryETF', retQueryETF) + + sleep(1) + #请求查询ETF股票篮 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param queryETFTickerBasketInfo 需要查询股票篮的的ETF合约,其中合约代码不可以为空,market字段也必须指定 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + queryETFTickerBasketInfo = {} + queryETFTickerBasketInfo['ticker'] = '510050' + queryETFTickerBasketInfo['market'] = 2 + reqid += 1 + retQueryETFTickerBasket = api.queryETFTickerBasket(queryETFInfo,session_id, reqid) + printFuncName('queryETFTickerBasket',retQueryETFTickerBasket) + sleep(1) + + #请求查询今日新股申购信息列表 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryIPOInfoList = api.queryIPOInfoList(session_id, reqid) + printFuncName('queryIPOInfoList',retQueryIPOInfoList) + sleep(1) + + #请求查询用户新股申购额度信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryIPOQuotaInfo = api.queryIPOQuotaInfo(session_id, reqid) + printFuncName('queryIPOQuotaInfo',retQueryIPOQuotaInfo) + sleep(1) + + #请求查询今日可转债申购信息列表 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryBondIPOInfoList = api.queryBondIPOInfoList(session_id, reqid) + printFuncName('queryBondIPOInfoList', retQueryBondIPOInfoList) + if retQueryBondIPOInfoList != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + sleep(1) + + #请求查询可转债转股的基本信息 + #@return 查询是否发送成功,“0”表示发送成功,非“0”表示发送出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的可转债转股信息的筛选条件,可以为NULL(为NULL表示查询所有的可转债转股信息),此参数中合约代码可以为空字符串,如果为空字符串,则查询所有可转债转股信息,如果不为空字符串,请不带空格,并以'\0'结尾,且必须与market匹配 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + queryBondSwapStockInfo = {} + queryBondSwapStockInfo['market'] = 2 + #queryBondSwapStockInfo['ticker'] = '113641' + reqid += 1 + retQueryBondSwapStockInfo = api.queryBondSwapStockInfo(queryBondSwapStockInfo, session_id, reqid) + printFuncName('queryBondSwapStockInfo', retQueryBondSwapStockInfo) + if retQueryBondSwapStockInfo != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + sleep(1) + + #请求查询期权合约 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的期权合约的筛选条件,可以为NULL(为NULL表示查询所有的期权合约) + #@param session_id 资金账户对应的session,登录时得到 + #@param reqid 用于用户定位查询响应的ID,由用户自定义 + queryOptionAuctionInfo = {} + queryOptionAuctionInfo['ticker'] = '10000001' + queryOptionAuctionInfo['market'] = 2 + reqid += 1 + retQueryOptionAuctionInfo = api.queryOptionAuctionInfo(queryOptionAuctionInfo,session_id, reqid) + printFuncName('queryOptionAuctionInfo',retQueryOptionAuctionInfo) + + #融资融券业务中现金直接还款请求 + #@return 现金直接还款订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的serial_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + #@param amount 现金还款的金额 + #@param session_id 资金账户对应的session_id,登录时得到 + retCreditCashRepay = api.creditCashRepay(500.5,session_id) + printFuncName('creditCashRepay',retCreditCashRepay) + + #请求查询信用账户特有信息,除资金账户以外的信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryCreditCashRepayInfo = api.queryCreditCashRepayInfo(session_id, reqid) + printFuncName('queryCreditCashRepayInfo',retQueryCreditCashRepayInfo) + + #请求查询信用账户特有信息,除资金账户以外的信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryCreditFundInfo = api.queryCreditFundInfo(session_id, reqid) + printFuncName('queryCreditFundInfo',retQueryCreditFundInfo) + + #请求查询信用账户负债合约信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryCreditDebtInfo = api.queryCreditDebtInfo(session_id, reqid) + printFuncName('queryCreditDebtInfo',retQueryCreditDebtInfo) + + #请求查询指定证券负债未还信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的指定证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + queryCreditTickerDebtInfo = {} + queryCreditTickerDebtInfo['ticker'] = '000623' + queryCreditTickerDebtInfo['market'] = 2 + reqid += 1 + retQueryCreditTickerDebtInfo = api.queryCreditTickerDebtInfo(queryCreditTickerDebtInfo,session_id, reqid) + printFuncName('queryCreditTickerDebtInfo',retQueryCreditTickerDebtInfo) + + #请求查询信用账户待还资金信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryCreditAssetDebtInfo = api.queryCreditAssetDebtInfo(session_id, reqid) + printFuncName('queryCreditAssetDebtInfo',retQueryCreditAssetDebtInfo) + + #请求查询信用账户可融券头寸信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + queryCreditTickerAssignInfo = {} + queryCreditTickerAssignInfo['ticker'] = '000623' + queryCreditTickerAssignInfo['market'] = 2 + reqid += 1 + retQueryCreditTickerAssignInfo = api.queryCreditTickerAssignInfo(queryCreditTickerAssignInfo,session_id, reqid) + printFuncName('queryCreditTickerAssignInfo',retQueryCreditTickerAssignInfo) + + #融资融券业务中请求查询指定证券的余券 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的余券信息,不可以为空,需要明确指定 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法中用户必须提供了证券代码和所在市场 + queryCreditExcessStock = {} + queryCreditExcessStock['ticker'] = '000623' + queryCreditExcessStock['market'] = 2 + reqid += 1 + retQueryCreditExcessStock = api.queryCreditExcessStock(queryCreditExcessStock,session_id, reqid) + printFuncName('queryCreditExcessStock',retQueryCreditExcessStock) + + #融资融券业务中请求查询余券 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的余券信息,不可以为空,需要明确指定 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法中用户必须提供了证券代码和所在市场 + queryMulCreditExcessStock = {} + queryMulCreditExcessStock['ticker'] = '000623' + queryMulCreditExcessStock['market'] = 2 + reqid += 1 + retQueryMulCreditExcessStock = api.queryMulCreditExcessStock(queryMulCreditExcessStock,session_id, reqid) + printFuncName('queryMulCreditExcessStock',retQueryMulCreditExcessStock) + + #融资融券业务中请求负债合约展期 + #@return 负债合约展期订单在XTP系统中的ID,如果为‘0’表示消息发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示消息发送成功,用户需要记录下返回的xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + #@param debt_extend 负债合约展期的请求信息 + #@param session_id 资金账户对应的session_id,登录时得到 + queryCreditExtendDebtDate = {} + queryCreditExtendDebtDate['xtpid'] = 10 + queryCreditExtendDebtDate['debt_id'] = '2000' + queryCreditExtendDebtDate['defer_days'] = 2 + queryCreditExtendDebtDate['fund_account'] = '1111111111' + queryCreditExtendDebtDate['password'] = '1111111111' + reqid += 1 + retCreditExtendDebtDate = api.creditExtendDebtDate(queryCreditExtendDebtDate,session_id) + printFuncName('creditExtendDebtDate',retCreditExtendDebtDate) + + #融资融券业务中请求查询负债合约展期 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param xtp_id 需要查询的负债合约展期订单筛选条件,xtp_id可以为0,则默认所有负债合约展期订单,如果不为0,则请求特定的负债合约展期订单 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + retQueryCreditExtendDebtDateOrders = api.queryCreditExtendDebtDateOrders(36989101307593706,session_id, reqid) + printFuncName('queryCreditExtendDebtDateOrders',retQueryCreditExtendDebtDateOrders) + + #请求查询融资融券业务中账戶的附加信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + retQueryCreditFundExtraInfo = api.queryCreditFundExtraInfo(session_id, reqid) + printFuncName('queryCreditFundExtraInfo',retQueryCreditFundExtraInfo) + + #请求查询融资融券业务中账戶指定证券的附加信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要指定的证券,筛选条件中ticker可以全填0,如果不为0,请不带空格,并以'\0'结尾 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + queryQueryCreditPositionExtraInfo = {} + queryQueryCreditPositionExtraInfo['market'] = 2 + queryQueryCreditPositionExtraInfo['ticker'] = '600123' + reqid += 1 + retQueryCreditPositionExtraInfo = api.queryCreditPositionExtraInfo(queryCreditExtendDebtDate,session_id, reqid) + printFuncName('queryCreditPositionExtraInfo',retQueryCreditPositionExtraInfo) + + + #期权组合策略报单录入请求 + #@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()中返回报单未成交的状态,之后所有的订单状态改变(除了部成状态)都会通过报单响应函数返回 + IOCO_Req = { + 'side': 31, + 'market': 2, + 'business_type': 13, + 'quantity': 1, + 'opt_comb_info': { + 'strategy_id': 'CNSJC', + 'comb_num': '', + 'num_legs': 2, + 'leg_detail': [{'leg_security_id': '10001025'}, {'leg_security_id': '10001026'}] + } + } + insertOptionCombinedOrder_id = api.insertOptionCombinedOrder(IOCO_Req, session_id) + printFuncName('insertOptionCombinedOrder', insertOptionCombinedOrder_id) + sleep(1) + + + #期权组合策略报单撤单请求 + #@return 撤单在XTP系统中的ID,如果为‘0’表示撤单发送失败,此时用户可以调用GetApiLastError()来获取错误代码,非“0”表示撤单发送成功,用户需要记录下返回的order_cancel_xtp_id,它保证一个交易日内唯一,不同的交易日不保证唯一性 + #@param order_xtp_id 需要撤销的期权组合策略委托单在XTP系统中的ID + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 如果撤单成功,会在报单响应函数OnOptionCombinedOrderEvent()里返回原单部撤或者全撤的消息,如果不成功,会在OnCancelOrderError()响应函数中返回错误原因 + cancelOptionCombinedOrder = api.cancelOptionCombinedOrder(insertOptionCombinedOrder_id,session_id) + printFuncName('cancelOptionCombinedOrder',cancelOptionCombinedOrder) + + #请求查询期权组合策略未完结报单 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + queryOptionCombinedUnfinishedOrders = api.queryOptionCombinedUnfinishedOrders(session_id, reqid) + printFuncName('queryOptionCombinedUnfinishedOrders',queryOptionCombinedUnfinishedOrders) + + + #根据报单ID请求查询期权组合策略报单-旧版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + queryOptionCombinedOrderByXTPID = api.queryOptionCombinedOrderByXTPID(insertOptionCombinedOrder_id,session_id, reqid) + printFuncName('queryOptionCombinedOrderByXTPID',queryOptionCombinedOrderByXTPID) + + #请求查询期权组合策略报单-旧版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + query_option_combined_orders_req = { + #'comb_num':'', + #'begin_time': 0, + #'end_time': 0 + } + reqid += 1 + queryOptionCombinedOrders = api.queryOptionCombinedOrders(query_option_combined_orders_req,session_id, reqid) + printFuncName('queryOptionCombinedOrders',queryOptionCombinedOrders) + + #分页请求查询期权组合策略报单-旧版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + query_option_combine_orders_by_page_req = { + 'req_count':100, + 'reference':0, + 'reserved':1 + } + reqid += 1 + queryOptionCombinedOrdersByPage = api.queryOptionCombinedOrdersByPage(query_option_combine_orders_by_page_req,session_id, reqid) + printFuncName('queryOptionCombinedOrdersByPage',queryOptionCombinedOrdersByPage) + + + #根据报单ID请求查询期权组合策略报单-新版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param order_xtp_id 需要查询的报单在xtp系统中的ID,即InsertOrder()成功时返回的order_xtp_id + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + queryOptionCombinedOrderByXTPID = api.queryOptionCombinedOrderByXTPIDEx(insertOptionCombinedOrder_id,session_id, reqid) + printFuncName('queryOptionCombinedOrderByXTPIDEx',queryOptionCombinedOrderByXTPID) + + #请求查询期权组合策略报单-新版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的订单相关筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有报单,否则查询时间段内所有跟股票代码相关的报单,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + query_option_combined_orders_req = { + 'comb_num':'', + 'begin_time': 0, + 'end_time': 0 + } + reqid += 1 + queryOptionCombinedOrders = api.queryOptionCombinedOrdersEx(query_option_combined_orders_req,session_id, reqid) + printFuncName('queryOptionCombinedOrdersEx',queryOptionCombinedOrders) + + #分页请求查询期权组合策略报单-新版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要分页查询订单的条件,如果第一次查询,那么query_param.reference填0 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + query_option_combine_orders_by_page_req = { + 'req_count':100, + 'reference':0, + 'reserved':1 + } + reqid += 1 + queryOptionCombinedOrdersByPage = api.queryOptionCombinedOrdersByPageEx(query_option_combine_orders_by_page_req,session_id, reqid) + printFuncName('queryOptionCombinedOrdersByPageEx',queryOptionCombinedOrdersByPage) + + #请求查询期权组合策略未完结报单-新版本接口 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + reqid += 1 + queryOptionCombinedUnfinishedOrders = api.queryOptionCombinedUnfinishedOrdersEx(session_id, reqid) + printFuncName('queryOptionCombinedUnfinishedOrdersEx',queryOptionCombinedUnfinishedOrders) + + + #根据期权组合策略委托编号请求查询相关成交 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param order_xtp_id 需要查询的委托编号,即InsertOrder()成功时返回的order_xtp_id + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 此函数查询出的结果可能对应多个查询结果响应 + reqid += 1 + queryOptionCombinedTradesByXTPID = api.queryOptionCombinedTradesByXTPID(insertOptionCombinedOrder_id,session_id, reqid) + printFuncName('queryOptionCombinedTradesByXTPID',queryOptionCombinedTradesByXTPID) + + #请求查询期权组合策略的成交回报 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的成交回报筛选条件,其中合约代码可以为空,则默认所有存在的合约代码,如果不为空,请不带空格,并以'\0'结尾,其中起始时间格式为YYYYMMDDHHMMSSsss,为0则默认当前交易日0点,结束时间格式为YYYYMMDDHHMMSSsss,为0则默认当前时间 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分时段查询,如果股票代码为空,则默认查询时间段内的所有成交回报,否则查询时间段内所有跟股票代码相关的成交回报,此函数查询出的结果可能对应多个查询结果响应。此函数不建议轮询使用,当报单量过多时,容易造成用户线路拥堵,导致api断线 + query_option_combined_trades_req = { + 'comb_num': '', + 'begin_time': 0, + 'end_time': 0 + } + reqid += 1 + queryOptionCombinedTrades = api.queryOptionCombinedTrades(query_option_combined_trades_req,session_id, reqid) + printFuncName('queryOptionCombinedTrades',queryOptionCombinedTrades) + + #分页请求查询期权组合策略成交回报 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要分页查询成交回报的条件,如果第一次查询,那么reference填0 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法支持分页查询,注意用户需要记录下最后一笔查询结果的reference以便用户下次查询使用 + query_option_combine_trades_by_page_req = { + 'req_count': 100, + 'reference': 0, + 'reserved': 1 + } + reqid += 1 + queryOptionCombinedTradesByPage = api.queryOptionCombinedTradesByPage(query_option_combine_trades_by_page_req,session_id, reqid) + printFuncName('queryOptionCombinedTradesByPage',queryOptionCombinedTradesByPage) + + #请求查询投资者期权组合策略持仓 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询持仓的筛选条件,其中组合策略代码可以初始化为空,表示查询所有,如果不为空,请不带空格,并以'\0'结尾,注意需与market匹配,不匹配的话,可能导致查询不到所需的持仓 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法如果用户提供了合约代码,则会查询此合约的持仓信息(注意请指定market,如果market为0,可能会查询到2个市场的持仓,如果market为其他非有效值,则查询结果会返回找不到持仓),如果合约代码为空,则默认查询所有持仓信息。 + query_option_combined_position_req = { + 'comb_num': '', + 'market': 0 + } + reqid += 1 + queryOptionCombinedPosition = api.queryOptionCombinedPosition(query_option_combined_position_req,session_id, reqid) + printFuncName('queryOptionCombinedPosition',queryOptionCombinedPosition) + + #请求查询期权组合策略信息 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法仅支持精确查询,不支持模糊查询 + reqid += 1 + queryOptionCombinedStrategyInfo = api.queryOptionCombinedStrategyInfo(session_id, reqid) + printFuncName('queryOptionCombinedStrategyInfo',queryOptionCombinedStrategyInfo) + + #请求查询期权行权合并头寸 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 需要查询的行权合并的筛选条件,其中market为0会默认查询全市场,成分合约代码可以初始化为空,如果不为空,请不带空格,并以'\0'结尾,注意所有填写的条件都会进行匹配 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 该方法可能对应多条响应消息 + query_option_combined_exec_position_req = { + 'cntrt_code_1': '', + 'cntrt_code_2': '', + 'market': 0 + } + reqid += 1 + queryOptionCombinedExecPosition = api.queryOptionCombinedExecPosition(query_option_combined_exec_position_req,session_id, reqid) + printFuncName('queryOptionCombinedExecPosition',queryOptionCombinedExecPosition) + + #请求查询其他节点可用资金 + #@return 查询是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param query_param 查询时需要提供的信息 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + query_other_server_fund_req = { + 'fund_account': 'username', + 'password': 'password', + 'query_type': 1 + } + reqid += 1 + queryOtherServerFund = api.queryOtherServerFund(query_other_server_fund_req,session_id, reqid) + printFuncName('queryOtherServerFund',queryOtherServerFund) + + + algo_ip = '119.3.40.4' + algo_port = 8602 + algo_user = 'algo_user' + algo_password = 'algo_password' + algo_reqid = 0 + algo_local_ip = '10.25.171.32' + + #用户登录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只需调用一次,所有用户共用即可 + algo_session_id = api.loginALGO(algo_ip, algo_port, algo_user, algo_password, 1,algo_local_ip) + printFuncName('loginALGO', algo_session_id) + if algo_session_id != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('loginALGO-getApiLastError', retGetApiLastError) + sleep(1) + + #用户请求使用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 此函数为异步方式,一个用户只能拥有一个算法通道,如果之前已经建立,则无需重复建立,在使用算法前,请先建立算法通道 + reqid += 1 + aLGOUserEstablishChannel = api.aLGOUserEstablishChannel(ip,port,user,password,session_id) + printFuncName('aLGOUserEstablishChannel',aLGOUserEstablishChannel) + if aLGOUserEstablishChannel != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError-aLGOUserEstablishChannel', retGetApiLastError) + sleep(1) + + #algo业务中用户报算法单请求 + #@return 算法报单请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param strategy_type 需要创建的策略类型 + #@param client_strategy_id 用户自定义id,帮助用户定位 + #@param strategy_param 策略参数 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 仅能在用户建立算法通道后使用,算法单的异步通知得 + reqid += 1 + strategy_type = 5001 + strategy_param = '{"start_time": "09:30:00", "end_time": "14:57:00", "buy_side": "BUY", "sell_side": "SELL", "business_type": "CASH", "trade_list": [{"market": "SH", "ticker": "600000", "quantity": 13000}]}' + client_strategy_id = 1001 + insertAlgoOrder = api.insertAlgoOrder(strategy_type,client_strategy_id,strategy_param,session_id) + printFuncName('insertAlgoOrder',insertAlgoOrder) + if insertAlgoOrder != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError-insertAlgoOrder', retGetApiLastError) + sleep(1) + + + #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时,其他条件才生效,此条请求可能对应多条回应消息 + reqid += 1 + xtp_strategy_id = 1743756787714 + queryStrategy = api.queryStrategy(0,0,xtp_strategy_id,session_id, reqid) + printFuncName('queryStrategy',queryStrategy) + sleep(1) + + #algo业务中用户撤销算法单请求 + #@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param cancel_flag 是否需要撤销的算法单已下的订单,true-撤单,false-不撤单 + #@param xtp_strategy_id 需要撤销的算法单在xtp algobus系统中的id + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 仅能在用户建立算法通道后调用 + reqid += 1 + xtp_strategy_id = 1894408323075 + cancelAlgoOrder = api.cancelAlgoOrder(0,xtp_strategy_id,session_id) + printFuncName('cancelAlgoOrder',cancelAlgoOrder) + if cancelAlgoOrder != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + sleep(1) + + #获取算法单的母单ID + #@return 返回算法单的母单ID,如果返回为0表示不是算法单 + #@param order_xtp_id 算法单对应的xtp id + #@param order_client_id 算法单对应的自定义ID,不可随意填写 + #@remark 返回为0表示,不是算法单,如果传入的参数不对的话,可能会得不到正确结果,此函数调用不依赖于是否登录 + reqid += 1 + order_xtp_id = 54490310482330601 + order_client_id = 65538 + getAlgorithmIDByOrder = api.getAlgorithmIDByOrder(order_xtp_id,order_client_id) + printFuncName('getAlgorithmIDByOrder',getAlgorithmIDByOrder) + + sleep(1) + #algo业务中请求推荐算法 + #@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param basket_flag 是否将满足条件的推荐结果打包成母单篮的标志,true-打包 + #@param basket_param 需要算法推荐的证券列表,为json字串,具体格式参考说明文档或咨询运营人员 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 此条请求可能对应多条回应消息,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + reqid += 1 + basket_flag = True + #有回调的算法推荐 + basket_param = "{\"symbol_list\": [{\"ticker\": \"000001\", \"market\": \"SZ\", \"strategy_category\": \"ALGO\", \"quantity\": 10000, \"side\": \"BUY\"}]}" + #无回调的算法推荐 + #basket_param = "{\"symbol_list\": [{\"ticker\": \"000001\", \"market\": \"SZ\", \"strategy_category\": \"T0\", \"quantity\": 10000}]}" + strategyRecommendation = api.strategyRecommendation(basket_flag, basket_param, session_id, reqid) + printFuncName('strategyRecommendation', strategyRecommendation) + + sleep(1) + #algo业务中修改已有的算法单 + #@return 算法单修改请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param xtp_strategy_id xtp算法单策略ID + #@param strategy_param 修改后的策略参数 + #@param session_id 资金账户对应的session_id,登录时得到 + #@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + reqid += 1 + xtp_strategy_id = 1894408323073 + strategy_param = "{\"start_time\": \"09:30:00\", \"end_time\": \"14:55:00\", \"buy_side\": \"BUY\", \"sell_side\": \"SELL\", \"business_type\": \"CASH\", \"trade_list\": [{\"market\": \"SH\", \"ticker\": \"600000\", \"quantity\": 3000}]}" + modifyAlgoOrder = api.modifyAlgoOrder(xtp_strategy_id, strategy_param, session_id) + printFuncName('modifyAlgoOrder', modifyAlgoOrder) + if modifyAlgoOrder != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + + sleep(1) + #algo业务中暂停指定策略中指定证券的算法单请求 + #@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param xtp_strategy_id xtp算法单策略ID + #@param ticker_info 指定证券信息,可以为null,为null表示暂停指定策略中所有证券的算法单 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + reqid += 1 + xtp_strategy_id = 21894080577537 + pause_ticker_info = {} + pause_ticker_info['m_ticker'] = '002304' # 洋河股份 + pause_ticker_info['m_market'] = 1 # 深圳A股 + pauseAlgoOrder = api.pauseAlgoOrder(xtp_strategy_id, pause_ticker_info, session_id, reqid) + printFuncName('pauseAlgoOrder', pauseAlgoOrder) + if pauseAlgoOrder != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + + sleep(2) + #algo业务中重启指定策略中指定证券的算法单请求 + #@return 请求发送是否成功,“0”表示成功,非“0”表示出错,此时用户可以调用GetApiLastError()来获取错误代码 + #@param xtp_strategy_id xtp算法单策略ID + #@param ticker_info 指定证券信息,可以为null,为null表示重启指定策略中所有证券的算法单 + #@param session_id 资金账户对应的session_id,登录时得到 + #@param request_id 用于用户定位查询响应的ID,由用户自定义 + #@remark 仅能在用户建立算法通道后使用,此功能上线时间视服务器后台支持情况而定,具体以运营通知时间为准 + reqid += 1 + xtp_strategy_id = 21894080577537 + resume_ticker_info = {} + resume_ticker_info['m_ticker'] = '002304' # 洋河股份 + resume_ticker_info['m_market'] = 1 # 深圳A股 + resumeAlgoOrder = api.resumeAlgoOrder(xtp_strategy_id, resume_ticker_info, session_id, reqid) + printFuncName('resumeAlgoOrder', resumeAlgoOrder) + if resumeAlgoOrder != 0 : + retGetApiLastError = api.getApiLastError() + printFuncName('getApiLastError', retGetApiLastError) + + + #sleep为了删除接口对象前将回调数据输出,不sleep直接删除回调对象会自动析构,无法返回回调的数据 + sleep(5) + + #登出请求 + #@return 登出是否成功,“0”表示登出成功,“-1”表示登出失败 + #@param session_id 资金账户对应的session,登录时得到 + logout = api.logout(session_id) + printFuncName('logout:',logout ) + + #删除接口对象本身 + #@remark 不再使用本接口对象时,调用该函数删除接口对象 + #release = api.release() + #printFuncName('release', release) + + exit = api.exit() + printFuncName('exit', exit) + + + diff --git a/version.txt b/version.txt deleted file mode 100644 index 03f965c..0000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -1.1.19.2---1.2 diff --git "a/vs2015\350\277\220\350\241\214\345\272\223/vc_redist.x64.exe" "b/vs2015\350\277\220\350\241\214\345\272\223/vc_redist.x64.exe" new file mode 100644 index 0000000..048fda2 Binary files /dev/null and "b/vs2015\350\277\220\350\241\214\345\272\223/vc_redist.x64.exe" differ diff --git "a/vs2015\350\277\220\350\241\214\345\272\223/vc_redist.x86.exe" "b/vs2015\350\277\220\350\241\214\345\272\223/vc_redist.x86.exe" new file mode 100644 index 0000000..caea04a Binary files /dev/null and "b/vs2015\350\277\220\350\241\214\345\272\223/vc_redist.x86.exe" differ diff --git "a/vs2015\350\277\220\350\241\214\345\272\223/\350\257\264\346\230\216.txt" "b/vs2015\350\277\220\350\241\214\345\272\223/\350\257\264\346\230\216.txt" new file mode 100644 index 0000000..3d68729 --- /dev/null +++ "b/vs2015\350\277\220\350\241\214\345\272\223/\350\257\264\346\230\216.txt" @@ -0,0 +1,3 @@ +如果本地安装的vs2015及以上版本,是不需要安装vc_redist的。 +但如果本地安装的是较低的vs2010版本,则需要安装vc_redist,并且要根据python的位数选择对应的运行库,python是32位就选vcredist_x86.exe,64位选vcredist_x64.exe。 +vcredist下载地址请参考:https://www.microsoft.com/zh-cn/download/details.aspx?id=48145 \ No newline at end of file diff --git "a/\350\257\264\346\230\216.jpg" "b/\350\257\264\346\230\216.jpg" deleted file mode 100644 index 5e6cb40..0000000 Binary files "a/\350\257\264\346\230\216.jpg" and /dev/null differ pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy