// TdxHqDemoCpp.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using namespace std; //开发文档 // //1.扩展行情API均是TdxHqApi.dll文件的导出函数,包括以下函数:(所有行情函数均为客户端主动请求查询,不是服务器推送) // bool OpenTdx(char* ErrInfo);//打开通达信 // void CloseTdx();//关闭通达信 //int TdxExHq_Multi_Connect(char* IP, int Port, char* Result, char* ErrInfo);//连接券商行情服务器 //void TdxExHq_Multi_Disconnect(int ConnectionID);//断开服务器 //bool TdxExHq_Multi_GetMarkets(int ConnectionID, char* Result, char* ErrInfo);//获取所有市场代码 //bool TdxExHq_Multi_GetInstrumentCount(int ConnectionID, int& Result, char* ErrInfo);//获取所有品种的数目 //bool TdxExHq_Multi_GetInstrumentInfo(int ConnectionID, int Start, short Count, char* Result, char* ErrInfo);//获取所有品种代码 //bool TdxExHq_Multi_GetInstrumentBars(int ConnectionID, byte Category, byte Market, char* Zqdm, int Start, short& Count, char* Result, char* ErrInfo);//获取指定品种的K线数据 //bool TdxExHq_Multi_GetMinuteTimeData(int ConnectionID, byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取指定品种的分时图数据 //bool TdxExHq_Multi_GetTransactionData(int ConnectionID, byte Market, char* Zqdm, int Start, short& Count, char* Result, char* ErrInfo);//获取指定品种的分时成交数据 //bool TdxExHq_Multi_GetInstrumentQuote (int ConnectionID, byte Market, char* Zqdm, char* Result, char* ErrInfo);//获取指定品种的盘口报价 //bool TdxExHq_Multi_GetHistoryTransactionData(int ConnectionID, byte Market, char* Zqdm, int date, int Start, short& Count, char* Result, char* ErrInfo);//获取指定品种的历史分时成交数据 //bool TdxExHq_Multi_GetHistoryMinuteTimeData(int ConnectionID, byte Market, char* Zqdm, int date, char* Result, char* ErrInfo);//获取指定品种的分时图数据 ///行情接口执行后,如果失败,则字符串ErrInfo保存了出错信息中文说明; ///如果成功,则字符串Result保存了结果数据,形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。 ///返回的Result结果数据都是\n,\t分隔的中文字符串,比如查询K线数据,返回的结果字符串就形如 ///“时间\t开盘价\t收盘价\t最高价\t最低价\t成交量\t成交额\n ///20150519\t4.644000\t4.732000\t4.747000\t4.576000\t146667487\t683638848.000000\n ///20150520\t4.756000\t4.850000\t4.960000\t4.756000\t353161092\t1722953216.000000” ///查得此数据之后,通过分割字符串, 可以恢复为几行几列的表格形式的数据 /2.API使用流程为: 应用程序先调用OpenTdx打开通达信实例,一个实例下可以同时建立多个到行情服务器的连接,每个连接称之为ConnectionID.应用程序先调用TdxExHq_Multi_Connect获取ConnectionID, //可以重复调用TdxExHq_Multi_Connect建立多个到行情服务器的连接,每个连接对应返回的ConnectionID, //然后才可以调用其他接口获取行情数据,应用程序应自行处理网络断线问题, 线程应只通过本线程建立的连接传输数据,不能通过其他线程建立的连接传输数据 //最后调用CloseTdx关闭通达信实例 //OpenTdx和CloseTdx在整个应用程序中只能被成功调用一次. //如果断线,调用任意api函数后,api会返回已经断线的错误信息,应用程序应根据此错误信息重新连接服务器。 //3.各个函数功能说明 /// /// 打开通达信实例 /// /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 /// 成功返回true, 失败返回false ///bool OpenTdx(char* ErrInfo); typedef bool(__stdcall* OpenTdxDelegate)(char* ErrInfo); /// /// 关闭通达信实例 /// ///void CloseTdx(); typedef void(__stdcall* CloseTdxDelegate)(); /// /// 连接通达信扩展行情服务器 /// /// 服务器IP,可在券商通达信软件登录界面“通讯设置”按钮内查得 /// 服务器端口 /// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。 /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 /// 成功返回 ConnectionID, 失败返回-1 typedef int(__stdcall* TdxExHq_Multi_ConnectDelegate)(char* IP, int Port, char* Result, char* ErrInfo); /// /// 断开同服务器的连接 /// typedef void(__stdcall* TdxExHq_Multi_DisconnectDelegate)(int ConnectionID); /// /// 获取扩展行情中支持的各个市场的市场代码 /// /// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。 /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 typedef bool(__stdcall* TdxExHq_Multi_GetMarketsDelegate)(int ConnectionID,char* Result, char* ErrInfo); /// /// 获取所有期货合约的总数 /// /// 此API执行返回后,Result内保存了返回的合约总数。 /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 typedef bool(__stdcall* TdxExHq_Multi_GetInstrumentCountDelegate)(int ConnectionID,int& Result, char* ErrInfo); /// /// 获取指定范围的期货合约的代码 /// // 合约范围的开始位置, 由TdxExHq_GetInstrumentCount返回信息中确定 /// 合约的数目, 由TdxExHq_GetInstrumentCount返回信息中获取 /// 此API执行返回后,Result内保存了返回的查询数据,出错时为空字符串。 /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 typedef bool(__stdcall* TdxExHq_Multi_GetInstrumentInfoDelegate)(int ConnectionID,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线位置是0, 前一条是1, 依此类推 /// 范围的大小,API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目, 最大值800 /// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。 /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 /// 成功返货true, 失败返回false typedef bool(__stdcall* TdxExHq_Multi_GetInstrumentBarsDelegate)(int ConnectionID,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_Multi_GetMinuteTimeDataDelegate)(int ConnectionID,byte Market, char* Zqdm, char* Result, char* ErrInfo); /// /// 获取指定范围内的分时成交数据 /// /// 市场代码 /// 证券代码 /// 范围的开始位置,最后一条K线位置是0, 前一条是1, 依此类推 /// 范围的大小,API执行前,表示用户要请求的K线数目, API执行后,保存了实际返回的K线数目 /// 此API执行返回后,Result内保存了返回的查询数据, 形式为表格数据,行数据之间通过\n字符分割,列数据之间通过\t分隔。一般要分配1024*1024字节的空间。出错时为空字符串。 /// 此API执行返回后,如果出错,保存了错误信息说明。一般要分配256字节的空间。没出错时为空字符串。 /// 成功返货true, 失败返回false typedef bool(__stdcall* TdxExHq_Multi_GetTransactionDataDelegate)(int ConnectionID,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_Multi_GetInstrumentQuoteDelegate) (int ConnectionID,byte Market, char* Zqdm, char* Result, char* ErrInfo); /// /// 获取历史分时成交指定范围内的数据 /// /// 市场代码, /// 证券代码 /// 范围的开始位置,最后一条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_Multi_GetHistoryTransactionDataDelegate)(int ConnectionID,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_Multi_GetHistoryMinuteTimeDataDelegate)(int ConnectionID,byte Market, char* Zqdm, int date, char* Result, char* ErrInfo); int _tmain(int argc, _TCHAR* argv[]) { //载入dll, dll要复制到debug和release目录下,必须采用多字节字符集编程设置,用户编程时需自己控制浮点数显示的小数位数与精度 HMODULE TdxApiHMODULE = LoadLibrary("TdxHqApi.dll"); OpenTdxDelegate OpenTdx = (OpenTdxDelegate)GetProcAddress(TdxApiHMODULE, "OpenTdx"); CloseTdxDelegate CloseTdx = (CloseTdxDelegate)GetProcAddress(TdxApiHMODULE, "CloseTdx"); //获取api函数 TdxExHq_Multi_ConnectDelegate TdxExHq_Multi_Connect = (TdxExHq_Multi_ConnectDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_Connect"); TdxExHq_Multi_DisconnectDelegate TdxExHq_Multi_Disconnect = (TdxExHq_Multi_DisconnectDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_Disconnect"); TdxExHq_Multi_GetMarketsDelegate TdxExHq_Multi_GetMarkets = (TdxExHq_Multi_GetMarketsDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetMarkets"); TdxExHq_Multi_GetInstrumentCountDelegate TdxExHq_Multi_GetInstrumentCount = (TdxExHq_Multi_GetInstrumentCountDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetInstrumentCount"); TdxExHq_Multi_GetInstrumentInfoDelegate TdxExHq_Multi_GetInstrumentInfo = (TdxExHq_Multi_GetInstrumentInfoDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetInstrumentInfo"); TdxExHq_Multi_GetInstrumentBarsDelegate TdxExHq_Multi_GetInstrumentBars = (TdxExHq_Multi_GetInstrumentBarsDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetInstrumentBars"); TdxExHq_Multi_GetMinuteTimeDataDelegate TdxExHq_Multi_GetMinuteTimeData = (TdxExHq_Multi_GetMinuteTimeDataDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetMinuteTimeData"); TdxExHq_Multi_GetTransactionDataDelegate TdxExHq_Multi_GetTransactionData = (TdxExHq_Multi_GetTransactionDataDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetTransactionData"); TdxExHq_Multi_GetInstrumentQuoteDelegate TdxExHq_Multi_GetInstrumentQuote = (TdxExHq_Multi_GetInstrumentQuoteDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetInstrumentQuote"); TdxExHq_Multi_GetHistoryTransactionDataDelegate TdxExHq_Multi_GetHistoryTransactionData = (TdxExHq_Multi_GetHistoryTransactionDataDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetHistoryTransactionData"); TdxExHq_Multi_GetHistoryMinuteTimeDataDelegate TdxExHq_Multi_GetHistoryMinuteTimeData = (TdxExHq_Multi_GetHistoryMinuteTimeDataDelegate)GetProcAddress(TdxApiHMODULE, "TdxExHq_Multi_GetHistoryMinuteTimeData"); //开始获取行情数据 char* Result = new char[1024 * 1024]; char* ErrInfo = new char[256]; if (!OpenTdx(ErrInfo))//OpenTdx只能调用一次,如果调用失败,必须再调用直至成功 { cout << ErrInfo << endl; return; } short Count = 80; //连接服务器 int ConnectionID=TdxExHq_Multi_Connect("111.111.111.111", 7727, Result, ErrInfo); //int ConnectionID2=TdxExHq_Multi_Connect("112.111.111.111", 7727, Result, ErrInfo);//建立第二个连接 if (ConnectionID ==-1) { return; } cout << Result << endl; //bool1 = TdxExHq_Multi_GetMarkets(ConnectionID, Result, ErrInfo); //if (!bool1) //{ // cout << ErrInfo << endl;//连接失败 // return 0; //} //cout << Result << endl; //int InstrumentCount = 0; //bool1 = TdxExHq_Multi_GetInstrumentCount(ConnectionID, InstrumentCount, ErrInfo); //cout << InstrumentCount << endl; //bool1 = TdxExHq_Multi_GetInstrumentInfo(ConnectionID, 0, 511, Result, ErrInfo);//Count最大511 //if (!bool1) //{ // cout << ErrInfo << endl;//连接失败 // return 0; //} //cout << Result << endl; //Count = 50; //bool1 = TdxExHq_Multi_GetInstrumentBars(ConnectionID, 0, 30, "AGL3", 0, Count, Result, ErrInfo);// 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线 //if (!bool1) //{ // cout << ErrInfo << endl;//连接失败 // return 0; //} //cout << Result << endl; //bool1 = TdxExHq_Multi_GetMinuteTimeData(ConnectionID, 47, "IF1409", Result, ErrInfo); //if (!bool1) //{ // cout << ErrInfo << endl;//连接失败 // return 0; //} //cout << Result << endl; //bool1 = TdxExHq_Multi_GetTransactionData(ConnectionID, 47, "IF1409", 0, Count, Result, ErrInfo); //if (!bool1) //{ // cout << ErrInfo << endl;//连接失败 // return 0; //} //cout << Result << endl; //获取五档报价数据 /*bool1 = TdxExHq_Multi_GetInstrumentQuote(ConnectionID, 47, "IF1409", Result, ErrInfo); if (!bool1) { cout << ErrInfo << endl; return 0; } cout << Result << endl; */ //bool1 = TdxExHq_Multi_GetHistoryTransactionData(ConnectionID, 47, "IF1409", 20140919, 0, Count, Result, ErrInfo); //if (!bool1) //{ // cout << ErrInfo << endl;//连接失败 // return 0; //} //cout << Result << endl; bool1 = TdxExHq_Multi_GetHistoryMinuteTimeData(ConnectionID, 47, "IF1410", 20140827, Result, ErrInfo); if (!bool1) { cout << ErrInfo << endl;//连接失败 return 0; } cout << Result << endl; TdxExHq_Multi_Disconnect(ConnectionID); CloseTdx();//CloseTdx只能调用一次, cout << "已经断开服务器"<> a; return 0; }