| 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)