以下是使用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()