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) {undefined CThostFtdcTraderApi*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}; {undefined jfieldID?fid=?env->GetFieldID(clzparam,?"BrokerID",?"Ljava/lang/String;"); jstring?jstr=?(jstring)?env->GetObjectField(pQryTradingNotice,fid);const?char*cstr;if(jstr)?{undefined cstr=?env->GetStringUTFChars(jstr,?NULL); strcpy(QryTradingNotice.BrokerID,?(char?*)?cstr); } env->ReleaseStringUTFChars((jstring)jstr,?cstr); } {undefined jfieldID?fid=?env->GetFieldID(clzparam,?"InvestorID",?"Ljava/lang/String;"); jstring?jstr=?(jstring)?env->GetObjectField(pQryTradingNotice,fid);const?char*cstr;if(jstr)?{undefined cstr=?env->GetStringUTFChars(jstr,?NULL); strcpy(QryTradingNotice.InvestorID,?(char?*)?cstr); } env->ReleaseStringUTFChars((jstring)jstr,?cstr); } {undefined jfieldID?fid=?env->GetFieldID(clzparam,?"InvestUnitID",?"Ljava/lang/String;"); jstring?jstr=?(jstring)?env->GetObjectField(pQryTradingNotice,fid);const?char*cstr;if(jstr)?{undefined cstr=?env->GetStringUTFChars(jstr,?NULL); strcpy(QryTradingNotice.InvestUnitID,?(char?*)?cstr); } env->ReleaseStringUTFChars((jstring)jstr,?cstr); } jint?iRtn=?ptrApi->ReqQryTradingNotice(&QryTradingNotice,?(?int)?nRequestID);returniRtn; }
以上就是小編今天的分享了,希望可以幫助到大家。