Hey @jeff-lee would love to get some feedback on the trading logic? Would really appreciate your insight.
def __init__(self):
self.dataclose = self.datas[0].close
self.datavolume = self.datas[0].volume
self.datalow = self.datas[0].low
self.sma_veryfast = btind.MovingAverageSimple(self.dataclose, period=10)
self.sma_fast = btind.MovingAverageSimple(self.dataclose, period=20)
self.sma_mid = btind.MovingAverageSimple(self.dataclose, period=50)
self.sma_slow = btind.MovingAverageSimple(self.dataclose, period=100)
self.sma_veryslow = btind.MovingAverageSimple(self.dataclose, period=200)
# BollingerBandsWidth = upperband - lowerband/middleband.
self.bbw = BollingerBandsW()
self.boll = btind.BollingerBands(self.dataclose)
self.std = btind.StdDev(self.bbw.l.bbw, period=100)
self.lines_bbw = (self.boll.l.top - self.boll.l.bot) / self.boll.l.mid
self.volatility_level = VolatilityLevel()
self.low_volatility_level = self.volatility_level.l.VLI_fast < self.volatility_level.l.VLI_slow
self.high_volatility_level = self.volatility_level.l.VLI_fast > self.volatility_level.l.VLI_slow
self.extreme_volatility_level = self.bbw.l.bbw > self.volatility_level.l.VLI_top
self.vol_condition = (btind.MovingAverageSimple(self.datavolume, period=10) >
btind.MovingAverageSimple(self.datavolume, period=50))
self.crossdown_boll_top = bt.ind.CrossDown(self.dataclose, self.boll.top)
self.crossup_boll_bot = bt.ind.CrossUp(self.dataclose, self.boll.bot)
self.highest_high = btind.Highest(self.dataclose, period=20)
self.low_of_last_candle = self.datalow[0]
self.close_of_price = self.dataclose[0]
self.stop_win = None
self.stop_loss = None
self.order = None
@staticmethod
def get_params():
return dict()
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status == order.Completed:
if order.isbuy():
self.stop_loss = self.stop_loss if self.stop_loss else 0.05 * self.dataclose[-1]
take_profit = order.executed.price * (1.0 + self.stop_loss)
sl_ord = self.sell(exectype=bt.Order.Stop,
price=order.executed.price * (1.0 - self.stop_loss))
sl_ord.addinfo(name="Stop")
tkp_ord = self.buy(exectype=bt.Order.Limit,
price=take_profit)
tkp_ord.addinfo(name="Prof")
if self.stop_win:
self.sell(price=(order.executed.price * (1 + self.stop_win)),
exectype=bt.Order.Limit)
self.order = None
def _next(self):
if self.order:
return
if self.crossdown_boll_top and self.vol_condition:
if self.close_of_price > self.sma_fast:
if self.bbw.bbw < self.volatility_level.l.VLI_top:
if self.low_volatility_level:
if self.sma_mid > self.sma_veryslow:
self.buy()
else:
self.buy()
elif self.sma_slow > self.sma_veryslow:
self.buy()
self.stop_loss = self.low_of_last_candle
if self.crossup_boll_bot and self.vol_condition:
self.close()
self.stop_loss = None
self.stop_win = None
portfolio_value = self.broker.get_value()
trade_profit = self.broker.get_value([self.data]) / portfolio_value
if trade_profit > 0.03:
self.stop_win = 0.01
elif trade_profit > 0.20:
self.stop_win = 0.15
elif trade_profit > 0.25:
self.stop_win = 0.20
elif trade_profit > 0.30:
self.stop_win = 0.25
elif trade_profit > 0.35:
self.stop_win = 0.30
elif trade_profit > 0.40:
self.stop_win = 0.35
if self.crossup_boll_bot and self.vol_condition:
self.sell()
self.stop_loss = self.highest_high