易妖游戏网
您的当前位置:首页通达信编辑DLL函数范例

通达信编辑DLL函数范例

来源:易妖游戏网
通达信编辑DLL函数范例

通达信最新内测版公式支持dll函数,发个dll编辑教程,大家一起学习

为什么要用dll文件来开发公式?

1.为了突破分析家和飞狐现有功能的。 2.为了提高公式速度。 3.为了加密公式的理念。 4.增加新的功能。

下面我们逐渐用vc++ 6.0来讲制作分析家dll公式的过程。 [第一讲]准备的东东 1.安装VC++ 6.0软件

2.下载分析家C语言接口文件。 3.具备C++编程的知识。

如果不会,自己下载教学软件,或找本相关的书籍。 4.会分析家基本公式编写。

如果不会,在本站下载相关分析家公式编写资料。 准备好后,我开始讲一个完整公式的编写过程。 [第二讲]练习编译dll文件。 1.解包分析家c语言接口 2.启动Vc++

点击菜单[File]选Open Workspace。 选择文件FxjFunc.dsw

3.选择菜单[Build],选择Build FxjFunc.dll

生成FxjFunc.dll文件。如果没有错误,显示下面结果。 --------------------Configuration: FxjFunc - Win32 Debug--------------------

FxjFunc.dll - 0 error(s), 0 warning(s)

4.生成的FxjFunc.dll文件在D:\\SUPERSTK目录中。

如果不在当前使用的分析家目录,可以将FxjFunc.dll文件复制到分析家目录中,也可以复制到飞狐

\\FoxTrader\\FmlDLL目录中。

5.在飞狐或分析家建立公式,看看结果。公式只有下面一句,10日close均线。

ma1:\"fxjfunc@mymaclose\"(10); 如果结果正确,你已经成功编写了dll公式了。

在后面的讲课中介绍编写技巧。 第三讲]分析家扩展函数规范及设计 分析家扩展函数规范如下:

///////////////////////////////////////////////////////////////////////////

#ifndef __FXJFUNC_H_INCLUDE #define __FXJFUNC_H_INCLUDE

#ifdef __cplusplus extern \"C\" {

#endif //__cplusplus

///////////////////////////////////////////////////////////////////////////

//分析周期 enum DATA_TYPE {

TICK_DATA=2, //分笔成交 MIN1_DATA, //1分钟线 MIN5_DATA, //5分钟线 MIN15_DATA, //15分钟线

MIN30_DATA, //30分钟线 MIN60_DATA, //60分钟线 DAY_DATA, //日线 WEEK_DATA, //周线 MONTH_DATA, //月线 MULTI_DATA //多日线 };

///////////////////////////////////////////////////////////////////////////

//基本数据

typedef struct tagSTKDATA {

time_t m_time; //时间,UCT float m_fOpen; //开盘 float m_fHigh; //最高 float m_fLow; //最低 float m_fClose; //收盘 float m_fVolume; //成交量 float m_fAmount; //成交额

WORD m_wAdvance; //上涨家数(仅大盘有效) WORD m_wDecline; //下跌家数(仅大盘有效) } STKDATA;

////////////////////////////////////////////////////////////////////////////

//扩展数据,用于描述分笔成交数据的买卖盘 typedef union tagSTKDATAEx { struct {

float m_fBuyPrice[3]; //买1--买3价 float m_fBuyVol[3]; //买1--买3量 float m_fSellPrice[3]; //卖1--卖3价 float m_fSellVol[3]; //卖1--卖3量 };

float m_fDataEx[12]; //保留 } STKDATAEx;

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////

//函数数据结构

typedef struct tagCALCINFO {

const DWORD m_dwSize; //结构大小

const DWORD m_dwVersion; //调用软件版本(V2.10 : 0x210) const DWORD m_dwSerial; //调用软件序列号 const char* m_strStkLabel; //股票代码 const BOOL m_bIndex; //大盘 const

int

m_nNumData;

//

(pData,pDataEx,pResultBuf数据数量)

const STKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为 NULL

const STKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为 NULL

const int m_nParam1Start; //参数1有效位置 const float* m_pfParam1; //调用参数1

const float* m_pfParam2; //调用参数2 const float* m_pfParam3; //调用参数3 const float* m_pfParam4; //调用参数3

float* m_pResultBuf; //结果缓冲区 const DATA_TYPE m_dataType; //数据类型 const float* m_pfFinData; //财务数据 } CALCINFO;

///////////////////////////////////////////////////////////////////////////////////

//示例函数,使用时用实际名称替换

__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData);

__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);

