Home >  > Vn.py学习记录三(米筐教程及取前三根K线)

Vn.py学习记录三(米筐教程及取前三根K线)

3

蜗牛博客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(部署到云服务器,实现自动交易)

一、下载RQdata数据
1.获取账号
到米筐(RiceQuant)注册一个试用账号(注册地址:https://www.ricequant.com/purchase#1)。然后会得到一个make.bat的文件。用文本编辑打开,可以看到里面存了你的账号、密码,试用账号可以试用一个月。

Updated on Jan-10-2020
现在米筐对试用账号的注册也很严格了,需要上传名片,以及电话验证,所以大家注册成功之后一定要珍惜这一个月的使用权。

2.修改设置
打开F:\vnpy\vnpy-2.0.2\tests\backtesting这个文件夹,再打开里面的getdata.py,将上面获取到的账号、密码添加进去。
并设定好你要下载的vt_symbol、start_date、End_data这些。

3.下载数据
执行getdata.py,就可以下载数据了。

备注:
1.判断是否RQdata过期。
可以执行F:\vnpy\vnpy-2.0.2\tests\backtesting\getdata.py,如果过期,会报错:
getdata

rqdatac.share.errors.AuthenticationFailed: user auth failed! code: 202 message:
该 License 已过期

2.如何在VN.PY中使用?
直接修改“C:\ProgramData\VNConda\Lib\site-packages\vnpy\trader\setting.py”中的账号、密码即可。

3.2019.Jul.05 重新申请了一个号码,看看什么时候过期。

Updated on 14-Sep-2019:
今天发现license过期了,重新申请,发现发生了许多变化:
1.注册时除了提供手机号码,还需要提供邮箱。
2.邮箱中会收到.bat文件以及密码,需要执行.bat文件,然后就可以使用这里的rq.get_price('平安银行','2018-3-23','2018-4-23')代码了。
3.执行上面的F:\vnpy\vnpy-2.0.2\tests\backtesting\getdata.py文件也不会报错了。

Updated on 14-Oct-2019

再次申请了一个,已经使用了邮箱:

myso、2207、

而且发现不用再执行那个bat了,直接在vnpy中输入密码就可以直接使用了。

Oct-16-2019
执行getdata.py报错,说 License 已过期,那么它的有效期刚好是30天。

二、截取最近三根K线的值

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, 5, self.on_5min_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.
        """

        self.bg.update_bar(bar)


    def on_5min_bar(self, bar: BarData):
        """"""
        self.cancel_all()

        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return
        
        print('上一根K线的开盘价是{}:'.format(am.open_array[-1]))
        print('上一根K线的最高价是{}:'.format(am.high_array[-1]))
        print('上一根K线的最低价是{}:'.format(am.low_array[-1]))
        print('上一根K线的收盘价是{}:'.format(am.close_array[-1]))
        print('上二根K线的开盘价是{}:'.format(am.open_array[-2]))
        print('上三根K线的开盘价是{}:'.format(am.open_array[-3]))

        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

然后用以下的代码进行验证:

from vnpy.app.cta_strategy import (
    CtaTemplate,
    StopOrder,
    TickData,
    BarData,
    TradeData,
    OrderData,
    BarGenerator,
    ArrayManager,
)


class TestBarStrategy(CtaTemplate):
    author = "蜗牛博客snailtoday.com"

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super(TestBarStrategy, 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.
        """
        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

        print('上一根K线的最高价是{}:'.format(am.high_array[-1]))
       

        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

验证结果:

虽然我设定的日期是:

start = datetime(2018,3,29),
end = datetime(2018,5,28),

从结果来看,5月28日的数据并没有加载,只加载到了5月28日的前一天5月25日的数据。

验证前三根K线

print('上一根K线的最高价是{}:'.format(am.high_array[-1]))
print('上二根K线的最高价是{}:'.format(am.high_array[-2]))
print('上三根K线的最高价是{}:'.format(am.high_array[-3]))

结果和上面的一致

四、合约代码
直接在vn.py里面查询即可。比如:rb1906.SHFE

五、事件引擎

例二:
利用内置的函数,注册事件:

github.com/msincenselee/vnpy

六、主引擎
main engine实例化所有引擎,比如策略引擎、事件引擎等。

七、OnOrder OnTrade的区别:

Onorder: 发了单,交易所收到你的单,你的单没有成交他也会发一个onorder指令给你。如果你发10手,第一次成交5手,第二次成交3手,第三次成交2手,你会收到3个onorder

OnTrade: 成交结束,你有交易的时候就会拿到。

在单一合约里面,OnOrder OnTrade是同一个。

撤单是没有onTrade的,如果你发了10次开单的请求,最后都没有成交,最后撤单了(自己或者交易所),Onorder都会发送给你,onTrade是收不到的。所以最好在onorder中写处理。

还有一个区别是套利中,买卖跨期合约,将spM1705&M1709作为一个合约发送到上层,买一手spm1705,空一手M1709,onorder会收到一条信息“spM1705&M1709”。

ontrade收到两条信息:M1705多成交了一条,M1709空成交了一条。

八、时间
bar.datetime

暧昧帖

本文暂无标签
Comment (3)
Trackback (0)
  1. 李贵珍 Google Chrome 78.0.3904.108Windows 7 沙发 2020/12/16 16:01

    这个米匡注册以后, mark.bat 在哪搞到呢,弄了好几天了,都没搞明白

    • dengwen168 Firefox 83.0Windows 7 回复 李贵珍 2020/12/17 22:22

      好久没有用米匡了,以前是发到你的邮箱的。

  2. nuckykk Google Chrome 97.0.4692.71unknow 板凳 2022/03/04 11:31

    博主有在策略内部加载eventengine,进行回测的经验吗?

  • 还没有Trackback

发表评论

*

*