网际风通视接口规范:
****************************************************************************************
*
在通视卡规范基础上,参照飞狐交易师接口规范3.0,进行扩展,实时行情增加涨跌停价;
*
内外盘;期货行情的昨结算价和现结算价;增加补充5分钟线、1分钟线、分笔数据的支持
****************************************************************************************/

/****************************************************************************************
*
驱动程序安装后,应该在系统注册表中注册以下信息,分析软件通过该注册信息启动动态库
*
HKEY_LOCAL_MACHINE/SOFTWARE/StockDrv 下

*
Driver  = "驱动DLL全路径"
****************************************************************************************/

#ifndef __STOCKDRV_H__
#define __STOCKDRV_H__


#if _MSC_VER > 1000
#pragma once
#endif

typedef long time_t;

/////////////////////////////////////////////////////////////////////////////////////////

// 工作方式类型定义
#define RCV_WORK_SENDMSG
4
       // 兼容标准图文消息处理模式
// 其他工作方式保留
//
消息类型
#define RCV_REPORT
0x3f001234
#define RCV_FILEDATA
0x3f001235

//==================================== 数据结构 =================================================
// 证券市场
#define
SH_MARKET_EX
'HS'
// 上海
#define
SZ_MARKET_EX
'ZS'
// 深圳
#define
HK_MARKET_EX
'KH'
// 香港
#define
SQ_MARKET_EX
'QS'
// 上期
#define
DL_MARKET_EX
'LD'
// 大连
#define
ZZ_MARKET_EX
'ZZ'
// 郑州
#define
JZ_MARKET_EX
'JZ'
// 中金所
#define
WP_MARKET_EX
'PW'
// 外盘
#define
ID_MARKET_EX
'DI'
// 国际指数
#define
WH_MARKET_EX
'WH'
// 外汇


// 文件数据类型
#define
FILE_HISTORY_MIN1_EX
0xA003
// 补1分钟K线数据(扩展)
#define
FILE_HISTORY_EX
0x0002
// 补日线数据
#define
FILE_HISTORY_MIN5_EX
0x0051
// 补5分钟K线数据(扩展)
#define
FILE_MINUTE_EX
4
// 补分时线数据
#define
FILE_MINUTE_EX
5
// 补分笔线数据 (扩展)
#define
FILE_POWER_EX
6
// 补充除权数据
#define
FILE_FINANCE_EX
7
// 补充财务数据(扩展)

#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
FILE_SHAZQDATA_EX
0x3000
// 上海债券净价交易

#define
FILE_TYPE_RES
-1
// 保留

// 消息子类型
#define
News_Sha_Ex
2
// 上证消息
#define
News_Szn_Ex
4
// 深证消息
#define
News_Sqn_Ex
5
// 期货消息
#define
News_Fin_Ex
6
// 财经报道
#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_SUPPORTEXTHQ
6
// 是否支持JSJ格式


#define
STKLABEL_LEN
10
// 品种代码长度
#define
STKNAME_LEN
  
32
// 品种名称  长度

//////////////////////////////////////////////////////////////////////////////////
//行情数据结构,支持期货行情
typedef struct tagRCV_REPORT_STRUCTEx
{

WORD
m_cbSize;
// 结构大小

time_t
m_time;
// 交易时间(日历时间)

WORD
m_wMarket;
// 股票市场类型

char
m_szLabel[STKLABEL_LEN];
// 股票代码,以'\0'结尾

char
m_szName[STKNAME_LEN];
      
// 股票名称,以'\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[3];
// 申买价1,2,3

float
m_fBuyVolume[3];
// 申买量1,2,3

float
m_fSellPrice[3];
// 申卖价1,2,3

float
m_fSellVolume[3];
// 申卖量1,2,3


float
m_fBuyPrice4;
// 申买价4

float
m_fBuyVolume4;
// 申买量4

float
m_fSellPrice4;
// 申卖价4

float
m_fSellVolume4;
// 申卖量4


float
m_fBuyPrice5;
// 申买价5

float
m_fBuyVolume5;
// 申买量6

float
m_fSellPrice5;
// 申卖价5

float
m_fSellVolume5;
// 申卖量5


float
m_fLastAverage;
      
//期货专用昨结算价(扩展)

float
m_fAverage;
   
//期货专用今结算价(扩展)
} RCV_REPORT_STRUCTEx, *PRCV_REPORT_STRUCTEx;


