vn.py量化社区
By Traders, For Traders.
Member
加入于:
帖子: 51
声望: 2

还在深入了解VNPY中,准备写一个日记来记录自己使用VNPY的过程。这样能更快的使用好VNPY。
2020/4/3
今天把 自定义策略 成功的加载进VNPY了。虽然看了论坛里面的教程,但是我只能说纸上得来终觉浅。原来是我偷懒直接复制本来用的策略改出来而出的问题。

description
这个地方的在写 策略类的时候 一定要和 现在已经存在策略的 类的名字 有区别 ,要不然就会和我一样死都读不出来。

然后今天 成功的把ctp连接上, 并且 把 模板策略在 sinow 中跑了起来。并且自己写了一个K线画图。

明天的安排是 把自己写的策略成功在仿真上面跑起来,因为今天跑的时候发现,总是没有成交信号,明天看看是不是哪里没有写对。
Member
加入于:
帖子: 51
声望: 2

2020/4/4
忘记今天是休息日,当然也是 公祭 时刻 ,是不开盘嘚, 所以今天是把 昨天自己写的策略 进行回测 。
解决了 没有成交信号的问题, 主要是 因为我模仿的是一个跨周期的策略 。 在需要调用2小时周期的时候 ,写成120分钟

description

在 BarGenerator 这个类中 明确了分钟的参数只能被60整除

现在我就不知道 同时调用 5分钟 和 2小时的策略中 应该如何把 小时周期写出来 ,是用Interval.HOUR 传进去吗?

另外 在 策略改动后,进行重载 有时候策略是没有更新的,点开vn自带的编辑器 会发现策略是没有更改的,感觉和缓存有关。 最好的方法是 重现启动 vntrade .就没问题了。

Member
avatar
加入于:
帖子: 6
声望: 0

安装调用vnpy.trader.vtObject 有没有踩过坑啊?

Member
加入于:
帖子: 51
声望: 2

有为2e52e747874f4409 wrote:

安装调用vnpy.trader.vtObject 有没有踩过坑啊?
额 我用的2.1.1的版本 vtObject 你这个 感觉是很老的版本才有的文件吧··所以还没有

Member
加入于:
帖子: 51
声望: 2

2020/4/6
今天 把实盘的流程走了一遍,感觉基本上的使用是没有问题了。数据源用的是天勤的调用 ,回测用的是自己的数据,这个应该是目前最省钱的方法。
数据库这一块还没有弄,没有做直接数据库的连接,初步选定为 mongoDB 。 多看群里大佬的帖子收获还是挺大的。

from vnpy.trader.constant import Interval

跨周期的问题也解决了。 使用 Interval 之前 要先调用这个包

下一步就是 把自己的在文华上的策略 翻译过来 进行仿真模拟盘的 测试。

Member
avatar
加入于:
帖子: 25
声望: 0

你好!我也想试试天勤,请问如何使用?哪里有教程?

Member
加入于:
帖子: 51
声望: 2

hebpmo wrote:

你好!我也想试试天勤,请问如何使用?哪里有教程?
额 论坛里面有 我记得是在数据 板块把 你找一下

Member
加入于:
帖子: 51
声望: 2

2020/4/7
今天将 几个策略在模拟盘上了线。 除了 之前的那个跨两小时周期的 在初始化的时候 没有把 参数算出来之外其他的 策略都可以 很好的初始化。
因为用的是天勤的数据 所以考虑是否是数据的原因,长周期的均线无法获得 算出,下一步准备用 米筐的数据在试一下。

description
另外 今天 在 编写另外一个策略的时候 用到 5分钟周期 的120日均线, 也是无法算出均线值来。经过试验只能算到100日均线。 搞不明白,

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

