Overall Statistics |
Total Trades 593 Average Win 1.84% Average Loss -0.88% Compounding Annual Return 207.519% Drawdown 35.900% Expectancy 0.241 Net Profit 112.530% Sharpe Ratio 2.687 Probabilistic Sharpe Ratio 74.970% Loss Rate 60% Win Rate 40% Profit-Loss Ratio 2.10 Alpha 1.469 Beta 0.614 Annual Standard Deviation 0.586 Annual Variance 0.344 Information Ratio 2.484 Tracking Error 0.565 Treynor Ratio 2.566 Total Fees $9122.33 |
import decimal as d import numpy as np class CryptoTechnical(QCAlgorithm): def Initialize(self): self.Debug('Initializing...') self.SetStartDate(2020, 1, 1) # Set Start Date self.SetEndDate(2020, 9, 1) # Set End Date self.fiat = 'EUR' self.crypto = 'ETH' # Set Strategy Cash (USD) self.SetCash(1) # Set Strategy Cash (EUR) self.SetCash(self.fiat, 6000, 1.1) self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash) self.pair = self.crypto + self.fiat self.symbol = self.AddCrypto(self.pair, Resolution.Minute, Market.GDAX).Symbol #Symbol Data Dictionary: self.symbol_data = {} # Indicator Parameters self.ind_params = (26, 12, 9) #Create symbol data object for symbol self.InitizalizeSymbolData(self.symbol, self.ind_params) self.Debug('Initialized.') def OnData(self, data): for key, symbol_data in self.symbol_data.items(): symbol_data.ComputeStatus() if self.Time.minute % 15 == 0 and self.LiveMode: inspection = symbol_data.indicator.Signal.Current.Value self.Debug('Indicator: '+str(inspection)) decision = 'Buy' if symbol_data.is_buy else 'Sell' self.Debug('Decision:'+str(decision)) fiat_amount = self.Portfolio.CashBook[self.fiat].Amount crypto_amount = self.Portfolio.CashBook[self.crypto].Amount if symbol_data.is_buy == True and self.Portfolio.CashBook[self.fiat].Amount > 100 : Price = data[key].Close quantity = round((self.Portfolio.CashBook[self.fiat].Amount*0.99)/Price, 3) if quantity > 0: self.MarketOrder(key, quantity) if symbol_data.is_sell == True and self.Portfolio.CashBook[self.crypto].Amount > 0.01 : Price = data[key].Close quantity = round(self.Portfolio.CashBook[self.crypto].Amount*0.99, 3) self.MarketOrder(key, -quantity) def InitizalizeSymbolData(self, symbol, parameters): needed_period = max(parameters)+1 if symbol not in self.symbol_data: self.symbol_data[symbol] = SymbolData(self, symbol, parameters) history = self.History(symbol, needed_period, Resolution.Hour) if not history.empty: self.symbol_data[symbol].WarmUpIndicators(history) class SymbolData(object): def __init__(self, algorithm, symbol, parameters): self.symbol = symbol self.indicator = algorithm.MACD(symbol, *parameters, MovingAverageType.Simple, Resolution.Hour) self.is_buy = False self.is_sell = False def WarmUpIndicators(self, history): for index, row in history.loc[str(self.symbol)].iterrows(): self.indicator.Update(index, row["close"]) def ComputeStatus(self): if self.indicator.Signal.Current.Value > self.indicator.Current.Value: self.is_buy = True self.is_sell = False else: self.is_sell = True self.is_buy = False