java,ctp
<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
java ctp是什麼,讓我們一起了解一下。
ctp是綜合交易平臺,是技術專門爲期貨公司開發的一套期貨經紀業務管理系統,由交易、風險控制、結算三大系統組成。JAVA接口中的CTP是由JNI實現的,通過靜態方法例如CreateFtdcTraderApi方法來創建。
那麼在期貨交易中,由JNI實現的CTP在JAVA接口中是如何操作的?
CTP的頭文件分爲3個部分:
1. ThostFtdcUserApiDataType.h,api的數據類型, typedef了一大堆類型,char, char[], int, short, double。 對於大部分char型,又#define了很多字符常量。開頭的枚舉類型比較特殊。還有那個單引號括起來的連續字符也比較特殊。
2. ThostFtdcUserApiStruct.h, api的數據結構,用於api和spi的函數參數,數據結構的成員變量的類型全部來自上面的頭文件。
3. API、SPI (Trader, Market Data)
他的實現思路是:
Java的API類跟C++中一樣,只能通過靜態方法例如CreateFtdcTraderApi方法來創建。
Java的API類,包含一個C++的API的實例的指針。API的每個函數,全部通過native方法。這個native方法通過這個指針調用對應的CTP API。例如:public native int ReqUserLogin(CThostFtdcReqUserLoginField pReqUserLoginField,int nRequestID);
Java中的SPI類可以用new來創建,它的構造函數會調用newNativeSpiInstance這個native方法。newNativeSpiInstance(代碼最長的函數)會幹這麼幾件事。
具體操作:實現每一個java API類的native函數。
JNIEXPORT jint JNICALL Java_ctp_CThostFtdcTraderApi_ReqQryTradingNotice(JNIEnv*env,jobject obj,jobject pQryTradingNotice,jint nRequestID){undefinedCThostFtdcTraderApi*ptrApi;jclass clazzTraderApi= env->FindClass("Lctp/CThostFtdcTraderApi;");jfieldID fidTraderApi= env->GetFieldID(clazzTraderApi, "ptrApi", "J");ptrApi= (CThostFtdcTraderApi*)env->GetLongField(obj,fidTraderApi);jclass clzparam= env->FindClass("Lctp/apistruct/CThostFtdcQryTradingNoticeField;");CThostFtdcQryTradingNoticeField QryTradingNotice= { 0};{undefinedjfieldID fid= env->GetFieldID(clzparam, "BrokerID", "Ljava/lang/String;");jstring jstr= (jstring) env->GetObjectField(pQryTradingNotice,fid);const char*cstr;if(jstr) {undefinedcstr= env->GetStringUTFChars(jstr, NULL);strcpy(QryTradingNotice.BrokerID, (char *) cstr);}env->ReleaseStringUTFChars((jstring)jstr, cstr);}{undefinedjfieldID fid= env->GetFieldID(clzparam, "InvestorID", "Ljava/lang/String;");jstring jstr= (jstring) env->GetObjectField(pQryTradingNotice,fid);const char*cstr;if(jstr) {undefinedcstr= env->GetStringUTFChars(jstr, NULL);strcpy(QryTradingNotice.InvestorID, (char *) cstr);}env->ReleaseStringUTFChars((jstring)jstr, cstr);}{undefinedjfieldID fid= env->GetFieldID(clzparam, "InvestUnitID", "Ljava/lang/String;");jstring jstr= (jstring) env->GetObjectField(pQryTradingNotice,fid);const char*cstr;if(jstr) {undefinedcstr= env->GetStringUTFChars(jstr, NULL);strcpy(QryTradingNotice.InvestUnitID, (char *) cstr);}env->ReleaseStringUTFChars((jstring)jstr, cstr);}jint iRtn= ptrApi->ReqQryTradingNotice(&QryTradingNotice, ( int) nRequestID);returniRtn;}
-
excel表格設打開密碼忘記了怎麼辦
我們在工作中經常會使用到Excel表格,如果這個表格的內容非常重要,並且不能夠輕易外露的話,可以設置一個保護密碼,但是如果表格的密碼忘記了,應該怎麼打開呢?受保護的Excel文檔是無法修改的,輸入內容就會出現要求輸入密碼的提示框,我們修改文件的後綴名爲rar,再回車確定...
-
蘋果手機長圖怎麼截圖,蘋果手機截長圖的兩種方法
1、長截圖辦法一iOS13上新之後自帶的長截圖方法,是在我們瀏覽網頁的時候使用的。操作方法:上音量鍵+開關鍵一起按下,然後點開截好的圖片,選擇“整頁”截圖即可。2、長截圖方法二利用QQ實現長截圖。操作方法:首先就是需要我們打開QQ,然後試着上音量鍵+開關鍵一起按下...
-
乾土豆粉怎樣快速泡開
乾土豆粉是用土豆磨成粉然後經過加工製作出來的粉條,它與紅薯粉、米粉一樣,可以存儲一定的時間。吃的時候首先用熱水泡開,然後再用冷水冷卻,土豆粉就會一條一條的分開,不會互相粘在一起。土豆粉不同的吃法,泡開所需要的時間也是不一樣的,如果要用來涼拌,那泡的時間要長...
-
微信怎麼建
1、微信的創建方法:打開微信。點擊更多。選擇註冊。輸入暱稱,手機號和密碼。勾選同意協議。點擊註冊即可。2、微信推薦使用手機號註冊,並支持100餘個國家的手機號。微信不可以通過QQ號直接登錄註冊或者通過郵箱帳號註冊。第一次使用QQ號登陸時,是登陸不了的,只能用...