VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 10
声望: 0

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

```python
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
加入于:
帖子: 5018
声望: 303

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

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

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】