(16)、编程接口全攻略
为什么使用编程接口
由于分析家的自编公式缺乏循序、选择及循环三大基本结构中的循环结构,因而不能编制某些公式,作为补救措施,汇天奇公司推出编程接口。编程接口的优点是能实现任意算法,运算效率高,保密性强;缺点是需要额外的知识,调试困难,善未完善。所以,笔者建议尽量避免使用它。
使用编程接口需要什么基础知识及软件
原始的编程接口是以C语言提供,以Win32动态连接库的形式实现的,所以任何一个可以生成Win32
动态连接库的开发工具,都可以用于编写扩展函数,如Delphi、BCB、VC、VB等。
由于分析家软件是用VC编写的,故汇天奇公司推荐使用VC作为开发工具。有鉴于此,笔者编写了VC6.0下的
CustomAppWizard,可自动生成程序框架,并作一些必要的设置,可节省不少时间。如果使用VC,只需学习C
语言,不必懂得C++知识,更不必掌握MFC,要求可说是相当低了。
本文以VC为例,讲述扩展函数的编制。
扩展函数的命名及引用
扩展函数的命名有以下规定:
1.函数名称须符合C语言的规定,并需全部大写.
2.函数必须以下述A,B两種形式之一声明,请用实际函数名称替代xxxxxxxx。
__declspec(dllexport)intxxxxxxxx(CALCINFO*pData);
----------A
__declspec(dllexport)intxxxxxxxxVAR(CALCINDO*pData);
----------B
3.上述形式A用于声明不带参数或全部参数为常数的函数;
形式B用于声明参数1为序列数的函数;两種函数的区别在于后者以VAR结尾.
4.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫
SYSTEM,EXPLORER;
扩展函数的引用分两个步骤:
1、将生成的动态连接库拷贝到分析家目录下;
2、编写一个公式,引用动态连接库中的扩展函数,格式如下:
"动态库名称@函数名称"(参数表)
例如,您编了一个扩展函数叫FUNCTION(),有两个常数参数,生成的动态连接库叫FORMula.dll,引用为
"),注意一对半角双引号的位置,库名及函数名不区分大小写。
数据结构
编程接口的一大任务是数据的传递,包括将原始数据传递给扩展函数及将运算结果传递回分析家。这是通过函数的参数CALCINFO*
pData实现的,结构CALCINFO的定义在头文件FxjFunc.h或Analyst.h中,简介如下:
typedefstructtagCALCINFO
{
constDWORDm_dwSize;//本结构的大小,可用于分配内存
constDWORDm_dwVersion;//调用软件版本(V2.10:0x210)
constDWORDm_dwSerial;//调用软件序列号
constchar*m_strStkLabel;//股票代码
constBOOLm_bIndex;//大盘
//数据数量(pData,pDataEx,pResultBuf指向的数组大小)
constintm_nNumData;
//常规数据数组指针,注意:当m_nNumData==0时可能为NULL
constSTKDATA*m_pData;
//扩展数据数组指针,用于描述分笔成交买卖盘,注意:可能为NULL
constSTKDATAEx*m_pDataEx;
constintm_nParam1Start;//参数1有效位置,详见注4、5
constfloat*m_pfParam1;//调用参数1
constfloat*m_pfParam2;//调用参数2
constfloat*m_pfParam3;//调用参数3
constfloat*m_pfParam4;//调用参数3
float*m_pResultBuf;//结果缓冲区
constDATA_TYPEm_dataType;//数据类型
constfloat*m_pfFinData;//财务数据
}CALCINFO;
注:
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]是一致的
结构CALCINFO中用到的其它数据结构定义可在同一头文件中找到,读者如有疑问可自行查阅。
使用CustomAppWizard编程
由于CustomAppWizard
已完成了所有例行的工作,我们只需要读出原始数据,对其进行处理后,写入结果缓冲区就行了。具体可参阅网友Normal的大作,此处不再赘
述。有几点补充如下:
1、函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
m_pResultBuf[返回值]--m_pResultBuf[m_nNumData-1]间为有效值。
2、CustomAppWizard只适用于VC6.0,不能用于VC5.0。
不使用CustomAppWizard编程
手工编程的话,要注意以下几点:
1、函数参数传递顺序必须按照C规则,如果文件扩展名用.cpp,则函数声明必须包含在extern"C"{}
的括号中;
2、Project->Settings...->C/C++->Category:General
->Preprocessordefinitions中加入FXJFUNC_EXPORTS;
3、编译时选择1字节对齐,即
Project->Settings...->C/C++->Category:CodeGeneration
->Structmemberalignment:选1Byte;
使用其它编程工具的,可参考以上设置。
共13页: 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 11 [12] [13] 下一页