功能不够用?使用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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | // 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文件做开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2020-04-14 python+tkinter+pyautogui 自制截屏软件