Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
'''
ICHIMOKU Cloud for 5 minute time buckets

'''

#import a bunch of stuff
from clr import AddReference
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Algorithm.Framework")
AddReference("QuantConnect.Indicators")

from QuantConnect import *
from QuantConnect.Indicators import *
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Alphas import *
from QuantConnect.Algorithm.Framework.Portfolio import *
from QuantConnect.Algorithm.Framework.Risk import *
from QuantConnect.Algorithm.Framework.Selection import *
from QuantConnect.Data.Consolidators import *

from datetime import timedelta
import numpy as np

from System.Drawing import Color

class IchimokuAlgorithm(QCAlgorithm):
    
    def Initialize(self):
        self.SetStartDate(2020, 8, 17)  # Set Start Date
        self.SetEndDate(2020, 8, 17)  # Set End Date
        self.SetCash(10000)  # Set Strategy Cash
        
        

        # SET THE INSTRUMENTS WE ARE GOING TO USE IN OUR UNIVERSE
        self.long_symbol  = self.AddEquity("SPXL", Resolution.Minute).Symbol
    
                
        # Ichimoku Cloud
        TenkanPeriod = 9
        KijunPeriod = 26
        SenkouAPeriod = 26
        SenkouBPeriod = 52
        SenkouADelay = 26
        SenkouBDelay = 26
        
        
        #self.Ichi = self.ICHIMOKU(self.long_symbol, TenkanPeriod, KijunPeriod, SenkouAPeriod, SenkouBPeriod, SenkouADelay, SenkouBDelay)
        self.Ichi = IchimokuKinkoHyo('ichi', TenkanPeriod, KijunPeriod, SenkouAPeriod, SenkouBPeriod, SenkouADelay, SenkouBDelay)
        
        
        # redefine the indicators so it works on 5 min buckets 
        self.timebucketConsolidator = TradeBarConsolidator(timedelta(minutes = 5))
        self.timebucketConsolidator.DataConsolidated += self.OnBarHandler
        self.SubscriptionManager.AddConsolidator(self.long_symbol, self.timebucketConsolidator)
        
        self.RegisterIndicator(self.long_symbol, self.Ichi, self.timebucketConsolidator)

        # 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" 
        self.CloudTop = 0
        self.CloudBottom = 0
        
        # Warmup those indicators
        self.SetWarmup(self.Ichi.WarmUpPeriod * 5)
        
        # Add a custom chart to track the SMA cross
        self.chart = Chart('Trade Chart')
        self.chart.AddSeries(Series('Price', SeriesType.Line, 0))
        self.chart.AddSeries(Series('Sentiment', SeriesType.Line, 1))
        self.AddChart(self.chart)

    def OnBarHandler(self, sender, bar):
    
        if self.IsWarmingUp:
            return
        
        '''
        This is the IICHIMOKU CLOUD evaluator. 
        This block decides whether self.Sentiment gets set to Bullish, Bearish or Neutral.  
        Maybe move it later into its own function
        '''
        
        self.CloudTop    = max(self.Ichi.SenkouA.Current.Value, self.Ichi.SenkouB.Current.Value)
        self.CloudBottom = min(self.Ichi.SenkouA.Current.Value, self.Ichi.SenkouB.Current.Value)
        
        if (self.Sentiment == "Bullish" or self.Sentiment == "Bearish") and ((self.Ichi.Chikou.Current.Value < self.CloudTop) and (self.Ichi.Chikou.Current.Value > self.CloudBottom)):
            self.Sentiment = "Neutral"
            self.Debug("Sentiment turning Neutral")
                
        elif (self.Sentiment == "Bearish" or self.Sentiment == "Neutral") and (self.Ichi.Chikou.Current.Value > self.CloudTop):
            self.Sentiment = "Bullish"
            self.Debug("Sentiment turning Bullish")
                
        elif (self.Sentiment== "Bullish" or self.Sentiment == "Neutral") and (self.Ichi.Chikou.Current.Value < self.CloudBottom):
            self.Sentiment = "Bearish"
            self.Debug("Sentiment turning Bearish")

        '''
        end of the ICHIMOKU CLOUD logic
        '''
        
        if self.Sentiment == "Neutral":
            SentimentNumber = 1
        if self.Sentiment == "Bullish":
            SentimentNumber = 2
        if self.Sentiment == "Bearish":
            SentimentNumber = 0
            
        self.Plot('Trade Chart', 'Price',     self.Securities[self.long_symbol].Price)
        self.Plot('Trade Chart', 'CloudTop',     self.CloudTop)
        self.Plot('Trade Chart', 'CloudBottom',     self.CloudBottom)
        self.Plot('Trade Chart', 'Sentiment', SentimentNumber)