class lw_5f_threeMA(CtaTemplate):
    """螺纹钢、5分钟级别、三均线策略
    策略:
    10,20,120均线,120均线做多空过滤
    MA120之上
        MA10 上穿 MA20,金叉,做多
        MA10 下穿 MA20,死叉,平多
    MA120之下
        MA10 下穿 MA20,死叉,做空
        MA10 上穿 MA20,金叉,平空

    更新记录
    """

    author = "回测猛如虎"

    #策略参数
    ma10_window = 10     # 均线窗口数
    ma20_window = 20      
    ma120_window = 110   
    # minDiff = 1         # 商品最小交易单位

    fixed_size = 1      # 每次交易的数量

    # 策略变量
    fast_ma0 = 0.0             #10分钟快速均线
    fast_ma1 = 0.0
    slow_ma0 = 0.0             #20分钟慢速均线
    slow_ma1 = 0.0              
    ma120 = 0         
    # ma_trend = 0     # 均线趋势  多头1 空头 -1


    parameters = ["ma10_window",
                  "ma20_window", "ma120_window",
                  "minDiff"]

    variables = ["fast_ma0", "fast_ma1", "slow_ma0", "slow_ma1", "ma120"]

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)


        # 创建K线合成器对象
        self.bg5 = BarGenerator(self.on_bar, 5, self.on_5min_bar) # 15分钟K线
        self.am5 = ArrayManager()


    def on_init(self):
        """
        初始化策略(由用户继承实现)
        """
        self.write_log("策略初始化")
        self.load_bar(15)

    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.bg5.update_tick(tick)



    def on_bar(self, bar: BarData):
        """
        收到BAR推送(必须由用户继承实现)
        """
        # 基于120分钟判断判断趋势过滤,因此先更新 ps:辅助判断的条件K线先计算,最后计算交易的K线周期   
        #基于5分钟
        self.bg5.update_bar(bar)

    def on_5min_bar(self, bar: BarData):
        """5分钟合成"""
        self.cancel_all()

        #保存K线数据 
        self.am5.update_bar(bar)
        if not self.am5.inited:
            return

        #计算技术指标数值


        fast_ma = self.am5.sma(self.ma10_window, array=True) # 10日均线
        self.fast_ma0 = fast_ma[-1]
        self.fast_ma1 = fast_ma[-2]
        print(self.fast_ma0)
        slow_ma = self.am5.sma(self.ma20_window, array=True) # 20日均线
        self.slow_ma0 = slow_ma[-1]
        self.slow_ma1 = slow_ma[-2]
        print(self.slow_ma0)
        print(bar.datetime)

        ma120_now = self.am5.sma(self.ma120_window, array=True) # 120日均线
        self.ma120 = ma120_now[-1]
        print(self.ma120)
        # 计算金叉 死叉
        cross_over = self.fast_ma0 > self.slow_ma0 and self.fast_ma1 < self.slow_ma1
        cross_below = self.fast_ma0 < self.slow_ma0 and self.fast_ma1 > self.slow_ma1
        print(cross_over)
        print(cross_below)

        # 判断是否要进行交易

        # 当前无仓位,发送开仓委托
        if self.pos == 0:
            # MA10 上穿MA20, MA10 > MA120, bar.close > MA120
            if  cross_over and self.fast_ma0 > self.ma120 and bar.close_price > self.ma120:
                self.buy(bar.close_price , self.fixed_size)
            # MA10 下穿MA20, MA10 < MA120, bar.close < MA120

            elif cross_below and self.fast_ma0 < self.ma120 and  bar.close_price < self.ma120:

                self.short(bar.close_price , self.fixed_size)

        # 当持有多头仓位时

        elif self.pos > 0:
            # MA10下穿MA20,多单离场
            if  cross_below:
                self.sell(bar.close_price,abs(self.pos))     

        # 当持有空头仓位时
        elif self.pos < 0:
            # MA10上穿MA20,空离场
            if cross_over:
                self.cover(bar.close_price,abs(self.pos))

        # 发出状态更新事件
        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
Member
加入于:
帖子: 51
声望: 2

2020/4/11
关于多周期 特别是长周期的策略,进行模拟依然没有成功。 把数据不全后,初始化还是没有数据。这个需要进一步的探究? 另外 模拟 大佬的 B_BREAK这个策略时,出现重复开单的情况。 但是自己阅读代码感觉逻辑是没有问题的。 希望有大佬可以测试一下。

Member
加入于:
帖子: 51
声望: 2

2020/4/13
今天申请到的期货公司的穿透测试 到位了 明天开始测试 。 不过蛋疼的是 期货公司给我的是6.15的,还不知道怎么过测试。明天再说吧

Member
加入于:
帖子: 51
声望: 2

2020/4/14
穿透测试 完成 。 期货公司给的API 是6.15 ,一开始是懵逼的,因为看教程说要用CTPTEST这个接口。后来用CTP实盘这个接口 填的期货公司提供的验证码 进行测试 没想到是可以的。
另外 不知道 怎么把 vnpy 的 bardata 处理成 DataFrame格式的数据?

Member
加入于:
帖子: 51
声望: 2

2020/4/19
实盘的API也下发了·,我准备自己骗自己 ,明日实盘。

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号