服务器开发程序不是很复杂,重点在运维和升级。证券行情分析App开发,是一个复杂的工程,包括网络模块、行情模块、交易模块、信息模块、UI模块、指标模块以及为以上模块提供服务的基础库(比如UILite/XLib),下面的文章,我会一一分析各个模块如何开发。
这里我建议开发App程序,最好也用MVC模型开发
M:行情模块、交易模块、信息模块
V:UI模块
C:控制模块,提供M-V交互的控制模块
MVC是不仅仅用在大的框架上,在小的功能模块上依然可以借鉴MVC的思想。
一、网络模块
1)、网络模块,需要保证网络请求应答的一致性,保证每一个请求无论遇到任何意外都会有对应的回应,对于App主动断开连接可以忽略请求的应答,这非常重要。
2)、网络模块,不应该关心具体业务,只需考虑最快最稳定的处理各种请求推送。
3)、网络模块,对于其他模块发起的连接,如果IP和端口都一样,可以考虑共用连接。
4)、大部分的证券App都提供测速功能,但是测速不应该在这里实现,应该在外部实现,网络模块只提供连接时间,收发包的时间由外部实现。
二、行情模块
首先,我们面对的是包括上海证券交易所、深圳证券交易所、商品期货交易所、金融期货交易所、还有其他各类证券交易所,每个交易所的数据都是不一样的,这就要求我们思考如何组织这些交易所过来的数据。面向对象开发的好处是支持继承和多态,所以我们可以提取出公共数据生成基本对象,通过派生生成特殊交易所数据对象,比如:
市场信息对象:
class CExchangeInfo
{
public:
char Code[]; // 市场代码
char Name[]; // 市场名称
char Status[]; // 市场状态标志[盘前,盘中,盘后等等]
unsigned char TimeZone; // 该市场所处时区
unsigned long Date; // 市场日期[YYYYMMDD格式]
unsigned long Time; // 市场时间[HHMMSS格式]
unsigned char PeriodsCount; // 交易时段数量[0表示24小时全天交易]
unsigned short Periods[4][2]; // 交易时段描述[最多只是4个交易时段,每个时段包括开始、结束时间,精确到分,HH * 60 + MM格式]
unsigned char ProductCount; // 产品分类数量[该市场所有分类数量]
unsigned short CommodityCount; // 商品数量[该市场所有商品数量]
}
市场信息派生对象:
class CSHExchangeInfo : public CExchangeInfo
{
public:
unsigned char BidPeriodsCount; //集合竞价交易时段[0表示无集合竞价]
unsigned short BidPeriods[4][2]; //集合竞价交易时段描述[最多只是4个交易时段,每个时段包括开始、结束时间,精确到分,HH * 60 + MM格式]
};
以此类推,可以设计其他数据结构,比如
产品分类数据CProductInfo->CSHProductInfo、
商品数据CCommodityInfo->CSHCommodityInfo、
商品快照数据、
商品明细数据、
商品分时数据、
商品历史数据(分钟线、日线)、
商品财务数据、
其他特殊数据
等等
这样,其他地方就可以使用统一的方式处理多个证券交易市场数据,对于特殊的地方也可以动态转换成特殊证券交易市场对象,获取对应数据,做对应的特殊处理。
其次,组织好了数据结构之后,就要考虑数据的初始化、更新、保存了。
初始化时,需要处理日期变化和不变的逻辑,比如是否需要删除本地保存的快照、分时和明细等当日数据。
行情更新,第一次需要请求行情数据,因为之前没有看过或者中间隔了一段时间,需要补齐数据,然后注册推送,等待行情推送,收到推送更新快照、明细、分时、历史数据,然后通知数据更新,方便界面或者其他部分更新行情。
保存,如果不再使用某个商品行情数据,就需要从内存中移除商品对象,并保存到文件,方便再次使用时直接从本地文件读取。
这里向服务器请求数据,需要支持增量请求,减小服务器压力,并提高App和服务器的效率。
行情数据模块需要控制内存中缓存的商品对象的数目,因为内存总归是有限的,可以使用比较成熟的缓存机制来换入换出商品对象。
行情数据模块要保证请求回应的一致性,就算请求过程中出现各种意外,也要保证每个请求都能收到应答,除非主动销毁行情数据模块。
财务数据的更新机制,应该是增量请求的,因为每个交易日只有部分股票等商品的财务数据会更新。
最后,通过以上分析,我们基本上定义了标准统一的数据格式和结构清晰的初始化、更新处理数据的逻辑,这样我们就可以编写控制模块为其他模块提供获取数据的各种适配器和访问行情数据的统一接口。