import backtrader as bt
class MovingAverageCrossover(bt.Strategy):
params = (
("fast_window", 20),
("slow_window", 50),
("order_percentage", 0.95),
("take_profit_percentage", 0.03),
("stop_loss_percentage", 0.02),
)
def __init__(self):
self.fast_average = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.fast_window
)
self.slow_average = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.slow_window
)
def next(self):
if self.position:
if self.data.close >= self.sell_price:
self.sell()
elif self.data.close < self.stop_loss:
self.sell()
else:
if self.data.close > self.fast_average:
self.buy_price = self.data.close * (1 + self.params.take_profit_percentage)
self.stop_loss = self.data.close * (1 - self.params.stop_loss_percentage)
size = self.params.order_percentage * self.broker.cash
self.buy(size=size)
if __name__ == "__main__":
cerebro = bt.Cerebro()
data = bt.feeds.YahooFinanceData(dataname="AAPL", fromdate="2020-01-01", todate="2021-12-31")
cerebro.adddata(data)
cerebro.addstrategy(MovingAverageCrossover)
cerebro.run()
class MovingAverageCrossover(bt.Strategy):
params = (
("fast_window", 20),
("slow_window", 50),
("order_percentage", 0.95),
("take_profit_percentage", 0.03),
("stop_loss_percentage", 0.02),
)
def __init__(self):
self.fast_average = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.fast_window
)
self.slow_average = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.slow_window
)
def next(self):
if self.position:
if self.data.close >= self.sell_price:
self.sell()
elif self.data.close < self.stop_loss:
self.sell()
else:
if self.data.close > self.fast_average:
self.buy_price = self.data.close * (1 + self.params.take_profit_percentage)
self.stop_loss = self.data.close * (1 - self.params.stop_loss_percentage)
size = self.params.order_percentage * self.broker.cash
self.buy(size=size)
if __name__ == "__main__":
cerebro = bt.Cerebro()
data = bt.feeds.YahooFinanceData(dataname="AAPL", fromdate="2020-01-01", todate="2021-12-31")
cerebro.adddata(data)
cerebro.addstrategy(MovingAverageCrossover)
cerebro.run()