我一直在用backtrader,也想看看vnpy。但vnpy很多示例代码都不是极简的,参合着界面相关部分,使得我始终抓不住vnpy的核心。
希望有朋友能把下述简单的策略逻辑用vnpy实现一下。
极简的双均线策略:使用日线数据,基本思想是短期均线上穿长期均线(金叉)买入,下穿长期均线(死叉)卖出。
以下是backtrader的实现代码。代码无需考虑日线长度,backtrader会自动取得恰好足够长的数据,用以计算均线值。
希望有精通vnpy的朋友,也写个极简的代码实现同样的逻辑(删除所有不必要的部分,比如给界面传递事件信息的部分),看看vnpy的核心编制思路是咋样的。谢谢。
# 创建策略类
class SmaCross(bt.Strategy):
# 定义参数
params = dict(
fast_period=5, # 快速移动平均期数
slow_period = 10,) # 慢速移动平均期数
def __init__(self):
# 股票stock的快速移动平均线指标
fastMA = {stock: bt.ind.MovingAverageSimple(stock, period=self.params.fast_period) for stock in self.datas}
# 股票stock的慢速移动平均线指标
slowMA = {stock: bt.ind.MovingAverageSimple(stock, period=self.params.slow_period) for stock in self.datas}
# 股票stock的移动均线交叉信号指标
self.crossover = {stock: bt.ind.CrossOver(fastMA[stock], slowMA[stock]) for stock in self.datas}
self.orderlist = [] # 以往订单列表
def next(self): # 每个新bar触发调用一次,相当于其他框架的 on_bar()方法
for o in self.orderlist:
self.cancel(o) # 取消以往所有订单
self.orderlist=[] # 置空
for stock in self.datas:
if not self.getposition(stock): # 还没有仓位,才可以买
if self.crossover[stock] > 0: # 金叉
order = self.buy(data=stock,size=100)
self.orderlist.append(order)
# 已有仓位,才可以卖
elif self.crossover[stock] < 0: # 死叉
order = self.sell(data=stock, size=100)
self.orderlist.append(order)