策略为王数据结构、文件存储、类使用举例说明使用手册

Published

策略为王源代码项目结构介绍

https://www.stockso.com/Blog/BlogPost/5bdb308153f4882d248ec79c/introduction-to-the-project-structure-of-wang-yuan-code

 

G:\stock\TskingVS2019\src\Client ---------- root
├── bin/  ---------- 可执行文件目录 
│   ├── StkUI.exe ---------- 主程序
│   ├── data/ ---------- 数据目录
│   │       ├── domain.dat ---------- 应用服务缓存
│   │       ├── group.dat  ---------- 应用服务缓存
│   │       ├── CHNA.pwr ---------- 沪深除权信息存放在文件 ,CHNA.pwr 与分析家(http://www.fxj.com.cn)    除权文件格式相同。
│   │       ├── \shase\xdrdata\ ---------- 用户运行“数据管理”修改后的除权信息保存在data\shase\xdrdata\ 和 data\sznse\xdrdata下,每个股票一个文件,格式为 struct drdata_t 的数组
│   │       ├──"data\\shna.bst";		// 财务资料表
│   │       ├── "data\\shse.cod";		// 上海代码表
│   │       ├── "data\\szse.cod";		// 深圳代码表
│   │       ├── "data\\shse.rpt";		// 上海行情保存文件
│   │       ├── "data\\szse.rpt";		// 深圳行情保存文件
│   │       ├── "data\\shse.min";		// 上海分时保存文件
│   │       ├──"data\\szse.min";		// 深圳分时保存文件
│   │       ├── "data\\clkoutln.out";       //行情额外数据文件,/ 行情额外数据结构 CStock::dataOutline,对应typedef struct outline_t {结构,按行存储
│   │       └── CHNA.bst ---------- 
│   ├── export/---------- 应用服务缓存
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   ├── Help/---------- 应用服务缓存
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │          └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   └── news/---------- 应用服务缓存
│            ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│            ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│            └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
├── Help/  ---------- 可执行文件目录 
│   ├── Chs/ ---------- 数据目录
│   │       ├── StockAna.chm ---------- 应用服务缓存
│   │       ├── StockAna.hhp  ---------- 应用服务缓存
│   │       ├── Table of Contents.hhc ---------- 。
│   │       ├── \Chs\htm ---------- 
│   │       └── CHNA.bst ---------- 
│   └── Enu/---------- 应用服务缓存
├── NetTS/  ----------  用来连接数据服务器并下载数据
│   ├── StkUI.exe ---------- 主程序
│   ├── data/ ---------- 数据目录
│   │       ├── domain.dat ---------- 应用服务缓存
│   │       ├── group.dat  ---------- 应用服务缓存
│   │       ├── CHNA.pwr ---------- 沪深除权信息存放在文件 ,CHNA.pwr 与分析家(http://www.fxj.com.cn)    除权文件格式相同。
│   │       ├── \shase\xdrdata\ ---------- 用户运行“数据管理”修改后的除权信息保存在data\shase\xdrdata\ 和 data\sznse\xdrdata下,每个股票一个文件,格式为 struct drdata_t 的数组
│   │       └── CHNA.bst ---------- 沪深财务信息存放在文件 data\CHNA.bst 文件, CHNA.bst 文件为 struct basedata_t 的 数组。财务资料更新可以在软件“历史下载”中自动下载更新,导入通达信软件目录下的 base.dbf 文件自行更新。
│   ├── export/---------- 应用服务缓存
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   ├── Help/---------- 应用服务缓存
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │          └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   └── news/---------- 应用服务缓存
│            ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│            ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│            └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
├── StkLib/  ---------- 可执行文件目录 
│   ├── Include/ ---------- 文件头目录
│   │       ├── Stock.h---------- 定义有关股票的数据结构struct
│   │       │           ├── KDATA结构,DRDATA结构
│   │       │           ├── class	CKData
│   │       │           ├── class	CDRData
│   │       │           ├── class	CBaseData
│   │       │           ├── class	CReport
│   │       │           ├── class	CMinute
│   │       │           ├── class	COutline
│   │       │           ├── class	CStockInfo
│   │       │           └── class	CStock
│   │       ├── Technique.h  ---------- 定义指标数据结构
│   │       ├── CHNA.pwr ---------- 沪深除权信息存放在文件 ,CHNA.pwr 与分析家(http://www.fxj.com.cn)    除权文件格式相同。
│   │       ├── \shase\xdrdata\ ---------- 用户运行“数据管理”修改后的除权信息保存在data\shase\xdrdata\ 和 data\sznse\xdrdata下,每个股票一个文件,格式为 struct drdata_t 的数组
│   │       └── CHNA.bst ---------- 
│   ├── Src/---------- 源文件目录
│   │         │****************** 1.负责操作磁盘数据的部分***********
│   │         ├── StStore.cpp ----------  三个驱动的接口定义
│   │         │       ├── QianLong.cpp    ---------- 实现 class IStStore  接口 
│   │         │       ├── ShengLong.cpp  ----------实现 class IStStore  接口 
│   │         │       └── SelfDB.cpp         ----------实现 class IStStore  接口 
│   │         │               ├── CTSKFile类(用法:CTSKFile file;;)读写自定义二进制带索引区的K线文件和自定义分笔明细文件;
│   │         │               └──  CSelfDB::InstallBasetableTdx(const char * filename)--安装通达信base.dbf财务数据,对应菜单:数据->数据管理->板块财务F10数据导入->选择通达信导入目录
│   │         └── Database.cpp ----------CStDatabase类 的实现,负责操作磁盘数据。
│   │         │***************** 2.负责操作配置文件的部分 ***********
│   │         ├── Profile.cpp ----------  策略为王专用指标的实现
│   │         ├── TechEnergy.cpp ----------     
│   │         ├── TechKLine.cpp ----------
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹Database
│   │         ***************** 3.负责Stock.h实现的部分 ***********
│   │         ├── KData.cpp         K线数据结构数组类实现
│   │         ├── DRData.cpp        除权数据结构数组类实现   
│   │         ├── BaseData.cpp      基本资料数据结构类实现
│   │         ├── Report.cpp        行情数据结构数组类实现
│   │         ├── Minute.cpp        行情分时数据结构数组类实现
│   │         ├── Outline.cpp       行情额外数据结构数组类实现 
│   │         └── Stock.cpp         class CStockInfo and class CStock 股票数据结构实现
│   │         ├── ************ 4.负责操作技术指标的部分 ***********
│   │         ├── TechCLK.cpp ----------  策略为王专用指标的实现
│   │         ├── TechEnergy.cpp ----------     
│   │         ├── TechKLine.cpp ----------
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹Database
│   │         ├── ************ 4.负责的部分 ***********
│   │         ├── Packets.cpp ----------  UpdateStockContainerByKData()等转换函数
│   │         ├── TechEnergy.cpp ----------     
│   │         ├── TechKLine.cpp ----------
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹Database
├── StkNet/                     ----------一个MFC dll 类,负责管理通视驱动和行情服务器.
│   ├── Include/
│   ├── bootstrap-grid.css.map
│   ├── bootstrap-grid.min.css
│   ├── bootstrap-grid.min.css.map
│   ├── Src/
│   │      ├── SCStkdrv.h----------数畅驱动
│   ├── bootstrap-reboot.min.css
│   ├── bootstrap-reboot.min.css.map
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   ├── bootstrap.min.css
│   └── bootstrap.min.css.map
 │   ├── Meowv.Blog.BackgroundJobs ---------- 后台定时任务
 │   ├── Meowv.Blog.Domain ---------- 领域层,实体,仓储接口
 │   ├── Meowv.Blog.Domain.Shared ---------- 领域层,一些常量,枚举等
 │   ├── Meowv.Blog.EntityFrameworkCore ---------- 集成EF Core,仓储接口实现
 │   ├── Meowv.Blog.EntityFrameworkCore.DbMigrations ---------- EF Core数据库迁移
 │   ├── Meowv.Blog.HttpApi ---------- API控制器
 │   ├── Meowv.Blog.HttpApi.Hosting ---------- WebApi项目,依赖于HttpApi,
 │   ├── Meowv.Blog.Swagger ---------- Swagger扩展、Filter
 │   └── Meowv.Blog.ToolKits ---------- 公共的工具类、扩展方法
├── StkTech/  ---------- 可执行文件目录 
│   ├── StkUI.exe ---------- 主程序
│   ├── data/ ---------- 数据目录
│   │       ├── domain.dat ---------- 应用服务缓存
│   │       ├── group.dat  ---------- 应用服务缓存
│   │       ├── CHNA.pwr ---------- 沪深除权信息存放在文件 ,CHNA.pwr 与分析家(http://www.fxj.com.cn)    除权文件格式相同。
│   │       ├── \shase\xdrdata\ ---------- 用户运行“数据管理”修改后的除权信息保存在data\shase\xdrdata\ 和 data\sznse\xdrdata下,每个股票一个文件,格式为 struct drdata_t 的数组
│   │       └── CHNA.bst ---------- 沪深财务信息存放在文件 data\CHNA.bst 文件, CHNA.bst 文件为 struct basedata_t 的 数组。财务资料更新可以在软件“历史下载”中自动下载更新,导入通达信软件目录下的 base.dbf 文件自行更新。
│   ├── export/---------- 应用服务缓存
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   ├── Help/---------- 应用服务缓存
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │          └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   └── news/---------- 应用服务缓存
│            ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│            ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│            └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
├── StkUI/  ---------- 可执行文件目录 
│   ├── StkUI.exe ---------- 主程序
│   ├── Dialog/ ---------- 对话框目录
│   │       ├── ListExportDlg.cpp ----------数据导出对话框。对应 主菜单-列表(L)-当前股票列表数据导出(X)...对话框CDialog(CExportDest.cpp)
│   │       ├── ExportDest.cpp    ---------- 数据导出类定义了class CExportDB类,包含导出到.txt .mdb .odbc .excel的文件打开、写入、关闭文件函数。被ListExportDlg.cpp调用
│   │       ├── CHNA.pwr ---------- 沪深除权信息存放在文件 ,CHNA.pwr 与分析家(http://www.fxj.com.cn)    除权文件格式相同。
│   │       ├── \shase\xdrdata\ ---------- 用户运行“数据管理”修改后的除权信息保存在data\shase\xdrdata\ 和 data\sznse\xdrdata下,每个股票一个文件,格式为 struct drdata_t 的数组
│   │       └── CHNA.bst ---------- 沪深财务信息存放在文件 data\CHNA.bst 文件, CHNA.bst 文件为 struct basedata_t 的 数组。财务资料更新可以在软件“历史下载”中自动下载更新,导入通达信软件目录下的 base.dbf 文件自行更新。
│   ├── Help/---------- 帮助文件F1
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │         └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   ├── ParamDlg/---------- 技术指标设置对话框
│   │         ├── base.dbf ---------- 应用服务数据传输对象(DTO)
│   │         ├── block_fg.dat ---------- 应用服务数据传输对象(DTO)
│   │          └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
│   └── View/---------- 画图函数
│            ├── BaseView.cpp ---------- 基类
│            ├── DrawTech.cpp---------- 画叠加指标
│            └── tdxhy.cfg ---------- 用于README.md展示图片的图片文件夹
├── incon.dat ---------- 板块代码数据文件,用二进制格式存储
└── XPFace/ ---------- 用于README.md展示图片的图片文件夹
base.dbftdxhy
 
 
 
 

https://github.com/xzm/trade/blob/master/csgt/Document/readme.txt

 

1. 策略为王数据结构及存储  

 有关股票的数据结构都在工程StkLib中定义。

目录:

src\Client\StkLib\Include

  

 其中StKLib/Include/Stock.h中定义了如下结构和类:  

 1) KDATA结构

  
 K线数据结构,如果是日线,则日期,开盘价,最高价,最低价,收盘价几个信息。  
 CKData类:对KDATA结构的数组形式及一些操作。例如:技术图表界面中的K线图就是依据 这个类画的。  
 CKData类里面有三个标志变量,  
 int m_nKType: 记录这个数组是日线,周线,5分钟线等,见CKData::KTypes  枚举类型。  
 int m_nCurFormat: 记录K线的复权状态,见CKData::Formats枚举类型。

formatOriginal不复权;
formatXDRup向上复权,  
formatXDRdown向下复权。  


 int m_nCurMaindataType;:记录主数据类型,见CKData::MaindataTypes枚举类型。  
 例如:如果是mdtypeAverage,则MaindataAt(...)函数  
 返回的就是平均价。  

 K线数据在磁盘上的存储,与钱龙,核新格式兼容,每只股票一个文件。磁盘上日线,  
 周线,月线的数据格式是源文件StkLib\\Src\\Qianlong.h中定义的结构QL_Data_day的简单  
 重复,从文件头开始至文件尾都是这个结构,有多少个就说明有多少个数据。同样,5分  
 钟,15分钟,30分钟,60分钟线的结构是源文件StkLib\\Src\\Qianlong.h中的QL_Data_5min。  

 装载K线数据时,自动转换成CKData类的对象。  

 2) DRDATA结构  
 除权除息数据结构,即K线复权时使用的公司股本变动及分红等数据。CDRData类是  
 DRDATA结构的数组形式及一些操作。  

 DRDATA在磁盘上存储于data\\CHNA.pwr文件中,该文件格式与分析家除权文件格式完全  
 相同。分析家除权文件的格式就是源文件StkLib\\Src\\SelfDB.h中的结构FXJ_DRDATA。  

 装载数据时,自动转换为CDRData类的对象。  

 3) BASEDATA结构  
 财务信息数据结构,即股票的财务数据信息。CBasedata类是BASEDATA结构的数组形式  
 及一些操作。  

 BASEDATA在磁盘上存储于data\\CHNA.bst中。该文件的格式即为若干个BASEDATA结构。  

 4) REPORT结构  
 实时行情传送过来的股票报价包,类似于通视的RCV_REPORT_STRUCTEx。  
 StkNet\\Src\\StkReceiver.h中的CStkReceiver类是负责接收通视数据包的类,有一个静态  
 对象可以通过AfxGetStkReceiver()方法获得。该对象将收到的通视数据转换成相应的  
 REPORT,MINUTE,OUTLINE,MULTISORT结构。并创建线程,向需要数据的窗口发送消息。  
 同时将相应数据存储到本地dat\\目录下,只保存当天数据。  

 dat\\report.now保存最新RCV_REPORT_STRUCTEx数据,源文件NetTS\\Src\\TSCache.cpp中的  
 BOOL CTSCache::StoreReports( )和BOOL CTSCache:oadReports( )方法保存和读取这个  
 文件。  

 dat\\SHSE.rpt,dat\\SZSE.rpt分别保存上证和深证的REPORT数据。格式为类CClkFile,定  
 义在StkLib\\Include\\SelfDB.h中。  

 dat\\SHSE.min,dat\\SZSE.min分别保存上证和深证的MINUTE数据。格式为类CClkFile,定  
 义在StkLib\\Include\\SelfDB.h中。  

 5) MINUTE结构  
 实时行情传送过来的分钟线数据,类似于通视的RCV_MINUTE_STRUCTEx。  
 即分时行情窗口中的分时价格线数据,每分钟一个数据。  

 6) OUTLINE结构  
 实时行情传送过来的行情额外数据,通视目前没有该类数据。  

 7) MULTISORT结构  
 实时行情传送过来的综合排名数据。通视目前没有该类数据。通视的综合排名是根据收到  
 的RCV_REPORT_STRUCTEx自己算出来的。这个结构是天网网络接口发送的,在服务器端计算  
 好的排名,直接发到客户端,显示在综合排名界面。  

 该数据不存盘。  

 8) COMMPACKET结构  
 为了写程序方便,定义的一个结构,该结构可以分配其他结构数组,分配方法在源文件  
 StkLib\\Src\\Packets.cpp中。  

 该数据不存盘。  

 9) CStockInfo类  
 股票基本信息数据,包含基本财务数据,最新报价数据,最近若干天的K线缓存。  

 该数据不存盘。  

 10) CStock类  
 某只股票的全部数据都可以存储在这个类里,装载过程参见后面的示例代码说明。  

 其中StKLib/Include/StockContainer.h中定义了如下结构和类:  

 11) CStockContainer类  
 CStockInfo类的数组容器,AfxGetStockContainer()函数得到该类的一个静态对象,保存  
 着当前所有股票的基本信息数据缓存。在程序启动时装载。  
 AfxGetSListContainer()函数得到该类的另一个静态对象,保存着当前股票列表窗口中的  
 股票及基本信息缓存。该对象的数据初始化根据用户操作自动从AfxGetStockContainer()  
 对象里装载。  

 12) CDomain类  
 一个板块或者一个分组。包含该板块(分组)名称及代码数组。  

 13) CDomainContainer类  
 板块或者分组容器类。  
 AfxGetDomainContainer()方法返回一个静态对象,包含当前板块信息。  
 AfxGetGroupContainer()方法返回一个静态对象,包含当前分组信息。  

 其中StKLib/Include/Database.h中定义了如下类:  

 14) CStDatabase类  
 访问本地数据的接口类。通过AfxGetDB()方法返回该类的一个静态对象,可以通过  
 该对象读取本地的K线数据,F10资料,除权数据。读取方法参看下面示例详解�

 

