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; }
以上就是小编今天的分享了,希望可以帮助到大家。