VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 8
声望: 0

以下是使用veighna软件python语言编写的组合策略。根据上述条件,当SPY在200天移动平均线之上且VIX至少3天在10天移动平均线之上5%时,以SPY收盘价格买入10手SPY,如果SPY收盘是参数为2的RSI是大于65时,则以SPY收盘价格卖出平仓。

from vnpy.app.cta_strategy import (
    CtaTemplate,
    Direction,
    StopOrder,
    TickData,
    BarData,
    OrderData,
    TradeData,
    PositionData
)


class VixSpyStrategy(CtaTemplate):
    """"""
    author = "Veighna"

    # 策略参数
    rsi_length = 14
    rsi_entry = 65

    # 策略变量
    long_pos = 0

    # VIX的K线
    vix_bar = None

    # SPY的均线
    spy_ma200 = 0

    # 参数列表,保存了参数的名称
    parameters = ["rsi_length", "rsi_entry"]

    # 变量列表,保存了变量的名称
    variables = ["long_pos"]

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

        self.vix_bar = BarData()
        self.spy_ma200 = {}

        self.bg = BarGenerator(self.on_bar)
        self.am = ArrayManager()

    def on_init(self):
        """
        当策略被初始化时调用该方法。
        """
        self.write_log("策略初始化")

        # 加载历史数据并让AutoManage开始执行
        self.load_bar(10)

    def on_start(self):
        """
        策略启动时介绍
        """
        self.write_log("策略启动")

    def on_stop(self):
        """
        策略停止时调用
        """
        self.write_log("策略停止")

    def on_tick(self, tick: TickData):
        """
        当新的Tick数据到达时调用
        """
        pass

    def on_bar(self, bar: BarData):
        """
        当新的K线数据到达时调用
        """
        self.cancel_all()

        # 更新VIX数据
        if bar.vt_symbol == "VIX":
            self.vix_bar = bar
            self.vix_ma10 = self.am.sma(10)

        # 更新SPY数据
        elif bar.vt_symbol == "SPY":
            self.bg.update_bar(bar)
            self.spy_ma200 = self.am.sma(200)

            if not self.spy_ma200:
                return

            # VIX至少3天在10天线上方5%
            if (self.vix_bar.close >= self.vix_ma10[-1] * 1.05
                    and self.vix_ma10[-2] >= self.vix_ma10[-1] * 1.05
                    and self.vix_ma10[-3] >= self.vix_ma10[-1] * 1.05):

                # SPY在移动平均线上方
                if bar.close >= self.spy_ma200[-1]:

                    # 如果没有持仓,买入10手SPY
                    if self.long_pos == 0:
                        self.buy(bar.close, 10)

            # RSI大于65时,平仓
            elif self.long_pos > 0 and self.am.rsi(self.rsi_length) >= self.rsi_entry:
                self.sell(bar.close, abs(self.long_pos))

        self.put_event()
Member
avatar
加入于:
帖子: 6132
声望: 381

不修改引擎的情况下,CTA策略模块只能传入一个合约,也只能跑一个合约。
除此之外,如果你要计算200天均线,需要调大am的size,am的默认size是100。建议还是看一下项目文档吧,有相关介绍的https://www.vnpy.com/docs/cn/cta_strategy.html#cta-ctatemplate