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")