| Overall Statistics |
|
Total Orders 1254 Average Win 124.05% Average Loss -7.50% Compounding Annual Return 71.481% Drawdown 53.800% Expectancy 3.870 Start Equity 100000.00 End Equity 868273.78 Net Profit 768.274% Sharpe Ratio 1.202 Sortino Ratio 1.447 Probabilistic Sharpe Ratio 43.454% Loss Rate 72% Win Rate 28% Profit-Loss Ratio 16.53 Alpha 0.636 Beta 0.374 Annual Standard Deviation 0.566 Annual Variance 0.32 Information Ratio 0.98 Tracking Error 0.573 Treynor Ratio 1.819 Total Fees $0.00 Estimated Strategy Capacity $15000000.00 Lowest Capacity Asset ETHUSD 2XR Portfolio Turnover 2.31% |
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 cryptocurrency pairs
self.crypto_symbols = [
self.AddCrypto("BTCUSD", Resolution.DAILY).Symbol,
self.AddCrypto("ETHUSD", Resolution.DAILY).Symbol,
self.AddCrypto("LTCUSD", Resolution.DAILY).Symbol,
self.AddCrypto("BCHUSD", Resolution.DAILY).Symbol,
self.AddCrypto("XRPUSD", Resolution.DAILY).Symbol,
self.AddCrypto("ADAUSD", Resolution.DAILY).Symbol,
self.AddCrypto("DOTUSD", Resolution.DAILY).Symbol,
self.AddCrypto("LINKUSD", Resolution.DAILY).Symbol,
self.AddCrypto("SOLUSD", Resolution.DAILY).Symbol
]
self.entry_prices = {}
self.stop_prices = {}
# Define indicators
self.indicators = {}
for symbol in self.crypto_symbols:
self.indicators[symbol] = {
'hammer': self.CandlestickPatterns.Hammer(symbol),
'hanging_man': self.CandlestickPatterns.HangingMan(symbol),
'doji': self.CandlestickPatterns.Doji(symbol),
'spinning_top': self.CandlestickPatterns.SpinningTop(symbol),
'engulfing': self.CandlestickPatterns.Engulfing(symbol),
'rsi': self.RSI(symbol, 14, MovingAverageType.Wilders, Resolution.DAILY),
'sma10': self.SMA(symbol, 10, Resolution.DAILY),
'sma05': self.SMA(symbol, 5, Resolution.DAILY),
'ema20': self.EMA(symbol, 20, Resolution.DAILY),
'sma30': self.SMA(symbol, 30, Resolution.DAILY),
'sma50': self.SMA(symbol, 50, Resolution.DAILY),
'sma200': self.SMA(symbol, 200, Resolution.DAILY),
'sma600': self.SMA(symbol, 600, Resolution.DAILY),
'sma40': self.SMA(symbol, 40, Resolution.DAILY),
'sma120': self.SMA(symbol, 120, Resolution.DAILY),
'ema05': self.EMA(symbol, 5, Resolution.DAILY),
'ema10': self.EMA(symbol, 10, Resolution.DAILY),
'ema30': self.EMA(symbol, 30, Resolution.DAILY),
'ema65': self.EMA(symbol, 65, Resolution.DAILY),
'ema100': self.EMA(symbol, 100, Resolution.DAILY),
'ema150': self.EMA(symbol, 150, Resolution.DAILY),
'ema500': self.EMA(symbol, 500, Resolution.DAILY),
'ema600': self.EMA(symbol, 600, Resolution.DAILY)
}
def OnData(self, data):
for symbol in self.crypto_symbols:
if not data.ContainsKey(symbol):
continue
price = data[symbol].Close
indicators = self.indicators[symbol]
# Buy condition
if indicators['rsi'].Current.Value > 55 and (indicators['ema10'].Current.Value > indicators['ema20'].Current.Value > indicators['ema65'].Current.Value > indicators['ema150'].Current.Value):
if not self.Portfolio[symbol].Invested:
self.SetHoldings(symbol, 1)
self.entry_prices[symbol] = price
#self.stop_prices[symbol] = price * 0.95
# Sell condition
elif indicators['rsi'].Current.Value < 40 and ((indicators['ema10'].Current.Value < indicators['ema65'].Current.Value) or (indicators['ema20'].Current.Value < indicators['ema65'].Current.Value)):
if self.Portfolio[symbol].Invested:
self.Liquidate(symbol)
self.entry_prices[symbol] = None
self.stop_prices[symbol] = None
#Stop-loss condition
if self.Portfolio[symbol].Invested and self.entry_prices.get(symbol) is not None:
if price < self.entry_prices[symbol] * 0.95:
self.Liquidate(symbol)
self.entry_prices[symbol] = None
# Trailing stop-loss
#if self.Portfolio[symbol].Invested:
# self.stop_prices[symbol] = max(self.stop_prices[symbol], price * 0.85)
# if price < self.stop_prices[symbol]:
# self.Liquidate(symbol)
# self.stop_prices[symbol] = None
def PlotIndicators(self):
for symbol in self.crypto_symbols:
indicators = self.indicators[symbol]
self.Plot(f"RSI_{symbol}", "RSI", indicators['rsi'].Current.Value)
self.Plot(f"SMA_{symbol}", "SMA10", indicators['sma10'].Current.Value)
self.Plot(f"SMA_{symbol}", "SMA20", indicators['sma20'].Current.Value)