通达信提供了插件选股功能,可以自己用C/C++语言开发选股插件。
把编译好的插件dll文件放入通达信目录下的plugin目录下,通过菜单功能>选股器>插件选股就可以使用了。
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#define PLUGIN_EXPORTS
#include "plugin.h"
/**********************************************************************
* MinGW 编译
* g++ -shared -mwindows -o MyPlugin.dll MyPlugin.cpp
**********************************************************************/
BOOL APIENTRY DllMain(HANDLE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
switch (fdwReason) {
case DLL_PROCESS_ATTACH: // 进程加载
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH: // 进程卸载
break;
}
return TRUE;
}
/*********************************************************
* 注册K线数据读取回调函数
*********************************************************/
PDATAIOFUNC readKData; // 读取K现数据的回调函数
void RegisterDataInterface(PDATAIOFUNC pfn){
readKData = pfn;
}
/*********************************************************
* 注册插件信息
*********************************************************/
void GetCopyRightInfo(LPPLUGIN info) {
//基本信息
strcpy(info->Name, "名称与版本");
strcpy(info->Dy, "产地");
strcpy(info->Author, "作者");
strcpy(info->Descript, "选股描述");
strcpy(info->Period, "适应周期");
strcpy(info->OtherInfo,"其他信息");
//参数信息
info->ParamNum = 2; // 0<=参数个数<=4
strcpy(info->ParamInfo[0].acParaName,"MA天数1"); // 参数的中文名称
info->ParamInfo[0].nMax=1; // 参数最小取值范围
info->ParamInfo[0].nMax=1000; // 参数最大取值范围
info->ParamInfo[0].nDefault=13; // 参数默认值
}
/*********************************************************
* 根据全部本地历史数据进行判断
* 返回真值(TRUE)为选中
*********************************************************/
BOOL InputInfoThenCalc1(
char * Code, // 股票代码 e.g. 002036
short nSetCode, // 股票市场 0=深市, 1=沪市
int Value[4], // 选股参数
short DataType, // 数据类型,默认为日K线历史数据,如申请行情数据则赋值为 REPORT_DAT
short nDataNum, // 数据个数
BYTE nTQ, // 是否精确除权
unsigned long unused
) {
// 分配空间
LPHISDAT pHisDat = new HISDAT[nDataNum]; //数据缓冲区
//利用回调函数申请数据,返回得到的数据个数
NTime tmpTime={0};
long readnum = m_pfn(Code,nSetCode,DataType,pHisDat,nDataNum,tmpTime,tmpTime,nTQ,0);
// 计算
/* ... ... */
// 释放空间
delete []pHisDat;
return TRUE
}
/*********************************************************
* 根据给定时间区间内的本地历史数据进行判断
* 返回真值(TRUE)为选中
*********************************************************/
BOOL InputInfoThenCalc2(
char * Code, // 股票代码 e.g. 002036
short nSetCode, // 股票市场 0=深市, 1=沪市
int Value[4], // 选股参数
short DataType, // 数据类型,默认为日K线历史数据,如申请行情数据则赋值为 REPORT_DAT
NTime time1, // 起始时间
NTime time2, // 结束时间
BYTE nTQ, // 是否精确除权
unsigned long unused
) {
// 计算区间内数据个数
long nDataNum = readKData(Code,nSetCode,DataType,NULL,-1,time1,time2,nTQ,0);
// 分配空间
LPHISDAT pHisDat = new HISDAT[datanum];
// 读取数据
long readnum = readKData(Code,nSetCode,DataType,pHisDat,datanum,time1,time2,nTQ,0);
// 计算
/* ... ... */
// 释放空间
delete []pHisDat;
return TRUE
}
/*****************定义在文件 "OutStruct.h" 中的数据结构 *********************
struct NTime {
unsigned short year;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
};
struct HISDAT {
NTime Time; //时间
float Open; //单位开盘价
float High; //单位最高价
float Low; //单位最低价
float Close; //单位收盘价
float Amount; //成交额
DWORD Volume; //单位成交量,指数无成交量
union {
float YClose; // 单位前收盘价(除权用) 或者 期货的持仓量
struct {
WORD up; // 上涨家数
WORD down; // 下跌家数
} zd; // 单位前收盘价(除权用),期货的持仓量
};
};
*************************************************************************/
利用通达信的选股插件,除了用来选股,也可以用来坐些数据统计和分析工作。
因为根据全部本地历史数据选股(InputInfoThenCalc1)时,实际上是已经提供了一个遍历个股全部数据的方法。可以借此,比如说,查找符合特定模式的K线形态进行统计分析。