前言
Pomelo是由网易开发的一套高度自由的开源Node.js服务器框架,最初为解决游戏开发领域的高并发、实时性所设计,对外提供了大量的API和工具库,使得服务器的定制化和扩展更加方便;但Pomelo并不仅仅应用于游戏行业,本文将使用其搭建一套简易的股票/期货交易系统服务器,以进一步探秘Pomelo的特性和使用方法。
Pomelo于2012年开源推出,目前已更新至2.2.5版本,令人兴奋的是新版本升级了socket.io库和rpc,修复了一些心跳及消息推送的bug,提高了框架的整体性能和稳定性;本文无特殊说明均以最新版本为基础进行构建。
股票/期货交易系统总体设计
本文主要针对Pomelo框架及其使用进行探秘,具体的金融交易策略和量化模型为金融范畴,不在本文阐述范围之内。
整个系统应包括以下模块:
交易登陆系统
行情数据源SDK
数据处理系统(对数据按时间周期或分时进行切片处理等)
指标拟合系统(输出量化指标,如均线、量能、MACD、KDJ、WR、波浪)
模型回测系统(如以年、月、周为单位回测成功比率)
预警系统
下单系统(完成买进卖出、平仓、止损)
针对上述模块,我们使用pomelo设计如下图架构,依照官方推荐,我们将Servers分为 Frontend-Servers 和 Backend-Servers,同时由于登陆操作较少,我们直接将登陆服务器组设置为Frontend-Servers;数据库选型为mysql,用以存储用户及交易数据,这里我们引入Nodejs的 generic-pool 创建连接池;行情源数据来自三方SDK。
初始化
使用pomelo init命令建立工程后,我们的目录结构大致如下:
app.js是入口文件,app.start() 即可启动服务器;pomelo内部采用了挂载组件的方式启动各个模块/组件,这样可以更加灵活的扩展功能;从源码可以看出,pomelo大部分模块均挂载在Pomelo变量下,同时对外提供了工厂函数 createApp,会实例化一个Application对象,Application维护了 servers 和 components等,源码如下:
Pomelo对底层通讯协议(ws、socket.io等)进行了很好的封装,统一放在 connectors 下,本文使用 hybridconnector ,如果采用web客户端可选用 sioconnector 。
登陆
本文将登陆服作为独立的一组服前端务器设计,为简单起见,clients向登陆服发送相关信息(name、password等)后,登陆服会进行校验,校验成功后会返回给clients一个token和connectors的ip及port,此时clients便可以使用token与交易系统通讯了。
由于login-server为Frontend-server,我们只需要创建handler作为对外接口。
In Login:
In connectors:
在connector中会绑定用户的uid到session中,pushAll会将其同步给其他服务器,在用户断开时会触发closed事件,onUserDisconnected函数会通知其他服务器踢出该用户。
多进程路由选择
Pomelo native支持多进程分布式部署,clients的消息可以通过路由的方式选择connector,本文根据用户的id进行负载均衡,Pomelo本身支持自定义。
DataServer & IndicatorServer
这两组server对clients透明,因此只需要建立remote跟交易系统进行rpc通信,DataServer主要负责解析行情数据,并格式化为符合我们需求的数据格式; IndicatorServer则负责将原始数据组装为分析用的各种指标,并向外提供接口。
现阶段很多三方SDK直接提供基础的数据指标,如MA、KDJ、VOL、CCI、WR等,因此本文将DataServer和IndicatorServer合并为一组server,统称为DataServer,负责为交易系统提供数据支持。
我们截取部分数据为例,DataServer统一将源数据格式化为如下格式:
"2017-03-01": { "OPEN": 32, "CLOSE": 33, "HIGH": 34, "LOW": 30, "MA5": 31.4, "MA10": 31.3, "MA30": 30.8, "MA60": 30.3, "KDJ":[65, 60, 41.7], "WR":[32, 33, 17] },
"2017-03-02": { "OPEN": 32.7, "CLOSE": 33.2,"HIGH": 34.8, "LOW": 31.5, "MA5": 32.7, "MA10": 31.5, "MA30": 30.4, "MA60": 30,"KDJ":[67, 61.4, 43.5], "WR":[30, 26, 16],
"2017-03-03": { "OPEN": 33.1, "CLOSE": 34.9, "HIGH": 35.8, "LOW": 32.3, "MA5": 33.8, "MA10": 32.1, "MA30": 31, "MA60": 30.7, "KDJ":[76, 63, 58], "WR":[19, 15, 12]}
DataServer数据分为Push和Pull模式,当天开盘及竞价的实时数据采用Push模式,历史数据采用被动Pull模式。
Push模式中我们使用pomelo-schedule做定时处理,其关键代码如下:
Push模式会在每个工作日9:00~15:00,将采集好的数据信息通过rpc直接调用LoopbackServer的receiveData远程函数,data参数即我们上面提到的格式化之后数据。
Pull模式直接提供remote rpc供LookbackServer远程调用拉取数据,Pull函数可以根据日期和不同的指标参数进行分段数据获取。
例如,获取2017年3月1日至今的MA5、kdj、wr、mtm、cci数据(具体指标含义请自行查阅相关文献):
LookbackServer & ExchangeServer
本节将介绍最重要的两个server,分别负责数据分析和订单系统。LookbackServer分析数据后会筛选出符合某策略的股票池,同时满足多种目标策略的股票将被选择为种子票,然后根据资金策略确定种子票的资金配置,并通过rpc通知ExchangeServer进行下单或获利了结,ExchangeServer也会通过rpc告知用户账户相关情况,以便及时报警。
我们以一组简单的策略为例(不使用未来函数),介绍servers之间的调用,
承接上节DataServer,LookbackServer中会接受DataServer的Push数据。
上述注册的rpc函数receiveData完成了关键的策略选股,如出现种子股并且回测成功,会调用Exchange服的远程rpc函数buy进行下单,本文下单的资金策略主要根据大盘指标ADL和ADR进行的,而不是通过个股的情况判断,感兴趣的同学可以研究下该指标,这里不赘述;下面一段代码描述了本文的一个wr选取黑马股简单策略(注:该策略未叠加未来函数,实盘有风险,盈亏自负)。
该指标解析,抓取波段黑马:
当前股价突破前30日最高价,向上突破;
选取均线多头排列,5日线 > 47日线 > 63日线 > 131日线 > 271日线;
KDJ黄金交叉;
最重要的一点wr三线同时入线:即进入强势区间0~20;
CCI并无出现超买情况;
量能并没失控:大于5日和63日均量;
价值投资:市盈率不能大于50,这样风险相对较小。
再次注明:该策略只能用于牛市和震荡市,熊市切勿使用!
举一档具体股票实例说明:
该票在箭头所示当天涨停,很多人认为该票前期涨幅已经过大,已经累积60%涨幅,主观判断今天是卖出点,而依据本文策略,刚好发出买入信号,下图是该股未来几天的走势:
如果按照策略买入,又可收获50%,感兴趣的同学可以自行加入艾略特波浪理论的未来函数,那样可以计算出,箭头处刚好是第三主升浪起点。
总结
本文通过搭建一套交易系统服务器框架对pomelo的使用进行了探秘,并简单阐述了一些量化交易的设计流程。
版权所有 Copyright © 2003 - 2014 www.hxhuo.com All Rights Reserv ed 会心火信息 专家-厦门会 心 信息科技 有限公司 闽ICP备10202970号-23