警告:用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函数”按钮。

通达信Python dll引擎 通达信dll函数编程_通达信Python dll引擎

如上图:第二号DLL绑定了TestPluginTCale.dll

通达信Python dll引擎 通达信dll函数编程_数组_02

在指标公式编辑器中就可以用TDXDLL2第二号DLL函数了。

通达信Python dll引擎 通达信dll函数编程_数据_03

TDXDLL2(1,H,C,C)含义:调用第二号DLL中标记为1的函数,此函数接受3个输入参数,其中第一个参数用于标记调用DLL中哪个函数。