如何编写通达信DLL的入口函数?
·
通达信DLL的入口函数编写需要遵循特定的接口规范,核心是实现RegisterTdxFunc函数并注册自定义函数。以下是详细的编写步骤和代码示例:
一、入口函数结构
通达信DLL的入口函数为RegisterTdxFunc,其作用是将自定义函数注册到通达信系统中。函数原型如下:
BOOL RegisterTdxFunc(PluginTCalcFuncInfo pFun);
- 参数:
pFun是一个指向PluginTCalcFuncInfo结构体数组的指针。 - 返回值:成功注册返回
TRUE,否则返回FALSE。
二、关键代码实现步骤
- 包含头文件
需引入通达信提供的头文件PluginTCalcFunc.h,定义函数结构和类型:
#include "PluginTCalcFunc.h" // 通达信DLL规范头文件
- 定义自定义函数
自定义函数需接受DataLen(数据长度)、pfOUT(输出数组)和三个输入数组(pfINa、pfINb、pfINc):
// 示例:计算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;
}
}
- 注册函数数组
通过全局变量g_CalcFuncSets定义注册的函数列表,每个函数需指定编号和地址:
PluginTCalcFuncInfo g_CalcFuncSets[] = {
{1, (pPluginFUNC)&MyMA}, // 函数编号1对应MyMA
{0, NULL} // 数组末尾必须以{0, NULL}结束
};
- 实现入口函数
在入口函数中将g_CalcFuncSets注册到通达信系统:
BOOL RegisterTdxFunc(PluginTCalcFuncInfo pFun) {
if (*pFun == NULL) {
*pFun = g_CalcFuncSets; // 将自定义函数数组传给通达信
return TRUE;
}
return FALSE;
}
- 导出入口函数
使用__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;
}
四、注意事项
- 参数传递规则:
DataLen表示数据长度(如742天或1800天)。- 输入数组
pfINa、pfINb、pfINc对应公式中的参数(如CLOSE、5、0)。 - 输出数组
pfOUT需填充结果,通达信通过TDXDLL1(1,CLOSE,5,0)调用该函数。
- 部署与绑定:
- 编译生成的DLL需复制到通达信安装目录的
T0002\dlls文件夹。 - 在通达信公式管理器中绑定DLL(如选择
TDXDLL1)。
- 编译生成的DLL需复制到通达信安装目录的
- 调试技巧:
- 使用
OutputDebugString输出日志,通过Visual Studio调试器查看。 - 确保函数编号唯一,避免冲突。
- 使用
五、扩展功能
若需实现更多功能(如选股逻辑或数据读取),可参考通达信提供的OutStruct.h和Plugin.h头文件,通过回调接口获取实时数据。例如:
// 通过回调函数获取历史数据
long ReadData(char* Code, short DataType, HISDAT* pData, short nDataNum) {
return g_pFuncCallBack(Code, 0, DataType, pData, nDataNum, 0, 0, 0, 0);
}
通过以上步骤,可完成通达信DLL入口函数的编写并实现自定义功能。
如果您觉得这篇文章对你有帮助,欢迎点赞、关注和评论!你的支持是我创作的最大动力!
更多推荐



所有评论(0)