警告:用DLL函数编写指标公式,没啥必要,一般股票软件的公式系统足够用了,除非是编程爱好者用于数据挖掘或者是极其复杂的计算。
本规范根据C++版本改写而成。
用户可以自己编写公式函数dll载入通达信客户端,用户dll必须遵循通达信接口规范。(请参考示范程序TDX_DLL_CALC_FUNC.dproj,TDX_PLUGIN_TCALC_FUNC.pas)
DLL函数结构
1. zfm提供了数据定义文件TDX_PLUGIN_TCALC_FUNC.pas。
type
//函数指针类型(数据个数,输出,输入a,输入b,输入c),参数的计算是基于长度为DataLen 的float类型数组。
TPluginFUNC=procedure(DataLen:integer;out pfOUT:single;
var pfINa:single;var pfINb:single;var pfINc:single);cdecl; //务必采用cdecl调用
//用来存放用户自己的函数pCallFunc和函数唯一标记nFuncMark;
//pCallFunc是TPluginFUNC类型指针,.
TPluginTCalcFuncInfo=packed record
nFuncMark:word;//函数编号
pCallFunc:TPluginFUNC ;//函数指针
end;
PpluginTCalcFuncInfo=^TPluginTCalcFuncInfo; //指向记录类型的指针
//测试函数
//指标函数参数分别是(数据个数,输出,输入a,输入b,输入c),参数的计算是基于长度为DataLen 的float类型数组。
// 输出,输入a,输入b,输入c,这四个参数都是指针数组
procedure TestPlugin1(DataLen:integer;out pfOUT:single; //第1个函数
var pfINa:single;var pfINb:single;var pfINc:single) ;cdecl; //务必采用cdecl调用
procedure TestPlugin2(DataLen:integer;out pfOUT:single; //第2个函数
var pfINa:single;var pfINb:single;var pfINc:single) ;cdecl; //务必采用cdecl调用
//可增加到10个函数
//RegisterTdxFunc函数为注册函数,用户的函数全部都放入PluginTCalcFuncInfo结构的全局数组g_CalcFuncSets中。
function RegisterTdxFunc(var pFun:PpluginTCalcFuncInfo):boolean;cdecl ; //务必采用cdecl调用
var
//PluginTCalcFuncInfo结构的全局数组,用来存储DLL导出的函数指针.
//根据实际导出函数的数量确定数组下标界限,
//导出2个,下标为0..2 ;导出10个,下标为0..10;
g_CalcFuncSets:array[0..2]of TPluginTCalcFuncInfo;
2. 包括注册DLL函数基本信息。
注册函数名称为RegisterTdxFunc。具体函数实例可参见TDX_PLUGIN_TCALC_FUNC.pas程序。
//RegisterTdxFunc函数为注册函数,用户的函数全部都放入PluginTCalcFuncInfo结构的全局数组g_CalcFuncSets中。
function RegisterTdxFunc(var pFun:PpluginTCalcFuncInfo):boolean;cdecl ;//务必采用cdecl调用
begin
if pFun=nil then
begin
pFun:=@g_CalcFuncSets[0]; //取第一个元素的地址 回传给变量
result:=True;
end else result:=False;
end;
initialization
//初始化g_CalcFuncSets数组 ,//加载的函数
g_CalcFuncSets[0].nFuncMark:=1; g_CalcFuncSets[0].pCallFunc:=TestPlugin1; //第一个函数
g_CalcFuncSets[1].nFuncMark:=2; g_CalcFuncSets[1].pCallFunc:=TestPlugin2; //第二个函数
g_CalcFuncSets[2].nFuncMark:=0; g_CalcFuncSets[2].pCallFunc:=nil; //结尾
自编实现细节说明
TDX_PLUGIN_TCALC_FUNC.pas文件中PluginTCalcFuncInfo结构用来存放用户自己的函数pCallFunc和函数唯一标记nFuncMark;
pCallFunc是procedure(DataLen:integer;out pfOUT:single; var pfINa:single;var pfINb:single;var pfINc:single);cdecl;类型指针;函数参数分别是(数据个数,输出,输入a,输入b,输入c),参数的计算是基于长度为DataLen 的float类型数组。
RegisterTdxFunc函数为注册函数,用户的函数全部都放入PluginTCalcFuncInfo结构的全局数组g_CalcFuncSets中。
函数dll的使用
将生成的dll文件拷贝到主程序的\T0002\dlls目录下(如果没有此目录,请人工建立,如果该dll有关联文件,请一并拷贝过去)
主程序进入后,ctrl+F打开公式管理器,点击“DLL函数”按钮。
如上图:第二号DLL绑定了TestPluginTCale.dll
在指标公式编辑器中就可以用TDXDLL2第二号DLL函数了。
TDXDLL2(1,H,C,C)含义:调用第二号DLL中标记为1的函数,此函数接受3个输入参数,其中第一个参数用于标记调用DLL中哪个函数。