SelfDB.h
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:13k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. class CClkFile;
  7. class CSelfDB;
  8. */
  9. #if !defined( __STKLIB_SELFDB_H__ )
  10. #define __STKLIB_SELFDB_H__
  11. #include "StdAfx.h"
  12. #include "../Include/Stock.h"
  13. #include "../Include/Database.h"
  14. #include "QianLong.h"
  15. #pragma pack(1)
  16. /* 2.0版财务信息数据结构 datbasetbl.dat
  17. typedef struct clk20_basedata_t {
  18. LONG type; // stock type
  19. char code[8]; // 代码
  20. char domain[16+1]; // 板块
  21. char province[8+1]; // 省份
  22. DWORD date;   // 日期 Format is YYYYMMDD for base data
  23. LONG reporttype; // 报告类型:年报、中报、季报
  24. LONG erate_dollar; // 当期美元汇率 0.001
  25. LONG erate_hkdollar; // 当期港币汇率 0.001
  26. // ★偿债能力
  27. LONG ratio_liquidity; // 流动比率 0.001
  28. LONG ratio_quick; // 速动比率 0.001
  29. LONG velocity_receivables; // 应收帐款周率 0.001
  30. // ★经营能力
  31. LONG velocity_merchandise; // 存货周转率 0.001
  32. LONG main_income; // 主营业务收入 10000
  33. LONG cash_ps; // 每股净现金流量 0.001
  34. // ★盈利能力
  35. LONG profit_margin; // 主营业务利润率 % 0.001
  36. LONG netasset_yield; // 净资产收益率 % 0.001
  37. // ★资本结构
  38. LONG date_begin; // 上市日期 Format is YYYYMMDD
  39. LONG share_count_total; // 总股本 10000
  40. LONG share_count_a; // 流通A股 10000
  41. LONG share_count_b; // 流通B股 10000
  42. LONG share_count_h; // 流通H股 10000
  43. LONG share_count_national; // 国有股 10000
  44. LONG share_count_corp; // 法人股 10000
  45. LONG profit_psud; // 每股未分配利润 0.001
  46. LONG asset; // 总资产 10000
  47. LONG ratio_holderright; // 股东权益比率 0.001
  48. LONG ratio_longdebt; // 长期负债率 0.001
  49. LONG ratio_debt; // 资产负债率 0.001
  50. // ★投资收益能力
  51. LONG netasset_ps; // 每股净资产 0.001
  52. LONG netasset_ps_regulate; // 调整每股净资产 0.001
  53. LONG eps; // 每股收益 0.001
  54. LONG eps_deduct; // 扣除后每股收益 0.001
  55. LONG net_profit; // 净利润 10000
  56. LONG main_profit; // 主营业务利润 10000
  57. LONG total_profit; // 利润总额 10000
  58. // ★增长率
  59. LONG profit_inc; // 主营利润增长率% 0.001
  60. LONG income_inc; // 主营收入增长率% 0.001
  61. LONG asset_inc; // 总资产增长率% 0.001
  62. // ★技术数据统计值
  63. LONG yield_average; // 平均收益率% 0.001
  64. LONG yield_stddev; // 收益标准差% 0.001
  65. LONG beite; // β值 0.001
  66. DWORD reserved[4];
  67. }CLK20_BASEDATA, *PCLK20_BASEDATA;
  68. */
  69. // 除权数据
  70. typedef struct clk_drdata_t {
  71. DWORD date;
  72. DWORD bonus; // 10派X元 /1000
  73. DWORD bonus_share; // 10送X股 /100
  74. DWORD ration_share; // 10配X股 /100
  75. DWORD ration_value; // 配股价 /1000
  76. DWORD reserved;
  77. }CLK_DRDATA, * PCLK_DRDATA;
  78. // 分析家格式除权数据
  79. typedef union fxj_drdata_t {
  80. struct
  81. {
  82. DWORD m_dwMagic; // = -1
  83. WORD m_wMarket; // SH 上海 SZ 深圳
  84. char m_szCode[6];
  85. char m_szReserved[8];
  86. };
  87. struct
  88. {
  89. time_t m_time;
  90. float m_fGive; // 每股送
  91. float m_fPei; // 每股配
  92. float m_fPeiPrice; // 配股价,仅当 m_fPei!=0.0f 时有效
  93. float m_fProfit; // 每股红利
  94. };
  95. }FXJ_DRDATA, * PFXJ_DRDATA;
  96. // 通达信格式财务数据
  97. #define TDX_FHEADER_SIZE 0x521
  98. typedef struct tdx_basedata_t {
  99. char m_szMagic;
  100. char m_szMarket; // 市场 '0' 深圳 '1' 上海
  101. char m_szCode[6];
  102. char m_szDate_modified[8]; // 更新日期
  103. char m_szShare_count_total[14]; // 总股本 10000
  104. char m_szShare_count_national[14]; // 国家股 10000
  105. char m_szShare_count_orig[14]; // 发起股 10000
  106. char m_szShare_count_corp[14]; // 法人股 10000
  107. char m_szShare_count_b[14]; // B股 10000
  108. char m_szShare_count_h[14]; // H股 10000
  109. char m_szShare_count_currency[14]; // 流通股 10000
  110. char m_szShare_count_employ[14]; // 职工股 10000
  111. char m_szUnkown1[14]; // 
  112. char m_szAsset[14]; // 总资产 1000
  113. char m_szAsset_currency[14]; // 流动资产 1000
  114. char m_szAsset_capital[14]; // 固定资产 1000
  115. char m_szAsset_imma[14]; // 无形资产 1000
  116. char m_szInvest_long[14]; // 长期投资 1000
  117. char m_szDebt_currency[14]; // 流动负债 1000
  118. char m_szDebt_long[14]; // 长期负债 1000
  119. char m_szAcc_fund[14]; // 公积金 1000
  120. char m_szNet_asset[14]; // 净资产 1000
  121. char m_szMain_income[14]; // 主营收入 1000
  122. char m_szMain_profit[14]; // 主营利益 1000
  123. char m_szOther_profit[14]; // 其他利益 1000
  124. char m_szBusiness_profit[14]; // 营业利益 1000
  125. char m_szInvest_profit[14]; // 投资收益 1000
  126. char m_szAllow_profit[14]; // 补贴收入 1000
  127. char m_szOut_profit[14]; // 业外收支 1000
  128. char m_szProfit_regulate[14]; // 损益调整 1000
  129. char m_szTotal_profit[14]; // 利润总额 1000
  130. char m_szProfit_aftertax[14]; // 税后利益 1000
  131. char m_szNet_profit[14]; // 净利益 1000
  132. char m_szProfit_ud[14]; // 未分利润 1000
  133. char m_szNet_asset_ps_regulate[14]; // 每股净资2
  134. char m_szUnknown2[3]; // 
  135. char m_szUnknown3[4]; // 
  136. char m_szUnknown4[2]; //
  137. char m_szDate_begin[8]; // 上市日期
  138. char m_szUnknown5[3]; // 
  139. char m_szUnknown6[11]; // 
  140. }TDX_BASEDATA, *PTDX_BASEDATA;
  141. // 分析家格式财务数据
  142. #define FXJ_FHEADER_SIZE 0x8
  143. typedef struct fxj_basedata_header_t {
  144. DWORD m_dwMagic1; // 0x223FD90C;
  145. DWORD m_dwMagic2; // 0x000000A6;
  146. }FXJ_BASEDATA_HEADER, *PFXJ_BASEDATA_HEADER;
  147. typedef struct fxj_basedata_t {
  148. WORD m_wMarket; // 市场 'ZS'" 深圳 'HS' 上海
  149. WORD m_wUnknown;
  150. char m_szCode[6];
  151. float m_fData[39];
  152. /*
  153. m_fData[0]
  154. m_fData[1]
  155. m_fData[2]*10000 // 总股本
  156. m_fData[3]*10000 // 国有股
  157. m_fData[4]*10000 // 发起人法人股
  158. m_fData[5]*10000 // 法人股
  159. m_fData[6]*10000 // 流通B股
  160. m_fData[7]*10000 // 流通H股
  161. m_fData[8]*10000 // 流通A股
  162. m_fData[9]
  163. m_fData[10]
  164. m_fData[11]*1000 // 总资产
  165. m_fData[12]*1000 // 流通资产
  166. m_fData[13]*1000 // 固定资产
  167. m_fData[14]
  168. m_fData[15]*1000 // 长期投资
  169. m_fData[16]*1000 // 流通负债
  170. m_fData[17]*1000 // 长期负债
  171. m_fData[18]*1000 // 资本公积金
  172. m_fData[19] // 公积金/股
  173. m_fData[20]*1000 // 股东权益
  174. m_fData[21]*1000 // 主营业务收入
  175. m_fData[22]*1000 // 主营业务利润
  176. m_fData[23]*1000 // 其它业务利润
  177. m_fData[24]*1000 // 营业利益
  178. m_fData[25]*1000 // 投资收益
  179. m_fData[29]*1000 // 利润总额
  180. m_fData[30]
  181. m_fData[31]*1000 // 净利润
  182. m_fData[32]*1000 // 未分配利润
  183. m_fData[33] // 每股未分配利润
  184. m_fData[34] // 每股收益
  185. m_fData[35] // 每股净资产
  186. m_fData[36] // 调整每股净资产
  187. m_fData[37] // 股东权益比率
  188. m_fData[38] // 净资产收益率 %
  189. */
  190. }FXJ_BASEDATA, *PFXJ_BASEDATA;
  191. /* 适用各种数据类型存储的文件格式包含三部分
  192. 1. 文件头:CLK_FHEADER
  193. 2. 索引区:大小为CLK_FHEADER.m_dwIndexRecordSize * CLK_FHADER.m_dwIndexRecordCount
  194. 分为CLK_FHADER.m_dwIndexRecordCount个块,
  195. 每块为CLK_FHEADER.m_dwIndexRecordSize,即CLK_INDEXRECORD
  196. 3. 数据区:大小为CLK_FHEADER.m_dwBlockSize * CLK_FHEADER.m_dwBlockCount
  197. 分为CLK_FHADER.m_dwBlockCount个Block,
  198. 每一Block有一个 CLK_BLOCKHEADER,和紧随其后的CLK_BLOCKHEADER.m_dwDataRecordCount个股票数据记录
  199. 如果一个Block不能记录该股票全部记录,则CLK_BLOCKHEAHDRE.m_dwPosNextBlock指向下一个数据块
  200. */
  201. #define CLK_FHEADER_MAGIC 'FKLC'
  202. #define CLK_FHEADER_VERMAJOR '2003'
  203. #define CLK_FHEADER_VERMINOR '1002'
  204. typedef struct clk_fheader { // 自有文件格式,文件头
  205. // 文件信息
  206. DWORD m_dwMagic; // = CLK_FHEADER_MAGIC
  207. DWORD m_dwVerMajor; // = CLK_FHEADER_VERMAJOR
  208. DWORD m_dwVerMinor; // = CLK_FHEADER_VERMINOR
  209. DWORD m_dwReserved1; // 保留
  210. DWORD m_dwDataType; // 数据分类说明,see CStock::DataType
  211. DWORD m_dwMarket; // 市场,see CStock::StockMarket,如果文件包含多个市场,则=0无效
  212. time_t m_time; // 文件最后修改日期
  213. // 索引区信息
  214. DWORD m_dwPosFirstIndex; // 索引区起始位置
  215. DWORD m_dwIndexRecordSize; // 索引区记录单元字节数
  216. DWORD m_dwIndexRecordCount; // 索引区记录单元个数
  217. DWORD m_dwStockCount; // 本文件索引区中的总股票数
  218. // 数据区信息,包含m_dwBlockCount个Block,每个Block包含m_dwBlockSize/m_dwDataRecordSize个DataRecord
  219. DWORD m_dwDataRecordSize; // 数据区记录字节数
  220. // 根据m_dwDataType,
  221. // = sizeof(REPORT)
  222. // or = sizeof(MINUTE)
  223. // or = sizeof(KDATA)
  224. DWORD m_dwRecordPerBlock; // 每个Block的记录数
  225. DWORD m_dwBlockSize; // 数据区Block单元字节数,一个Block有一个BlockHeader和若干个DataRecord
  226. DWORD m_dwPosFirstBlock; // 文件中第一个Block位置.
  227. DWORD m_dwPosFirstBlankBlock; // 文件中第一个空Block的位置,所有空Block组成一个链表
  228. DWORD m_dwReserved2[4]; // 保留
  229. char m_szDescript[128]; // 文件说明
  230. char m_szNextFileName[MAX_PATH]; // 有时候,一个文件不能太大,有多个文件,m_szNextFileName指向下
  231. // 一个同类型文件的相对目录,目前未使用
  232. }CLK_FHEADER;
  233. #define CLK_INDEXRECORD_MAGIC 'XDNI'
  234. typedef struct clk_indexrecord { // 自有文件格式,股票索引部分单元
  235. DWORD m_dwMagic; // = CLK_INDEXRECORD_MAGIC
  236. DWORD m_dwMarket; // 股票市场 see CStock::StockMarket
  237. char m_szCode[STKLIB_MAX_CODE2]; // 股票代码
  238. DWORD m_dwPosFirstBlock; // 本股票第一个Block起始位置,-1或0表示无
  239. DWORD m_dwDataRecordCountTotal; // 本股票数据记录总数
  240. DWORD m_dwReserved; // 保留
  241. }CLK_INDEXRECORD;
  242. #define CLK_BLOCKHEADER_MAGIC 'KCLB'
  243. typedef struct clk_blockheader { // 自有文件格式,数据区部分,数据块头
  244. DWORD m_dwMagic; // = CLK_BLOCKHEADER_MAGIC
  245. DWORD m_bUsed; // 本Block是否使用
  246. DWORD m_dwPosFirstRecord; // 本Block数据记录起始位置
  247. DWORD m_dwDataRecordCount; // 本Block块数据记录个数
  248. DWORD m_dwPosNextBlock; // 含有本股票数据的下一个Block的起始位置,-1或0表示无
  249. DWORD m_dwReserved; // 保留
  250. }CLK_BLOCKHEADER;
  251. #pragma pack()
  252. class CClkFile
  253. {
  254. public:
  255. CClkFile( );
  256. virtual ~CClkFile( );
  257. virtual BOOL Open( LPCTSTR lpszFileName );
  258. virtual void Close();
  259. // operation
  260. static BOOL BuildEmptyFile( LPCTSTR lpszFileName,
  261. DWORD dwDataType, // 数据分类说明,see CStock::DataType
  262. DWORD dwMarket, // 市场,see CStock::StockMarket,如果文件包含多个市场,则=0无效
  263. DWORD dwIndexRecordCount = 3000, // 索引区记录单元个数
  264. DWORD dwRecordPerBlock = 50, // 每个Block的记录数
  265. BOOL bRebuildIfExists = FALSE
  266. );
  267. static BOOL RemoveFileIfOutoftime( LPCTSTR lpszFileName, time_t tmNow ); // return TRUE if removed
  268. // Store Function
  269. BOOL EmptyAll( );
  270. DWORD StoreDataRecord(DWORD dwMarket, const char * szCode,
  271. void * pData, DWORD dwDataElementSize, DWORD dwDataElementCount,
  272. BOOL bOverWrite ); // 返回成功保存记录数
  273. // Load Function
  274. DWORD GetDataRecordCount( DWORD dwMarket, const char * szCode );
  275. DWORD LoadDataRecord( DWORD dwMarket, const char * szCode,
  276. void * pData, DWORD dwDataElementSize, DWORD dwMaxDataElement );// 返回成功读取记录数
  277. protected:
  278. DWORD Hash( LPCTSTR key, DWORD dwMax );
  279. BOOL GetDataInfo( DWORD dwMarket, const char * szCode, CLK_INDEXRECORD & idxRet, DWORD & dwPosIndexFind, BOOL bAddIfNotExists );
  280. BOOL SetDataInfo( DWORD dwPosIndex, CLK_INDEXRECORD idx, BOOL bFlush );
  281. DWORD GetFirstBlankBlockPos( BOOL bAddIfNotExists, BOOL bUseIt );
  282. DWORD EmptyBlockChain( DWORD dwPosFirstBlock );
  283. DWORD ReadData( DWORD dwPostBlock, void * pData, DWORD dwDataElementSize, DWORD dwMaxDataElement );
  284. DWORD WriteData( DWORD dwPosBlock, void * pData, DWORD dwDataElementSize, DWORD dwDataElementCount, BOOL bFlush );
  285. protected:
  286. CSPFile m_file;
  287. CLK_FHEADER m_header;
  288. // 记下当前正在操作的股票
  289. CLK_INDEXRECORD m_CurIndexRecord;
  290. DWORD m_dwPosCurIndex;
  291. };
  292. /***
  293. 自有格式数据的读取,除了除权除息数据、行情数据外,其余与钱龙格式数据相同。
  294. */
  295. class CSelfDB : public CQianlong
  296. {
  297. public:
  298. CSelfDB( const char * rootpath, BOOL bOK = TRUE );
  299. virtual ~CSelfDB( );
  300. static CSPString GetNewsPath( DWORD dwMarket );
  301. static CSPString GetBasePath( DWORD dwMarket );
  302. static BOOL CreateSelfDB( const char * rootpath );
  303. static BOOL GetAccurateRoot( const char * rootpath, char *accurateroot, int maxlen );
  304. virtual int LoadCodetable( CStockContainer & container );
  305. virtual int StoreCodetable( CStockContainer & container );
  306. virtual int LoadKData( CStock *pstock, int nKType );
  307. virtual int LoadBasetable( CStockContainer & container );
  308. virtual int StoreBasetable( CStockContainer & container );
  309. virtual int LoadDRData( CStock *pstock );
  310. virtual int StoreDRData( CStock *pstock );
  311. virtual int LoadReport( CStock *pstock );
  312. virtual int LoadMinute( CStock *pstock );
  313. virtual int LoadOutline( CStock *pstock );
  314. virtual int StoreReport( REPORT * pReport, int nCount, BOOL bBigTrade );
  315. virtual int StoreMinute( MINUTE * pMinute, int nCount );
  316. virtual int StoreOutline( OUTLINE * pOutline, int nCount );
  317. virtual int InstallCodetbl( const char * filename, const char *orgname );
  318. virtual int InstallCodetblBlock( const char * filename, const char *orgname );
  319. virtual int InstallCodetblFxjBlock( const char * filename, const char *orgname );
  320. virtual int InstallDRData( CDRData & drdata );
  321. virtual int InstallDRDataClk( const char * filename, const char *orgname );
  322. virtual int InstallDRDataFxj( const char * fxjfilename );
  323. virtual int InstallBasetable( const char * filename, const char *orgname );
  324. virtual int InstallBasetableTdx( const char * filename );
  325. virtual int InstallBasetableFxj( const char * filename );
  326. virtual int InstallNewsText( const char * filename, const char *orgname );
  327. virtual int InstallNewsText( const char * buffer, int nLen, const char *orgname );
  328. virtual BOOL GetFileName( CSPString &sFileName, int nDataType,
  329. CStockInfo * pInfo = NULL, int nKType = CKData::ktypeDay );
  330. // Attributes
  331. static char m_szDataType[256];
  332. static int GetType( ) { return dbtypeSelfDB; }
  333. static const char * GetName( ) { return m_szDataType; }
  334. virtual int GetDBType( ) { return GetType(); }
  335. virtual const char * GetDBTypeName( ) { return GetName(); }
  336. };
  337. #endif //__STKLIB_SELFDB_H__