1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| class MACD1Strategy(bt.Strategy):
def log(self, txt, dt=None): dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt))
def __init__(self): self.dataclose = self.data.close self.order = None self.buyprice = 0 self.buycomm = None self.macd=bt.indicators.MACD() self.cross=bt.indicators.CrossOver(self.macd.macd,self.macd.signal) self.buyflg=False
def notify_trade(self, trade): if trade.isclosed: print('毛收益 %0.2f, 扣佣后收益 % 0.2f, 佣金 %.2f, 市值 %.2f, 现金 %.2f' % (trade.pnl, trade.pnlcomm, trade.commission, self.broker.getvalue(), self.broker.getcash()))
def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return
if order.status in [order.Completed]: if order.isbuy(): self.log('买单执行,%s, %.2f, %i' % (order.data._name, order.executed.price, order.executed.size))
elif order.issell(): self.log('卖单执行, %s, %.2f, %i' % (order.data._name, order.executed.price, order.executed.size))
else: self.log('订单作废 %s, %s, isbuy=%i, size %i, open price %.2f' % (order.data._name, order.getstatusname(), order.isbuy(), order.created.size, order.data.open[0]))
def next(self): if self.cross==1: vol = self.broker.getvalue() / self.dataclose[0] // 100 * 100 self.log('创建买单,%.2f' % self.dataclose[0]) self.log('vol:%.2f' % vol) self.order = self.buy(size=vol) self.buyflg=True
elif self.cross==-1: if self.buyflg: self.log('创建卖单,%.2f' % self.dataclose[0]) self.order = self.sell(size=self.position.size) self.buyflg=False
|