|
|
import backtrader as bt |
|
|
|
|
|
|
|
|
|
|
|
class TestStrategy(bt.Strategy): |
|
|
params = (("exitbars", 5),) |
|
|
|
|
|
def log(self, txt, dt=None): |
|
|
"""Logging function fot this strategy""" |
|
|
dt = dt or self.datas[0].datetime.date(0) |
|
|
print("%s, %s" % (dt.isoformat(), txt)) |
|
|
|
|
|
def __init__(self): |
|
|
|
|
|
self.dataclose = self.datas[0].close |
|
|
|
|
|
|
|
|
self.order = None |
|
|
self.buyprice = None |
|
|
self.buycomm = None |
|
|
|
|
|
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( |
|
|
"BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f" |
|
|
% (order.executed.price, order.executed.value, order.executed.comm) |
|
|
) |
|
|
|
|
|
self.buyprice = order.executed.price |
|
|
self.buycomm = order.executed.comm |
|
|
else: |
|
|
self.log( |
|
|
"SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f" |
|
|
% (order.executed.price, order.executed.value, order.executed.comm) |
|
|
) |
|
|
|
|
|
self.bar_executed = len(self) |
|
|
|
|
|
elif order.status in [order.Canceled, order.Margin, order.Rejected]: |
|
|
self.log("Order Canceled/Margin/Rejected") |
|
|
|
|
|
self.order = None |
|
|
|
|
|
def notify_trade(self, trade): |
|
|
if not trade.isclosed: |
|
|
return |
|
|
|
|
|
self.log("OPERATION PROFIT, GROSS %.2f, NET %.2f" % (trade.pnl, trade.pnlcomm)) |
|
|
|
|
|
def next(self): |
|
|
|
|
|
self.log("Close, %.2f" % self.dataclose[0]) |
|
|
|
|
|
|
|
|
if self.order: |
|
|
return |
|
|
|
|
|
|
|
|
if not self.position: |
|
|
|
|
|
|
|
|
if self.dataclose[0] < self.dataclose[-1]: |
|
|
|
|
|
|
|
|
if self.dataclose[-1] < self.dataclose[-2]: |
|
|
|
|
|
|
|
|
|
|
|
self.log("BUY CREATE, %.2f" % self.dataclose[0]) |
|
|
|
|
|
|
|
|
self.order = self.buy() |
|
|
|
|
|
else: |
|
|
|
|
|
|
|
|
if len(self) >= (self.bar_executed + self.params.exitbars): |
|
|
|
|
|
self.log("SELL CREATE, %.2f" % self.dataclose[0]) |
|
|
|
|
|
|
|
|
self.order = self.sell() |
|
|
|