Spaces:
Running
Running
| import backtrader as bt | |
| # Create a Stratey | |
| 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): | |
| # Keep a reference to the "close" line in the data[0] dataseries | |
| self.dataclose = self.datas[0].close | |
| # To keep track of pending orders and buy price/commission | |
| self.order = None | |
| self.buyprice = None | |
| self.buycomm = None | |
| def notify_order(self, order): | |
| if order.status in [order.Submitted, order.Accepted]: | |
| # Buy/Sell order submitted/accepted to/by broker - Nothing to do | |
| return | |
| # Check if an order has been completed | |
| # Attention: broker could reject order if not enough cash | |
| 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: # Sell | |
| 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): | |
| # Simply log the closing price of the series from the reference | |
| self.log("Close, %.2f" % self.dataclose[0]) | |
| # Check if an order is pending ... if yes, we cannot send a 2nd one | |
| if self.order: | |
| return | |
| # Check if we are in the market | |
| if not self.position: | |
| # Not yet ... we MIGHT BUY if ... | |
| if self.dataclose[0] < self.dataclose[-1]: | |
| # current close less than previous close | |
| if self.dataclose[-1] < self.dataclose[-2]: | |
| # previous close less than the previous close | |
| # BUY, BUY, BUY!!! (with default parameters) | |
| self.log("BUY CREATE, %.2f" % self.dataclose[0]) | |
| # Keep track of the created order to avoid a 2nd order | |
| self.order = self.buy() | |
| else: | |
| # Already in the market ... we might sell | |
| if len(self) >= (self.bar_executed + self.params.exitbars): | |
| # SELL, SELL, SELL!!! (with all possible default parameters) | |
| self.log("SELL CREATE, %.2f" % self.dataclose[0]) | |
| # Keep track of the created order to avoid a 2nd order | |
| self.order = self.sell() | |