通达信MA为什么打不上去?

前一篇介绍DLL文件绑定,本篇简要说说DLL文件如何编写。DLL程序编写要求稍稍要高一些,需要懂一些编程语言,本篇以MFC为例需要有点C语言基础,本例比较简单。通达信DLL链接库编......

通达信MA为什么打不上去

前面写过一篇DLL参数传递,超过三个参数的传递方法,没有图文演示实例,本篇以DLL计算是否为十字星为例,再详细介绍。判断是否为十字星,要求:上下影线大于2.5%,K线实体小于1%,......接下来具体说说

通达信指标编写-MA函数-22

022-MA函数(通达信指标编写)

均价线,就是那个“移动平均线MA”,听说10个人里面有9个人都在使用,原理是:5日平均线=(今天收盘价+昨天收盘价+.....--5天前的收盘价)/5;10日平均线=(今天收盘价+昨天收盘价+......+10天前的收盘价)/10;150日平均线=(今天收盘价+昨天收盘价+......+150天前的收盘价)/150;200日平均线......

代码是:MA1=MA(CLOSE,5);MA2=MA(CLOSE,10);MA3=MA(CLOSE,150);......将上面的代码写下来,按照前面几课讲的,写在公式的编辑栏当中就可以了!注意:“MA”表示的就是计算平均值。在括号内写上计算的对象和计算的时间长度。MA1,MA2,MA3......是好几条指标线,别忘记了用分号把它们分开。电脑自己会把它们一起画出来。

均量线:均价线都有了,照着葫芦画瓢,把收盘价CLOSE换成成交量VOL就行了!MA1:MA(VOL,5);MA2:MA(VOL,10);MA3:MA(VOL,150);MA4:MA(VOL,200);

移动平均函数大致有五种:

1、MA 简单移动平均,意思是求简单移动平均。

用法:MA(X,N),求X的N日移动平均值。

例如:MA(CLOSE,10),表示求10日均价。

均线的画法:计算N日内收盘价的算术平均值,公式为:MA(X,N)表示X的N日平均。

例如: MA1: MA (CLOSE,5), coloryellow ;

表示为:参数名 画一条5日收盘价的均线 设置该线为黄*

通达信MA为什么打不上去?

MA函数

2、EMA 指数平滑移动平均 意思是求指数平滑移动平均。

用法:EMA(X,N),求X 的N日指数平滑移动平均。

例如:EMA(CLOSE,30),表示求30日指数平滑均价。

均线的画法:计算N日内收盘价的算术平均值,公式为:EMA(X,N)表示X的N日平均。

例如: EMA1: EMA (CLOSE,5), colorff00ff;

表示为:语句名EMA1 画一条5日收盘价的均线 设置该线为粉色

通达信MA为什么打不上去?

EMA函数

3、DMA 动态移动平均 意思是求动态移动平均。

用法:DMA(X,A),求X的动态移动平均,A必须小于1。

例如:DMA(CLOSE,VOL/CAPITAL),表示求以换手率作平滑因子的平均价。(CAPITAL是流通盘函数)

均线的画法:计算A收盘价的算术平均值,公式为:DMA(X,A)表示X的N日平均。

例如:DMA1: DMA (CLOSE,VOL/CAPITAL), colorff00ff;

表示为:语句名DMA1 画一条以换手率作平滑因子收盘价的均线 设置该线为粉色

通达信MA为什么打不上去?

DMA函数

4、SMA 移动平均 求移动平均。

用法:SMA(X,N,M),求X的N日移动平均,M为权数。N必须大于M。

例如:SMA(CLOSE,30,1),表示求30日移动平均价。

均线的画法:计算N日内收盘价的算术平均值,公式为:EMA(X,N)表示X的N日平均。

例如: SMA1: SMA (CLOSE,30,1), colorff00ff;

表示为:语句名SMA1 画一条30日收盘价的均线 设置该线为粉色

通达信MA为什么打不上去?

SMA函数

5、WMA 加权移动平均。

用法:WMA(X,N,),求X的N日加权移动平均。

例如:WMA(CLOSE,5),表示求5日加权移动平均价。

均线的画法:计算N日内收盘价的算术平均值,公式为:EMA(X,N)表示X的N日平均。

例如: WMA1: WMA(CLOSE,5), COLORWHITE;

表示为:语句名SMA1 画一条5日收盘价的加权移动均线 设置该线为白色

通达信MA为什么打不上去?

WMA函数

明白了上面这些函数用法,我们开始编靠前个指标:

给指标起个名,就叫"月均线主图"吧!

ma1:ma(close,5),colorwhite;{画一条5日收盘价的均线,设置该线为白色}

