首页 > 编程语言 >功能不够用?使用C++编写通达信插件及接入Python(一)

功能不够用?使用C++编写通达信插件及接入Python(一)

时间:2023-04-14 15:55:37浏览次数:53  
标签:插件 float Python 公式 绑定 C++ DLL 通达信

第一次尝试,参照: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文件做开发

 

标签:插件,float,Python,公式,绑定,C++,DLL,通达信
From: https://www.cnblogs.com/pu369/p/17318560.html

相关文章

  • python3控制结构
    1、介绍控制结构一般为:顺序结构,默认的从前到后执行顺序执行即是条件结构,if结构,python没有switch结构循环结构,while和for结构,以及迭代器,python不存在dowhile结构2、if结构if条件判断:passelif条件判断:passelse:pass3、while结构i=3whilei>0:......
  • ubuntu安装python开发环境
    一般ubuntu是自带python的,不需要安装。这里主要讲,更新pip,设置镜像源,配置虚拟环境,为后续开发做准备。一、更新pippip3configlist如果报没有config命令,说明pip版本不够高。aptinstallpython3-pip这里可以重新安装pip,一般不需要。pip3install-Up......
  • python 正则处理字符串,使用函数
    """在正则截取的字符子串基础上,处理字符串Python的re模块提供了re.sub用于替换字符串中的匹配项。语法:re.sub(pattern,repl,string,count=0,flags=0)参数:pattern:正则中的模式字符串。repl:替换的字符串,也可为一个函数。string:要被查找替换的原始字符串。cou......
  • python3 静态方法,类方法和普通方法
    classMyClass:@staticmethoddefstatic_method():print('静态方法')@classmethoddefclass_method(cls):print('类方法')#普通方法defnormal_method(self):print('普通方法')MyClass.stati......
  • python3 多继承时,父类有相同一个函数的选择
    classPeople:name=''age=0__weight=0def__init__(self,name,age,weight):print("People初始化")self.age=ageself.name=nameself.__weight=weightprint("People......
  • python3 各种方式连接mysql数据库
    print("python连接mysql数据库")#importmysql.connector"""#1使用mysql-connector连接mysqlimportmysql.connectormydb=mysql.connector.connect(host="localhost",user="clever",passwd="1881301"......
  • 列举说明Python同Java及C++的不同之处
    首先是C++C++是在C语言的基础上发展起来的,他包含了C语言的所有内容。同时,也引入了面向对象的概念。优点:1、他包含了C语言的内容,包括指针,使得C++在执行效率上特别的高效。2、引入面向对象的概念,使得开发效率提高。3、提供了很多的库,具有较好的封装性和移植性(代码)。缺点:1、C++比较难......
  • 对比Python中的列表、元组、字典、集合、字符串等之间异同
    1.数据类型列表、元组、字典、集合、字符串均属于python3的标准数据类型。字符串和元组属于不可变数据,即创建后不可修改。列表、字典、集合属于可变数据,即创建后可以修改元素。2.创建有元素的对象3.创建没有元素的对象列表使用eval()或list()或中括号[]进行创建,元素之间使用逗号分......
  • 【C/C++】assert实现
     #defineMLA_ASSERT(expr)(void)((!!(expr))||(printf("mlaassertfail:\"%s\"@%s,%u",#expr,__FILENAME__,__LINE__),printf("\r\n"),abort()//usage:MLA_ASSERT(pointer!=NULL)#defineMLA_ASSERT(expr)(vo......
  • python + QXDM5高通平台通过自动化截取log方法及代码
    转自python+QXDM5高通平台通过自动化截取log方法及代码准备工作:1.安装QXDM52.配置adb环境变量3.使用python3以上4.完成代码如下1importsys2importtime3importos45ifsys.platform.startswith("linux"):6sys.path.append('/opt/qcom/QXD......