功能不够用?使用C++编写通达信插件及接入Python(一)
第一次尝试,参照:http://www.xiaoyunyun.net/index.php/archives/53.html 和 https://blog.csdn.net/wiowei/article/details/121466094
在绑定DLL环节失败了
第二次尝试:参照:https://zhuanlan.zhihu.com/p/569819868
1.修改VS2019,勾选 windows10 SDK
2. 用Visual studio 打开 “TestPluginTCale.dsw”文件
出现“评审项目和解决方案更改” ,直接 确定
出现迁移报告,存在错误
3.解决BUG - 修改项目属性
在解决方案资源管理器中,项目的 TestPluginTCale上右键 属性
在弹出框的 配置属性 c/c++ 常规 中,将 “调试信息格式”的选项更改为“程序数据库(/Zi)”
在 配置属性 c/c++ 代码生成 中 “启用最小重新生成”设为“否(/Gm-)”
在 配置属性 c/c++ 代码生成 中 “启用函数级链接”设为“是(/Gy)”
确定 后, VS2019菜单-生成-生成解决方案
4.打开Debug文件夹,把 dll 文件 复制到通达信目录下的 \T0002\dlls 目录里
在绑定DLL环节又失败了
5 参考https://gupiaozhushou.net/faq/q2.html
-------------------------------
- 2.为何通达信绑定order.dll失败?2015-2-1
答:从桌面快捷方式点击通达信图标运行通达信可能会导致绑定dll失败,可以直接到通达信目录运行通达信软件后再绑定。
-----------------------
重新绑定成功。
第三次尝试:继续参照http://www.xiaoyunyun.net/index.php/archives/53.html
1.打开vs2019 --.创建新项目--动态链接库(DLL)--下一步
2.项目名称设置为DemoPlugin,自己找一个目录位置, 创建
3.打开项目属性,查看平台为win32 查看 按照上面第二次尝试时的 配置属性 进行设置
------------------------------------------------------------------------------------------------------------------------
在弹出框的 配置属性 c/c++ 常规 中,将 “调试信息格式”的选项更改为“程序数据库(/Zi)”
在 配置属性 c/c++ 代码生成 中 “启用最小重新生成”设为“否(/Gm-)”
在 配置属性 c/c++ 代码生成 中 “启用函数级链接”设为“是(/Gy)”
--------------------------------------------------------------------------------------------------------------------------
4.到通达信帮助中心https://help.tdx.com.cn/book.asp下载“通达信DLL函数编程规范.rar”
---------------------------------------------------------------------------------------------------------------------
通达信DLL函数编程规范文件说明:
- TestPluginTCale.cpp:DLL入口点
- PluginTCalcFunc.h:导出函数声明
- TCalcFuncSets.h
- TCalcFuncSets.cpp:定义导出函数
----------------------------------------------------------------------------------------------------------------------
把压缩包中的“PluginTCalcFunc.h”拷贝到项目文件夹中,编写通达信插件只需要这个头文件
在解决方案资源管理器中添加这个头文件(第一次尝试时忘了这一步了:-;)
5.实现插件(dllmain.cpp)
// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include "PluginTCalcFunc.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } void DemoFunction(int argCount, float* outResult, float* inArg0, float* inArg1, float* inArg2); //加载的函数 PluginTCalcFuncInfo g_CalcFuncSets[] = { {1, (pPluginFUNC)&DemoFunction}, {0,NULL}, }; //导出给TCalc的注册函数 extern "C" __declspec(dllexport) BOOL RegisterTdxFunc(PluginTCalcFuncInfo * *pFun) { if (*pFun == NULL) { (*pFun) = g_CalcFuncSets; return TRUE; } return FALSE; } void DemoFunction(int argCount, float* outResult, float* inArg0, float* inArg1, float* inArg2) { for (int i = 0; i < argCount; i++) { outResult[i] = inArg0[i]; } }
这个插件实现了一个“DemoFunction”函数,该函数只是简单的把传入的第一个参数的值返回给通达信主程序。一个DLL可以暴露多个函数给通达信主程序,只需要在全局数组“g_CalcFuncSets”中添加一项。添加时请注意,函数的索引号不可重复,结尾的“{0,NULL}”必须保留。
6.编译插件
点击Visual Studio菜单“生成->生成解决方案”编译插件,编译时目标平台只能选择x86,因为通达信软件是32位的,如果插件编译成了64位则不能被加载。
7.绑定插件
调用插件前需要先绑定插件DLL,步骤如下:
7.1复制项目Debug目录中的“DemoPlugin.dll”到“通达信安装目录\T0002\dlls”中,插件如果有第三方依赖库也一并复制,如QT。
7.2直接到通达信目录运行通达信软件,在通达信软件中绑定DLL,使用菜单“功能->公式系统->公式管理器”打开公式管理器,点击“DLL函数”按钮绑定DLL
请记住你绑定的是第几号DLL,后面要用到。这里我选择 第2号DLL
------------------------------------------------------------------
其实不用记住也行,在通达信安装目录\T0002\dlls生成了dlls.ini,里面内容有:band2=DemoPlugin.dll ,表示第2号DLL绑定了DemoPlugin.dll
----------------------------------------------------------------
8.调用插件
8.1.在通达信公式管理器(技术指标公式-其它类型)中点击“新建”按钮,创建一个新的公式,设置公式名称为“DEMO”,公式代码填入 DEMO:TDXDLL2(1,CLOSE * 0.9, 0, 0);
“TDXDLL2”需要替换成你绑定的DLL的索引,如果你绑定的是第1号DLL那么就写“TDXDLL1”,支持“TDXDLL1”到“TDXDLL10”。
8.2.点击“确定”按钮保存公式。
8.3.关闭“公式管理器”,回到主界面。
8. 4.使用副图菜单“选择副图指标”选中刚才创建的“DEMO”公式 并且副图上有文字提示:用到DLL函数
至此,从插件编写到插件使用,一个完整闭环的过程就介绍完了。不知道你注意到没有,在通达信公式中“DEMO:TDXDLL2(1,CLOSE * 0.9, 0, 0);”的第二个参数填写的是“CLOSE * 0.9”,它的意思是收盘价 * 0.9,看起来是一个值乘以了0.9,但是在插件中接收到的参数类型却是float*,是一个数组,包含多个值。这就是通达信公式和c++插件之间概念的差异,站在c++角度看,通达信公式中的所有数据都是数组,连时间也是数组,在插件中处理时需要注意这点。
插件的调试
通达信软件有反调试机制,不能直接附加调试器到通达信进程进行调试。只能使用日志进行调试,把信息输出到日志中,通过查看日志定位Bug。
由于调试困难,下一篇将参考 https://zhuanlan.zhihu.com/p/613157262 用 DLL做桥接,连接python文件做开发