ma2:ma(close,10),colorff00ff;{画一条10日收盘价的均线,设置该线为粉色}

ma3:ma(close,20),color00ff00;{画一条20日收盘价的均线,设置该线为绿色}

......根据个人需要可画多条线。

如果想设置参数,按参数名称 最小值 最大值 缺省值在指标编辑器中添上如下值:

N1 1 100 5

N2 1 100 10

N3 1 100 20

把指标中的5、10、20分别改为N1、N2、N3即可。

月均线主图

第二个指标:起名"季均线主图"

ema1:ema(close,20),colorff00ff;{画一条20日收盘价的均线,设置该线为粉色}

ema2:ema(close,40),color00ff00;{画一条40日收盘价的均线,设置该线为绿色}

ema3:ema(close,60),colorwhite;{画一条60日收盘价的均线,设置该线为白色}

.......根据个人需要可画多条线。

季均线主图

第三个指标:起名"长短结合主图"

sma1:sma(close,5,1),color00ff00;{画一条5日收盘价的均线,设置该线为绿色}

sma2:sma(close,10,1),coloryellow;{画一条10日收盘价的均线,设置该线为黄*}

sma3:sma(close,60,1),colorff00ff;{画一条60日收盘价的均线,设置该线为粉色}

长短结合主图

几种移动均线的比较

移动均线是我们经常用到的指标,几乎天天看均线,对以下几种移动均线做一比较。

1、简单移动平均MA

移动平均线实质上是一种追踪趋势的工具,而且滞后于市场的变化。这些结果的原因,就是它的计算方法了。

算法: (X1+X2+X3+...+Xn)/N 如:5日均线=(今天收盘价+昨天收盘价+.....5天前的收盘价)/5;

从输出看,N所取周期越长,曲线就越平滑。

{主图指标1}

MA5:MA(CLOSE,5),COLOR00FF00,LINETHICK2;

MA10:MA(CLOSE,10),COLORWHITE,LINETHICK2;

MA20:MA(CLOSE,20),COLORFF00FF,LINETHICK2;

简单移动平均MA

2、EMA 指数平滑移动平均 意思是求指数平滑移动平均。

算法:若Y=EMA(X,N) 则Y=[1/N*X+(1-1/N)*Y‘‘]其中Y‘表示上一周期Y值。 {主图指标2}

EMA5:EMA(CLOSE,5),COLOR00FF00,LINETHICK2;

EMA10:EMA(CLOSE,10),COLORWHITE,LINETHICK2;

EMA20:EMA(CLOSE,20),COLORFF00FF,LINETHICK2;

EMA 指数平滑移动平均

3、DMA 动态移动平均 意思是求动态移动平均。

算法: 若Y=DMA(X,A) 则 Y=A*X+(1-A)*Y‘,其中Y‘表示上一周期Y值,A必须小于1。

{主图指标3}

DMA5: DMA((CLOSE+OPEN)/2,VOL/(SMA(VOL,5,1)*5)),COLOR00FF00,LINETHICK2;{5日成本}

DMA10: DMA((CLOSE+OPEN)/2,VOL/(SMA(VOL,10,1)*10)),COLORWHITE,LINETHICK2;{10日成本}

DMA20: DMA((CLOSE+OPEN)/2,VOL/(SMA(VOL,20,1)*20)),COLORFF00FF,LINETHICK2;{20日成本}

DMA 动态移动平均

4、SMA 移动平均 求移动平均。

算法: 若Y=SMA(X,N,M) 则 Y=[M*X+(N-M)*Y‘)/N, 其中Y‘表示上一周期Y值,N必须大于M。

{主图指标4}

SMA5:SMA(close,5,1),COLOR00FF00,LINETHICK2;

SMA10:SMA(close,10,1),COLORWHITE,LINETHICK2;

SMA20:SMA(close,20,1),COLORFF00FF,LINETHICK2;

SMA 移动平均

5、WMA 求加权移动平均。

算法:WMA[X,N]=(1*X1+2*X2+3*X3+......+N*Xn)/(1+2+3+......+N);

用法:WMA(X,N);求X的N日加权移动平均.

{主图指标5}

wma5:wma(close,5),color00ff00,LINETHICK2;

wma10:wma(close,10),colorwhite,LINETHICK2;

wma20:wma(close,20),colorff00ff,LINETHICK2;

WMA 求加权移动平均

有比较才有鉴别。上面5张图依次排列并一一与下面5个均线主图指标相对应的,通过比较可以看出,由于计算方法的不同,相同周期的均线排列和分布也略有不同。有的线条分布的分散一些,有的分布紧密一些。但差别不大,究其原因在于编制的思路和机理上的差异。运用到实战中,看你如何选择了,如果喜欢看成本均线,应该选择DMA均线,看均价其它4个就行了。总之,结合实际需要灵活运用。

