可以从 通达信帮助中心-用户红宝书 下载通达信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},
};
TestPlugin1
和 TestPlugin2
:
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 指标多参数解决方法。