開心生活站

位置:首頁 > IT科技 > 

java,ctp

IT科技2.76W

<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 ctp

他的實現思路是:

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;}

標籤:java ctp