当MA10由下往上穿过MA20均线时执行为金叉,此时平空开多,
因为python版本兼容有点差,且源码功能都有所变化,所以没有环境信息的教程就是刷流氓。
代码实现如下:
from vnpy_ctastrategy import (
CtaTemplate,
BarGenerator,
ArrayManager
)
from typing import Any, Callable
from vnpy.trader.object import BarData, TickData
class DemoStrategy(CtaTemplate):
""""""""
# 作者
author = "zjs"
# 定义参数
fast_window = 10
slow_window = 20
# 定义变量
fast_ma0 = 0.0
fast_ma1 = 0.0
slow_ma0 = 0.0
slow_ma1 = 0.0
parameters = ["fast_window", "slow_window"]
variables = ["fast_ma0", "fast_ma1", "slow_ma0", "slow_ma1"]
def __init__(self,
cta_engine: Any,
strategy_name: str,
vt_symbol: str,
setting: dict, ):
""""""""
# 调用父类构造函数初始化
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager(100)
# 重写父类函数
def on_init(self):
self.write_log("demo策略初始化###")
self.load_bar(10)
def on_start(self):
self.write_log("demo策略启动##")
def on_tick(self, tick: TickData):
# tick更新
self.bg.update_tick(tick)
def on_stop(self):
self.write_log("demo策略停止")
def on_bar(self, bar: BarData):
# K线更新
am = self.am
am.update_bar(bar)
if not am.inited:
return
fast_ma = am.sma(self.fast_window, array=True)
fast_ma0 = fast_ma[-1]
fast_ma1 = fast_ma[-2]
slow_ma = am.sma(self.slow_window, array=True)
slow_ma0 = slow_ma[-1]
slow_ma1 = slow_ma[-2]
# 判断均线交叉
cross_over = fast_ma0 >= slow_ma0 and fast_ma1 < slow_ma1
cross_below = fast_ma0 <= slow_ma0 and fast_ma1 > slow_ma1
##如果是金叉,则执行买入操作
if cross_over:
# 定义交易价格(滑点),当前价格+5
price = bar.close_price + 5
if not self.pos:
self.buy(price, 1)
elif self.pos < 0:
self.cover(price, 1)
self.buy(price, 1)
##如果是死叉,则执行卖出/开空
elif cross_below:
price = bar.close_price - 5
if not self.pos:
self.short(price, 1)
elif self.pos > 0:
self.sell(price, 1)
self.short(price, 1)
# 更新图形
self.put_event()
要编写策略,在vnpy框架中只需继承CtaTemplate这个类,并重写其中的方法即可。
class CtaTemplate(ABC):
def on_init(self):
#策略初始化函数,用作参数的初始化,如加载bar数据
def on_start(self):
#策略启动
def on_tick(self, tick: TickData):
#接收tick数据
def on_stop(self):
#策略停止,销毁进程或数据
def on_bar(self, bar: BarData):
#将tick数据按周期(1分钟、5分钟等……周期)合成一个柱图数据,可以理解为蜡烛图
def buy(
self,
price: float,
volume: float,
stop: bool = False,
lock: bool = False,
net: bool = False
):
#执行买入操作,注意,这里的买入开仓,方向是多
def cover(
self,
price: float,
volume: float,
stop: bool = False,
lock: bool = False,
net: bool = False
):
#执行平仓操作,注意,这里的买入平仓,方向是多
def short(
self,
price: float,
volume: float,
stop: bool = False,
lock: bool = False,
net: bool = False
):
#执行卖出操作,注意,这里的卖出开仓。方向是空
def sell(
self,
price: float,
volume: float,
stop: bool = False,
lock: bool = False,
net: bool = False
):
#执行平仓操作,注意,这里的卖出平仓。方向是空
vnpy策略编写
使用移动平均线MAMA20组合来进行交易
熟悉这个类之后我们开始以一个简单的策略案例来用代码实现。
策略案例:双均线策略
开发环境
本文的教程适用vnpy0-0版本
文章为作者独立观点,不代表股票交易接口观点