__declspec(dllexport) __declspec(dllexport) #ifdef __cplusplus }

#endif //__cplusplus

#endif //__FXJFUNC_H_INCLUDE

////////////////////////////////////////////////////////////////////////

分析家的数据结构见上面。 //基本数据

typedef struct tagSTKDATA

int int

WINAPI WINAPI

MYMACLOSE_CALC_PREV(CALCINFO* pData); MYMAVAR_CALC_PREV(CALCINFO* pData);

{

time_t m_time; //时间,UCT float m_fOpen; //开盘 float m_fHigh; //最高 float m_fLow; //最低 float m_fClose; //收盘 float m_fVolume; //成交量 float m_fAmount; //成交额

WORD m_wAdvance; //上涨家数(仅大盘有效) WORD m_wDecline; //下跌家数(仅大盘有效) } STKDATA;

在前一讲中,求均线ma(c,x),是用收盘价,我们可以改成中值(h+l+c)/3的均线。

将FxjFunc.cpp程序中

fTotal += pData->m_pData[i-j].m_fClose; 改为

fTotal=fTotal [i-j].m_fHigh )/3;

将上面接口规范看懂后,你可以创作各种函数。

当将你公式中的一些分析家函数替换成dll中的函数,可以实现简单的加密。

另一方面,使用dll文件读取数据,是没有经过精度转换的原始记录数据,有助

于精确分析。此外用c++编写公式可以使用循环,遍历等很多分析家所不能实现

的功能。

[第四讲]公式中的数据传递

一.dll公式计算的结果如何返回到分析家中

+

(

pData->m_pData[i-j].m_fClose+

pData->m_pData[i-j].m_fLow+ pData->m_pData

dll函数计算结果用pData->m_pResultBuf带回. 也就是说dll函数必须有值返回。

函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:

m_pResultBuf[返回值] -- m_pResultBuf[m_nNumData-1]间为有效值.

例如上例:i表示当前所计算的周期。 pData->m_pResultBuf = fTotal/nPeriod;

全部数据为m_nNumData组。超过会出现错误。数据下标从0开始到m_nNumData-1二.分析家中公式的参数如

何传递到dll公式。

1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.

2.当一个参数无效时,则其后的所有参数均无效.

如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.

3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数. 4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;

5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,数组大小为m_nNumData,

数据有效范围为m_nParam1Start--m_nNumData.在时间上m_pData[x] 与 m_pfParam1[x]是一致的

在参数上,分析家不如飞狐交易师灵活。分析家只允许1个变化序列数据,飞狐可以允许四个变化序列数

据。三.公式的设计和使用

1.调用时在公式编辑器中写\"动态库名称@函数名称\"(参数表)即可,例如下面函数可以写

为\"FXJFUNC@MYCMALOSE\"(5)

2.动态连接库名称和函数名称可以自己定义.

3.使用时可以将动态库拷贝到分析家目录下使用. 分析家在SUPERSTK目录中

飞狐在FoxTrader\\FmlDLL目录中例子:在公式接口中有,这个例子告诉你如何使用两个参数。

//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期

//调用方法:

// MYMAVAR(CLOSE-OPEN,5)

__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData)

{

float f,fTotal; const float* pvalue; int nPeriod,nFirst,i,j;

if(pData->m_pfParam1 && pData->m_pfParam2 && //参数1,2有效

pData->m_nParam1Start>=0 && //参数1为序列数 pData->m_pfParam3==NULL) //有2个参数 {

pvalue = pData->m_pfParam1; //参数1 nFirst = pData->m_nParam1Start; //有效值 f = *pData->m_pfParam2; nPeriod = (int)f; //参数2 if(nFirst>=0 && nPeriod>0) {

for(i=nFirst+nPeriod-1;im_nNumData;i++) {

fTotal = 0.0f;

for(j=0;jfTotal += pData->m_pData[i-j].m_fClose;

pData->m_pResultBuf = fTotal/nPeriod; //平均 }

return nFirst+nPeriod-1; } }

return -1; }

大家可以参照上例来设计自己的dll公式。

因篇幅问题不能全部显示,请点此查看更多更全内容