根据通达信DLL函数编程规范 - 注意事项,单个自定义函数限定了输入参数为 3 个,且不能多不能少。如果用不到 3 个参数,可以将用不到的输入位置置 0 来占位,但如果需要用到超过 3 个参数的,就需要其他解决方法了。

参数预处理法

比如计算过程中需要计算 H, L, C 的平均数\frac{H+L+C}{3},可以先在公式中直接处理,再将处理结果给到 DLL 函数中。方法也可以适用于:先调用 DLL 函数,将函数的返回结果输入下一个 DLL 函数。

简单示例,通达信公式:

AVG:=(H+L+C)/3;
X1:TDXDLL1(1, AVG, OPEN, V);

全局变量法

你可以将某几个 DLL 函数作为输入全局变量的入口,如以下的 1 号函数:

ref class GlobalObjects {
public:
    static float* H, L, C;
}

void TestPlugin1(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)
{
    GlobalObjects::H = pfINa;
    GlobalObjects::L = pfINb;
    GlobalObjects::C = pfINc;
}

通过TDXDLL1(1, H, L, C)这样的公式语句,即可将 H, L, C 三个参数保存到全局变量中,而后再编写其他的函数:

void TestPlugin2(int DataLen, float* pfOUT, float* pfINa, float* pfINb, float* pfINc)
{
    for(int i = 0; i < DataLen; i++) {
        pfOUT[i] = GlobalObjects::H[i] * pfINa[i] * 0.618
                 + GlobalObjects::L[i] * pfINb[i] * 0.382
                 + GlobalObjects::C[i] * pfINc[i];
        pfOUT[i] /= 2;
    }
}

再通过TDXDLL1(2, param1, param2, param3)调用返回结果即可。