Overall Statistics |
Total Orders 774 Average Win 8.41% Average Loss -0.99% Compounding Annual Return 66.622% Drawdown 36.700% Expectancy 0.649 Start Equity 100000 End Equity 772936.80 Net Profit 672.937% Sharpe Ratio 1.367 Sortino Ratio 1.885 Probabilistic Sharpe Ratio 63.663% Loss Rate 83% Win Rate 17% Profit-Loss Ratio 8.53 Alpha 0.49 Beta 0.123 Annual Standard Deviation 0.369 Annual Variance 0.136 Information Ratio 0.966 Tracking Error 0.399 Treynor Ratio 4.114 Total Fees $0.00 Estimated Strategy Capacity $1900000.00 Lowest Capacity Asset BTCUSD 2XR Portfolio Turnover 52.81% |
from AlgorithmImports import * class TechnicalIndicatorsAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 1, 1) # Set Start Date self.SetEndDate(2022, 1, 1) # Set End Date self.SetCash(100000) # Set Strategy Cash # Add the cryptocurrency pair self.symbol = self.AddCrypto("BTCUSD", Resolution.HOUR).Symbol # Define indicators self.hammer = self.CandlestickPatterns.Hammer(self.symbol) self.hanging_man = self.CandlestickPatterns.HangingMan(self.symbol) self.doji = self.CandlestickPatterns.Doji(self.symbol) self.spinning_top = self.CandlestickPatterns.SpinningTop(self.symbol) self.engulfing = self.CandlestickPatterns.Engulfing(self.symbol) self.rsi = self.RSI(self.symbol, 14, MovingAverageType.Wilders, Resolution.HOUR) # Moving averages self.sma10 = self.SMA(self.symbol, 10, Resolution.HOUR) self.sma05 = self.SMA(self.symbol, 5, Resolution.HOUR) self.ema20 = self.EMA(self.symbol, 20, Resolution.HOUR) self.sma30 = self.SMA(self.symbol, 30, Resolution.HOUR) self.sma50 = self.SMA(self.symbol, 50, Resolution.HOUR) self.sma200 = self.SMA(self.symbol, 200, Resolution.HOUR) self.sma600 = self.SMA(self.symbol, 600, Resolution.HOUR) self.sma40 = self.SMA(self.symbol, 40, Resolution.HOUR) self.sma120 = self.SMA(self.symbol, 120, Resolution.HOUR) self.ema05 = self.EMA(self.symbol, 5, Resolution.HOUR) self.ema10 = self.EMA(self.symbol, 10, Resolution.HOUR) self.ema30 = self.EMA(self.symbol, 30, Resolution.HOUR) self.ema65 = self.EMA(self.symbol, 65, Resolution.HOUR) self.ema100 = self.EMA(self.symbol, 100, Resolution.HOUR) self.ema150 = self.EMA(self.symbol, 150, Resolution.HOUR) self.ema500 = self.EMA(self.symbol, 500, Resolution.HOUR) self.ema600 = self.EMA(self.symbol, 600, Resolution.HOUR) self.entry_price = None def OnData(self, data): if not data.ContainsKey(self.symbol): return price = data[self.symbol].Close # Buy condition if (self.rsi.Current.Value > 55) and (self.ema10.Current.Value > self.ema20.Current.Value > self.ema65.Current.Value > self.ema150.Current.Value): if not self.Portfolio[self.symbol].Invested: self.SetHoldings(self.symbol, 1) self.entry_price = price # self.stop_price = price*0.95 # Sell condition elif self.rsi.Current.Value < 40 and ((self.ema10.Current.Value < self.ema65.Current.Value) or (self.ema20.Current.Value < self.ema65.Current.Value)): if self.Portfolio[self.symbol].Invested: self.Liquidate(self.symbol) self.entry_price = None #self.stop_price = None # Stop-loss condition if self.Portfolio[self.symbol].Invested and self.entry_price is not None: if price < self.entry_price*0.995: self.Liquidate(self.symbol) self.entry_price = None # Trailing stop-loss #if self.Portfolio[self.symbol].Invested: # self.stop_price = max(self.stop_price, price * 0.85) # if price < self.stop_price: # self.Liquidate(self.symbol) # self.stop_price = None # def PlotIndicators(self): # self.Plot("RSI", "RSI", self.rsi.Current.Value) # self.Plot("SMA", "SMA10", self.sma10.Current.Value) # self.Plot("SMA", "SMA20", self.sma20.Current.Value)