您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 图文手把手教你一步步用VC++2010编写通达信缠论插件(2-K线包含处理)
图文手把手教你一步步用VC++2010编写通达信缠论插件(2-K线包含处理)前提:你得懂VC++程序设计;通达信公式指标编写等基础知识。按照图文提示,一步步往下走,按照说明,创建VC++2010工程,把文中的代码拷贝到文中说明的位置,编译运行,绝对通过!限于篇幅,本篇文档只涉及K线包含处理。本篇只收你一个下载券,我心不贪,请大家支持点儿。本来都是玩儿的,但是,我下载别人的资料,也要下载券啊!需要说明的是,生成pdf文档后,代码格式上会发生变化,比如原来一行的注释变成了两行,第二行却没有“//”符号;比如拷贝的时候最容易把最后一行的“}”给丢失了。主要是上面两个原因会造成编译不通过。这时候请大家仔细检查一下,会很快排除这种小错误的。这是我亲自试过的。其他好像没问题。我老榆是个实诚人,请大家放心。深谷老榆制作,2016.4.24下面工作是在前一篇文章“图文手把手教你一步步用VC++2010编写通达信缠论插件(1-DLL设计入门)”的基础上进行的,工程名字和其他文件代码等等都要用上个文件中的源代码才行。打开上面的ChanLunTdx工程后:第一步,首先创建两个文件,用以存放我们的公共函数和全局变量:util.h和util.cpp。鼠标右键单击工程名“ChanLunTdx”,后,选择“添加”下的“新建项”:这时候弹出“添加新项”窗口:选择“头文件(.h)”,并在下面“名称”处给出文件名“util”,后缀.h系统会自动加上的,把下面源代码拷贝到util.h中去:工程名:ChanLunTdx添加新项窗口#ifndef_UTIL_H_#define_UTIL_H_typedefstructtagStockData//原始K线数据结构{floathigh;//最高价floatlow;//最低价}StockData;typedefstructtagIncldCndlStks//包含处理过的K线数据结构{floathigh;//K线最高价floatlow;//K线最低价intdir;//K线方向1上-1下intflagInc;//被包含处理过:1包含右;-1被左包;0未包含处理过intno;//K线编号}IncldCndlStks;externintNumOfData;externStockData*pCandleArray;externIncldCndlStks*IncldCSData;voidAlocMemForStock(intNum);//根据数据项的大小给结构指针分配内存voidDelMemforStock(void);voidIncludingCndlStks(void);//K线包含处理#endif该文件截图如下所示:如法炮制,建立util.cpp文件,并把下面代码拷贝进去:#includestdafx.h#includeutil.hintNumOfData;StockData*pCandleArray;IncldCndlStks*IncldCSData;voidAlocMemForStock(intNum){NumOfData=Num;pCandleArray=newStockData[Num];IncldCSData=newIncldCndlStks[Num];}voidDelMemforStock(void){if(!pCandleArray)deletepCandleArray;if(!IncldCSData)deleteIncldCSData;}voidIncludingCndlStks(void){//初始化处理,先假定第一根(i=0)K线前的那根K线高低都是0;//hnow当前高lnow当前低hlast前一高llast前一低floathnow,lnow,h1ast=0,l1ast=0;intdir=0;//K线方向1上,-1下inti,j;for(i=0;iNumOfData;i++){//取出第i根K线的高、低值,即当前K线hnow=pCandleArray[i].high;lnow=pCandleArray[i].low;//今包昨:当前K线与前一根K线若存在包含关系,则if((hnow=h1ast)&&(lnow=l1ast)){if(dir==1)//说明K线方向是向上的,下面要向上处理{//高点的高点低点的高点lnow=l1ast;//hnow不变dir=1;//向上处理;}elseif(dir==-1)//说明dir=-1,K线方向是向下的,要向下处理{//高点的低点低点的低点hnow=h1ast;//lnow不变dir=-1;//向下处理;}IncldCSData[i].flagInc=1;//该K线包含处理过前一根K线,将来显示IncldCSData[i-1].flagInc=-1;//因为昨日被今包含,故无论昨日标志是-1、1,还是0,今天给它都-1,将来不显示IncldCSData[i-1].high=hnow;IncldCSData[i-1].low=lnow;}elseif((hnow=h1ast)&&(lnow=l1ast))//昨包今,即今被昨包{if(dir==1)//说明K线方向是向上的,下面要向上处理{//高点的高点低点的高点hnow=h1ast;//lnow不变dir=1;//向上处理;}elseif(dir==-1)//说明dir=-1,K线方向是向下的,要向下处理{//高点的低点低点的低点lnow=l1ast;//hnow不变dir=-1;//向下处理;}IncldCSData[i].flagInc=-1;//该K线被前一根K线包含处理,将来不显示if(IncldCSData[i-1].flagInc==0)//若昨日K线无包含标志,则置为1;IncldCSData[i-1].flagInc=1;//若昨日是被包含标志-1或1,则不动;j=i-1;while(IncldCSData[j].flagInc==-1)//被前面K线连续包含{IncldCSData[j].high=hnow;//修改昨天的值IncldCSData[j].low=lnow;j--;}if(IncldCSData[j].flagInc==1){IncldCSData[j].high=hnow;//修改昨天、或之前连续包含之首那根K线的值IncldCSData[j].low=lnow;}}else//说明无包含关系,不处理,但是,dir要设置{if(hnow=h1ast)//当前K线方向是向上的{dir=1;//}elseif(lnow=l1ast)//否则,当前K线方向是向下的{dir=-1;//}IncldCSData[i].flagInc=0;//该K线未包含处理、或被包含处理过}IncldCSData[i].high=hnow;IncldCSData[i].low=lnow;IncldCSData[i].dir=dir;IncldCSData[i].no=i;h1ast=hnow;l1ast=lnow;}}第二步,打开“ChanLunTdx.cpp”文件,在文件包含部分添加:#includeutil.h如图所示:并在文件后面添加如下代码://返回包含K线的H值;voidGetIncCSH(intDataLen,float*pfOUT,float*pfINa,float*pfINb,float*pfINc){inti;AlocMemForStock(DataLen);if(DataLen0){for(i=0;iDataLen;i++){pCandleArray[i].high=pfINa[i];pCandleArray[i].low=pfINb[i];}IncludingCndlStks();for(i=0;iDataLen;i++)pfOUT[i]=IncldCSData[i].high;}DelMemforStock();}//返回包含K线的L值;voidGetIncCSL(intDataLen,float*pfOUT,float*pfINa,float*pfINb,float*pfINc){inti;AlocMemForStock(DataLen);if(DataLen0){for(i=0;iDataLen;i++){pCandleArray[i].high=pfINa[i];pCandleArray[i].low=pfINb[i];}IncludingCndlStks();for(i=0;iDataLen;i++)pfOUT[i]=IncldCSData[i].low;}DelMemforStock();}//返回包含K线的包含标志;voidGetIncCSFlag(intDataLen,float*pfOUT,float*pfINa,float*pfINb,float*pfINc){inti;AlocMemForStock(DataLen);if(DataLen0){for(i=0;iDataLen;i++){pCandleArray[i].high=pfINa[i];pCandleArray[i].low=pfINb[i];}IncludingCndlStks();for(i=0;iDataLen;i++)pfOUT[i]=(float)IncldCSData[i].flagInc;}DelMemforStock();}如图所示(一屏幕显示不下了):第三步:修改“ChanLunTdx.cpp”中的“加载函数”,该函数是通达信要求的格式://加载的函数PluginTCalcFuncInfog_CalcFuncSets[]={{1,(pPluginFUNC)&EMA},{2,(pPluginFUNC)&MA},{3,(pPluginFUNC)&GetIncCSH},{4,(pPluginFUNC)&GetIncCSL},{5,(pPluginFUNC)&GetIncCSFlag},{0,NULL},};如图所示:这三行是新添加的第四步,编译生成“ChanLunTdx.dll”,在工程Debug文件夹下。并把该文件拷贝到通达信T002的Dlls文件夹下面。第五步:打开通达信公式编辑器,建立副图公式指标,我这里命名是“FTCS”。把下面代码拷贝进去:BHKXH:=TDXDLL1(3,H,L,0);BHKXL:=TDXDLL1(4,H,L,0);BHF:=TDXDLL1(5,H,L,0);STICKLINE(BHF=1,BHKXH,BHKXL,0.8,1),COLORMAGENTA;STICKLINE(BHF=0,BHKXH,BHKXL,0.8,1),COLORRED;STICKLINE(BHF=-1,BHKXH,BHKXL,0.8,1),COLORGRAY;如图所示:然后运行测试该公式,效果图和说明如下:完毕!==============================================================================================================================================后续工作:由于被包含K线将被删除,为了便于后面生成顶底分型,所以,需要把所有的标志为0(无包含关系)和1(包含别的K线)的标准K线存入链表;标志为-1的标准K线不存入。需要对原程序做如下修改:第一:打开util.h文件在文件包含部分添加下面两行:usingnamespacestd;#includelist在外部变量定义部分添加下面一行:externlistIncldCndlStksIncldCSList;//该链表将来存放包含处理过的标准K线,被包含处理的K线将不存放。如图所示:红色表示无包含关系;紫色表示包含了别的K线;灰色表示该K线被包含了。第二,打开util.cpp文件,在变量说明语句,添加下面一行://该链表将来存放包含处理过的标准K线,被包含处理过
本文标题:图文手把手教你一步步用VC++2010编写通达信缠论插件(2-K线包含处理)
链接地址:https://www.777doc.com/doc-5130610 .html