Home >  > VN.PY 2.0学习记录二(策略开发)

VN.PY 2.0学习记录二(策略开发)

0

蜗牛博客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也就用不着填了

暧昧帖

本文暂无标签

发表评论

*

*