Overall Statistics |
Total Trades 212 Average Win 1.72% Average Loss -1.80% Compounding Annual Return 14.216% Drawdown 19.000% Expectancy 0.161 Net Profit 31.156% Sharpe Ratio 0.579 Probabilistic Sharpe Ratio 21.936% Loss Rate 41% Win Rate 59% Profit-Loss Ratio 0.95 Alpha 0.114 Beta 0.029 Annual Standard Deviation 0.207 Annual Variance 0.043 Information Ratio -0.24 Tracking Error 0.289 Treynor Ratio 4.085 Total Fees $458.26 |
from datetime import timedelta import numpy as np class IchimokuAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2019,1, 1) # Set Start Date #self.SetEndDate(2020, 12, 17) # Set End Date self.SetCash(1000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.Bitfinex,AccountType.Cash) #self.UniverseSettings.Resolution = Resolution.Hours #self.UniverseSettings.Leverage = 5; # SET THE INSTRUMENTS WE ARE GOING TO USE IN OUR UNIVERSE self.symbol = self.AddCrypto("BTCUSD", Resolution.Minute).Symbol self.long_symbol ="BTCUSD" #self.long_symbol = self.AddForex("BTCUSD", Resolution.Minute, Market.Oanda).Symbol # Ichimoku Cloud TenkanPeriod = 9 KijunPeriod = 29 SenkouAPeriod =30 SenkouBPeriod =60 SenkouADelay = 30 SenkouBDelay = 30 self.Ichi = IchimokuKinkoHyo(TenkanPeriod, KijunPeriod, SenkouAPeriod, SenkouBPeriod, SenkouADelay, SenkouBDelay) self.EMA200 = ExponentialMovingAverage(55) self.RegisterIndicator(self.long_symbol, self.EMA200, timedelta(hours=2)) self.RegisterIndicator(self.long_symbol, self.Ichi, timedelta(hours=2)) # going to use three values for Sentiment: Bullish, Bearish and Neutral # setting default values but these will get re-set during pre-market so not a big deal self.Sentiment = "Neutral" # Warmup those indicators self.SetWarmup(SenkouBPeriod * 120) # Consolidate time into 5 min bars and call the handler Consolidator = QuoteBarConsolidator(timedelta(hours=2)) Consolidator.DataConsolidated += self.OnBarHandler self.SubscriptionManager.AddConsolidator(self.long_symbol, Consolidator) def OnBarHandler(self, sender, bar): if self.IsWarmingUp: return CloudTop = max(self.Ichi.SenkouA.Current.Value, self.Ichi.SenkouB.Current.Value) CloudBottom = min(self.Ichi.SenkouA.Current.Value, self.Ichi.SenkouB.Current.Value) AboveCloud = bar.Close > CloudTop BelowCloud = bar.Close < CloudBottom ToverK = self.Ichi.Tenkan.Current.Value > self.Ichi.Kijun.Current.Value TunderK = self.Ichi.Tenkan.Current.Value < self.Ichi.Kijun.Current.Value if AboveCloud and \ self.Ichi.Kijun.Current.Value > self.Ichi.Tenkan.Current.Value and \ bar.Close > self.EMA200.Current.Value and \ not self.Portfolio[self.symbol].IsLong: self.SetHoldings("BTCUSD", 1.0) if self.Ichi.Kijun.Current.Value < self.Ichi.Tenkan.Current.Value and self.Portfolio[self.symbol].IsLong: self.Liquidate("BTCUSD")