可以从 通达信帮助中心-用户红宝书 下载通达信DLL函数编程规范.rar 查看基本内容和框架。采用 VC++ 进行编写。

接口规范

实际上,就是导出了RegisterTdxFunc函数。通达信在载入 DLL 时,尝试调用这个函数,并将一个二维指针对象PluginTCalcFuncInfo**传入函数,获取指向绘图函数的数组。

BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun)
{
    if (*pFun == NULL)
    {
        (*pFun) = g_CalcFuncSets;
        return TRUE;
    }
    return FALSE;
}

其中PluginTCalcFuncInfo的结构:

typedef struct tagPluginTCalcFuncInfo
{
    unsigned short    nFuncMark;//函数编号
    pPluginFUNC       pCallFunc;//函数地址
}PluginTCalcFuncInfo;

pPluginFUNC是函数指针:

// 函数(数据个数,输出,输入a,输入b,输入c)
typedef void(*pPluginFUNC)(int, float*, float*, float*, float*);

g_CalcFuncSets初始化时:

PluginTCalcFuncInfo g_CalcFuncSets[] =
{
    {1, (pPluginFUNC)&TestPlugin1},
    {2, (pPluginFUNC)&TestPlugin2},
    {0, NULL},
};

TestPlugin1TestPlugin2

void TestPlugin1(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)
{
    for (int i = 0; i < DataLen; i++)
        pfOUT[i] = i;
}

void TestPlugin2(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)
{
    for (int i = 0; i < DataLen; i++)
    {
        pfOUT[i] = pfINa[i] + pfINb[i] + pfINc[i];
        pfOUT[i] = pfOUT[i] / 3;
    }
}

注意事项

根据pPluginFUNC的定义,固定了输入序列有三个:

// 函数(数据个数,输出,输入a,输入b,输入c)
typedef void(*pPluginFUNC)(int, float*, float*, float*, float*);

在编辑通达信公式并调用时:

XX:TDXDLL1(1, H, L, C);
{1 - 第一号公式,即在 g_CalcFuncSets 中序号为 1 的公式}
{剩余的 H, L, C 是固定的三个输入参数,对应输入a,输入b,输入c}

可以看到,通达信 DLL 公式函数,最多支持三个输入序列(或常数),哪怕你用不到这几个参数,也要给。关于如何给函数调用更多公式,详见通达信 DLL 指标多参数解决方法