编写通达信DLL文件(以MA均线为例)

前一篇介绍DLL文件绑定,本篇简要说说DLL文件如何编写。DLL程序编写要求稍稍要高一些,需要懂一些编程语言,本篇以MFC为例需要有点C语言基础,本例比较简单。

通达信DLL链接库编写,首先是要搭框架,就是与通达信软件的接口处理;在通达信官网帮助页面可以下载《通达信DLL函数编程规范》,里面有一个WORD简要说明,与一个较老的实例。按说明与实例素材,搭好框架;编写代码就只需在框架内按要求增加功能性代码即可。

下面以编程环境用Visual Studio2017 MFC为例,写个简单的DLL实例。VS2017可以网络搜索下载绿色版,此软件比较大需要10G+空间,实际以安装内容大小有不同,必须安装MFC组件。此处就不介绍软件安装,以安装好为例。

打开VS2017,文件——新建——项目,弹出如下图窗口,按图填写,项目名称可自定义,确定后弹出窗口再确定;新建项目完成。

新建项目

新建项目(MFC DLL)

完成项目新建

在新项目中任意打开一个文件,此处打开Dll_Demo.cpp,然后按下图,打开项目根目录。

打开文件所在位置

把《通达信DLL函数编程规范》内的PluginTCalcFunc.h头文件,复制粘贴到项目根目录。

编程规范头文件

粘贴头文件

在项目中添加PluginTCalcFunc.h头文件。下图中第③步点击现有项后,在弹出的窗口选择PluginTCalcFunc.h头文件,并确定添加。

添加资源

添加头文件

用记事本打开DLL编程规范里的TCalcFuncSets.h头文件,复制以下代码到PluginTCalcFunc.h头文件图示位置。

#ifdef __cplusplus

extern "C"

{

#endif //__cplusplus

__declspec(dllexport) BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun);

#ifdef __cplusplus

}

#endif //__cplusplus

头文件粘贴代码

如上图2提示,鼠标移到第20行红色波浪线处右键弹出窗口,选择靠前行快速操作与重构,再点击靠前行创建CPP文件,如下图:

创建CPP文件

cpp文件

打开《通达信DLL函数编程规范》内的TCalcFuncSets.cpp文件,复制如以下到代码到刚新建的cpp文件,注意语句对齐:

//生成的dll及相关依赖dll请拷贝到通达信安装目录的T0002/dlls/下面,再在公式管理器进行绑定

void TestPlugin1(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)

{

for(int i=0;i<DataLen;i++)

pfOUT[i]=i;

}

void TestPlugin2(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)

{

for(int i=0;i<DataLen;i++)

{

pfOUT[i]=pfINa[i]+pfINb[i]+pfINc[i];

pfOUT[i]=pfOUT[i]/3;

}

}

//加载的函数

PluginTCalcFuncInfo g_CalcFuncSets[] =

{

{1,(pPluginFUNC)&TestPlugin1},

{2,(pPluginFUNC)&TestPlugin2},

{0,NULL},

};

//导出给TCalc的注册函数

BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun)

{

if(*pFun==NULL)

{

(*pFun)=g_CalcFuncSets;

return TRUE;

}

return FALSE;

}

如下图点击生成菜单,生成解决方案,编译通过且生成我们所需的DLL文件。至此框架搭完。此官方实例两个功能函数,一个是输出通达信每次读取多少根K线数据(此数据用户在通达信系统设置里可自定义,K线图缩到最少,输出的数据为总共K线根数);另一个函数输出为传入三个参数的均值。

搭框架完成

设置项目属性,然后重新编译生成Release版dll。

项目属性

生成Release版本

框架完成后,以后要编辑新的功能,只需要在PluginTCalcFunc.cpp中添加新的功能函数代码,并加入到g_CalcFuncSets[]数组 ,下面举例,把靠前个函数更改为求取平均值,等下在通达信画平均线。

把靠前个函数全部删除或修改为如下代码,同时修改加载函数那里靠前个的名称,改为MA(如下图):

void MA(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)

{//参数1传入收盘价;参数2传入均线周期

int N = int(*pfINb);

float sum;

for (int i = N - 1; i < DataLen; i++)

{

sum = 0;

for (int j = 0; j < N; j++)

sum = sum + pfINa[i - j];

pfOUT[i] = sum / N;

}

}

MA函数

