是不是要得这个东东??
/***************************************************************************************** 分析家证券投资分析系统行情接口规范V2.1
* (适用于单向数据传输方式)
****************************************************************************************/
****************************************************************************************/
* 驱动程序安装后,应该在系统注册库中注册以下信息,分析软件通过该注册信息启动动态库 *
* HKEY_LOCAL_MACHINE/SOFTWARE/StockDrv 下 *
* Driver= "驱动DLL全路径" *
****************************************************************************************/
#ifndef __STOCKDRV_H__
#define __STOCKDRV_H__
/////////////////////////////////////////////////////////////////////////////////
//增补说明
//1。2001年9月1日,增补深圳行情库SJS库的更改
// a.工作模式增加RCV_WORK_SENDMSG模式,建议驱动程序支持RCV_WORK_MEMSHARE和RCV_WORK_SENDMSG两种工作模式以支持各种版本的分析家
// b.RCV_WORK_SENDMSG工作模式与RCV_WORK_MEMSHARE的唯一区别在于使用RCV_REPORT_STRUCTExV2数据结构替代RCV_REPORT_STRUCTEx数据结构传输动态行情
// c.若GetStockDrvInfo(RI_V2SUPPORT)返回1,则分析家启用RCV_WORK_SENDMSG工作模式,否则启用RCV_WORK_MEMSHARE工作模式,分析家采用这种方式来兼容前后版本
// d.采用RCV_WORK_SENDMSG工作模式,分析家系统能够支持4位和6位深圳股票代码
// e.RCV_WORK_SENDMSG工作模式只在分析家V4.01.00后的版本才支持。
/////////////////////////////////////////////////////////////////////////////////
// 工作方式类型定义
#define RCV_WORK_DEMAND 0 // 查询接口,方式一
#define RCV_WORK_MEMSHARE 2 // 内存共享直接引用,方式二
#define RCV_WORK_SENDMSG 4 // 版本 2 建议使用的方式,对于六位代码的深圳市场必须使用这种模式
// 其他工作方式保留
/*
指数代号-名称
1A0001上证综合指数]综合指数 1A0002上证A股指数 1A0003上证B股指数
1B0001上证工业指数 1B0002上证商业指数]商业指数 1B0004上证地产指数]地产指数]地产指数]地产指数
1B0005上证公用事业 1B0006上证综合 1B0007上证30指数
2A01 深证成分指数 2A02 深证成分A 2A03 深证成分B
2B01 深证工业 2B02 深证商业 2B03 深证金融
2B04 深证地产 2B05 深证公共事业 2B06 深证综合
2B07 深证基金 2C01 深证指数 2C02 深证A股
2C03 深证B股
*/
/////////////////////////////////////////////////////////////////////////////////////////
// 以下是接口方式二
// 证券市场
#define SH_MARKET_EX 'HS' // 上海
#define SZ_MARKET_EX 'ZS' // 深圳
#define HK_MARKET_EX 'KH' // 香港
// 文件数据类型
// 结构数组形式的文件数据
#define FILE_HISTORY_EX 2 // 补日线数据
#define FILE_MINUTE_EX 4 // 补分钟线数据
#define FILE_POWER_EX 6 // 补充除权数据
#define FILE_BASE_EX 0x1000 // 钱龙兼容基本资料文件,m_szFileName仅包含文件名
#define FILE_NEWS_EX 0x1002 // 新闻类,其类型由m_szFileName中子目录名来定
#define FILE_HTML_EX 0x1004 // HTML文件,m_szFileName为URL
#define FILE_SOFTWARE_EX 0x2000 // 升级软件
// 消息子类型
#define News_Sha_Ex 2 // 上证消息
#define News_Szn_Ex 4 // 深证消息
#define News_Fin_Ex 6 // 财经报道
#define News_TVSta_Ex 8 // 电视台通知
#define News_Unknown_Ex -1 // 未知提供者
//Definition For nInfo of Function GetStockDrvInfo(int nInfo,void * pBuf);
#define RI_IDSTRING 1 // 厂商名称,返回(LPCSTR)厂商名
#define RI_IDCODE 2 // 卡号
#define RI_VERSION 3 // 驱动程序版本
#define RI_V2SUPPORT 6 // 支持深圳SJS库结构
#define STKLABEL_LEN 10 // 股号数据长度,国内市场股号编码兼容钱龙
#define STKNAME_LEN 32 // 股名长度
//////////////////////////////////////////////////////////////////////////////////
//行情数据(版本1数据结构RCV_WORK_MEMSHARE)
typedef struct tagRCV_REPORT_STRUCTEx
{
WORD m_wMarket; // 股票市场类型
char m_szLabel; // 股票代码,以'\0'结尾
char m_szName; // 股票名称,以'\0'结尾
float m_fLastClose; // 昨收
float m_fOpen; // 今开
float m_fHigh; // 最高
float m_fLow; // 最低
float m_fNewPrice; // 最新
float m_fVolume; // 成交量
float m_fAmount; // 成交额
float m_fBuyPrice; // 申买价1,2,3
float m_fBuyVolume; // 申买量1,2,3
float m_fSellPrice; // 申卖价1,2,3
float m_fSellVolume; // 申卖量1,2,3
} RCV_REPORT_STRUCTEx;
//////////////////////////////////////////////////////////////////////////////////
//行情数据(版本2数据结构RCV_WORK_SENDMSG)
typedef struct tagRCV_REPORT_STRUCTExV2
{
WORD m_cbSize; // 结构大小
time_t m_time; // 成交时间
WORD m_wMarket; // 股票市场类型
char m_szLabel; // 股票代码,以'\0'结尾
char m_szName; // 股票名称,以'\0'结尾
float m_fLastClose; // 昨收
float m_fOpen; // 今开
float m_fHigh; // 最高
float m_fLow; // 最低
float m_fNewPrice; // 最新
float m_fVolume; // 成交量
float m_fAmount; // 成交额
float m_fBuyPrice; // 申买价1,2,3
float m_fBuyVolume; // 申买量1,2,3
float m_fSellPrice; // 申卖价1,2,3
float m_fSellVolume; // 申卖量1,2,3
float m_fBuyPrice4; // 申买价4
float m_fBuyVolume4; // 申买量4
float m_fSellPrice4; // 申卖价4
float m_fSellVolume4; // 申卖量4
} RCV_REPORT_STRUCTExV2;
//////////////////////////////////////////////////////////////////////////////////
//补充数据头
//数据头 m_dwHeadTag == EKE_HEAD_TAG
#define EKE_HEAD_TAG 0xffffffff
typedef struct tagRCV_EKE_HEADEx
{
DWORD m_dwHeadTag; // = EKE_HEAD_TAG
WORD m_wMarket; // 市场类型
char m_szLabel; // 股票代码
}RCV_EKE_HEADEx;
//补充日线数据
typedef union tagRCV_HISTORY_STRUCTEx
{
struct
{
time_t m_time; //UCT
float m_fOpen; //开盘
float m_fHigh; //最高
float m_fLow; //最低
float m_fClose; //收盘
float m_fVolume; //量
float m_fAmount; //额
WORD m_wAdvance; //涨数,仅大盘有效
WORD m_wDecline; //跌数,仅大盘有效
};
RCV_EKE_HEADEx m_head;
}RCV_HISTORY_STRUCTEx;
//补充分时线数据
typedef union tagRCV_MINUTE_STRUCTEx
{
struct{
time_t m_time; // UCT
float m_fPrice;
float m_fVolume;
float m_fAmount;
};
RCV_EKE_HEADEx m_head;
}RCV_MINUTE_STRUCTEx;
//补充除权数据
typedef union tagRCV_POWER_STRUCTEx
{
struct
{
time_t m_time; // UCT
float m_fGive; // 每股送
float m_fPei; // 每股配
float m_fPeiPrice; // 配股价,仅当 m_fPei!=0.0f 时有效
float m_fProfit; // 每股红利
};
RCV_EKE_HEADEx m_head;
}RCV_POWER_STRUCTEx;
//////////////////////////////////////////////////////////////////////////////////
// 文件类型数据包头
//注一:
// m_wDataType == FILE_BASE_EX
// m_dwAttrib = 股票证券市场,m_szFileName仅包含文件名
//m_wDataType == FILE_NEWS_EX
// m_dwAttrib = 消息来源,m_szFileName 包含目录的文件名,目录名为消息来源
// 如:"上交所消息\\0501Z012.TXT","新兰德\\XLD0001.TXT"
//m_wDataType == FILE_HTML_EX
// m_dwAttrib 保留, m_szFileName为URL
// m_wDataType == FILE_SOFTWARE_EX
// m_dwAttrib 分析软件类型, 用于初步判断
// m_szFileName 分析软件 ID 特征字符串 + '\\' + 文件名
// 如 "SuperStk\\SuperStk.EXE",
// ID 特征字符串为 "SuperStk", "SuperStk.EXE" 为文件名
// 特征字符串 和 文件名及其含义由分析软件商定义
//注二:
// 数据文件循环播出,每个文件有唯一的序列号,以避免重复接收
typedef struct tagRCV_FILE_HEADEx
{
DWORD m_dwAttrib; // 文件子类型
DWORD m_dwLen; // 文件长度
DWORD m_dwSerialNo; // 序列号
char m_szFileName; // 文件名 or URL
} RCV_FILE_HEADEx;
//////////////////////////////////////////////////////////////////////////////////
//数据通知消息
//直接数据引用通知消息
// wParam = RCV_WPARAM;
//lParam 指向 RCV_DATA结构;
// 返回 1 已经处理, 0 未处理或不能处理
#define RCV_REPORT 0x3f001234
#define RCV_FILEDATA 0x3f001235
// 注一:
// 记录数表示行情数据和补充数据(包括 Header)的数据包数,对文件类型数据, = 1
// 注二:
// 若 m_bDISK = FALSE, m_pData 为数据缓冲区指针
// ******** 数据共享,不能修改数据 **********
// m_bDISK = TRUE,m_pData 为该文件的存盘文件名,一般情况只有
// 升级软件等大文件用存盘方式
typedef struct tagRCV_DATA
{
int m_wDataType; // 文件类型
int m_nPacketNum; // 记录数,参见注一
RCV_FILE_HEADEx m_File; // 文件接口
BOOL m_bDISK; // 文件是否已存盘的文件
union
{
RCV_REPORT_STRUCTEx* m_pReport;
RCV_REPORT_STRUCTExV2 * m_pReportV2;
RCV_HISTORY_STRUCTEx * m_pDay;
RCV_MINUTE_STRUCTEx* m_pMinute;
RCV_POWER_STRUCTEx * m_pPower;
void * m_pData; // 参见注二
};
} RCV_DATA;
/* 消息处理程序 DEMO
LONG OnStkDataOK(UINT wParam,LONG lParam)
{
RCV_DATA* pHeader;
pHeader = (RCV_DATA *)lParam;
switch( wParam )
{
case RCV_REPORT: // 共享数据引用方式,股票行情
for(i=0; i<pHeader->m_nPacketNum; i++)
{
pHeader->m_pReport ...
// 数据处理
}
break;
case RCV_FILEDATA: // 共享数据引用方式,文件
switch(pHeader->m_wDataType)
{
case FILE_HISTORY_EX: // 补日线数据
break;
case FILE_MINUTE_EX: // 补分钟线数据
break;
case FILE_POWER_EX: // 补充除权数据
break;
case FILE_BASE_EX: // 钱龙兼容基本资料文件,m_szFileName仅包含文件名
break;
case FILE_NEWS_EX: // 新闻类,其类型由m_szFileName中子目录名来定
break;
case FILE_HTML_EX: // HTML文件,m_szFileName为URL
break;
case FILE_SOFTWARE_EX: // 升级软件
break;
}
break;
default:
return 0; // unknown data
}
return 1;
}
*/
//////////////////////////////////////////////////////////////////////////////////
//APIs
#ifdef __cplusplus
extern "C"{
#endif
//////////////////////////////////////////////////////////////////////////////////
// 注册函数
// 股票初始化
// 入口参数:
// hWnd 处理消息的窗口句柄
// Msg 用户自定义消息
// nWorkMode 接口工作方式,参见工作方式类型定义
// 返回参数:
// 1 成功
// -1 失败
// 注:
// 注册后,驱动程序会向处理窗口发送消息; 若不注册,通过查询方式亦可取得数据
// 若股票接收没启动,则启动股票接收程序
int WINAPI Stock_Init(HWND hWnd,UINT Msg,int nWorkMode);
// 退出,停止发送消息
// 入口参数:
// hWnd 处理消息的窗口句柄,同 Stock_Init 的调用入口参数
// 返回参数:
// 1 成功
// -1 失败
int WINAPI Stock_Quit(HWND hWnd);
// 激活接收程序,进行设置
// 入口参数:
// bSetup TRUE 显示窗口,进行设置
// FALSE 隐含窗口
// 返回参数:
// 1 成功
// -1 失败
int WINAPISetupReceiver(BOOL bSetup);
// 取得股票驱动信息
// 入口参数:
// nInfo 索引
// pBuf 缓冲区
// 出口参数:
// nInfo == RI_IDSTRING, 返回特征字符串长度, pBuf 为特征字符串
// 如: "TongShi_StockDrv_1.00"
// nInfo == RI_IDCODE, 返回信息卡 ID 号, pBuf 为字符串形式的 ID 号
// 如: 0x78001234 "78001234"
// nInfo == RI_VERSION, 返回信息卡版本号, pBuf 为字符串版本
// 如:1.00 "1.00"
// nInfo == RI_V2SUPPORT, 返回是否支持深圳SJS库结构, pBuf无效
DWORD WINAPIGetStockDrvInfo(int nInfo,void * pBuf);
void WINAPIReInitStockInfo();
//重新取得股票数据
#ifdef __cplusplus
}
#endif 顶!!!!!!! 我需要,多谢ak4701的支持,我的邮箱事wupangzi@hotmail.com 我最新完成了一个上证,深证上市股票的时时数据更新程序
平均两分钟搜索更新数据,并生成一个股票数据文本文件
(也可以改成数据库),对数据有兴趣的朋友可以联系我
(e-mail:stockseller@163.com)
有这么复杂吗,在宏汇NSD中很简单!
看宏汇NSD中的数据输出:程序如下,当然这个程序只能够在宏汇NSD中使用,您可以在www.hh.com.cn/nsd下载宏汇NSD,然后在菜单上选择“工具->数据输出”,再在数据输出窗口左上角选择“新建数据输出”,在选择数据输项目里选择“分笔数据输出2”,以后的操作都是向导,直至完成。
////////////////////////////////////////////////////////////////////////
//输出指定品种和指定日期的分笔数据(Tick)
////////////////////////////////////////////////////////////////////////
//定义dbf类
DBF类 dbf;
//定义输出文件的路径和名称
char dbfname;
//sprintf(dbfname, "%s\\0001.dbf", 输出路径);
sprintf(dbfname, "%s\\%s%s%d至%d的分笔数据.dbf", 输出路径,当前品种代码,当前品种名称,开始日期,截止日期);
输出("文件保存路径为%s", dbfname);
//输出("%s", dbfname);
//判断创建数据库是否成功
if (!dbf.创建数据库(dbfname))
{
显示调试信息(错误, "创建“%s”失败", dbfname);
return;
}
//判断用户选择字段信息
if (是否含有字段("时间")) dbf.添加字段("Time",'C', 20, 0, "时间");
if (是否含有字段("价格")) dbf.添加字段("Price", 'N', 6, 2, "价格");
if (是否含有字段("买/卖")) dbf.添加字段("BS", 'C', 2, 0, "买/卖");
if (是否含有字段("成交量")) dbf.添加字段("Volume",'N', 6, 0, "成交量");
if (是否含有字段("成交金额"))dbf.添加字段("Money", 'N', 6, 2, "成交金额");
if (是否含有字段("成交笔数"))dbf.添加字段("bishu", 'N', 6, 0, "成交笔数");
if (是否含有字段("卖量5"))dbf.添加字段("SV5", 'N', 6, 0, "卖量5");
if (是否含有字段("卖量4"))dbf.添加字段("SV4", 'N', 6, 0, "卖量4");
if (是否含有字段("卖量3"))dbf.添加字段("SV3", 'N', 6, 0, "卖量3");
if (是否含有字段("卖量2"))dbf.添加字段("SV2", 'N', 6, 0, "卖量2");
if (是否含有字段("卖量1"))dbf.添加字段("SV1", 'N', 6, 0, "卖量1");
if (是否含有字段("卖价5"))dbf.添加字段("SP5", 'N', 6, 2, "卖价5");
if (是否含有字段("卖价4"))dbf.添加字段("SP4", 'N', 6, 2, "卖价4");
if (是否含有字段("卖价3"))dbf.添加字段("SP3", 'N', 6, 2, "卖价3");
if (是否含有字段("卖价2"))dbf.添加字段("SP2", 'N', 6, 2, "卖价2");
if (是否含有字段("卖价1"))dbf.添加字段("SP1", 'N', 6, 2, "卖价1");
if (是否含有字段("买量1"))dbf.添加字段("BV1", 'N', 6, 0, "买量1");
if (是否含有字段("买量2"))dbf.添加字段("BV2", 'N', 6, 0, "买量2");
if (是否含有字段("买量3"))dbf.添加字段("BV3", 'N', 6, 0, "买量3");
if (是否含有字段("买量4"))dbf.添加字段("BV4", 'N', 6, 0, "买量4");
if (是否含有字段("买量5"))dbf.添加字段("BV5", 'N', 6, 0, "买量5");
if (是否含有字段("买价1"))dbf.添加字段("BP1", 'N', 6, 2, "买价1");
if (是否含有字段("买价2"))dbf.添加字段("BP2", 'N', 6, 2, "买价2");
if (是否含有字段("买价3"))dbf.添加字段("BP3", 'N', 6, 2, "买价3");
if (是否含有字段("买价4"))dbf.添加字段("BP4", 'N', 6, 2, "买价4");
if (是否含有字段("买价5"))dbf.添加字段("BP5", 'N', 6, 2, "买价5");
if (是否含有字段("买比")) dbf.添加字段("bsRatio", 'N', 6, 2, "买比");
//定义分笔成交类
分笔成交类 clsTick;
//输出("%d - %d", 开始索引, 截止索引);
//取数据日期(周期),并输出成交价格、成交量和成交金额
long lDate, lTime;
char szMark;
char szTime;
for (int j=开始索引; j<=截止索引; j++)
{
lDate = K线数据.取日期();
输出("输出%s股票 %d的分笔数据",当前品种代码,lDate);
if (!clsTick.读取分笔成交(lDate))
{
输出("输出日期为%d 的数据失败! 请先下载该代码的Tick数据", lDate);
continue;
}
int total = clsTick.总笔数();
int intVolume=0;
输出("成交总笔数%d", total);
for (int i=0; i<total; i++)
{
sprintf(szMark, "%c", clsTick[买卖标志]);
lTime = clsTick.取时间();
sprintf(szTime, "%2d-%2d-%2d %2d:%2d:%2d", lDate / 10000, lDate / 100 % 100, lDate % 100, lTime / 10000, lTime / 100 % 100, lTime % 100);
dbf.设置字符串("Time", szTime);
dbf.设置数据("Price",clsTick[成交价]);
dbf.设置字符串("BS",szMark);
intVolume=(i>0)?clsTick[成交量]-clsTick[成交量] : clsTick[成交量];
dbf.设置数据("Volume",intVolume);
dbf.设置数据("Money",intVolume*clsTick[成交价]);
dbf.设置数据("bishu",(i>0) ? clsTick[成交笔数]-clsTick[成交笔数] : clsTick[成交笔数]);
dbf.设置数据("SV5",clsTick[卖量5]);
dbf.设置数据("SV4",clsTick[卖量4]);
dbf.设置数据("SV3",clsTick[卖量3]);
dbf.设置数据("SV2",clsTick[卖量2]);
dbf.设置数据("SV1",clsTick[卖量1]);
dbf.设置数据("SP5",clsTick[卖价5]);
dbf.设置数据("SP4",clsTick[卖价4]);
dbf.设置数据("SP3",clsTick[卖价3]);
dbf.设置数据("SP2",clsTick[卖价2]);
dbf.设置数据("SP1",clsTick[卖价1]);
dbf.设置数据("BV1",clsTick[买量1]);
dbf.设置数据("BV2",clsTick[买量2]);
dbf.设置数据("BV3",clsTick[买量3]);
dbf.设置数据("BV4",clsTick[买量4]);
dbf.设置数据("BV5",clsTick[买量5]);
dbf.设置数据("BP1",clsTick[买价1]);
dbf.设置数据("BP2",clsTick[买价2]);
dbf.设置数据("BP3",clsTick[买价3]);
dbf.设置数据("BP4",clsTick[买价4]);
dbf.设置数据("BP5",clsTick[买价5]);
dbf.设置数据("bsRatio",clsTick[买卖比]);
dbf.追加记录();
}
}
//关闭打开的数据
dbf.关闭();
结果就是一个DBF数据库 dfzsbvfdazbcxbv z 我需要,多谢ak4701的支持,我的邮箱事wupangzi@hotmail.com
发一个000039 今天分笔数据给你,你仔细查看,如有用,我再整理源程序给你. 毕竟是几年前的东西了,整理很花时间. 程序用FOXPRO2.5 编写. 当然会一点C语言的基本知识的话,用起宏汇NSD中的编程功能可以说是容易之极,不会的朋友也可以按照提供的模版依葫芦画瓢慢慢学习!
现在宏汇NSD中集成了下面的一些基本的数据输出:
日K线数据输出;
市场成交集中度;
大盘股对综指影响度;
板块成交动态;
行业成交动态;
分笔数据输出;
成交分布分析;
价量成交分布;
地区成交动态;
市场总体概括;
里面很多数据输出对于普通用户可能用不着,这可是为深交所专门写的! ak4701:
能否把你的分笔提取代码给我一份?谢谢
我的邮箱
jxbking@263.net
谢谢 居然有这么多牛人,真是太好了。
只有分析家自己才有技术文档,其它都是朦的,绝对不100%正确;
你要分笔数据干吗,有道理的话可以给个插件你;直接在上面讨论比较好
大家好,我会写一些VB的程序,只是功底不深。我能用读二制文件的方法读大智慧的日数据,但读5分钟数据时,日期格式是10位的,不是很明白,那位好心人能帮我解决一下???TO ak4701
ak4701 你好,我试着在EXCEL里用VBA采用读二制文件的方法读取了分析家的分笔交易数据。问题结果我根本看不明白。转换出来的东西是每行22个记录。我不知道是我的编程能力有限还是思路出了问题。能否帮我点明,我实在看不懂了。下面是第一行的数据。-65823756 768 1106784000 996 2087 2087 809056563 12592 62128128 3407872 54330002 77988853 101320009 127927990 -1 -1 -1 -1 -1 -1 -1 -1
谢谢了先。 支持你的工作,只是偶不懂编程。 支持你的工作,只是偶不懂编程。 不懂,但看出来了,是个好提议,也是个好东西,帮你顶,俺虽然不会编程,但俺还不是很笨,还有时间肯学,有什么需要的,发个短信来,俺支持您,希望能帮上你什么忙 to chen712
源程序以发给你。 在PRP文件中,从第24字节开始到622268字节,每64字节为一条记录,每条记录中以4字节表示一个数值,这些数据记录了该文件个股分笔资料的位置(索引表),再从这个表中即可找出对应的分笔资料。
其实你用16进制文件编辑器打开PRP文件,你就会发现一些规律,再进行下一步处理。
用程序改写PRP文件相应部分,再由分析家读取,则更直接些。