from datetime import timedelta

class CalmRedAnt(QCAlgorithm):

def Initialize(self):

'''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''

self.SetStartDate(2021, 5, 1) #Set Start Date

self.SetEndDate(2021, 12, 1) #Set End Date

self.SetCash(10000) #Set Strategy Cash

# Find more symbols here: http://quantconnect.com/data

self.SetBrokerageModel(BrokerageName.FTX, AccountType.Cash)

self.SetTimeZone("America/New_York")

#self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash)

#self.SettlementModel = DelayedSettlementModel(3, TimeSpan.FromHours(8))

#self.AddCrypto("BTCUSD").Symbol

self.symbols = []

self.symbols.append("BTCUSD")#, self.symbols.append("XRPUSD"), \

#self.symbols.append("ETHUSD"), self.symbols.append("SOLUSD"), \

#---TO ADD

#self.symbols.append("BNBUSD"), self.symbols.append("LINKUSD"), \

#self.symbols.append("BICOUSD"), self.symbols.append("BATUSD"), \

#self.symbols.append("AVAXUSD")

#self.spy = self.AddSecurity("SPY", Resolution.Hour).Symbol

#self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Every(timedelta(minutes=720)), Action(self.trade))

#self.SetBenchmark("BTCUSD")

#INDICATORS

self.rsi = RelativeStrengthIndex(14, MovingAverageType.Exponential)

self.ema_f = ExponentialMovingAverage(3)

self.ema_d = ExponentialMovingAverage(7)

self.sma_h_s = ExponentialMovingAverage(14)

self.sma_h_f = ExponentialMovingAverage(7)

self.sto = Stochastic(3,1,14)

self.adx = AverageDirectionalIndex(14)

self.psar = ParabolicStopAndReverse(0.02, 0.02, 0.2)

self.indicators_by_symbol = {}

#self.SetWarmUp(timedelta(25))

for symbol in self.symbols:

self.AddCrypto(symbol, Resolution.Daily).Symbol

self.RegisterIndicator(symbol, self.rsi, Resolution.Daily)

self.RegisterIndicator(symbol, self.ema_f, Resolution.Daily)

self.RegisterIndicator(symbol, self.sma_h_s, Resolution.Daily)

self.RegisterIndicator(symbol, self.sma_h_f, Resolution.Daily)

self.RegisterIndicator(symbol, self.sto, Resolution.Daily)

self.RegisterIndicator(symbol, self.ema_d, Resolution.Daily)

self.RegisterIndicator(symbol, self.psar, Resolution.Daily)

#self.RegisterIndicator(symbol, self.upper_b, Resolution.Daily)

#self.RegisterIndicator(symbol, self.lower_b, Resolution.Daily)

#self.RegisterIndicator(symbol, self.upper_psar, Resolution.Daily)

self.RegisterIndicator(symbol, self.adx, Resolution.Daily)

self.indicators_by_symbol[symbol] = {

'rsi' : self.rsi,

'ema_f' :self.ema_f,

'sma_h_s' :self.sma_h_s,

'sma_h_f' :self.sma_h_f,

'sto' : self.sto,

'ema_d' : self.ema_d,

#'upper_b' : self.upper_b,

#'lower_b' : self.lower_b,

'psar' : self.psar,

#'upper_psar' : self.upper_psar,

'adx' : self.adx

}

def OnData(self, slice):

for symbol in self.indicators_by_symbol.keys():

if slice.Bars.ContainsKey(symbol):

history = self.History([symbol], 25, Resolution.Daily)

for bar in history.itertuples():

tradeBar = TradeBar(bar.Index[1], bar.Index[0], bar.open, bar.high, bar.low, bar.close, bar.volume, timedelta(1))

self.indicators_by_symbol[symbol]['sto'].Update(tradeBar)

self.indicators_by_symbol[symbol]['adx'].Update(tradeBar)

self.indicators_by_symbol[symbol]['psar'].Update(tradeBar)

#self.indicators_by_symbol[symbol]['upper_psar'].Update(bar.Index[1], bar.close)

self.indicators_by_symbol[symbol]['sma_h_s'].Update(bar.Index[1], bar.close)

self.indicators_by_symbol[symbol]['sma_h_f'].Update(bar.Index[1], bar.close)

self.indicators_by_symbol[symbol]['ema_f'].Update(bar.Index[1], bar.close)

self.indicators_by_symbol[symbol]['ema_d'].Update(bar.Index[1], bar.close)

self.indicators_by_symbol[symbol]['rsi'].Update(bar.Index[1], bar.close)

#self.indicators_by_symbol[symbol]['upper_b'].Update(bar.Index[1], bar.close)

#self.indicators_by_symbol[symbol]['lower_b'].Update(bar.Index[1], bar.close)

#if (self.indicators_by_symbol[symbol]['sma_h_s'].Current.Value < self.Securities[symbol].Price) and (self.indicators_by_symbol[symbol]['sma_h_f'].Current.Value < self.Securities[symbol].Price)

#self.StochRSI = IndicatorExtensions.Of(self.indicators_by_symbol[symbol]['rsi'], self.indicators_by_symbol[symbol]['sto']).Current.Value

#self.Debug('rsi_stoch: ' + str(self.StochRSI))

#if str(symbol)=="BTCUSD":

#self.cash = self.Portfolio.MarginRemaining

#self.cashy = self.cash/len(self.symbols)

#INDICATORS READY?

if not self.indicators_by_symbol[symbol]['rsi'].IsReady and not self.indicators_by_symbol[symbol]['sto'].IsReady\

and not self.indicators_by_symbol[symbol]['ema_d'].IsReady and not self.indicators_by_symbol[symbol]['psar'].IsReady:

return self.Debug('indicators not ready')

#OTHER INDICATORS

deviationPct = 0.10

self.upper_b = float(self.indicators_by_symbol[symbol]['ema_d'].Current.Value * (1+deviationPct))

self.lower_b = float(self.indicators_by_symbol[symbol]['ema_d'].Current.Value * (1-deviationPct))

self.upper_psar = float(self.indicators_by_symbol[symbol]['ema_d'].Current.Value * (1.2))

self.psar_m = float(IndicatorExtensions.Of(self.indicators_by_symbol[symbol]['ema_d'], self.indicators_by_symbol[symbol]['psar']).Current.Value)

#INFO

self.Debug('Info: ' + str(self.Time.date) + str(symbol) + ' price '+ str(self.Securities[symbol].Price) +' RSI ' + str(self.indicators_by_symbol[symbol]['rsi'].Current.Value) + ' sto ' + str(self.indicators_by_symbol[symbol]['sto'].Current.Value) + ' lower_b ' + str(self.lower_b) + ' ADX ' + str(self.indicators_by_symbol[symbol]['adx'].Current.Value))

#BUY

if self.indicators_by_symbol[symbol]['rsi'].Current.Value < 30.0:

#quantity = self.cashy/self.Securities[symbol].Price

#self.LimitOrder(symbol, quantity, self.Securities[symbol].Price)

if self.Portfolio.MarginRemaining > (1/len(self.symbols))*self.Securities[symbol].Price:

self.SetHoldings(symbol, 1/len(self.symbols))

self.Debug(str(symbol) +' BUY RSI ' + str(self.indicators_by_symbol[symbol]['rsi'].Current.Value))

elif self.indicators_by_symbol[symbol]['sto'].Current.Value < 20.0:

#quantity = self.cashy/self.Securities[symbol].Price

#self.LimitOrder(symbol, quantity, self.Securities[symbol].Price)

if self.Portfolio.MarginRemaining > (1/len(self.symbols))*self.Securities[symbol].Price:

self.SetHoldings(symbol, 1/len(self.symbols))

self.Debug(str(symbol) +' BUY sto ' + str(self.indicators_by_symbol[symbol]['sto'].Current.Value))

elif self.lower_b > self.Securities[symbol].Price:

#quantity = self.cashy/self.Securities[symbol].Price

#self.LimitOrder(symbol, quantity, self.Securities[symbol].Price)

if self.Portfolio.MarginRemaining > (1/len(self.symbols))*self.Securities[symbol].Price:

self.SetHoldings(symbol, 1/len(self.symbols))

self.Debug(str(symbol) +' BUY bands ' + str(self.lower_b))

elif self.indicators_by_symbol[symbol]['adx'].Current.Value > 70.0:

#quantity = self.cashy/self.Securities[symbol].Price

#self.LimitOrder(symbol, quantity, self.Securities[symbol].Price)

if self.Portfolio.MarginRemaining > (1/len(self.symbols))*self.Securities[symbol].Price:

self.SetHoldings(symbol, 1/len(self.symbols))

self.Debug(str(symbol) +' BUY ADX ' + str(self.indicators_by_symbol[symbol]['adx'].Current.Value))

#SELL

elif self.indicators_by_symbol[symbol]['rsi'].Current.Value > 70.0:

self.Liquidate(symbol)

#self.Debug(str(symbol) +' SELL RSI ' + str(self.indicators_by_symbol[symbol]['rsi'].Current.Value))

elif self.indicators_by_symbol[symbol]['sto'].Current.Value > 80.0:

self.Liquidate(symbol)

#self.Debug(str(symbol) +' SELL sto ' + str(self.indicators_by_symbol[symbol]['sto'].Current.Value))

elif self.upper_b < self.Securities[symbol].Price:

self.Liquidate(symbol)

#self.Debug(str(symbol) +' SELL bands ' + str(self.indicators_by_symbol[symbol]['upper_b'].Current.Value))

elif self.psar_m > self.upper_psar:

self.Liquidate(symbol)

#self.Debug(str(symbol) +' SELL PSAR ' + str(self.upper_psar))

#elif self.indicators_by_symbol[symbol]['adx'].Current.Value < 30.0:

# self.Liquidate(symbol)

# self.Debug(str(symbol) +' SELL ADX ' + str(self.indicators_by_symbol[symbol]['adx'].Current.Value))

else:

self.Debug('none')

else:

self.Debug('NOT slice.Bars.ContainsKey(symbol)')