通达信插件选股编程规范与模版编写新的选股插件只需定制自己的”MyPlugin.cpp”(名称亦自定),其他源文件为接口规范,不可更改。插件的编写包括一个插件信息注册函数,两个选股条件判断函数和若干自编实现细节函数。1.插件信息注册函数包括注册插件基本信息和参数信息,相关结构定义参见”OutStruct.h”,现支持4个参数。具体函数实例可参见”MyPlugin.cpp”示范程序。2.选股条件判断函数BOOLInputInfoThenCalc1(char*Code,shortnSetCode,intValue[4],shortDataType,shortnDataNum,BYTEnTQ,unsignedlongunused)此函数申请全部本地历史数据判断最新条件成立与否;BOOLInputInfoThenCalc2(char*Code,shortnSetCode,intValue[4],shortDataType,NTimetime1,NTimetime2,BYTEnTQ,unsignedlongunused)此函数阶段的历史判断计算阶段最后条件成立与否。数据申请是通过函数指针调用回调函数,该回调函数声明如下:DATAIOFUNC(char*Code,shortnSetCode,shortDataType,void*pData,shortnDataNum,NTime,NTime,BYTEnTQ,unsignedlong)Code为股票代码,如申请上证指数数据则赋值为”999999”;nSetCode为市场分类,0为深市,1为沪市;DataType为申请数据类型,缺省为日K线历史数据,如申请行情数据则赋值为REPORT_DAT,其他相关类型参见”OutStruct.h”;pData为申请数据缓冲区,若为NULL且nDataNum为-1则函数返回历史数据个数;nDataNum为申请数据个数,若为-1且pData为NULL则函数返回历史数据个数;2个Ntime为申请数据的时间范围,缺省为全部本地历史数据;nTQ精确除权信息。编写选股条件判断函数应考虑判断申请到的数据个数和选股参数的关系,否则可能使选股条件无意义。具体函数实例可参见”MyPlugin.cpp”示范程序。3.自编实现细节函数为选股条件判断函数的实现可自编写辅助函数,如计算均线、判断交叉等,可理解为编写一般公式所使用的各类函数。以后根据需要将会公布更多常用的辅助函数。函数编写应注意判断数据的有效性,系统对{0xF8,0xF8,0xF8,0xF8}定义为无效数,对无效数应加以判断不参与计算。具体函数实例可参见”MyPlugin.cpp”示范程序。4.插件dll的使用将生成的dll文件拷贝到主程序的plugin目录下(如果没有此目录,请人工建立,如果该dll有关联文件,请一并拷贝过去)主程序进入后,在选股器时打开“插件选股”,即可使用此插件进行选股,运行期间拷贝dll过去后,在插件选股界面上点击刷新也可以找到此插件。模版choice2.cpp://choice1.cpp:DefinestheentrypointfortheDLLapplication.//#includestdafx.h#includeplugin.h#definePLUGIN_EXPORTSBOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){switch(ul_reason_for_call){caseDLL_PROCESS_ATTACH:caseDLL_THREAD_ATTACH:caseDLL_THREAD_DETACH:caseDLL_PROCESS_DETACH:break;}returnTRUE;}PDATAIOFUNCm_pfn;voidRegisterDataInterface(PDATAIOFUNCpfn){m_pfn=pfn;/*不管*/}voidGetCopyRightInfo(LPPLUGINinfo){strcpy(info-Name,两MA线穿越/*名称*/);strcpy(info-Dy,武汉/*地址*/);strcpy(info-Author,allfresh/*作者*/);strcpy(info-Period,短线/*周期*/);strcpy(info-Descript,两MA线穿越/*描述*/);strcpy(info-OtherInfo,自定义天数,两MA线穿越\nallfresh7711@yahoo.com.cn2000.01.15/*信息*/);//填写参数信息info-ParamNum=2;/*参数个数*/strcpy(info-ParamInfo[0].acParaName,MA天数1);/*参数1名字*/info-ParamInfo[0].nMin=1;/*参数1最小值*/info-ParamInfo[0].nMax=1000;/*参数1最大值*/info-ParamInfo[0].nDefault=13;/*参数1默认值*/strcpy(info-ParamInfo[1].acParaName,MA天数2);/*参数2名字*/info-ParamInfo[1].nMin=1;/*参数2最小值*/info-ParamInfo[1].nMax=1000;/*参数2最大值*/info-ParamInfo[1].nDefault=250;/*参数2默认值*/}////////////////////////////////////////////////////////////////////////////////constBYTEg_nAvoidMask[]={0xF8,0xF8,0xF8,0xF8};//无效数据标志//计算接口1BOOLInputInfoAndCalc1(char*Code,shortnSetCode,intValue[4],shortDataType,shortnDataNum,BYTEnTQ,BOOL*pOutput,unsignedlongunused)//按最近数据计算{BOOLnRet=FALSE;NTimetmpTime;memset(&tmpTime,0,sizeof(NTime));LPHISDATpHisDat=newHISDAT[nDataNum];shortreadnum=m_pfn(Code,nSetCode,DataType,pHisDat,nDataNum,tmpTime,tmpTime,nTQ,0);if(readnummax(Value[0],Value[1]))//只有将数据个数大于Value[0]和Value[1]中的最大值才有意义nRet=InputInfoAndCalc0(Code,nSetCode,Value,DataType,pHisDat,readnum,nTQ,pOutput,unused);deletepHisDat;returnnRet;}//计算接口2BOOLInputInfoAndCalc2(char*Code,shortnSetCode,intValue[4],shortDataType,NTimetime1,NTimetime2,BYTEnTQ,BOOL*pOutput,unsignedlongunused)//选取区段{BOOLnRet=FALSE;NTimetmpTime;memset(&tmpTime,0,sizeof(NTime));//窥视数据个数shortdatanum=m_pfn(Code,nSetCode,DataType,NULL,-1,time1,time2,nTQ,0);if(datanummax(Value[0],Value[1]))returnFALSE;//读取数据LPHISDATpHisDat=newHISDAT[datanum];shortreadnum=m_pfn(Code,nSetCode,DataType,pHisDat,datanum,time1,time2,nTQ,0);if(readnummax(Value[0],Value[1]))//只有将数据个数大于Value[0]和Value[1]中的最大值才有意义nRet=InputInfoAndCalc0(Code,nSetCode,Value,DataType,pHisDat,readnum,nTQ,pOutput,unused);deletepHisDat;returnnRet;}//计算接口0BOOLInputInfoAndCalc0(char*Code,shortnSetCode,intValue[4],shortDataType,HISDAT*pHisDat,shortnDataNum,BYTEnTQ,BOOL*pOutput,unsignedlongunused){inti=0;inttmpint=0;floatflma1=0.0;floatfnma1=0.0;floatflma2=0.0;floatfnma2=0.0;if(Value[0]1||Value[1]1)returnFALSE;if(nDataNum=Value[0]||nDataNum=Value[1]){for(i=0;inDataNum;i++)pOutput[i]=FALSE;returnTRUE;}tmpint=max(Value[0],Value[1]);for(i=1;i=Value[0];i++)fnma1+=pHisDat[tmpint-i].Close;for(i=1;i=Value[1];i++)fnma2+=pHisDat[tmpint-i].Close;for(i=0;inDataNum;i++){flma1=fnma1;flma2=fnma2;if(i=tmpint){fnma1+=(pHisDat[i].Close-pHisDat[i-Value[0]].Close);fnma2+=(pHisDat[i].Close-pHisDat[i-Value[1]].Close);}else{pOutput[i]=FALSE;continue;}if(flma1/Value[0]flma2/Value[1]&&fnma1/Value[0]fnma2/Value[1])pOutput[i]=TRUE;elsepOutput[i]=FALSE;}returnTRUE;}choice2.dsp:#MicrosoftDeveloperStudioProjectFile-Name=choice2-PackageOwner=4#MicrosoftDeveloperStudioGeneratedBuildFile,FormatVersion6.00#**DONOTEDIT**#TARGTYPEWin32(x86)Dynamic-LinkLibrary0x0102CFG=choice2-Win32Debug!MESSAGEThisisnotavalidmakefile.TobuildthisprojectusingNMAKE,!MESSAGEusetheExportMakefilecommandandrun!MESSAGE!MESSAGENMAKE/fchoice2.mak.!MESSAGE!MESSAGEYoucanspecifyaconfigurationwhenrunningNMAKE!MESSAGEbydefiningthemacroCFGonthecommandline.Forexample:!MESSAGE!MESSAGENMAKE/fchoice2.makCFG=choice2-Win32Debug!MESSAGE!MESSAGEPossiblechoicesforconfigurationare:!MESSAGE!MESSAGE