2. 磁盘上的文件  

 dat\\report.now 最新即时行情列表数据。  
 dat\\SHSE.rpt 每天每只上证股票的成交数据。  
 dat\\SZSE.rpt 每天每只深证股票的成交数据。  
 dat\\SHSE.min 每天每只上证股票的分钟线数据。  
 dat\\SZSE.min 每天每只深证股票的分钟线数据。  
 data\\shase\\base\\ 上证F10资料,每只股票一个文件。  
 data\\shase\\day\\ 上证日线数据,每只股票一个文件。  
 data\\shase\\week\\ 上证周线数据,每只股票一个文件。  
 data\\shase\\month\\ 上证月线数据,每只股票一个文件。  
 data\\shase\\mnt\\ 上证5分钟数据,每只股票一个文件。  
 data\\shase\\xdr\\ 上证除权数据,每只股票一个文件。最终结果是CHNA.pwr与该目录  
 下的文件合并的结果。  
 data\\shase\\base\\ 深证F10资料,每只股票一个文件。  
 data\\shase\\day\\ 深证日线数据,每只股票一个文件。  
 data\\shase\\week\\ 深证周线数据,每只股票一个文件。  
 data\\shase\\month\\ 深证月线数据,每只股票一个文件。  
 data\\shase\\mnt\\ 深证5分钟数据,每只股票一个文件。  
 data\\shase\\xdr\\ 深证除权数据,每只股票一个文件。最终结果是CHNA.pwr与该目录  
 下的文件合并的结果。  

 data\\SHSE.cod 上证代码表。  键盘精灵的股票代码来自这两个文件
 data\\SHSE.cod 深证代码表。  
 data\\CHNA.bst 财务数据文件。  
 data\\CHNA.pwr 除权数据文件。  
 data\\domain.dat 板块数据文件。  
 group.dat 分组数据文件。  



