pu369com

功能不够用?使用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

-------------------------------

答:从桌面快捷方式点击通达信图标运行通达信可能会导致绑定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文件做开发

 

posted on 2023-04-14 15:48  pu369com  阅读(2558)  评论(0编辑  收藏  举报

导航