起因是从 数据提供商取到的股指期货的结算价更新比较晚,一般收盘后还是昨天的数据。
而页面更新后接口基本还要延迟个半个多小时,就想试试从网页上抓取。
目前没有很好的办法,记录下这几天的集中尝试思路:
1. 从通达信上抓取: 股票,网上有个tdxHqApi.dll, 存在有效期,可以获取股票的行情数据。
股指期货,传说中的tdxExHq.dll, 没有找到,但某网站提供了一个demo,这个demo确实取到了数据。
网上找到的接口如下:
//开发文档
//
//1.行情API均是TdxHqApi.dll文件的导出函数,包括以下函数:(所有行情函数均为客户端主动请求查询,不是服务器推送)
//bool TdxHq_Connect(char* IP, int Port, char* Result, char* ErrInfo);//连接券商行情服务器
//void TdxHq_Disconnect();//断开服务器
//bool TdxHq_GetSecurityCount(byte Market, short& Result, char* ErrInfo);//获取指定市场内的证券数目
//bool TdxHq_GetSecurityList(byte Market, short Start, short& Count, char* Result, char* ErrInfo);//获取市场内指定范围内的所有证券代码
//bool TdxHq_GetSecurityBars(byte Category, byte Market, char* Zqdm, short Start, short& Count, char* Result, char* ErrInfo);//获取股票K线
//bool TdxHq_GetIndexBars(byte Category, byte Market, char* Zqdm, short Start, short& Count, char* Result, char* ErrInfo);//获取指数K线
//bool TdxHq_GetMinuteTimeData(byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取分时图数据
//bool TdxHq_GetHistoryMinuteTimeData(byte Market, char* Zqdm, int date, char* Result, char* ErrInfo);//获取历史分时图数据
//bool TdxHq_GetTransactionData(byte Market, char* Zqdm, short Start, short& Count, char* Result, char* ErrInfo);//获取分时成交
//bool TdxHq_GetHistoryTransactionData(byte Market, char* Zqdm, short Start, short& Count, int date, char* Result, char* ErrInfo);//获取历史分时成交
//bool TdxHq_GetSecurityQuotes(byte Market[], char* Zqdm[], short& Count, char* Result, char* ErrInfo);//获取盘口五档报价
//bool TdxHq_GetCompanyInfoCategory(byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取F10信息类别
//bool TdxHq_GetCompanyInfoContent(byte Market, char* Zqdm, char* FileName, int Start, int Length, char* Result, char* ErrInfo);//获取F10信息内容
//bool TdxHq_GetXDXRInfo(byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取权息数据
//bool TdxHq_GetFinanceInfo(byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取财务数据
//3.各个函数功能说明
///
/// 连接通达信行情服务器
///
/// 服务器IP,可在券商通达信软件登录界面“通讯设置”按钮内查得
/// 服务器端口
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool (__stdcall* TdxHq_ConnectDelegate)(char* IP, int Port, char* Result, char* ErrInfo);
///
/// 断开同服务器的连接
///
typedef void(__stdcall* TdxHq_DisconnectDelegate)();
///
/// 获取证券指定范围的的K线数据
///
/// K线种类, 0->5分钟K线 1->15分钟K线 2->30分钟K线 3->1小时K线 4->日K线 5->周K线 6->月K线 7->1分钟 8->1分钟K线 9->日K线 10->季K线 11->年K线< / param>
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 范围的开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// 范围的大小,API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目, 最大值800
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetSecurityBarsDelegate)(byte Category, byte Market, char* Zqdm, short Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取市场内所有证券的数量
///
/// 市场代码, 0->深圳 1->上海
/// 此API执行返回后,Result内保存了返回的证券数量
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetSecurityCountDelegate)(byte Market, short& Result, char* ErrInfo);
///
/// 获取市场内某个范围内的1000支股票的股票代码
///
/// 市场代码, 0->深圳 1->上海
/// 范围开始位置,第一个股票是0, 第二个是1, 依此类推,位置信息依据TdxHq_GetSecurityCount返回的证券总数确定
/// 范围的大小,API执行后,保存了实际返回的股票数目,
/// 此API执行返回后,Result内保存了返回的证券代码信息,形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetSecurityListDelegate)(byte Market, short Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取指数的指定范围内K线数据
///
/// K线种类, 0->5分钟K线 1->15分钟K线 2->30分钟K线 3->1小时K线 4->日K线 5->周K线 6->月K线 7->1分钟 8->1分钟K线 9->日K线 10->季K线 11->年K线< / param>
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 范围开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// 范围的大小,API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目,最大值800
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool (__stdcall* TdxHq_GetIndexBarsDelegate)(byte Category, byte Market, char* Zqdm, short Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取分时数据
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool (__stdcall* TdxHq_GetMinuteTimeDataDelegate)(byte Market, char* Zqdm, char* Result, char* ErrInfo);
///
/// 获取历史分时数据
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 日期, 比如2014年1月1日为整数20140101
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetHistoryMinuteTimeDataDelegate)(byte Market, char* Zqdm, int Date, char* Result, char* ErrInfo);
///
/// 获取分时成交某个范围内的数据
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 范围开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// 范围大小,API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetTransactionDataDelegate) (byte Market, char* Zqdm, short Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取历史分时成交某个范围内的数据
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 范围开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// 范围大小,API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目
/// 日期, 比如2014年1月1日为整数20140101
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetHistoryTransactionDataDelegate) (byte Market, char* Zqdm, short Start, short& Count, int Date, char* Result, char* ErrInfo);
///
/// 批量获取多个证券的五档报价数据
///
/// 市场代码, 0->深圳 1->上海, 第i个元素表示第i个证券的市场代码
/// 证券代码, Count个证券代码组成的数组
/// API执行前,表示用户要请求的证券数目,最大50(不同券商可能不一样,具体数目请自行咨询券商或测试), API执行后,保存了实际返回的数目
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetSecurityQuotesDelegate) (byte Market[], char* Zqdm[], short& Count, char* Result, char* ErrInfo);
///
/// 获取F10资料的分类
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetCompanyInfoCategoryDelegate) (byte Market, char* Zqdm, char* Result, char* ErrInfo);
///
/// 获取F10资料的某一分类的内容
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 类目的文件名, 由TdxHq_GetCompanyInfoCategory返回信息中获取
/// 类目的开始位置, 由TdxHq_GetCompanyInfoCategory返回信息中获取
/// 类目的长度, 由TdxHq_GetCompanyInfoCategory返回信息中获取
/// 此API执行返回后,Result内保存了返回的查询数据,出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetCompanyInfoContentDelegate) (byte Market, char* Zqdm, char* FileName, int Start, int Length, char* Result, char* ErrInfo);
///
/// 获取除权除息信息
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 此API执行返回后,Result内保存了返回的查询数据,出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetXDXRInfoDelegate) (byte Market, char* Zqdm, char* Result, char* ErrInfo);
///
/// 获取财务信息
///
/// 市场代码, 0->深圳 1->上海
/// 证券代码
/// 此API执行返回后,Result内保存了返回的查询数据,出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxHq_GetFinanceInfoDelegate) (byte Market, char* Zqdm, char* Result, char* ErrInfo);
//开发文档
//
//1.扩展行情API均是TdxHqApi.dll文件的导出函数,包括以下函数:(所有行情函数均为客户端主动请求查询,不是服务器推送)
//bool TdxExHq_Connect(char* IP, int Port, char* Result, char* ErrInfo);//连接券商行情服务器
//void TdxExHq_Disconnect();//断开服务器
//bool TdxExHq_GetMarkets(char* Result, char* ErrInfo);//获取所有市场代码
//bool TdxExHq_GetInstrumentCount(int& Result, char* ErrInfo);//获取所有品种的数目
//bool TdxExHq_GetInstrumentInfo(int Start, short Count, char* Result, char* ErrInfo);//获取所有品种代码
//bool TdxExHq_GetInstrumentBars(byte Category, byte Market, char* Zqdm, int Start, short& Count, char* Result, char* ErrInfo);//获取指定品种的K线数据
//bool TdxExHq_GetMinuteTimeData(byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取指定品种的分时图数据
//bool TdxExHq_GetTransactionData(byte Market, char* Zqdm, int Start, short& Count, char* Result, char* ErrInfo);//获取指定品种的分时成交数据
//bool TdxExHq_GetInstrumentQuote (byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取指定品种的盘口报价
//bool TdxExHq_GetHistoryTransactionData(byte Market, char* Zqdm, int date, int Start, short& Count, char* Result, char* ErrInfo);//获取指定品种的历史分时成交数据
//bool TdxExHq_GetHistoryMinuteTimeData(byte Market, char* Zqdm, int date, char* Result, char* ErrInfo);//获取指定品种的分时图数据
//3.各个函数功能说明
///
/// 连接通达信扩展行情服务器
///
/// 服务器IP,可在券商通达信软件登录界面“通讯设置”按钮内查得
/// 服务器端口
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_ConnectDelegate)(char* IP, int Port, char* Result, char* ErrInfo);
///
/// 断开同服务器的连接
///
typedef void(__stdcall* TdxExHq_DisconnectDelegate)();
///
/// 获取扩展行情中支持的各个市场的市场代码
///
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
typedef bool(__stdcall* TdxExHq_GetMarketsDelegate)(char* Result, char* ErrInfo);
///
/// 获取所有期货合约的总数
///
/// 此API执行返回后,Result内保存了返回的合约总数。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
typedef bool(__stdcall* TdxExHq_GetInstrumentCountDelegate)(int& Result, char* ErrInfo);
///
/// 获取指定范围的期货合约的代码
///
// 合约范围的开始位置, 由TdxExHq_GetInstrumentCount返回信息中确定
/// 合约的数目, 由TdxExHq_GetInstrumentCount返回信息中获取
/// 此API执行返回后,Result内保存了返回的查询数据,出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
typedef bool(__stdcall* TdxExHq_GetInstrumentInfoDelegate)(int Start, short Count, char* Result, char* ErrInfo);
///
/// 获取合约的K线数据
///
/// K线种类, 0->5分钟K线 1->15分钟K线 2->30分钟K线 3->1小时K线 4->日K线 5->周K线 6->月K线 7->1分钟 8->1分钟K线 9->日K线 10->季K线 11->年K线< / param>
/// 市场代码
/// 证券代码
/// K线开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目, 最大值800
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_GetInstrumentBarsDelegate)(byte Category, byte Market, char* Zqdm, int Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取分时数据
///
/// 市场代码,
/// 证券代码
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_GetMinuteTimeDataDelegate)(byte Market, char* Zqdm, char* Result, char* ErrInfo);
///
/// 获取分时成交数据
///
/// 市场代码
/// 证券代码
/// K线开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_GetTransactionDataDelegate)(byte Market, char* Zqdm, int Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取合约的五档报价数据
///
/// 市场代码
/// 证券代码
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_GetInstrumentQuoteDelegate) (byte Market, char* Zqdm, char* Result, char* ErrInfo);
///
/// 获取历史分时成交数据
///
/// 市场代码,
/// 证券代码
/// K线开始位置,最后一条K线位置是0, 前一条是1, 依此类推
/// API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目
/// 日期, 比如2014年1月1日为整数20140101
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_GetHistoryTransactionDataDelegate)(byte Market, char* Zqdm, int date, int Start, short& Count, char* Result, char* ErrInfo);
///
/// 获取历史分时数据
///
/// 市场代码
/// 证券代码
/// 日期, 比如2014年1月1日为整数20140101
/// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。
/// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。
/// 成功返货true, 失败返回false
typedef bool(__stdcall* TdxExHq_GetHistoryMinuteTimeDataDelegate)(byte Market, char* Zqdm, int date, char* Result, char* ErrInfo);
http://download.csdn.net/detail/fonjames/9511643
http://download.csdn.net/detail/fonjames/9511639
其他接口见 此网站 http://chaoguwaigua.com/
后续可能思路: 从exe抽取dll模块?或者exe封装成dll,如果有知道方法可以联系我 :-)
2 从同花顺的网页接口上获取:
股指:
http://d.10jqka.com.cn/multimarketreal/129/IF1605/65_66_67_68_69_70_199112
大概跟测了下, 6表示昨收, 7表示开盘 , 8最高,9最低 ,10现价, 12 总量 ,66昨结 ,69涨停价 ,70跌停价,199112 :涨跌幅
还是没有找到结算价,有知道的童鞋可以告知我下。
未完待续。