Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-0.353
Tracking Error
0.636
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
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)')
            
    #def trade(self):     
        
                
        # if not self.Portfolio.Invested:
        #    self.SetHoldings("SPY", 1)