通达信DLL的入口函数编写需要遵循特定的接口规范,核心是实现RegisterTdxFunc函数并注册自定义函数。以下是详细的编写步骤和代码示例:


一、入口函数结构
通达信DLL的入口函数为RegisterTdxFunc,其作用是将自定义函数注册到通达信系统中。函数原型如下:

BOOL RegisterTdxFunc(PluginTCalcFuncInfo pFun);
  • 参数:pFun是一个指向PluginTCalcFuncInfo结构体数组的指针。
  • 返回值:成功注册返回TRUE,否则返回FALSE

二、关键代码实现步骤

  1. 包含头文件
    需引入通达信提供的头文件PluginTCalcFunc.h,定义函数结构和类型:
#include "PluginTCalcFunc.h" // 通达信DLL规范头文件
  1. 定义自定义函数
    自定义函数需接受DataLen(数据长度)、pfOUT(输出数组)和三个输入数组(pfINapfINbpfINc):
// 示例:计算5日均线的自定义函数
void MyMA(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc) {
    int period = (int)*pfINb; // 从输入参数获取周期(如5日)
    for (int i = period - 1; i < DataLen; i++) {
        float sum = 0.0f;
        for (int j = 0; j < period; j++) {
            sum += pfINa[i - j];
        }
        pfOUT[i] = sum / period;
    }
}
  1. 注册函数数组
    通过全局变量g_CalcFuncSets定义注册的函数列表,每个函数需指定编号和地址:
PluginTCalcFuncInfo g_CalcFuncSets[] = {
    {1, (pPluginFUNC)&MyMA}, // 函数编号1对应MyMA
    {0, NULL}                // 数组末尾必须以{0, NULL}结束
};
  1. 实现入口函数
    在入口函数中将g_CalcFuncSets注册到通达信系统:
BOOL RegisterTdxFunc(PluginTCalcFuncInfo pFun) {
    if (*pFun == NULL) {
        *pFun = g_CalcFuncSets; // 将自定义函数数组传给通达信
        return TRUE;
    }
    return FALSE;
}
  1. 导出入口函数
    使用__declspec(dllexport)声明入口函数,确保通达信能识别:
extern "C" __declspec(dllexport) BOOL RegisterTdxFunc(PluginTCalcFuncInfo pFun);

三、完整代码示例

#include "PluginTCalcFunc.h"
// 自定义函数:计算均线
void MyMA(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc) {
    int period = (int)*pfINb;
    for (int i = period - 1; i < DataLen; i++) {
        float sum = 0.0f;
        for (int j = 0; j < period; j++) {
            sum += pfINa[i - j];
        }
        pfOUT[i] = sum / period;
    }
}
// 注册函数数组
PluginTCalcFuncInfo g_CalcFuncSets[] = {
    {1, (pPluginFUNC)&MyMA},
    {0, NULL}
};
// 入口函数
extern "C" __declspec(dllexport) BOOL RegisterTdxFunc(PluginTCalcFuncInfo pFun) {
    if (*pFun == NULL) {
        *pFun = g_CalcFuncSets;
        return TRUE;
    }
    return FALSE;
}

四、注意事项

  1. 参数传递规则:
    • DataLen表示数据长度(如742天或1800天)。
    • 输入数组pfINapfINbpfINc对应公式中的参数(如CLOSE50)。
    • 输出数组pfOUT需填充结果,通达信通过TDXDLL1(1,CLOSE,5,0)调用该函数。
  2. 部署与绑定:
    • 编译生成的DLL需复制到通达信安装目录的T0002\dlls文件夹。
    • 在通达信公式管理器中绑定DLL(如选择TDXDLL1)。
  3. 调试技巧:
    • 使用OutputDebugString输出日志,通过Visual Studio调试器查看。
    • 确保函数编号唯一,避免冲突。

五、扩展功能
若需实现更多功能(如选股逻辑或数据读取),可参考通达信提供的OutStruct.hPlugin.h头文件,通过回调接口获取实时数据。例如:

// 通过回调函数获取历史数据
long ReadData(char* Code, short DataType, HISDAT* pData, short nDataNum) {
    return g_pFuncCallBack(Code, 0, DataType, pData, nDataNum, 0, 0, 0, 0);
}

通过以上步骤,可完成通达信DLL入口函数的编写并实现自定义功能。

如果您觉得这篇文章对你有帮助,欢迎点赞、关注和评论!你的支持是我创作的最大动力!

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