编译通过,若有问题请检查是否按步骤没有错漏,如下图,在提示的路径文件夹中找到Dll_Demo.dll文件,复制到通达信安装路径下的\T0002\dlls,然后按上一篇文章绑定该DLL到靠前号DLL。

绑定DLL

在通达信公式管理器中,新建如下图指标,就是调用dll画均线,同一个函数给不同均线周期即可画出不同的均线。

通达信tn6指标公式

测试公式通过后,主图调用该指标,成功画出三条均线

DLL画均线

这个过程说起来很复杂,明白了就很简单,以后要做的就是在框架内编辑不同的函数代码,根据个人C语言水平,编辑不同功能的股票函数。

通达信Dll多参数传递应用实例

前面写过一篇DLL参数传递,超过三个参数的传递方法,没有图文演示实例,本篇以DLL计算是否为十字星为例,再详细介绍。

判断是否为十字星, 要求:上下影线大于2.5%,K线实体小于1%,符合条件的全部判为十字星K线。要传递参数有:*高价H、最低价L、收盘价C、开盘价O、幅度(参数FUDU)等共5个;DLL调用时每次只能传递三个,那么我们分两次传递,靠前次传*高价H与幅度FUDU,不计算,返回值全部置0;第二次传递L、C、O并完成计算,返回结果=1为十字星,=0不是十字星

打开上次《编写通达信DLL文件(以MA均线为例)》VS2017的DLL_DEMO项目;打开PluginTCalcFunc.h头文件,在里面添加两个全局变量,其中一个是数组,如下图,数组长度需要定长一点,现在上市久的股票有5000多天,日线则有这么多数据。也可以改用VECTOR或LIST容器,会自动安排内存空间。

添加全局变量

打开 PluginTCalcFunc.cpp 文件,增加两个功能函数,靠前个函数 param 传入*高价与幅度:

void param(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)

{//pfINa传入*高价H,pfINb传入上下影线幅度,另一个参数不用

memset(nHigh, 0.0, sizeof(nHigh)); //数组初始化

Range = *pfINb;

for (int i = 0; i < DataLen; i++)

{

nHigh[i] = pfINa[i]; //参数传入数据存入数组

pfOUT[i] = 0;

}

}

加入靠前个函数

第二个函数 CrossStars ,计算并返回是否为十字星:

void CrossStars(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)

{//pfINa=C,pfINb=O,pfINc=L

float nMax = 0.0;

float nMin = 0.0;

for (int i = 0; i < DataLen; i++)

{

//C/O取高值

if (pfINa[i] > pfINb[i])

nMax = pfINa[i];

else nMax = pfINb[i];

//C/O取低值

if (pfINa[i] < pfINb[i])

nMin = pfINa[i];

else nMin = pfINb[i];

//计算上下影线、实体

float upLine = (nHigh[i] - nMax) / nMax * 100;//修改除数为nMax,图片内也需要修改

float downLine = (nMin - pfINc[i]) / nMin * 100;

float K_rect = (nMax / nMin - 1) * 100;

if (upLine > Range && downLine > Range && K_rect < 1)

pfOUT[i] = 1;

else pfOUT[i] = 0;

}

}

第二个函数

加载第3、第4个函数,即param与CrossStars,把它们排序在3、4号位;

//加载的函数

PluginTCalcFuncInfo g_CalcFuncSets[] =

{

{1,(pPluginFUNC)&MA},

{2,(pPluginFUNC)&TestPlugin2},

{3,(pPluginFUNC)¶m},

{4,(pPluginFUNC)&CrossStars},

{0,NULL},

};

加载函数

重新生成解决方案

生成解决方案

打开通达信公式管理器,打开DLL_DEMO指标,加上如下图三句代码(红色字体),注意要增加一个FUDU的参数,0-10,默认2.5,并测试成功:

MA10:TDXDLL1(1,C,N1,1),COLORYELLOW;

MA20:TDXDLL1(1,C,N2,1),COLORMAGENTA;

MA60:TDXDLL1(1,C,N3,1),COLORGREEN;

{此句传入两个参数,一定要在下一个之前传}

XA1:=TDXDLL1(3,H,FUDU,0);

{传入三个参数,合并上面两个计算,返回1为十字星,0否}

XA2:=TDXDLL1(4,C,O,L);

DRAWICON(XA2,L*0.98,1);

TN6指标编写

应用于图,主图上出现有红色箭头标示的十字星,DLL传 参成功:

以上就是通达信MA为什么打不上去?的详细内容,希望通过阅读小编的文章之后能够有所收获!

版权:本文由用户自行上传,观点仅代表作者本人,本站仅供存储服务。如有侵权,请联系管理员删除,了解详情>>

发布
问题