蜗牛博客VNPY学习记录:
VN.PY 2.0学习记录一(如何回测)
VN.PY 2.0学习记录二(策略开发)
Vn.py学习记录三(米筐教程)
VN.PY 2.0学习记录四(多线程、多进程)
Vn.py学习记录五–交易时间段及Widgets
Vn.py学习记录六(无界面模拟盘)
Vn.py学习记录七(V2.0.5版本)
Vnpy学习记录八(R-Breaker及pickle)
Vn.py学习记录九(事件驱动引擎)
VN.PY学习记录十(源码概述)
VNPY学习记录11(微信+Vscode)
VNPY学习记录12(父子进程、回调函数)
VNPY学习记录13(部署到云服务器,实现自动交易)
一、开发一个test策略
写策略需要在C:\ProgramData\VNConda\Lib\site-packages\vnpy\app\cta_strategy\strategies这个文件夹下面。
代码:
from vnpy.app.cta_strategy import ( CtaTemplate, StopOrder, TickData, BarData, TradeData, OrderData, BarGenerator, ArrayManager, ) class MaDbwStrategy(CtaTemplate): author = "蜗牛博客snailtoday.com" def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super(MaDbwStrategy, self).__init__( cta_engine, strategy_name, vt_symbol, setting ) self.bg = BarGenerator(self.on_bar) self.am = ArrayManager() def on_init(self): """ Callback when strategy is inited. """ self.write_log("策略初始化") self.load_bar(10) def on_start(self): """ Callback when strategy is started. """ self.write_log("策略启动") self.put_event() def on_stop(self): """ Callback when strategy is stopped. """ self.write_log("策略停止") self.put_event() def on_tick(self, tick: TickData): """ Callback of new tick data update. """ self.bg.update_tick(tick) def on_bar(self, bar: BarData): """ Callback of new bar data update. """ if bar.close_price < 3730: if self.pos == 0: self.buy(bar.close_price, 1) elif self.pos > 0: pass if bar.close_price > 3920: if self.pos > 0: self.sell(bar.close_price, 1) elif self.pos == 0: pass self.put_event() def on_order(self, order: OrderData): """ Callback of new order data update. """ pass def on_trade(self, trade: TradeData): """ Callback of new trade data update. """ self.put_event() def on_stop_order(self, stop_order: StopOrder): """ Callback of stop order update. """ pass
最终结果:
与我手工计算的结果差不多:
总共只交易了两次,
4月18日:3727买入
5月14日:3920.2卖出。
与图形上的曲线也相符,不过不知为什么,计算收益的时候有点差异。
发现这里又有坑了:
1.不成交
将条件设为if bar.close_price < 3800.00:,下面这个达到条件的不成交。
二、如何合成K线?
BarGenerator里面的update_tick()用于把tick数据合成1分钟K线数据,update_bar()是用于把1分钟数据合成X分钟数据。
可以参考2.0版本cta_strategy里面的布林带策略示例,那里提供1分钟K线合成为15分钟K线,并且基于15分钟K线来产生买卖信号。
AM: 将收到的K线时间序列的推送缓存下来,方便我们计算一些技术指标,比如均线、RSI
三、显示成交明细
engine.showBacktestingResult() for i in range(10): d = engine.tradeDict[str(i+1)].__dict__ print(d[´tradeID´],d[´dt´],d[´direction´],d[´price´],d[´volume´]
四、优化
优化配置
Setting = OptimizationSetting() setting.setOptimizeTarget(´sharpeRatio´) Setting.addParameter(´atrLength´,12,14,1) #起始为12,结束14,步进2 #Setting.addParameter(´rsiLength´,20,30,5) 执行多进程优化 import time start = time.time() engine.runParallelOptimization(AtrRsiStrategy,setting) print u´耗时:s%´ %(tim.time()-start)
五、取当天第一根K线
Kdata=pd.DataFrame mask= (Kdata.datetime.day==today) & (Kdata.datetime.hour==9) & (Kdata.datetime.minute==0) First1min= Kdata[mask]
Kdata = pandas.DataFrame mask = (Kdata.datetime.day == 27) & (Kdata.datetime.hour == 9) & (Kdata.datetime.minute == 0) First1min = Kdata[mask]
开盘时间:
if(dt.hour == 9 or dt.hour == 21) and dt.minute <2: self.openWindwo = True
六、模拟盘
May.07.2018 update
今天,自己写的策略模拟盘终于也成功了。
从成交时间来看,是14:50开的多仓,可是看K线图有点没搞懂。
七、
tick数据的流程这样的:
ctpgateway--onRtnDepthMarketData---self.gateway.onTick
==>
VtGateway--onTick
==>
tick数据存入eventengine
==>
ctaengine中注册处理tick事件的函数procecssTickEvent--strategy.onTick
最终到达策略中的ontick.
VNPY的数据记录模块在 DataRecorder目录下,这个模块就是用来实现你说的将tick数据存入数据库这个功能的。
DR_setting.json 是个设置文件,设置是否打开本模块,以及你希望记录的品种。
drEngine.py 是实现记录到数据库的相关代码。 读一读就清楚啦。
至于上面的流程,是之前发生的事情,如果只是希望记录数据库,不清楚也没关系的。
如果想弄清楚,就从最开始的ctpgateway开始,一层一层print,打出你想看到的一切,应该就能理解这个过程了。
onRtnDepthMarketData是一个回调函数,由底层API收到柜台服务器推送的行情数据后自动调用,从而把数据推送到你的程序中,所以
1. 这个函数你用不着调用
2. data也就用不着填了