通达信数据-通达信DLL股票插件编程part4 - 非可视化插件开发流程

Published

开发环境

Window 10

Visual Studio 2026 c++

 

准备工作

 

类别具体内容说明
开发工具Visual Studio 2017及以上版本(本例使用的2022版)支持C++ DLL项目编译,兼容通达信DLL开发规范
参考资料《通达信DLL函数编程规范》通达信官网下载,包含接口定义、工程模板、开发要求
测试环境通达信客户端(对应32/64位版本)用于测试编译后的DLL功能有效性

开始编写前请做好准备工作,去通达信官网下载《通达信DLL函数编程规范》,下载地址是:
通达信帮助中心

解压,你会得到

 

创建项目(创建DLL项目)

通达信插件是以动态库(DLL)方式插入的,因此需要创建一个动态库项目

项目创建好了以后把压缩包“通达信DLL函数编程规范.rar”中的“PluginTCalcFunc.h”拷贝到项目文件夹中,编写通达信插件只需要这个头文件,头文件的内容如下:

 

 

实现插件

 

通达信DLL函数编程规范文件说明:

TestPluginTCale.cpp:DLL入口点
PluginTCalcFunc.h:导出函数声明
TCalcFuncSets.h
TCalcFuncSets.cpp:定义导出函数

 

step 1.添加2个函数

src/DemoPlugin/dllmain.cpp

void TestPlugin1(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)
{
	for(int i=0;i<DataLen;i++)
		pfOUT[i]=i;
}

void TestPlugin2(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)
{
	for(int i=0;i<DataLen;i++)
	{
		pfOUT[i]=pfINa[i]+pfINb[i]+pfINc[i];
		pfOUT[i]=pfOUT[i]/3;
	}
}

 

step 2.实现核心数据接口 (TCalcFuncInfo)

通达信通过一个结构体数组来识别 DLL 中有哪些函数可用。

g_CalcFuncSets[]: 这是一个全局数组,起到了“菜单”的作用。

{1, (pPluginFUNC)&TestPlugin1}:表示将 TestPlugin1 函数注册为 DLL 中的 1号函数。在通达信公式里调用 TDXDLL1(1, ...) 就会执行它。
{0, NULL}:这是终止符号,告诉通达信“菜单到此结束”,防止程序继续读取越界内存。

 

实现 TCalcFuncSet 导出函数

// step 2. 将函数注册到 DLL中
PluginTCalcFuncInfo g_CalcFuncSets[] =
{
    {1, (pPluginFUNC)&TestPlugin1},
    {2, (pPluginFUNC)&TestPlugin2},
    {0, NULL},
};

/*
通达信通过一个结构体数组来识别 DLL 中有哪些函数可用。

g_CalcFuncSets[]: 这是一个全局数组,起到了“菜单”的作用。

{1, (pPluginFUNC)&TestPlugin1}:表示将 TestPlugin1 函数注册为 DLL 中的 1号函数。在通达信公式里调用 TDXDLL1(1, ...) 就会执行它。

{0, NULL}:这是终止符号,告诉通达信“菜单到此结束”,防止程序继续读取越界内存。

使用方法

暴露某个函数给通达信主程序,只需要在全局数组“g_CalcFuncSets”中添加一项即可。每项包含一个函数编号和对应的函数地址。
*/

 step 3. 注册机制 (RegisterTdxFunc)-导出注册函数

//导出给TCalc的注册函数
BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun)
{
    if (*pFun == NULL)
    {
        // 将函数列表的指针传给通达信
        (*pFun) = g_CalcFuncSets;  
        return TRUE;
    }
    return FALSE;
}
/*
这是整个 DLL 的入口点.
当在通达信“公式管理器”中点击“绑定 DLL”并选择该文件时,通达信会寻找并调用 RegisterTdxFunc.
它将内部定义的 g_CalcFuncSets 地址传递给通达信主程序,从而完成函数的挂载。
*/

 

项目编译设置

 

配置类型:

“配置属性 -> 常规 -> 配置类型”为“动态库(.dll)”

 

点击Visual Studio菜单“生成->生成解决方案”编译插件,编译时目标平台选择x64,因为通达信软件是64位的。

Note

2024 年 7 月前,通达信仅支持 32 位 DLL;

目前已支持 64 位 DLL,需确保 DLL 位数与通达信客户端版本完全匹配(32 位对应 32 位、64 位对应 64 位

平台配置:

项目 -> 鼠标右击【属性】

常规 ->  调试信息格式 -> 【程序数据库】

代码生成 -> 启用最小重新生成【否】 - 启用函数级链接【是】

 

字符集:

右键项目 -> 属性 -> 配置属性 -> 高级 -> 字符集,选择“使用多字节字符集”

 

C++标准:

配置属性 -> C/C++ -> 语言 -> C++标准,选择ISO C++17或更低版本(保证兼容性)

 

编译插件

点击Visual Studio菜单“生成->生成解决方案”编译插件

output

重新生成开始于 上午1:10...
1>------ 已启动全部重新生成: 项目: DemoPlugin, 配置: Debug x64 ------
1>  pch.cpp
1>  dllmain.cpp
1>F:\stock\TdxDllCcpluscplus\src\DemoPlugin\dllmain.cpp(26,20): warning C4244: “=”: 从“int”转换到“float”,可能丢失数据
1>  (编译源文件“/dllmain.cpp”)
1>  DemoPlugin.vcxproj -> F:\stock\TdxDllCcpluscplus\x64\Debug\DemoPlugin.dll
========== 全部重新生成: 1 成功,0 失败,0 已跳过 ==========
========== 重新生成 于 上午1:10 完成,耗时 09.497 秒 ==========

 

将生成的 .dll 文件放入通达信安装目录下的 T0002/dlls/ 文件夹中

打开Debug文件夹,把 dll 文件 复制到通达信 D:\Thirdprogram\newtdx773_64\T0002\dlls 目录里

D:\Thirdprogram\newtdx773_64\T0002\dlls

若 DLL 存在依赖文件(如其他辅助 DLL、配置文件),需一并复制。

 

useful links

blog

使用C++编写通达信公式插件

http://www.xiaoyunyun.net/index.php/archives/53.html

 

32位编译设置

https://zhuanlan.zhihu.com/p/569819868

https://zhuanlan.zhihu.com/p/1991081822759719157

https://zhuanlan.zhihu.com/p/1898341945929082053