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