//////////////////////////////////////////////////////////////////////////////////
//补充数据头
//数据头 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[STKLABEL_LEN];
  // 股票代码
}RCV_EKE_HEADEx,*PRCV_EKE_HEADEx;

//补充日线、5分钟、1分钟数据
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,*PRCV_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,*PRCV_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,*PRCV_POWER_STRUCTEx;

//////////////////////////////////////////////////////////////////////////////////
// 文件类型数据包头
//  注一:
//
m_wDataType == FILE_BASE_EX
//
m_dwAttrib = 股票证券市场,m_szFileName仅包含文件名
//
m_FileTime = 基本面资料文件创建日期
//  m_wDataType == FILE_NEWS_EX
//
m_dwAttrib = 消息来源,m_szFileName 包含目录的文件名,目录名为消息来源
//
m_dwSerialNo = 序列号
//
如:  "上交所消息\\0501Z012.TXT","新兰德\\XLD0001.TXT"
//  m_wDataType == FILE_HTML_EX
//
m_dwAttrib 保留, m_szFileName为URL
//
m_wDataType
== FILE_SOFTWARE_EX
//
m_dwAttrib 分析软件类型, 用于初步判断
//
m_szFileName 分析软件 ID 特征字符串 + '\\' + 文件名
//
如 "TongShi\\TS\\RECEIVE\\RECEIVE.EXE",
//
ID 特征字符串为 "TongShi", "TS\\RECEIVE\\RECEIVE.EXE" 为文件名
//
特征字符串 和 文件名及其含义由分析软件商定义
//  注二:
//  数据文件循环播出,每个文件有唯一的序列号,以避免重复接收
typedef struct tagRCV_FILE_HEADEx
{

DWORD
m_dwAttrib;
// 文件子类型

DWORD
m_dwLen;
// 文件长度

DWORD
m_dwSerialNo;
// 文件序列号

char
m_szFileName[MAX_PATH];
// 文件名 or URL
} RCV_FILE_HEADEx,*PRCV_FILE_HEADEx;

//////////////////////////////////////////////////////////////////////////////////
//  数据通知消息
//查询方式通知消息
//
wParam = MsgPara_StkData
有股票数据
//
wParam = MsgPara_File
有文件数据文件
//直接数据引用通知消息
//
wParam = RCV_WPARAM;
//  lParam 指向 RCV_DATA结构;
//
返回 1 已经处理, 0 未处理或不能处理,目前该返回值被忽略

// 注一:
//
  记录数表示行情数据和补充数据(包括 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_HISTORY_STRUCTEx * m_pDay;

RCV_MINUTE_STRUCTEx  * m_pMinute;

RCV_POWER_STRUCTEx   * m_pPower;

void
     * m_pData;
// 参见注二

};
} RCV_DATA,*PRCV_DATA;

/* 消息处理程序 DEMO(VC++)
LONG OnStkDataOK(UINT wParam,LONG lParam)
{

UINT wFileType = wParam;

RCV_DATA*
pHeader;

pHeader = (RCV_DATA *)lParam;


int nBufSize = pHeader->m_pReport[0].m_cbSize;//数据结构大小

PBYTE pBaseBuf = (PBYTE)&pHeader->m_pReport[0];//VC++。

//PBYTE pBaseBuf = (PBYTE)&pHeader->m_pReport[0]-2;//BCB需要减2。

switch( wFileType )

{

case RCV_REPORT:
// 实时行情

for(int i=0; i<pHeader->m_nPacketNum; i++)

{

RCV_REPORT_STRUCTEx & Buf = *(PRCV_REPORT_STRUCTEx)(pBaseBuf + nBufSize*i);
                        if(Buf.m_fLastClose*1000 <=0) continue;  //收盘价为零,可能这个品种目前没有实时数据
                        if(Buf.m_szName == "上证指数") {;};// 从接口共享内存取出数据进行处理

//Buf.m_time/60;
                        //Buf.m_wMarket;
                         //Buf.m_szLabel;
                        //Buf.m_szName;
                        //Buf.m_fLastClose;

}

break;


case RCV_FILEDATA:
// 补K线数据

switch(pHeader->m_wDataType)

{

case FILE_HISTORY_EX:
// 补日线数据

for(i=0; i<pHeader->m_nPacketNum; i++)

{

pHeader->m_pDay ...

//数据处理

// 请编补日线、5分钟线、1分钟线的调用范例

}

break;

case FILE_HISTORY_MIN5_EX:
// 补5分钟K线数据(扩展)

break;

case FILE_HISTORY_MIN1_EX:
// 补1分钟K线数据(扩展)

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;
}
*/

