Overall Statistics |
Total Trades 144 Average Win 0.35% Average Loss -0.14% Compounding Annual Return 0.638% Drawdown 1.700% Expectancy 0.036 Net Profit 0.638% Sharpe Ratio 0.204 Probabilistic Sharpe Ratio 17.091% Loss Rate 70% Win Rate 30% Profit-Loss Ratio 2.40 Alpha 0.006 Beta -0.002 Annual Standard Deviation 0.023 Annual Variance 0.001 Information Ratio -1.412 Tracking Error 0.556 Treynor Ratio -2.458 Total Fees $29.68 Estimated Strategy Capacity $3000.00 Lowest Capacity Asset SANUSD E3 |
# -------------------------------------------------------------------------------- MA_1 = 120; MA_2 = 12; AlphA = float(MA_1/ MA_2); Beta = (AlphA * float(MA_1 - 1)) / float(MA_1 - AlphA); Gamma = float(Beta) + 1.0; RSIUP = 70; RSIDOWN = 30; a = RSIUP - RSIDOWN; b = RSIUP - a; c = ((RSIUP + 10) - (RSIDOWN - 10 )) / 100; d = (RSIUP + 10) - c * 100; # -------------------------------------------------------------------------------- class UpgradedApricotPony(QCAlgorithm): def Initialize(self): #Grunddaten für Indikator self.SetStartDate(2019, 1, 1) # Set Start Date self.SetEndDate(2019, 12, 31) #Set End Date self.SetCash(10000) # Set Strategy Cash #Allgemeine Einstellungen self.SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Margin) #Broker Modell self.SetTimeZone("Europe/Berlin") #durch die Zeitzone wird auch die 4h Anzeige in der Grafik um 2h verschoben self.positionSizeUSD = 100 self.profit_percentage = 0.3 self.loss_percentage = -0.1 #Universe universe = ['BTCUSD', 'LTCUSD', 'ETHUSD', 'XMRUSD', 'XRPUSD', 'EOSUSD', 'SANUSD', 'XLMUSD'] self.pairs = [Pair(self, ticker) for ticker in universe] self.SetWarmUp((MA_1 + MA_2 + 250), Resolution.Daily) def OnData(self, data): for pair in self.pairs: if self.IsWarmingUp: return #Aktuelle Datenpunkte symbol = pair.symbol price = self.Securities[symbol].Price #RSI over EMA rsi_1 = pair.rsi_1.Current.Value rsi_ema = pair.rsi_ema.Current.Value diff = rsi_ema - rsi_1 #New Moving Average nma = pair.nma.Current.Value nma_ema = pair.nma_ema.Current.Value nma_hl = nma * Gamma - nma_ema * Beta #Bollinger Bands% bbr = (self.Securities[symbol].Price - pair.bb.LowerBand.Current.Value) / (pair.bb.UpperBand.Current.Value - pair.bb.LowerBand.Current.Value) bbnorm = (a * bbr + b) #Stochastic Smoothed sto = pair.sto.Current.Value sto_stochd = (c * pair.sto.StochK.Current.Value + d) #Strategie: #Prüfen ob man bereits in einen Coin investiert ist: if not self.Portfolio[symbol].Invested: #Long if self.Securities[symbol].Close > nma and pair.rsi_1.Current.Value > pair.rsi_ema.Current.Value and bbnorm > pair.rsi_1.Current.Value and pair.rsi_1.Current.Value > sto_stochd: quantity = (self.Portfolio.Cash * 0.01)/ self.Securities[symbol].Price self.MarketOrder(symbol, quantity) #Short elif self.Securities[symbol].Close < nma and pair.rsi_1.Current.Value < pair.rsi_ema.Current.Value and bbnorm < pair.rsi_1.Current.Value and pair.rsi_1.Current.Value < sto_stochd: quantity = (self.Portfolio.Cash * 0.01)/ self.Securities[symbol].Price self.MarketOrder(symbol, -quantity) return profit = self.Portfolio[symbol].UnrealizedProfitPercent if self.Portfolio[symbol].Invested: if self.Portfolio[symbol].IsLong: if profit > self.profit_percentage: self.Liquidate(symbol, "Take Profit reached") self.Log(str(self.Time) + " " + str(symbol) + " " + str(profit)) elif profit < self.loss_percentage: self.Liquidate(symbol, "Stop Price reached") self.Log(str(self.Time) + " " + str(symbol) + " " + str(profit)) elif self.Portfolio[symbol].IsShort: if profit > self.profit_percentage: self.Liquidate(symbol, "Take Profit reached") self.Log(str(self.Time) + " " + str(symbol) + " " + str(profit)) elif profit < self.loss_percentage: self.Liquidate(symbol, "Stop Price reached") self.Log(str(self.Time) + " " + str(symbol) + " " + str(profit)) def OnOrderEvent(self, orderEvent): if orderEvent.FillQuantity == 0: return fetched = self.Transactions.GetOrderById(orderEvent.OrderId) #self.Log(f"{str(fetched.Type)} was filled") funktioniert nicht richtig self.Log(f" Symbol was: {str(orderEvent.Symbol)}") self.Log(f" Quantity was: {str(orderEvent.FillQuantity)}") #Verschiedene Indikatoren werden angelgt class Pair: def __init__(self, algorithm, ticker): self.symbol = algorithm.AddCrypto(ticker, Resolution.Daily, Market.Bitfinex).Symbol #RSI over EMA self.rsi_1 = algorithm.RSI(self.symbol, 14)#, MovingAverageType.Simple, Resolution.Daily) self.rsi_ema = IndicatorExtensions.EMA(algorithm.RSI(self.symbol, 13), 13) #New Moving Average self.nma = IndicatorExtensions.Over(IndicatorExtensions.Plus(algorithm.EMA(self.symbol, MA_1, Resolution.Daily, Field.High), algorithm.EMA(self.symbol, MA_1, Resolution.Daily, Field.Low)), 2) self.nma_ema = IndicatorExtensions.Of(ExponentialMovingAverage(MA_2), self.nma) #Bollinger Bands% self.bb = algorithm.BB(self.symbol, 20, 2) #Stochastic Smoothed self.sto = algorithm.STO(self.symbol, 14, 5, 1)