3. 指标数据结构及调用接口  

 其中StKLib/Include/Technique.h中定义了如下类:  
 1) CTechnique类  
 该类为所有技术指标类的父类,该类里保存着计算指标用的数据,即一个CKData对象。  
 另外还有一些Cache,是对刚刚计算过的指标值进行缓存,提高显示速度,以免总是重复计算。  
 几个虚函数接口:  

 // 得到nIndex位置处的买卖信号,nIndex为CKData的数组位置,pnCode为原因代号  
 virtual int GetSignal( int nIndex, UINT * pnCode = NULL );  

 // 得到nStart到nEnd之间的指标值的最大最小值,画图时用来判断画图坐标区间。  
 virtual BOOL GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );  

 // 计算指标值,对不同的指标类型,对应参数的个数不同。  
 virtual BOOL Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast );  
 virtual BOOL Calculate( double * pValue, int nIndex, BOOL bUseLast );  
 virtual BOOL Calculate( double * pValue1, double * pValue2, int nIndex, BOOL bUseLast ); 
 virtual BOOL Calculate( double * pValue1, double * pValue2, double * pValue3, int nIndex, BOOL bUseLast );  
 virtual BOOL Calculate( double * pValue1, double * pValue2, double * pValue3, double * pValue4, int nIndex, BOOL bUseLast );  
 virtual BOOL Calculate( double * pValue1, double * pValue2, double * pValue3, double * pValue4, double * pValue5, int nIndex, BOOL bUseLast );  

 // 计算单个指标值及该指标值nMADays日均线  
 virtual BOOL CalculateMA( double * pValue, double * pMA, int nIndex, BOOL bUseLast, int nMADays );  