/*消息处理程序 DEMO(BCB C++ Build)

void __fastcall OnStkDataOK(TMessage & Msg)
{


        UINT wFileType = Msg.WParam;
        RCV_DATA * pHeader;

pHeader = (RCV_DATA *) Msg.LParam;

int nBufSize = pHeader->m_pReport[0].m_cbSize;//数据结构大小

PBYTE pBaseBuf = (PBYTE)&pHeader->m_pReport[0]-2;//BCB需要减2。

switch( wFileType )

{

case RCV_REPORT:
// 实时行情

for(int i=0; i<pHeader->m_nPacketNum; i++)

{

RCV_REPORT_STRUCTEx & Buf = *(PRCV_REPORT_STRUCTEx)(pBaseBuf + nBufSize*i);
                        if(Buf.m_fLastClose*1000 <=0) continue;  //收盘价为零,可能这个品种目前没有实时数据
                        if(AnsiString(Buf.m_szName) == "上证指数") ShowMessage(AnsiString(Buf.m_szLabel));// 从接口共享内存取出数据进行处理

数据处理......

}

}
}

*/

//////////////////////////////////////////////////////////////////////////////////
//APIs
#ifdef __cplusplus
extern "C"{
#endif

//////////////////////////////////////////////////////////////////////////////////
// 注册函数

// 股票初始化
// 入口参数:
//
hWnd
处理消息的窗口句柄
//
Msg
用户自定义消息
//
nWorkMode
接口工作方式, 应等于 RCV_WORK_SENDMSG
// 返回参数:
//
1
成功

//
-1
失败
int WINAPI
Stock_Init(HWND hWnd,UINT Msg,int nWorkMode);

// 退出,停止发送消息
// 入口参数:
//
hWnd
处理消息的窗口句柄,同 Stock_Init 的调用入口参数
//
返回参数:
//
1
成功

//
-1
失败
int WINAPI
Stock_Quit(HWND hWnd);

//////////////////////////////////////////////////////////////////////////////////
// 行情接口      

// 取已接收到的股票总数
int WINAPI
GetTotalNumber();


// 由序号取股票数据(扩展)
// 入口参数:

//
nNo
序号
//
pBuf
存放股票数据的缓冲区
// 返回参数:
//
    NoStockData
无股票数据

// 注:
//
该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架
int WINAPI
GetStockByNoEx(int nNo,RCV_REPORT_STRUCTEx * pBuf);

// 由股号取股票数据(扩展)
// 入口参数:

//
pszStockCode股票代号

//
nMarket
证券市场
//
pBuf
存放股票数据的缓冲区
// 返回参数:
//
    NoStockData
无股票数据

// 注:
//
该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架
int WINAPI
GetStockByCodeEx(char * pszStockCode,int nMarket,RCV_REPORT_STRUCTEx * pBuf);

// 激活接收程序,进行设置
// 入口参数:
//
bShowWindow
TRUE
显示窗口,进行设置
//
FALSE
隐含窗口
// 返回参数:
//
1
成功
//
-1
失败
int
WINAPI  SetupReceiver(BOOL bShowWindow);

//
取得股票驱动信息
//
入口参数:
//
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_ERRRATE,
取信道误码,
//
nInfo == RI_STKNUM,
取上市股票总家数
DWORD WINAPI  GetStockDrvInfo(int nInfo,void * pBuf);

#ifdef __cplusplus
}
#endif

#endif // __STOCKDRV_H__