通达信DLL函数编程Delphi接口规范

这篇博客介绍了如何使用DLL函数来扩展股票软件的功能,特别是对于编程爱好者进行数据挖掘和复杂计算的需求。用户需要遵循通达信接口规范编写DLL,并通过全局数组g_CalcFuncSets注册函数。在DLL中定义了多个函数,每个函数都有唯一的标记和函数指针,用于接收和处理股票数据。用户可以通过公式管理器调用这些DLL函数,增强股票指标的计算能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

警告:用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中哪个函数。

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值