4. 读取某只股票数据的示例程序详解  

 方法一:  
 CStock stock; // 创建CStock对象,用于存储数据。  
 stock.SetStockCode( CStock::marketSHSE, \"600036\" ); // 股票代码  
 AfxPrepareStockData( &AfxGetDB(), stock, CKData::ktypeDay, CKData::formatXDRdown, CKData::mdtypeClose, FALSE, TRUE );  
 // 装载stock的日线,并向下除权。  
  
 CKData & kday = stock.GetKData(CKData::ktypeDay); // 访问stock的日K线数据  

 方法二:  
 CStock stock; // 创建CStock对象,用于存储数据。  
 stock.SetStockCode( CStock::marketSHSE, \"600036\" ); // 股票代码

\r\n

 AfxReloadStock( stock ); // 装载stock的所有本地数据  

 CKData & kday = stock.GetKData(CKData::ktypeDay); // 访问stock的日K线数据  
 CKData & kweek = stock.GetKData(CKData::ktypeWeek); // 访问stock的周K线数据  

 方法三:  
 CStock stock; // 创建CStock对象,用于存储数据。  
 stock.SetStockCode( CStock::marketSHSE, \"600036\" ); // 股票代码  
 stock.SetDatabase( &AfxGetDB() ); // 告诉stock一个CStDatabase的指针  
 stock.PrepareData( CStock::dataK, CKData::ktypeDay ); // 装载日K线  
 stock.PrepareData( CStock::dataK, CKData::ktypeWeek ); // 装载周K线,实际上是从日K线计算转换而来,磁盘上无需存放。  
 stock.PrepareData( CStock::dataDR ); // 装载除权数据  

 CStockInfo & info = stock.GetStockInfo(); // 访问stock的基本信息数据  
 CKData & kday = stock.GetKData(CKData::ktypeDay); // 访问stock的日K线数据  
 CKData & kweek = stock.GetKData(CKData::ktypeWeek); // 访问stock的周K线数据  
 kday.SetDRData( stock.GetDRData() ); // 设置kdata的除权数据,用来复权  
 kday.ChangeCurFormat( CKData::formatXDRdown, AfxGetProfile().GetAutoResumeDRBegin(), AfxGetProfile().GetAutoResumeDRLimit() ); // 对kday向下复权  

5. 调用某指标信号计算的示例程序详解  

 CStock stock;  
 if( !stock.SetStockCode( CStock::marketSHSE, \"600036\" ) )  
 return;  
 if( !AfxPrepareStockData( &AfxGetDB(), stock, CKData::ktypeDay, CKData::formatXDRdown, CKData::mdtypeClose, FALSE, TRUE ) )  
 continue;  
 CKData & kdata = stock.GetKData( nKType );  

 CTechnique * pTech = CTechnique::CreateTechnique( STT_MACD, &kdata ); // 创建MACD指标类的对象  
 if( NULL == pTech )  
 return;  
 AfxGetProfile().GetTechParameters().FindParameters( STT_MACD, pTech ); // 找到配置文件中的指标参数,并赋给pTech  
 UINT itsc = ITSC_NOTHING;  
 UINT its = pTech->GetSignal( kdata.GetSize()-1, &itsc ); // 得到最后一天的买卖信号  
 if( ITS_BUY == its ) // 买入信号  
 {  
 }  
 if( ITS_SELL == its ) // 卖出信号  
 {  
 }  
 delete pTech;  


6. 调用某指标画图的示例程序详解  

 画图的函数都在StkUI\\View\\StockGraph.cpp和SktUI\\View\\DrawTech.cpp中。  

void CStockGraph:rawTechR( CDC * pDC, CRect rect, BOOL bDrawTitle )  
// 在rect矩形区域画出威廉指标R的指标曲线,bDrawTitle表示是否画标题.  
{  
 CStock stock;  
 if( !stock.SetStockCode( CStock::marketSHSE, \"600036\" ) )  
 return;  
 if( !AfxPrepareStockData( &AfxGetDB(), stock, CKData::ktypeDay, CKData::formatXDRdown, CKData::mdtypeClose, FALSE, TRUE ) )  
 continue;  
 CKData & kdata = stock.GetKData( nKType );  

 CTechnique * pTech = CTechnique::CreateTechnique( STT_R, &kdata );  
 if( NULL == pTech )  
 return;  
 AfxGetProfile().GetTechParameters().FindParameters( STT_R, pTech );  

 int nIndexStart = 0, nIndexEnd = 200; // 指标值起始和结束下标。  
 double dMin = 0, dMax = 0;  
 if( !m_techparam.r.GetMinMaxInfo( nIndexStart, nIndexEnd, &dMin, &dMax ) // 取得区间内的指标值最大最小值  
 || !DrawAxis( pDC, rect, 10, 5, dMin, dMax, FALSE, TRUE, 0 ) ) // 画坐标线及坐标数值, 10为标题高度, 5为纵轴坐标线个数  
 return;  
  
 DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_R, pTech, &kdata,  
 AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );  
 // 画只有一根线的指标.AfxGetProfile().GetColor(CColorClass::clrLine1)为线的颜色,  
 // drawtechtype_line表示画线,drawtechtype_dot表示画点.  
 delete pTech;  
}

 

AfxGetStockContainer

AfxGetStockContainer().ReloadBase( &AfxGetDB() ); //重新从磁盘装载财务数据。下载数据或安装数据完成后调用
 AfxGetSListStockContainer().ReRetrieveFromStatic( AfxGetActiveStrategy() );

 

7.板块-获取板块

                CDomainContainer & domains = AfxGetDomainContainer();
		for( int i=0; i<domains.GetSize(); i++ )
		{
			CDomain	& domain = domains.ElementAt(i);
			int nItem = m_listGroup.AddString( domain.m_strName );
			m_listGroup.SetItemData( nItem, NULL );
		}

",获取某板块所有股票代码

//删除某个版块的指定股票代码 by freeman
BOOL CDomainContainer::RemoveDomainStock( LPCTSTR lpszDomainName, LPCTSTR lpszStockCode )
{
	if( NULL == lpszDomainName || strlen(lpszDomainName) < 0
		|| NULL == lpszStockCode || strlen(lpszStockCode) < 0 )
		return FALSE;

	for( int i=0; i<GetSize(); i++ )
	{
		CDomain	& domain	=	ElementAt(i);
		if( 0 == domain.m_strName.CompareNoCase( lpszDomainName ) )
		{
			for( int k=0; k<domain.GetSize(); k++ )
			{
				if( 0 == domain.ElementAt(k).CompareNoCase(lpszStockCode) )
				{
					domain.RemoveAt(k);
					return TRUE;
				}
			}
			break;
		}
	}

	return FALSE;
}

11) CStockContainer类的使用

path:G:\stock\TskingVS2019\src\Client\StkLib\Src\SelfDB.cpp

//从文件中加载财务数据  2019/06/08 by freeman
int CSelfDB::LoadBasetable(CStockContainer& container)
{
	container.Lock();

	CSPMapStringToPtr	map;
	map.InitHashTable(container.GetSize() + container.GetSize() + 100);

	for (int i=0; i<container.GetSize(); i++)
	{
		CStockInfo	& info	= container.ElementAt(i);
		map.SetAt(info.GetStockCode(), (void *)i);
		info.m_basedata.RemoveAll();
	}
	
	CSPString	sFileName	= GetRootPath();
	sFileName	+= self_chna_basetbl;
	CSPFile	file;
	if (file.Open(sFileName, CSPFile::modeRead | CSPFile::shareDenyNone))
	{
		BASEDATA	block;
		while(sizeof(block) == file.Read(&block, sizeof(block)))
		{
			void * pArrayID	= NULL;
			if (map.Lookup(block.m_szCode, pArrayID))
			{
				int	nIndex	= ((int)pArrayID);
				if (nIndex >= 0 && nIndex < container.GetSize())
				{
					container.ElementAt(nIndex).m_basedata.InsertBaseDataSort(block);
				}
			}
		}
		file.Close();
	}

	container.UnLock();
	return container.GetSize();
}

 

 

更新容器中的股票信息

switch (wParam)
	{
	case CStock::dataReport:
		if (pCommPacket && CStock::dataReport == pCommPacket->m_dwDataType
			&& pCommPacket->m_dwCount > 0)
		{
			CStockContainer& container = AfxGetSListStockContainer();
			// 如果当前股票列表显示的日期不是今天的,返回,不做刷新
			DWORD	dwDate = -1;;
			AfxGetSListStockContainer().GetCurrentType(NULL, NULL, &dwDate);
			//发过来的明细日期不是当天的则丢弃
			if (-1 != dwDate && dwDate != CSPTime(pCommPacket->m_pReport[0].m_time).ToStockTimeDay())
				return 0L;

			container.Lock();

			// 刷新数据
			BOOL	bNeedReSort = FALSE;
			for (DWORD i = 0; i < pCommPacket->m_dwCount; i++)
			{
				int	id = 0;//股票在容器中的id号
				if (container.GetStockInfo(pCommPacket->m_pReport[i].m_szCode, NULL, &id))
				{
					CStockInfo& info = container.ElementAt(id);//取得股票信息
					UpdateStockInfoByREPORT(info, &(pCommPacket->m_pReport[i]));//更新成交明细数据
					StockInfoChanged(id, info);//更新股票容器数据,id为股票在容器中的id号,info 为新的股票信息
					bNeedReSort = TRUE;
				}
			}

获取容器中的股票信息

CStockInfo	info;
	if( !AfxGetStockContainer().GetStockInfo( stock.GetStockCode(), &info ) )
		info	=	stock.GetStockInfo( );

 

BOOL CStockGraph::PrepareStockData(BOOL bReload)
{
	if (!m_CurStock.GetStockInfo().IsValidStock())
		return FALSE;

	CStockInfo	info;
	if (AfxGetStockContainer().GetStockInfo(m_CurStock.GetStockCode(), &info)
		&& m_CurStock.GetStockInfo().IsEqualTo(info.GetMarket(), info.GetStockCode()))
	{
		m_CurStock.SetStockInfo(&info);
		m_CurStockDown.SetStockInfo(&info);
	}

 

修改股票容器中的股票信息

int	id = 0;//股票在容器中的id号
					if (AfxGetStockContainer().GetStockInfo(aReport[i].m_szCode, NULL, &id))
					{
						CStockInfo& info = container.ElementAt(id);//取得股票信息

						container.ElementAt(id)=info;

					}

					/

 

从配置类中取出当前股票

CStockInfo	info;
	//从配置类中取出当前股票 by freeman
	if (AfxGetProfile().GetCurrentStock(&info))
	{
		//CStockGraph	m_graph;设置当前股票信息
		m_graph.SetCurStock(info);
		//加载相关数据 ,包括加载K线数据,计算指标等  by freeman
		m_graph.PrepareStockData(UPDATE_HINT_GRAPHVIEW_NOTRELOADDATA != lHint);
	}
//功能:重新加载所有股票的分时线;更新stockinfo的缓存分时线 by freeman
int AfxRefreshStockContainerMinute( CStockContainer & container, LONG lStockType, int nSecondsToRead )
{
	container.Lock();

	time_t	tmTradeLatest	=	-1;

	int	nCount = 0;
	for( int i=0; i<container.GetSize(); i++ )
	{
		CStockInfo & info = container.ElementAt(i);
		if( info.GetType() != lStockType )
			continue;

		CStock	stock;
		stock.SetStockInfo( &info );
		stock.SetDatabase( &AfxGetDB() );
		//加载分时线数据 by freeman
		AfxGetDB().LoadMinute( &stock );
		info.m_minute.RemoveAll();
		
		CMinute	& minstock = stock.GetMinute();
		if( -1 == tmTradeLatest && stock.GetMinute().GetSize() > 0 )
			tmTradeLatest	=	CSPTime::GetTimeTradeLatest( minstock[0].m_time );
		for( int i=0; i<minstock.GetSize(); i++ )
		{
			if( -1 == nSecondsToRead || tmTradeLatest-minstock[i].m_time<nSecondsToRead )
				info.m_minute.Add( minstock[i] );
		}
		
		nCount	++;
	}
	container.UnLock();
	return nCount;
}

 

CStockContainer& container = AfxGetSListStockContainer();
//股票容器
	for (int i = 0; i < container.GetSize(); i++)
	{
		CStockInfo& info = container.GetStockInfoByID(i);//数组的Id号;除此之外,还存在负数ID代表其他类型。

		//插入一行,第0列为股票名称  2019/06/08 by freeman
		int nRow = m_Grid.InsertRow(info.GetStockName());
		m_Grid.SetItemData(nRow, 0, i);

 

断点测试函数

if ((strncmp(info.GetStockCode(), "603895", 6) == 0))
		{
			int  j = 0;
		}
/数据更新 2019/06/08 by freeman
void CSListView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
	TRACE(_T("CSListView::OnUpdate %d %d %d\n"), pSender, lHint, pHint);

 

CStock::markShanghai
CStock::marketSHSE