diff --git a/.gitignore b/.gitignore index 775cbfd4..dc3e78ec 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,7 @@ Release/ *.zip # API的.con文件 -*.con \ No newline at end of file +*.con + +# visual studio +*.opensdf \ No newline at end of file diff --git a/vn.lts/pyscript/generate_td_functions.py b/vn.lts/pyscript/generate_td_functions.py index b9e43cc2..38e1b458 100644 --- a/vn.lts/pyscript/generate_td_functions.py +++ b/vn.lts/pyscript/generate_td_functions.py @@ -34,7 +34,66 @@ def processCallBack(line): createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine) createProcess(cbName, cbArgsTypeList, cbArgsValueList) + + # 生成.h文件中的process部分 + process_line = 'void process' + cbName[2:] + '(Task task);\n' + fheaderprocess.write(process_line) + fheaderprocess.write('\n') + # 生成.h文件中的on部分 + if 'OnRspError' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last) {};\n' + elif 'OnRsp' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last) {};\n' + elif 'OnRtn' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict data) {};\n' + elif 'OnErrRtn' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error) {};\n' + else: + on_line = '' + fheaderon.write(on_line) + fheaderon.write('\n') + + # 生成封装部分 + createWrap(cbName) + + +#---------------------------------------------------------------------- +def createWrap(cbName): + """在Python封装段代码中进行处理""" + # 生成.h文件中的on部分 + if 'OnRspError' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict error, int id, bool last)\n' + override_line = '("on' + cbName[2:] + '")(error, id, last);\n' + elif 'OnRsp' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error, int id, bool last)\n' + override_line = '("on' + cbName[2:] + '")(data, error, id, last);\n' + elif 'OnRtn' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict data)\n' + override_line = '("on' + cbName[2:] + '")(data);\n' + elif 'OnErrRtn' in cbName: + on_line = 'virtual void on' + cbName[2:] + '(dict data, dict error)\n' + override_line = '("on' + cbName[2:] + '")(data, error);\n' + else: + on_line = '' + + if on_line is not '': + fwrap.write(on_line) + fwrap.write('{\n') + fwrap.write('\t PyLock lock;\n') + fwrap.write('\n') + fwrap.write('\ttry\n') + fwrap.write('\t{\n') + fwrap.write('\t\tthis->get_override'+override_line) + fwrap.write('\t}\n') + fwrap.write('\tcatch (error_already_set const &)\n') + fwrap.write('\t{\n') + fwrap.write('\t\tPyErr_Print();\n') + fwrap.write('\t}\n') + fwrap.write('};\n') + fwrap.write('\n') + + def createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine): # 从回调函数生成任务对象,并放入队列 @@ -66,6 +125,7 @@ def createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine): elif type_ == 'bool': ftask.write("\ttask.task_last = " + cbArgsValueList[i] + ";\n") elif 'RspInfoField' in type_: + ftask.write("\n") ftask.write("\tif (pRspInfo)\n") ftask.write("\t{\n") ftask.write("\t\ttask.task_error = " + cbArgsValueList[i] + ";\n") @@ -77,7 +137,17 @@ def createTask(cbName, cbArgsTypeList, cbArgsValueList, orignalLine): ftask.write("\t\ttask.task_error = empty_error;\n") ftask.write("\t}\n") else: - ftask.write("\ttask.task_data = " + cbArgsValueList[i] + ";\n") + ftask.write("\n") + ftask.write("\tif (" + cbArgsValueList[i][1:] + ")\n") + ftask.write("\t{\n") + ftask.write("\t\ttask.task_data = " + cbArgsValueList[i] + ";\n") + ftask.write("\t}\n") + ftask.write("\telse\n") + ftask.write("\t{\n") + ftask.write("\t\t" + type_ + " empty_data = " + type_ + "();\n") + ftask.write("\t\tmemset(&empty_data, 0, sizeof(empty_data));\n") + ftask.write("\t\ttask.task_data = empty_data;\n") + ftask.write("\t}\n") ftask.write("\tthis->task_queue.push(task);\n") ftask.write("};\n") @@ -152,13 +222,19 @@ def processFunction(line): if len(fcArgsTypeList)>0 and fcArgsTypeList[0] in structDict: createFunction(fcName, fcArgsTypeList, fcArgsValueList) + + # 生成.h文件中的主动函数部分 + if 'Req' in fcName: + req_line = 'int req' + fcName[3:] + '(dict req, int nRequestID);\n' + fheaderfunction.write(req_line) + fheaderfunction.write('\n') def createFunction(fcName, fcArgsTypeList, fcArgsValueList): type_ = fcArgsTypeList[0] struct = structDict[type_] - ffunction.write(fcName + '\n') + ffunction.write('int TdApi::req' + fcName[3:] + '(dict req, int nRequestID)\n') ffunction.write('{\n') ffunction.write('\t' + type_ +' myreq = ' + type_ + '();\n') ffunction.write('\tmemset(&myreq, 0, sizeof(myreq));\n') @@ -190,6 +266,10 @@ fprocess = open('lts_td_process.cpp', 'w') ffunction = open('lts_td_function.cpp', 'w') fdefine = open('lts_td_define.cpp', 'w') fswitch = open('lts_td_switch.cpp', 'w') +fheaderprocess = open('lts_td_header_process.h', 'w') +fheaderon = open('lts_td_header_on.h', 'w') +fheaderfunction = open('lts_td_header_function.h', 'w') +fwrap = open('lts_td_wrap.cpp', 'w') define_count = 1 @@ -204,4 +284,8 @@ ftask.close() fprocess.close() ffunction.close() fswitch.close() -fdefine.close() \ No newline at end of file +fdefine.close() +fheaderprocess.close() +fheaderon.close() +fheaderfunction.close() +fwrap.close() \ No newline at end of file diff --git a/vn.lts/pyscript/lts_td_function.cpp b/vn.lts/pyscript/lts_td_function.cpp index 665fcd11..c5163938 100644 --- a/vn.lts/pyscript/lts_td_function.cpp +++ b/vn.lts/pyscript/lts_td_function.cpp @@ -1,4 +1,4 @@ -ReqUserLogin +int TdApi::reqUserLogin(dict req, int nRequestID) { CSecurityFtdcReqUserLoginField myreq = CSecurityFtdcReqUserLoginField(); memset(&myreq, 0, sizeof(myreq)); @@ -17,7 +17,7 @@ ReqUserLogin return i; }; -ReqUserLogout +int TdApi::reqUserLogout(dict req, int nRequestID) { CSecurityFtdcUserLogoutField myreq = CSecurityFtdcUserLogoutField(); memset(&myreq, 0, sizeof(myreq)); @@ -27,7 +27,7 @@ ReqUserLogout return i; }; -ReqOrderInsert +int TdApi::reqOrderInsert(dict req, int nRequestID) { CSecurityFtdcInputOrderField myreq = CSecurityFtdcInputOrderField(); memset(&myreq, 0, sizeof(myreq)); @@ -58,7 +58,7 @@ ReqOrderInsert return i; }; -ReqOrderAction +int TdApi::reqOrderAction(dict req, int nRequestID) { CSecurityFtdcInputOrderActionField myreq = CSecurityFtdcInputOrderActionField(); memset(&myreq, 0, sizeof(myreq)); @@ -81,7 +81,7 @@ ReqOrderAction return i; }; -ReqUserPasswordUpdate +int TdApi::reqUserPasswordUpdate(dict req, int nRequestID) { CSecurityFtdcUserPasswordUpdateField myreq = CSecurityFtdcUserPasswordUpdateField(); memset(&myreq, 0, sizeof(myreq)); @@ -93,7 +93,7 @@ ReqUserPasswordUpdate return i; }; -ReqTradingAccountPasswordUpdate +int TdApi::reqTradingAccountPasswordUpdate(dict req, int nRequestID) { CSecurityFtdcTradingAccountPasswordUpdateField myreq = CSecurityFtdcTradingAccountPasswordUpdateField(); memset(&myreq, 0, sizeof(myreq)); @@ -105,7 +105,7 @@ ReqTradingAccountPasswordUpdate return i; }; -ReqQryExchange +int TdApi::reqQryExchange(dict req, int nRequestID) { CSecurityFtdcQryExchangeField myreq = CSecurityFtdcQryExchangeField(); memset(&myreq, 0, sizeof(myreq)); @@ -114,7 +114,7 @@ ReqQryExchange return i; }; -ReqQryInstrument +int TdApi::reqQryInstrument(dict req, int nRequestID) { CSecurityFtdcQryInstrumentField myreq = CSecurityFtdcQryInstrumentField(); memset(&myreq, 0, sizeof(myreq)); @@ -126,7 +126,7 @@ ReqQryInstrument return i; }; -ReqQryInvestor +int TdApi::reqQryInvestor(dict req, int nRequestID) { CSecurityFtdcQryInvestorField myreq = CSecurityFtdcQryInvestorField(); memset(&myreq, 0, sizeof(myreq)); @@ -136,7 +136,7 @@ ReqQryInvestor return i; }; -ReqQryTradingCode +int TdApi::reqQryTradingCode(dict req, int nRequestID) { CSecurityFtdcQryTradingCodeField myreq = CSecurityFtdcQryTradingCodeField(); memset(&myreq, 0, sizeof(myreq)); @@ -148,7 +148,7 @@ ReqQryTradingCode return i; }; -ReqQryTradingAccount +int TdApi::reqQryTradingAccount(dict req, int nRequestID) { CSecurityFtdcQryTradingAccountField myreq = CSecurityFtdcQryTradingAccountField(); memset(&myreq, 0, sizeof(myreq)); @@ -158,7 +158,7 @@ ReqQryTradingAccount return i; }; -ReqQryDepthMarketData +int TdApi::reqQryDepthMarketData(dict req, int nRequestID) { CSecurityFtdcQryDepthMarketDataField myreq = CSecurityFtdcQryDepthMarketDataField(); memset(&myreq, 0, sizeof(myreq)); @@ -167,7 +167,7 @@ ReqQryDepthMarketData return i; }; -ReqQryBondInterest +int TdApi::reqQryBondInterest(dict req, int nRequestID) { CSecurityFtdcQryBondInterestField myreq = CSecurityFtdcQryBondInterestField(); memset(&myreq, 0, sizeof(myreq)); @@ -177,7 +177,7 @@ ReqQryBondInterest return i; }; -ReqQryMarketRationInfo +int TdApi::reqQryMarketRationInfo(dict req, int nRequestID) { CSecurityFtdcQryMarketRationInfoField myreq = CSecurityFtdcQryMarketRationInfoField(); memset(&myreq, 0, sizeof(myreq)); @@ -188,7 +188,7 @@ ReqQryMarketRationInfo return i; }; -ReqQryInstrumentCommissionRate +int TdApi::reqQryInstrumentCommissionRate(dict req, int nRequestID) { CSecurityFtdcQryInstrumentCommissionRateField myreq = CSecurityFtdcQryInstrumentCommissionRateField(); memset(&myreq, 0, sizeof(myreq)); @@ -202,7 +202,7 @@ ReqQryInstrumentCommissionRate return i; }; -ReqQryETFInstrument +int TdApi::reqQryETFInstrument(dict req, int nRequestID) { CSecurityFtdcQryETFInstrumentField myreq = CSecurityFtdcQryETFInstrumentField(); memset(&myreq, 0, sizeof(myreq)); @@ -212,7 +212,7 @@ ReqQryETFInstrument return i; }; -ReqQryETFBasket +int TdApi::reqQryETFBasket(dict req, int nRequestID) { CSecurityFtdcQryETFBasketField myreq = CSecurityFtdcQryETFBasketField(); memset(&myreq, 0, sizeof(myreq)); @@ -222,7 +222,7 @@ ReqQryETFBasket return i; }; -ReqQryOFInstrument +int TdApi::reqQryOFInstrument(dict req, int nRequestID) { CSecurityFtdcQryOFInstrumentField myreq = CSecurityFtdcQryOFInstrumentField(); memset(&myreq, 0, sizeof(myreq)); @@ -232,7 +232,7 @@ ReqQryOFInstrument return i; }; -ReqQrySFInstrument +int TdApi::reqQrySFInstrument(dict req, int nRequestID) { CSecurityFtdcQrySFInstrumentField myreq = CSecurityFtdcQrySFInstrumentField(); memset(&myreq, 0, sizeof(myreq)); @@ -242,7 +242,7 @@ ReqQrySFInstrument return i; }; -ReqQryOrder +int TdApi::reqQryOrder(dict req, int nRequestID) { CSecurityFtdcQryOrderField myreq = CSecurityFtdcQryOrderField(); memset(&myreq, 0, sizeof(myreq)); @@ -257,7 +257,7 @@ ReqQryOrder return i; }; -ReqQryTrade +int TdApi::reqQryTrade(dict req, int nRequestID) { CSecurityFtdcQryTradeField myreq = CSecurityFtdcQryTradeField(); memset(&myreq, 0, sizeof(myreq)); @@ -272,7 +272,7 @@ ReqQryTrade return i; }; -ReqQryInvestorPosition +int TdApi::reqQryInvestorPosition(dict req, int nRequestID) { CSecurityFtdcQryInvestorPositionField myreq = CSecurityFtdcQryInvestorPositionField(); memset(&myreq, 0, sizeof(myreq)); @@ -283,7 +283,7 @@ ReqQryInvestorPosition return i; }; -ReqFundOutByLiber +int TdApi::reqFundOutByLiber(dict req, int nRequestID) { CSecurityFtdcInputFundTransferField myreq = CSecurityFtdcInputFundTransferField(); memset(&myreq, 0, sizeof(myreq)); @@ -299,7 +299,7 @@ ReqFundOutByLiber return i; }; -ReqQryFundTransferSerial +int TdApi::reqQryFundTransferSerial(dict req, int nRequestID) { CSecurityFtdcQryFundTransferSerialField myreq = CSecurityFtdcQryFundTransferSerialField(); memset(&myreq, 0, sizeof(myreq)); @@ -310,7 +310,7 @@ ReqQryFundTransferSerial return i; }; -ReqFundInterTransfer +int TdApi::reqFundInterTransfer(dict req, int nRequestID) { CSecurityFtdcFundInterTransferField myreq = CSecurityFtdcFundInterTransferField(); memset(&myreq, 0, sizeof(myreq)); @@ -326,7 +326,7 @@ ReqFundInterTransfer return i; }; -ReqQryFundInterTransferSerial +int TdApi::reqQryFundInterTransferSerial(dict req, int nRequestID) { CSecurityFtdcQryFundInterTransferSerialField myreq = CSecurityFtdcQryFundInterTransferSerialField(); memset(&myreq, 0, sizeof(myreq)); diff --git a/vn.lts/pyscript/lts_td_header_function.h b/vn.lts/pyscript/lts_td_header_function.h new file mode 100644 index 00000000..089f73da --- /dev/null +++ b/vn.lts/pyscript/lts_td_header_function.h @@ -0,0 +1,52 @@ +int reqUserLogin(dict req, int nRequestID); + +int reqUserLogout(dict req, int nRequestID); + +int reqOrderInsert(dict req, int nRequestID); + +int reqOrderAction(dict req, int nRequestID); + +int reqUserPasswordUpdate(dict req, int nRequestID); + +int reqTradingAccountPasswordUpdate(dict req, int nRequestID); + +int reqQryExchange(dict req, int nRequestID); + +int reqQryInstrument(dict req, int nRequestID); + +int reqQryInvestor(dict req, int nRequestID); + +int reqQryTradingCode(dict req, int nRequestID); + +int reqQryTradingAccount(dict req, int nRequestID); + +int reqQryDepthMarketData(dict req, int nRequestID); + +int reqQryBondInterest(dict req, int nRequestID); + +int reqQryMarketRationInfo(dict req, int nRequestID); + +int reqQryInstrumentCommissionRate(dict req, int nRequestID); + +int reqQryETFInstrument(dict req, int nRequestID); + +int reqQryETFBasket(dict req, int nRequestID); + +int reqQryOFInstrument(dict req, int nRequestID); + +int reqQrySFInstrument(dict req, int nRequestID); + +int reqQryOrder(dict req, int nRequestID); + +int reqQryTrade(dict req, int nRequestID); + +int reqQryInvestorPosition(dict req, int nRequestID); + +int reqFundOutByLiber(dict req, int nRequestID); + +int reqQryFundTransferSerial(dict req, int nRequestID); + +int reqFundInterTransfer(dict req, int nRequestID); + +int reqQryFundInterTransferSerial(dict req, int nRequestID); + diff --git a/vn.lts/pyscript/lts_td_header_on.h b/vn.lts/pyscript/lts_td_header_on.h new file mode 100644 index 00000000..ba040bf7 --- /dev/null +++ b/vn.lts/pyscript/lts_td_header_on.h @@ -0,0 +1,75 @@ + + + +virtual void onRspError(dict error, int id, bool last) {}; + +virtual void onRspUserLogin(dict data, dict error, int id, bool last) {}; + +virtual void onRspUserLogout(dict data, dict error, int id, bool last) {}; + +virtual void onRspOrderInsert(dict data, dict error, int id, bool last) {}; + +virtual void onRspOrderAction(dict data, dict error, int id, bool last) {}; + +virtual void onRspUserPasswordUpdate(dict data, dict error, int id, bool last) {}; + +virtual void onRspTradingAccountPasswordUpdate(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryExchange(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryInstrument(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryInvestor(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryTradingCode(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryTradingAccount(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryDepthMarketData(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryBondInterest(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryMarketRationInfo(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryInstrumentCommissionRate(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryETFInstrument(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryETFBasket(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryOFInstrument(dict data, dict error, int id, bool last) {}; + +virtual void onRspQrySFInstrument(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryOrder(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryTrade(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryInvestorPosition(dict data, dict error, int id, bool last) {}; + +virtual void onRtnOrder(dict data) {}; + +virtual void onRtnTrade(dict data) {}; + +virtual void onErrRtnOrderInsert(dict data, dict error) {}; + +virtual void onErrRtnOrderAction(dict data, dict error) {}; + +virtual void onRspFundOutByLiber(dict data, dict error, int id, bool last) {}; + +virtual void onRtnFundOutByLiber(dict data) {}; + +virtual void onErrRtnFundOutByLiber(dict data, dict error) {}; + +virtual void onRtnFundInByBank(dict data) {}; + +virtual void onRspQryFundTransferSerial(dict data, dict error, int id, bool last) {}; + +virtual void onRspFundInterTransfer(dict data, dict error, int id, bool last) {}; + +virtual void onRspQryFundInterTransferSerial(dict data, dict error, int id, bool last) {}; + +virtual void onRtnFundInterTransferSerial(dict data) {}; + +virtual void onErrRtnFundInterTransfer(dict data, dict error) {}; + diff --git a/vn.lts/pyscript/lts_td_header_process.h b/vn.lts/pyscript/lts_td_header_process.h new file mode 100644 index 00000000..07220fa3 --- /dev/null +++ b/vn.lts/pyscript/lts_td_header_process.h @@ -0,0 +1,78 @@ +void processFrontConnected(Task task); + +void processFrontDisconnected(Task task); + +void processHeartBeatWarning(Task task); + +void processRspError(Task task); + +void processRspUserLogin(Task task); + +void processRspUserLogout(Task task); + +void processRspOrderInsert(Task task); + +void processRspOrderAction(Task task); + +void processRspUserPasswordUpdate(Task task); + +void processRspTradingAccountPasswordUpdate(Task task); + +void processRspQryExchange(Task task); + +void processRspQryInstrument(Task task); + +void processRspQryInvestor(Task task); + +void processRspQryTradingCode(Task task); + +void processRspQryTradingAccount(Task task); + +void processRspQryDepthMarketData(Task task); + +void processRspQryBondInterest(Task task); + +void processRspQryMarketRationInfo(Task task); + +void processRspQryInstrumentCommissionRate(Task task); + +void processRspQryETFInstrument(Task task); + +void processRspQryETFBasket(Task task); + +void processRspQryOFInstrument(Task task); + +void processRspQrySFInstrument(Task task); + +void processRspQryOrder(Task task); + +void processRspQryTrade(Task task); + +void processRspQryInvestorPosition(Task task); + +void processRtnOrder(Task task); + +void processRtnTrade(Task task); + +void processErrRtnOrderInsert(Task task); + +void processErrRtnOrderAction(Task task); + +void processRspFundOutByLiber(Task task); + +void processRtnFundOutByLiber(Task task); + +void processErrRtnFundOutByLiber(Task task); + +void processRtnFundInByBank(Task task); + +void processRspQryFundTransferSerial(Task task); + +void processRspFundInterTransfer(Task task); + +void processRspQryFundInterTransferSerial(Task task); + +void processRtnFundInterTransferSerial(Task task); + +void processErrRtnFundInterTransfer(Task task); + diff --git a/vn.lts/pyscript/lts_td_task.cpp b/vn.lts/pyscript/lts_td_task.cpp index 1c670b5f..090c8d03 100644 --- a/vn.lts/pyscript/lts_td_task.cpp +++ b/vn.lts/pyscript/lts_td_task.cpp @@ -26,6 +26,7 @@ void TdApi::OnRspError(CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool { Task task = Task(); task.task_name = ONRSPERROR; + if (pRspInfo) { task.task_error = *pRspInfo; @@ -45,7 +46,18 @@ void TdApi::OnRspUserLogin(CSecurityFtdcRspUserLoginField *pRspUserLogin, CSecur { Task task = Task(); task.task_name = ONRSPUSERLOGIN; - task.task_data = *pRspUserLogin; + + if (pRspUserLogin) + { + task.task_data = *pRspUserLogin; + } + else + { + CSecurityFtdcRspUserLoginField empty_data = CSecurityFtdcRspUserLoginField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -65,7 +77,18 @@ void TdApi::OnRspUserLogout(CSecurityFtdcUserLogoutField *pUserLogout, CSecurity { Task task = Task(); task.task_name = ONRSPUSERLOGOUT; - task.task_data = *pUserLogout; + + if (pUserLogout) + { + task.task_data = *pUserLogout; + } + else + { + CSecurityFtdcUserLogoutField empty_data = CSecurityFtdcUserLogoutField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -85,7 +108,18 @@ void TdApi::OnRspOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecurit { Task task = Task(); task.task_name = ONRSPORDERINSERT; - task.task_data = *pInputOrder; + + if (pInputOrder) + { + task.task_data = *pInputOrder; + } + else + { + CSecurityFtdcInputOrderField empty_data = CSecurityFtdcInputOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -105,7 +139,18 @@ void TdApi::OnRspOrderAction(CSecurityFtdcInputOrderActionField *pInputOrderActi { Task task = Task(); task.task_name = ONRSPORDERACTION; - task.task_data = *pInputOrderAction; + + if (pInputOrderAction) + { + task.task_data = *pInputOrderAction; + } + else + { + CSecurityFtdcInputOrderActionField empty_data = CSecurityFtdcInputOrderActionField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -125,7 +170,18 @@ void TdApi::OnRspUserPasswordUpdate(CSecurityFtdcUserPasswordUpdateField *pUserP { Task task = Task(); task.task_name = ONRSPUSERPASSWORDUPDATE; - task.task_data = *pUserPasswordUpdate; + + if (pUserPasswordUpdate) + { + task.task_data = *pUserPasswordUpdate; + } + else + { + CSecurityFtdcUserPasswordUpdateField empty_data = CSecurityFtdcUserPasswordUpdateField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -145,7 +201,18 @@ void TdApi::OnRspTradingAccountPasswordUpdate(CSecurityFtdcTradingAccountPasswor { Task task = Task(); task.task_name = ONRSPTRADINGACCOUNTPASSWORDUPDATE; - task.task_data = *pTradingAccountPasswordUpdate; + + if (pTradingAccountPasswordUpdate) + { + task.task_data = *pTradingAccountPasswordUpdate; + } + else + { + CSecurityFtdcTradingAccountPasswordUpdateField empty_data = CSecurityFtdcTradingAccountPasswordUpdateField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -165,7 +232,18 @@ void TdApi::OnRspQryExchange(CSecurityFtdcExchangeField *pExchange, CSecurityFtd { Task task = Task(); task.task_name = ONRSPQRYEXCHANGE; - task.task_data = *pExchange; + + if (pExchange) + { + task.task_data = *pExchange; + } + else + { + CSecurityFtdcExchangeField empty_data = CSecurityFtdcExchangeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -185,7 +263,18 @@ void TdApi::OnRspQryInstrument(CSecurityFtdcInstrumentField *pInstrument, CSecur { Task task = Task(); task.task_name = ONRSPQRYINSTRUMENT; - task.task_data = *pInstrument; + + if (pInstrument) + { + task.task_data = *pInstrument; + } + else + { + CSecurityFtdcInstrumentField empty_data = CSecurityFtdcInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -205,7 +294,18 @@ void TdApi::OnRspQryInvestor(CSecurityFtdcInvestorField *pInvestor, CSecurityFtd { Task task = Task(); task.task_name = ONRSPQRYINVESTOR; - task.task_data = *pInvestor; + + if (pInvestor) + { + task.task_data = *pInvestor; + } + else + { + CSecurityFtdcInvestorField empty_data = CSecurityFtdcInvestorField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -225,7 +325,18 @@ void TdApi::OnRspQryTradingCode(CSecurityFtdcTradingCodeField *pTradingCode, CSe { Task task = Task(); task.task_name = ONRSPQRYTRADINGCODE; - task.task_data = *pTradingCode; + + if (pTradingCode) + { + task.task_data = *pTradingCode; + } + else + { + CSecurityFtdcTradingCodeField empty_data = CSecurityFtdcTradingCodeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -245,7 +356,18 @@ void TdApi::OnRspQryTradingAccount(CSecurityFtdcTradingAccountField *pTradingAcc { Task task = Task(); task.task_name = ONRSPQRYTRADINGACCOUNT; - task.task_data = *pTradingAccount; + + if (pTradingAccount) + { + task.task_data = *pTradingAccount; + } + else + { + CSecurityFtdcTradingAccountField empty_data = CSecurityFtdcTradingAccountField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -265,7 +387,18 @@ void TdApi::OnRspQryDepthMarketData(CSecurityFtdcDepthMarketDataField *pDepthMar { Task task = Task(); task.task_name = ONRSPQRYDEPTHMARKETDATA; - task.task_data = *pDepthMarketData; + + if (pDepthMarketData) + { + task.task_data = *pDepthMarketData; + } + else + { + CSecurityFtdcDepthMarketDataField empty_data = CSecurityFtdcDepthMarketDataField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -285,7 +418,18 @@ void TdApi::OnRspQryBondInterest(CSecurityFtdcBondInterestField *pBondInterest, { Task task = Task(); task.task_name = ONRSPQRYBONDINTEREST; - task.task_data = *pBondInterest; + + if (pBondInterest) + { + task.task_data = *pBondInterest; + } + else + { + CSecurityFtdcBondInterestField empty_data = CSecurityFtdcBondInterestField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -305,7 +449,18 @@ void TdApi::OnRspQryMarketRationInfo(CSecurityFtdcMarketRationInfoField *pMarket { Task task = Task(); task.task_name = ONRSPQRYMARKETRATIONINFO; - task.task_data = *pMarketRationInfo; + + if (pMarketRationInfo) + { + task.task_data = *pMarketRationInfo; + } + else + { + CSecurityFtdcMarketRationInfoField empty_data = CSecurityFtdcMarketRationInfoField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -325,7 +480,18 @@ void TdApi::OnRspQryInstrumentCommissionRate(CSecurityFtdcInstrumentCommissionRa { Task task = Task(); task.task_name = ONRSPQRYINSTRUMENTCOMMISSIONRATE; - task.task_data = *pInstrumentCommissionRate; + + if (pInstrumentCommissionRate) + { + task.task_data = *pInstrumentCommissionRate; + } + else + { + CSecurityFtdcInstrumentCommissionRateField empty_data = CSecurityFtdcInstrumentCommissionRateField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -345,7 +511,18 @@ void TdApi::OnRspQryETFInstrument(CSecurityFtdcETFInstrumentField *pETFInstrumen { Task task = Task(); task.task_name = ONRSPQRYETFINSTRUMENT; - task.task_data = *pETFInstrument; + + if (pETFInstrument) + { + task.task_data = *pETFInstrument; + } + else + { + CSecurityFtdcETFInstrumentField empty_data = CSecurityFtdcETFInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -365,7 +542,18 @@ void TdApi::OnRspQryETFBasket(CSecurityFtdcETFBasketField *pETFBasket, CSecurity { Task task = Task(); task.task_name = ONRSPQRYETFBASKET; - task.task_data = *pETFBasket; + + if (pETFBasket) + { + task.task_data = *pETFBasket; + } + else + { + CSecurityFtdcETFBasketField empty_data = CSecurityFtdcETFBasketField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -385,7 +573,18 @@ void TdApi::OnRspQryOFInstrument(CSecurityFtdcOFInstrumentField *pOFInstrument, { Task task = Task(); task.task_name = ONRSPQRYOFINSTRUMENT; - task.task_data = *pOFInstrument; + + if (pOFInstrument) + { + task.task_data = *pOFInstrument; + } + else + { + CSecurityFtdcOFInstrumentField empty_data = CSecurityFtdcOFInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -405,7 +604,18 @@ void TdApi::OnRspQrySFInstrument(CSecurityFtdcSFInstrumentField *pSFInstrument, { Task task = Task(); task.task_name = ONRSPQRYSFINSTRUMENT; - task.task_data = *pSFInstrument; + + if (pSFInstrument) + { + task.task_data = *pSFInstrument; + } + else + { + CSecurityFtdcSFInstrumentField empty_data = CSecurityFtdcSFInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -425,7 +635,18 @@ void TdApi::OnRspQryOrder(CSecurityFtdcOrderField *pOrder, CSecurityFtdcRspInfoF { Task task = Task(); task.task_name = ONRSPQRYORDER; - task.task_data = *pOrder; + + if (pOrder) + { + task.task_data = *pOrder; + } + else + { + CSecurityFtdcOrderField empty_data = CSecurityFtdcOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -445,7 +666,18 @@ void TdApi::OnRspQryTrade(CSecurityFtdcTradeField *pTrade, CSecurityFtdcRspInfoF { Task task = Task(); task.task_name = ONRSPQRYTRADE; - task.task_data = *pTrade; + + if (pTrade) + { + task.task_data = *pTrade; + } + else + { + CSecurityFtdcTradeField empty_data = CSecurityFtdcTradeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -465,7 +697,18 @@ void TdApi::OnRspQryInvestorPosition(CSecurityFtdcInvestorPositionField *pInvest { Task task = Task(); task.task_name = ONRSPQRYINVESTORPOSITION; - task.task_data = *pInvestorPosition; + + if (pInvestorPosition) + { + task.task_data = *pInvestorPosition; + } + else + { + CSecurityFtdcInvestorPositionField empty_data = CSecurityFtdcInvestorPositionField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -485,7 +728,17 @@ void TdApi::OnRtnOrder(CSecurityFtdcOrderField *pOrder) { Task task = Task(); task.task_name = ONRTNORDER; - task.task_data = *pOrder; + + if (pOrder) + { + task.task_data = *pOrder; + } + else + { + CSecurityFtdcOrderField empty_data = CSecurityFtdcOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -493,7 +746,17 @@ void TdApi::OnRtnTrade(CSecurityFtdcTradeField *pTrade) { Task task = Task(); task.task_name = ONRTNTRADE; - task.task_data = *pTrade; + + if (pTrade) + { + task.task_data = *pTrade; + } + else + { + CSecurityFtdcTradeField empty_data = CSecurityFtdcTradeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -501,7 +764,18 @@ void TdApi::OnErrRtnOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecu { Task task = Task(); task.task_name = ONERRRTNORDERINSERT; - task.task_data = *pInputOrder; + + if (pInputOrder) + { + task.task_data = *pInputOrder; + } + else + { + CSecurityFtdcInputOrderField empty_data = CSecurityFtdcInputOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -519,7 +793,18 @@ void TdApi::OnErrRtnOrderAction(CSecurityFtdcOrderActionField *pOrderAction, CSe { Task task = Task(); task.task_name = ONERRRTNORDERACTION; - task.task_data = *pOrderAction; + + if (pOrderAction) + { + task.task_data = *pOrderAction; + } + else + { + CSecurityFtdcOrderActionField empty_data = CSecurityFtdcOrderActionField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -537,7 +822,18 @@ void TdApi::OnRspFundOutByLiber(CSecurityFtdcInputFundTransferField *pInputFundT { Task task = Task(); task.task_name = ONRSPFUNDOUTBYLIBER; - task.task_data = *pInputFundTransfer; + + if (pInputFundTransfer) + { + task.task_data = *pInputFundTransfer; + } + else + { + CSecurityFtdcInputFundTransferField empty_data = CSecurityFtdcInputFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -557,7 +853,17 @@ void TdApi::OnRtnFundOutByLiber(CSecurityFtdcFundTransferField *pFundTransfer) { Task task = Task(); task.task_name = ONRTNFUNDOUTBYLIBER; - task.task_data = *pFundTransfer; + + if (pFundTransfer) + { + task.task_data = *pFundTransfer; + } + else + { + CSecurityFtdcFundTransferField empty_data = CSecurityFtdcFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -565,7 +871,18 @@ void TdApi::OnErrRtnFundOutByLiber(CSecurityFtdcInputFundTransferField *pInputFu { Task task = Task(); task.task_name = ONERRRTNFUNDOUTBYLIBER; - task.task_data = *pInputFundTransfer; + + if (pInputFundTransfer) + { + task.task_data = *pInputFundTransfer; + } + else + { + CSecurityFtdcInputFundTransferField empty_data = CSecurityFtdcInputFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -583,7 +900,17 @@ void TdApi::OnRtnFundInByBank(CSecurityFtdcFundTransferField *pFundTransfer) { Task task = Task(); task.task_name = ONRTNFUNDINBYBANK; - task.task_data = *pFundTransfer; + + if (pFundTransfer) + { + task.task_data = *pFundTransfer; + } + else + { + CSecurityFtdcFundTransferField empty_data = CSecurityFtdcFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -591,7 +918,18 @@ void TdApi::OnRspQryFundTransferSerial(CSecurityFtdcFundTransferField *pFundTran { Task task = Task(); task.task_name = ONRSPQRYFUNDTRANSFERSERIAL; - task.task_data = *pFundTransfer; + + if (pFundTransfer) + { + task.task_data = *pFundTransfer; + } + else + { + CSecurityFtdcFundTransferField empty_data = CSecurityFtdcFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -611,7 +949,18 @@ void TdApi::OnRspFundInterTransfer(CSecurityFtdcFundInterTransferField *pFundInt { Task task = Task(); task.task_name = ONRSPFUNDINTERTRANSFER; - task.task_data = *pFundInterTransfer; + + if (pFundInterTransfer) + { + task.task_data = *pFundInterTransfer; + } + else + { + CSecurityFtdcFundInterTransferField empty_data = CSecurityFtdcFundInterTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -631,7 +980,18 @@ void TdApi::OnRspQryFundInterTransferSerial(CSecurityFtdcFundInterTransferSerial { Task task = Task(); task.task_name = ONRSPQRYFUNDINTERTRANSFERSERIAL; - task.task_data = *pFundInterTransferSerial; + + if (pFundInterTransferSerial) + { + task.task_data = *pFundInterTransferSerial; + } + else + { + CSecurityFtdcFundInterTransferSerialField empty_data = CSecurityFtdcFundInterTransferSerialField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -651,7 +1011,17 @@ void TdApi::OnRtnFundInterTransferSerial(CSecurityFtdcFundInterTransferSerialFie { Task task = Task(); task.task_name = ONRTNFUNDINTERTRANSFERSERIAL; - task.task_data = *pFundInterTransferSerial; + + if (pFundInterTransferSerial) + { + task.task_data = *pFundInterTransferSerial; + } + else + { + CSecurityFtdcFundInterTransferSerialField empty_data = CSecurityFtdcFundInterTransferSerialField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -659,7 +1029,18 @@ void TdApi::OnErrRtnFundInterTransfer(CSecurityFtdcFundInterTransferField *pFund { Task task = Task(); task.task_name = ONERRRTNFUNDINTERTRANSFER; - task.task_data = *pFundInterTransfer; + + if (pFundInterTransfer) + { + task.task_data = *pFundInterTransfer; + } + else + { + CSecurityFtdcFundInterTransferField empty_data = CSecurityFtdcFundInterTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; diff --git a/vn.lts/pyscript/lts_td_wrap.cpp b/vn.lts/pyscript/lts_td_wrap.cpp new file mode 100644 index 00000000..952e2da8 --- /dev/null +++ b/vn.lts/pyscript/lts_td_wrap.cpp @@ -0,0 +1,504 @@ +virtual void onRspError(dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspError")(error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspUserLogin(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspUserLogin")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspUserLogout(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspUserLogout")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspOrderInsert(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspOrderInsert")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspOrderAction(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspOrderAction")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspUserPasswordUpdate(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspUserPasswordUpdate")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspTradingAccountPasswordUpdate(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspTradingAccountPasswordUpdate")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryExchange(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryExchange")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryInstrument(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryInstrument")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryInvestor(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryInvestor")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryTradingCode(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryTradingCode")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryTradingAccount(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryTradingAccount")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryDepthMarketData(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryDepthMarketData")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryBondInterest(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryBondInterest")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryMarketRationInfo(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryMarketRationInfo")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryInstrumentCommissionRate(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryInstrumentCommissionRate")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryETFInstrument(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryETFInstrument")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryETFBasket(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryETFBasket")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryOFInstrument(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryOFInstrument")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQrySFInstrument(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQrySFInstrument")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryOrder(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryOrder")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryTrade(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryTrade")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryInvestorPosition(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryInvestorPosition")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRtnOrder(dict data) +{ + PyLock lock; + + try + { + this->get_override("onRtnOrder")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRtnTrade(dict data) +{ + PyLock lock; + + try + { + this->get_override("onRtnTrade")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onErrRtnOrderInsert(dict data, dict error) +{ + PyLock lock; + + try + { + this->get_override("onErrRtnOrderInsert")(data, error); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onErrRtnOrderAction(dict data, dict error) +{ + PyLock lock; + + try + { + this->get_override("onErrRtnOrderAction")(data, error); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspFundOutByLiber(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspFundOutByLiber")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRtnFundOutByLiber(dict data) +{ + PyLock lock; + + try + { + this->get_override("onRtnFundOutByLiber")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onErrRtnFundOutByLiber(dict data, dict error) +{ + PyLock lock; + + try + { + this->get_override("onErrRtnFundOutByLiber")(data, error); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRtnFundInByBank(dict data) +{ + PyLock lock; + + try + { + this->get_override("onRtnFundInByBank")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryFundTransferSerial(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryFundTransferSerial")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspFundInterTransfer(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspFundInterTransfer")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRspQryFundInterTransferSerial(dict data, dict error, int id, bool last) +{ + PyLock lock; + + try + { + this->get_override("onRspQryFundInterTransferSerial")(data, error, id, last); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onRtnFundInterTransferSerial(dict data) +{ + PyLock lock; + + try + { + this->get_override("onRtnFundInterTransferSerial")(data); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + +virtual void onErrRtnFundInterTransfer(dict data, dict error) +{ + PyLock lock; + + try + { + this->get_override("onErrRtnFundInterTransfer")(data, error); + } + catch (error_already_set const &) + { + PyErr_Print(); + } +}; + diff --git a/vn.lts/vnltstd/pyltstd/vnltstd.cpp b/vn.lts/vnltstd/pyltstd/vnltstd.cpp index 99334d08..edaae992 100644 --- a/vn.lts/vnltstd/pyltstd/vnltstd.cpp +++ b/vn.lts/vnltstd/pyltstd/vnltstd.cpp @@ -86,6 +86,7 @@ void TdApi::OnRspError(CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool { Task task = Task(); task.task_name = ONRSPERROR; + if (pRspInfo) { task.task_error = *pRspInfo; @@ -105,7 +106,18 @@ void TdApi::OnRspUserLogin(CSecurityFtdcRspUserLoginField *pRspUserLogin, CSecur { Task task = Task(); task.task_name = ONRSPUSERLOGIN; - task.task_data = *pRspUserLogin; + + if (pRspUserLogin) + { + task.task_data = *pRspUserLogin; + } + else + { + CSecurityFtdcRspUserLoginField empty_data = CSecurityFtdcRspUserLoginField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -125,7 +137,18 @@ void TdApi::OnRspUserLogout(CSecurityFtdcUserLogoutField *pUserLogout, CSecurity { Task task = Task(); task.task_name = ONRSPUSERLOGOUT; - task.task_data = *pUserLogout; + + if (pUserLogout) + { + task.task_data = *pUserLogout; + } + else + { + CSecurityFtdcUserLogoutField empty_data = CSecurityFtdcUserLogoutField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -145,7 +168,18 @@ void TdApi::OnRspOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecurit { Task task = Task(); task.task_name = ONRSPORDERINSERT; - task.task_data = *pInputOrder; + + if (pInputOrder) + { + task.task_data = *pInputOrder; + } + else + { + CSecurityFtdcInputOrderField empty_data = CSecurityFtdcInputOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -165,7 +199,18 @@ void TdApi::OnRspOrderAction(CSecurityFtdcInputOrderActionField *pInputOrderActi { Task task = Task(); task.task_name = ONRSPORDERACTION; - task.task_data = *pInputOrderAction; + + if (pInputOrderAction) + { + task.task_data = *pInputOrderAction; + } + else + { + CSecurityFtdcInputOrderActionField empty_data = CSecurityFtdcInputOrderActionField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -185,7 +230,18 @@ void TdApi::OnRspUserPasswordUpdate(CSecurityFtdcUserPasswordUpdateField *pUserP { Task task = Task(); task.task_name = ONRSPUSERPASSWORDUPDATE; - task.task_data = *pUserPasswordUpdate; + + if (pUserPasswordUpdate) + { + task.task_data = *pUserPasswordUpdate; + } + else + { + CSecurityFtdcUserPasswordUpdateField empty_data = CSecurityFtdcUserPasswordUpdateField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -205,7 +261,18 @@ void TdApi::OnRspTradingAccountPasswordUpdate(CSecurityFtdcTradingAccountPasswor { Task task = Task(); task.task_name = ONRSPTRADINGACCOUNTPASSWORDUPDATE; - task.task_data = *pTradingAccountPasswordUpdate; + + if (pTradingAccountPasswordUpdate) + { + task.task_data = *pTradingAccountPasswordUpdate; + } + else + { + CSecurityFtdcTradingAccountPasswordUpdateField empty_data = CSecurityFtdcTradingAccountPasswordUpdateField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -225,7 +292,18 @@ void TdApi::OnRspQryExchange(CSecurityFtdcExchangeField *pExchange, CSecurityFtd { Task task = Task(); task.task_name = ONRSPQRYEXCHANGE; - task.task_data = *pExchange; + + if (pExchange) + { + task.task_data = *pExchange; + } + else + { + CSecurityFtdcExchangeField empty_data = CSecurityFtdcExchangeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -245,7 +323,18 @@ void TdApi::OnRspQryInstrument(CSecurityFtdcInstrumentField *pInstrument, CSecur { Task task = Task(); task.task_name = ONRSPQRYINSTRUMENT; - task.task_data = *pInstrument; + + if (pInstrument) + { + task.task_data = *pInstrument; + } + else + { + CSecurityFtdcInstrumentField empty_data = CSecurityFtdcInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -265,7 +354,18 @@ void TdApi::OnRspQryInvestor(CSecurityFtdcInvestorField *pInvestor, CSecurityFtd { Task task = Task(); task.task_name = ONRSPQRYINVESTOR; - task.task_data = *pInvestor; + + if (pInvestor) + { + task.task_data = *pInvestor; + } + else + { + CSecurityFtdcInvestorField empty_data = CSecurityFtdcInvestorField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -285,7 +385,18 @@ void TdApi::OnRspQryTradingCode(CSecurityFtdcTradingCodeField *pTradingCode, CSe { Task task = Task(); task.task_name = ONRSPQRYTRADINGCODE; - task.task_data = *pTradingCode; + + if (pTradingCode) + { + task.task_data = *pTradingCode; + } + else + { + CSecurityFtdcTradingCodeField empty_data = CSecurityFtdcTradingCodeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -305,7 +416,18 @@ void TdApi::OnRspQryTradingAccount(CSecurityFtdcTradingAccountField *pTradingAcc { Task task = Task(); task.task_name = ONRSPQRYTRADINGACCOUNT; - task.task_data = *pTradingAccount; + + if (pTradingAccount) + { + task.task_data = *pTradingAccount; + } + else + { + CSecurityFtdcTradingAccountField empty_data = CSecurityFtdcTradingAccountField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -323,32 +445,51 @@ void TdApi::OnRspQryTradingAccount(CSecurityFtdcTradingAccountField *pTradingAcc void TdApi::OnRspQryDepthMarketData(CSecurityFtdcDepthMarketDataField *pDepthMarketData, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pDepthMarketData) //ֶ޸ģΪпܳpDepthMarketDataΪָ + Task task = Task(); + task.task_name = ONRSPQRYDEPTHMARKETDATA; + + if (pDepthMarketData) { - Task task = Task(); - task.task_name = ONRSPQRYDEPTHMARKETDATA; task.task_data = *pDepthMarketData; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcDepthMarketDataField empty_data = CSecurityFtdcDepthMarketDataField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRspQryBondInterest(CSecurityFtdcBondInterestField *pBondInterest, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { Task task = Task(); task.task_name = ONRSPQRYBONDINTEREST; - task.task_data = *pBondInterest; + + if (pBondInterest) + { + task.task_data = *pBondInterest; + } + else + { + CSecurityFtdcBondInterestField empty_data = CSecurityFtdcBondInterestField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -368,7 +509,18 @@ void TdApi::OnRspQryMarketRationInfo(CSecurityFtdcMarketRationInfoField *pMarket { Task task = Task(); task.task_name = ONRSPQRYMARKETRATIONINFO; - task.task_data = *pMarketRationInfo; + + if (pMarketRationInfo) + { + task.task_data = *pMarketRationInfo; + } + else + { + CSecurityFtdcMarketRationInfoField empty_data = CSecurityFtdcMarketRationInfoField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -386,32 +538,51 @@ void TdApi::OnRspQryMarketRationInfo(CSecurityFtdcMarketRationInfoField *pMarket void TdApi::OnRspQryInstrumentCommissionRate(CSecurityFtdcInstrumentCommissionRateField *pInstrumentCommissionRate, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pInstrumentCommissionRate) //ֶ޸ģΪпָֿܳ + Task task = Task(); + task.task_name = ONRSPQRYINSTRUMENTCOMMISSIONRATE; + + if (pInstrumentCommissionRate) { - Task task = Task(); - task.task_name = ONRSPQRYINSTRUMENTCOMMISSIONRATE; task.task_data = *pInstrumentCommissionRate; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcInstrumentCommissionRateField empty_data = CSecurityFtdcInstrumentCommissionRateField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRspQryETFInstrument(CSecurityFtdcETFInstrumentField *pETFInstrument, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { Task task = Task(); task.task_name = ONRSPQRYETFINSTRUMENT; - task.task_data = *pETFInstrument; + + if (pETFInstrument) + { + task.task_data = *pETFInstrument; + } + else + { + CSecurityFtdcETFInstrumentField empty_data = CSecurityFtdcETFInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -431,7 +602,18 @@ void TdApi::OnRspQryETFBasket(CSecurityFtdcETFBasketField *pETFBasket, CSecurity { Task task = Task(); task.task_name = ONRSPQRYETFBASKET; - task.task_data = *pETFBasket; + + if (pETFBasket) + { + task.task_data = *pETFBasket; + } + else + { + CSecurityFtdcETFBasketField empty_data = CSecurityFtdcETFBasketField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -451,7 +633,18 @@ void TdApi::OnRspQryOFInstrument(CSecurityFtdcOFInstrumentField *pOFInstrument, { Task task = Task(); task.task_name = ONRSPQRYOFINSTRUMENT; - task.task_data = *pOFInstrument; + + if (pOFInstrument) + { + task.task_data = *pOFInstrument; + } + else + { + CSecurityFtdcOFInstrumentField empty_data = CSecurityFtdcOFInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -471,7 +664,18 @@ void TdApi::OnRspQrySFInstrument(CSecurityFtdcSFInstrumentField *pSFInstrument, { Task task = Task(); task.task_name = ONRSPQRYSFINSTRUMENT; - task.task_data = *pSFInstrument; + + if (pSFInstrument) + { + task.task_data = *pSFInstrument; + } + else + { + CSecurityFtdcSFInstrumentField empty_data = CSecurityFtdcSFInstrumentField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -489,78 +693,112 @@ void TdApi::OnRspQrySFInstrument(CSecurityFtdcSFInstrumentField *pSFInstrument, void TdApi::OnRspQryOrder(CSecurityFtdcOrderField *pOrder, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pOrder) //ֶ޸ģΪпܳpOrderΪָ + Task task = Task(); + task.task_name = ONRSPQRYORDER; + + if (pOrder) { - Task task = Task(); - task.task_name = ONRSPQRYORDER; task.task_data = *pOrder; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcOrderField empty_data = CSecurityFtdcOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRspQryTrade(CSecurityFtdcTradeField *pTrade, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pTrade) //ֶ޸ģΪпܳpTradeΪָ + Task task = Task(); + task.task_name = ONRSPQRYTRADE; + + if (pTrade) { - Task task = Task(); - task.task_name = ONRSPQRYTRADE; task.task_data = *pTrade; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcTradeField empty_data = CSecurityFtdcTradeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRspQryInvestorPosition(CSecurityFtdcInvestorPositionField *pInvestorPosition, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pInvestorPosition) //ֶ޸ģָֹ + Task task = Task(); + task.task_name = ONRSPQRYINVESTORPOSITION; + + if (pInvestorPosition) { - Task task = Task(); - task.task_name = ONRSPQRYINVESTORPOSITION; task.task_data = *pInvestorPosition; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcInvestorPositionField empty_data = CSecurityFtdcInvestorPositionField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRtnOrder(CSecurityFtdcOrderField *pOrder) { Task task = Task(); task.task_name = ONRTNORDER; - task.task_data = *pOrder; + + if (pOrder) + { + task.task_data = *pOrder; + } + else + { + CSecurityFtdcOrderField empty_data = CSecurityFtdcOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -568,7 +806,17 @@ void TdApi::OnRtnTrade(CSecurityFtdcTradeField *pTrade) { Task task = Task(); task.task_name = ONRTNTRADE; - task.task_data = *pTrade; + + if (pTrade) + { + task.task_data = *pTrade; + } + else + { + CSecurityFtdcTradeField empty_data = CSecurityFtdcTradeField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -576,7 +824,18 @@ void TdApi::OnErrRtnOrderInsert(CSecurityFtdcInputOrderField *pInputOrder, CSecu { Task task = Task(); task.task_name = ONERRRTNORDERINSERT; - task.task_data = *pInputOrder; + + if (pInputOrder) + { + task.task_data = *pInputOrder; + } + else + { + CSecurityFtdcInputOrderField empty_data = CSecurityFtdcInputOrderField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -594,7 +853,18 @@ void TdApi::OnErrRtnOrderAction(CSecurityFtdcOrderActionField *pOrderAction, CSe { Task task = Task(); task.task_name = ONERRRTNORDERACTION; - task.task_data = *pOrderAction; + + if (pOrderAction) + { + task.task_data = *pOrderAction; + } + else + { + CSecurityFtdcOrderActionField empty_data = CSecurityFtdcOrderActionField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -612,7 +882,18 @@ void TdApi::OnRspFundOutByLiber(CSecurityFtdcInputFundTransferField *pInputFundT { Task task = Task(); task.task_name = ONRSPFUNDOUTBYLIBER; - task.task_data = *pInputFundTransfer; + + if (pInputFundTransfer) + { + task.task_data = *pInputFundTransfer; + } + else + { + CSecurityFtdcInputFundTransferField empty_data = CSecurityFtdcInputFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -632,7 +913,17 @@ void TdApi::OnRtnFundOutByLiber(CSecurityFtdcFundTransferField *pFundTransfer) { Task task = Task(); task.task_name = ONRTNFUNDOUTBYLIBER; - task.task_data = *pFundTransfer; + + if (pFundTransfer) + { + task.task_data = *pFundTransfer; + } + else + { + CSecurityFtdcFundTransferField empty_data = CSecurityFtdcFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -640,7 +931,18 @@ void TdApi::OnErrRtnFundOutByLiber(CSecurityFtdcInputFundTransferField *pInputFu { Task task = Task(); task.task_name = ONERRRTNFUNDOUTBYLIBER; - task.task_data = *pInputFundTransfer; + + if (pInputFundTransfer) + { + task.task_data = *pInputFundTransfer; + } + else + { + CSecurityFtdcInputFundTransferField empty_data = CSecurityFtdcInputFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -658,38 +960,67 @@ void TdApi::OnRtnFundInByBank(CSecurityFtdcFundTransferField *pFundTransfer) { Task task = Task(); task.task_name = ONRTNFUNDINBYBANK; - task.task_data = *pFundTransfer; + + if (pFundTransfer) + { + task.task_data = *pFundTransfer; + } + else + { + CSecurityFtdcFundTransferField empty_data = CSecurityFtdcFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; void TdApi::OnRspQryFundTransferSerial(CSecurityFtdcFundTransferField *pFundTransfer, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pFundTransfer) //ֶ޸ģָֹ + Task task = Task(); + task.task_name = ONRSPQRYFUNDTRANSFERSERIAL; + + if (pFundTransfer) { - Task task = Task(); - task.task_name = ONRSPQRYFUNDTRANSFERSERIAL; task.task_data = *pFundTransfer; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcFundTransferField empty_data = CSecurityFtdcFundTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRspFundInterTransfer(CSecurityFtdcFundInterTransferField *pFundInterTransfer, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { Task task = Task(); task.task_name = ONRSPFUNDINTERTRANSFER; - task.task_data = *pFundInterTransfer; + + if (pFundInterTransfer) + { + task.task_data = *pFundInterTransfer; + } + else + { + CSecurityFtdcFundInterTransferField empty_data = CSecurityFtdcFundInterTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -707,32 +1038,50 @@ void TdApi::OnRspFundInterTransfer(CSecurityFtdcFundInterTransferField *pFundInt void TdApi::OnRspQryFundInterTransferSerial(CSecurityFtdcFundInterTransferSerialField *pFundInterTransferSerial, CSecurityFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { - if (pFundInterTransferSerial) //ֶ޸ģָֹ + Task task = Task(); + task.task_name = ONRSPQRYFUNDINTERTRANSFERSERIAL; + + if (pFundInterTransferSerial) { - Task task = Task(); - task.task_name = ONRSPQRYFUNDINTERTRANSFERSERIAL; task.task_data = *pFundInterTransferSerial; - if (pRspInfo) - { - task.task_error = *pRspInfo; - } - else - { - CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); - memset(&empty_error, 0, sizeof(empty_error)); - task.task_error = empty_error; - } - task.task_id = nRequestID; - task.task_last = bIsLast; - this->task_queue.push(task); } + else + { + CSecurityFtdcFundInterTransferSerialField empty_data = CSecurityFtdcFundInterTransferSerialField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + + if (pRspInfo) + { + task.task_error = *pRspInfo; + } + else + { + CSecurityFtdcRspInfoField empty_error = CSecurityFtdcRspInfoField(); + memset(&empty_error, 0, sizeof(empty_error)); + task.task_error = empty_error; + } + task.task_id = nRequestID; + task.task_last = bIsLast; + this->task_queue.push(task); }; void TdApi::OnRtnFundInterTransferSerial(CSecurityFtdcFundInterTransferSerialField *pFundInterTransferSerial) { Task task = Task(); task.task_name = ONRTNFUNDINTERTRANSFERSERIAL; - task.task_data = *pFundInterTransferSerial; + + if (pFundInterTransferSerial) + { + task.task_data = *pFundInterTransferSerial; + } + else + { + CSecurityFtdcFundInterTransferSerialField empty_data = CSecurityFtdcFundInterTransferSerialField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } this->task_queue.push(task); }; @@ -740,7 +1089,18 @@ void TdApi::OnErrRtnFundInterTransfer(CSecurityFtdcFundInterTransferField *pFund { Task task = Task(); task.task_name = ONERRRTNFUNDINTERTRANSFER; - task.task_data = *pFundInterTransfer; + + if (pFundInterTransfer) + { + task.task_data = *pFundInterTransfer; + } + else + { + CSecurityFtdcFundInterTransferField empty_data = CSecurityFtdcFundInterTransferField(); + memset(&empty_data, 0, sizeof(empty_data)); + task.task_data = empty_data; + } + if (pRspInfo) { task.task_error = *pRspInfo; @@ -756,9 +1116,6 @@ void TdApi::OnErrRtnFundInterTransfer(CSecurityFtdcFundInterTransferField *pFund - - - ///------------------------------------------------------------------------------------- ///̴߳ӶȡݣתΪpython󣬽 ///------------------------------------------------------------------------------------- diff --git a/vn.lts/vnltstd/test/vnltstd.pyd b/vn.lts/vnltstd/test/vnltstd.pyd index 9e756bb0..e5f19986 100644 Binary files a/vn.lts/vnltstd/test/vnltstd.pyd and b/vn.lts/vnltstd/test/vnltstd.pyd differ