Overall Statistics
Total Trades
9
Average Win
8.26%
Average Loss
-2.36%
Compounding Annual Return
-3.160%
Drawdown
14.500%
Expectancy
0.124
Net Profit
-3.415%
Sharpe Ratio
-0.037
Probabilistic Sharpe Ratio
11.780%
Loss Rate
75%
Win Rate
25%
Profit-Loss Ratio
3.50
Alpha
-0.007
Beta
0
Annual Standard Deviation
0.196
Annual Variance
0.038
Information Ratio
-0.515
Tracking Error
0.354
Treynor Ratio
-103.151
Total Fees
$51.10
# kijun= (26 period high + 26 periode low) /2

# documentation : 
#https://www.quantconnect.com/lean/documentation/topic28737.html
#https://www.quantconnect.com/forum/discussion/4507/output-of-ichimoku-indicator/p1
import numpy as np
from datetime import timedelta
from datetime import datetime
import pandas as pd


from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
from QuantConnect.Data.Market import TradeBar
from System.Drawing import Color


class inchimoku(QCAlgorithm):

 

     def Initialize(self):
        self.SetStartDate(2020, 1, 1)
        self.SetEndDate(2021, 2, 1)
        self.SetCash(100000)
        self.symbol = "FSLR"
        
        
        self.AddEquity(self.symbol, Resolution.Daily)
        self.ichimoku = self.ICHIMOKU(self.symbol,9, 26, 26, 52, 26, 26, Resolution.Daily) 

        
       
        #self.SetWarmUp(52,Resolution.Daily)
        
        
        ichimokuPlot = Chart('ichimokuPlot')
        
        ichimokuPlot.AddSeries(Series('Tenkan', SeriesType.Line, "", Color.Blue))
        #ichimokuPlot.AddSeries(Series('TenkanCal', SeriesType.Line, "", Color.Red))

        ichimokuPlot.AddSeries(Series('Kijun', SeriesType.Line, "", Color.Purple))
        #ichimokuPlot.AddSeries(Series('KijunCal', SeriesType.Line, "", Color.Green))

        ichimokuPlot.AddSeries(Series('SenkouA', SeriesType.Line, "", Color.Orange))
        ichimokuPlot.AddSeries(Series('SenkouB', SeriesType.Line, "", Color.Yellow))
        #ichimokuPlot.AddSeries(Series('SenkouBtest', SeriesType.Line, "", Color.Yellow))

        ichimokuPlot.AddSeries(Series('SenkouBCal', SeriesType.Line, "", Color.White))

        ichimokuPlot.AddSeries(Series('Chikou', SeriesType.Line, "", Color.Pink))
        ichimokuPlot.AddSeries(Series('Price', SeriesType.Line, "", Color.Gray))
        #ichimokuPlot.AddSeries(Series('Buy', SeriesType.Scatter, '$', Color.Green, ScatterMarkerSymbol.Triangle))
        #ichimokuPlot.AddSeries(Series('Sell', SeriesType.Scatter, '$', Color.Red, ScatterMarkerSymbol.TriangleDown))
        
        self.AddChart(ichimokuPlot)
        
        self.highestPrice = 0
        self.buyPrice = 0
        
        self.rwPrice = RollingWindow[float](26)
        self.rwKijun = RollingWindow[float](26)
        self.rwTenkan = RollingWindow[float](26)
        self.rwSenkouA = RollingWindow[float](26)
        self.rwSenkouB = RollingWindow[float](26)
        self.rwHigh = RollingWindow[float](52)
        self.rwLow = RollingWindow[float](52)


        


     def OnData(self,data):
        if data[self.symbol] is None: return
        
        self.lastClose = data[self.symbol].Close
        self.lastHigh = data[self.symbol].High
        self.lastLow = data[self.symbol].Low
        #data[self.symbol].Time
        

        
        #if self.IsWarmingUp: return
    
        if self.ichimoku.IsReady: 
            self.rwPrice.Add(self.lastClose)
            self.rwKijun.Add(self.ichimoku.Kijun.Current.Value)
            self.rwTenkan.Add(self.ichimoku.Tenkan.Current.Value)
            self.rwSenkouA.Add(self.ichimoku.SenkouA.Current.Value)
            self.rwSenkouB.Add(self.ichimoku.SenkouB.Current.Value)
            self.rwHigh.Add(self.lastHigh)
            self.rwLow.Add(self.lastLow)
            


            
            if self.rwKijun.IsReady and self.rwPrice.IsReady and self.rwTenkan.IsReady and self.rwSenkouA.IsReady and self.rwSenkouB.IsReady  and self.rwLow.IsReady and self.rwHigh.IsReady:
                # tenkan= (9 period high + 9 periode low) /2
                #Tenkan-sen=(Last 9 period high + Last 9 period low)/2
                #tenkanHighValues= sum(list(self.rwHigh)[:9])
                #tenkanLowValues= sum(list(self.rwLow)[:9])

                #TenkanCal = (tenkanHighValues +tenkanLowValues) /2 /9
                self.Plot("ichimokuPlot", "Tenkan", self.ichimoku.Tenkan.Current.Value)
                #self.Plot("ichimokuPlot", "TenkanCal", TenkanCal)
                # kijun= (26 period high + 26 periode low) /2
                #kijunHighValues= sum(list(self.rwHigh)[:26])
                #kijunLowValues= sum(list(self.rwLow)[:26])
                
                #KijunCal = ( kijunHighValues +kijunLowValues) /2 / 26
                self.Plot("ichimokuPlot", "Kijun", self.ichimoku.Kijun.Current.Value)
                #self.Plot("ichimokuPlot", "KijunCal", KijunCal)

                self.Plot("ichimokuPlot", "SenkouA", self.ichimoku.SenkouA.Current.Value)
                self.Plot("ichimokuPlot", "SenkouB", self.ichimoku.SenkouB.Current.Value)
                self.Plot("ichimokuPlot", "Price", self.lastClose)
    
                self.Plot("ichimokuPlot", "Chikou", self.ichimoku.Chikou.Current.Value)
                #max_value = max(list(self.priceWindow)[20:40])
                #highestHigh = max(list(self.rwHigh))
                lowestLow  = min(list(self.rwHigh))
                highestHigh = max(list(self.rwHigh))
                #self.Debug(highestHigh)
                #self.Debug(lowestLow)

                self.SenkouBCal = (highestHigh + lowestLow) / 2
                

                

                
                #self.SenkouACal = ( KijunCal + TenkanCal) / 2 # plotted 26 days intothe future
                self.SenkouACal = ( self.ichimoku.Tenkan.Current.Value + self.ichimoku.Kijun.Current.Value) / 2 # plotted 26 days intothe future

                
                self.Plot("ichimokuPlot", "SenkouBCal", self.SenkouBCal)
                self.Plot("ichimokuPlot", "SenkouACal", self.SenkouACal)
                #self.Plot("ichimokuPlot", "SenkouBtest", self.ichimoku.SenkouB)
                #self.Debug(self.ichi)
                
                


                
                # hard trading rules. 
                
                '''
                1 basic foundation strategy, the conservative safe way:
                • Price above the Kuma Cloud.
                
                • Tenkan Sen greater than the Kijun Sen.
                • Chikou Span is greater than the price from 26 periods ago.
                • Future Senkou A is greater than the Future Senkou B.
                • Price is not far from Kijun Sen and Tenkan Sen.
                • Tenkan Sen, Kijun Sen, and Chikou Span should not be in a Thick Kuma
                    Cloud.
                
                '''
                '''
                
                # softer trading rules
                2 Future Senkou Crossover strategy page 156
                The basic bullish rules for this strategy are:
                
                • Current Senkou A is greater than current Senkou B.
                
                • Price closes above the Kuma Cloud.
                
                • If Tenkan Sen is less than Kijun Sen then Tenkan Sen should be point-
                i.ng upward while the Kijun Sen is flat.
                Or Tenkan Sen is greater than the Kijun Sen.
                
                •Chikou Span is in "open space."
                
                •Future Senkou B is flat or pointing upward.
                •If Future Senkou A is less than Future Senkou B then Future Senkou A
                must be pointing upward.
                
                •Price, Tenkan Sen, Kijun Sen, and Chikou should not be in the Kumo
                Cloud. lf they are, it should be a thick cloud.
                •Price is not far from Tenkan Sen and KijWl Sen.
                •Optional: Future Kumo Cloud is not thick.
                
                '''
                
            
                '''
                2 Future Senkou Crossover strategy page 156
                The basic bullish rules for this strategy are:
                
                • Current Senkou A is greater than current Senkou B.
                '''
                if self.ichimoku.SenkouA.Current.Value > self.ichimoku.SenkouB.Current.Value:
                    
                    
                    #• Price closes above the Kuma Cloud.
                    if self.lastClose > self.ichimoku.SenkouA.Current.Value and self.lastClose > self.ichimoku.SenkouB.Current.Value:
                        
    
                        
                        # if Tenkan Sen is greater than the Kijun Sen continue .
                        #reset
                        TenkanUpAndKijunFlat = False
                        TenkanGreaterThanKijun = False
                        
                        if self.ichimoku.Tenkan.Current.Value > self.ichimoku.Kijun.Current.Value:
                            TenkanGreaterThanKijun = True
                        
                        #• If Tenkan Sen is less than Kijun Sen then Tenkan Sen should be point-
                        #i.ng upward while the Kijun Sen is flat.    
                        if self.ichimoku.Tenkan.Current.Value < self.ichimoku.Kijun.Current.Value:
                            TenkanGreaterThanKijun = False
                            self.tenkanYesterday = self.rwTenkan[1]
                            self.kijunYesterday = self.rwKijun[1]
                            #tenkan up? and kijun flat?
                            if self.ichimoku.Tenkan.Current.Value > self.tenkanYesterday and self.ichimoku.Kijun.Current.Value == self.kijunYesterday: 
                            
                                TenkanUpAndKijunFlat = True
                            
                        
                        
                        # (if tenkan > kijun ) or ( kijun is flat and tenkan moves upward  )
                        if TenkanUpAndKijunFlat or TenkanGreaterThanKijun   : 
                                
                          
                             
                            
                            
                            
                            #•Chikou Span is in "open space." 
                            # if it higher than the cloud back then and is it higher than the price
                            # chikou current close is chikou 26 days ago. 
                            self.chikou26DaysAgo = self.lastClose
                            
                            self.SenkouA26daysAgo = self.rwSenkouA[self.rwSenkouA.Count-1]
                            self.SenkouB26daysAgo = self.rwSenkouB[self.rwSenkouB.Count-1]
                            self.price26DaysAgo = self.rwPrice[self.rwSenkouB.Count-1]

                            self.CloudTop26daysAgo = 0
                            if self.SenkouB26daysAgo > self.SenkouA26daysAgo: 
                                self.CloudTop26daysAgo = self.SenkouB26daysAgo
                            
                            if self.SenkouA26daysAgo > self.SenkouB26daysAgo: 
                                self.CloudTop26daysAgo = self.SenkouA26daysAgo
                            
                            
                            if self.chikou26DaysAgo  >  self.CloudTop26daysAgo and self.chikou26DaysAgo > self.price26DaysAgo: 
                               
                               

                                
                                
                                #•Future Senkou B is flat or pointing upward.
                                #Senkou Span B = (52-period high + 52-period low) / 2.
                                #SenkouBFuture = (self.rwHigh[self.rwHigh.Count -1] + self.rwLow[self.rwLow.Count -1]) / 2.
                                
                                '''
                                
                                DelayedTenkanSenkouA
                                
                                
                                •If Future Senkou A is less than Future Senkou B then Future Senkou A
                                must be pointing upward.
                                
                                •Price, Tenkan Sen, Kijun Sen, and Chikou should not be in the Kumo
                                Cloud. lf they are, it should be a thick cloud.
                                •Price is not far from Tenkan Sen and KijWl Sen.
                                •Optional: Future Kumo Cloud is not thick.
                                '''
                            
                            
                            
                            
                            
                            
                            
                                #BUY
                                #self.TenkanYesterday = self.rwTenkan[self.rwTenkan.Count-1] 
                                        #self.kijunYesterday = self.rwKijun[self.rwKijun.Count-1]
                                        # if price yester is lower than Kijun yesterday  AND price today is > than kijunYesterday.  
                                        #self.TenkanYesterday < self.kijunYesterday and self.Ichimoku.Tenkan.Current.Value > self.Ichimoku.Kijun.Current.Value:
                                        
                                self.priceYesterday = self.rwPrice[1] 
                                self.kijunYesterday = self.rwKijun[1]
                                
                                
                                # if price yester is lower than Kijun yesterday  AND price today is > than kijunYesterday.  
                                
                                # buy at crossing point when price is larger than kijun
                                if self.priceYesterday < self.kijunYesterday and  self.lastClose > self.ichimoku.Kijun.Current.Value:
                    
                                    if not self.Portfolio.Invested:  
                                        self.SetHoldings(self.symbol, 1)
                                        #self.Plot("ichimokuPlot", "Buy", self.lastClose)   
                                        self.buyPrice = self.lastClose
                                        
                                        self.highestPrice = 0
                                        self.stopPrice = self.buyPrice
                                        
                            
                #SELL
                        
                # trailing stop
                #self.oldHighestPrice = self.highestPrice
                
                # update highest price
                if self.lastClose > self.highestPrice: 
                    self.highestPrice = self.lastClose 
                    # and change limit
                    self.stopPrice = self.highestPrice * 0.90
                
                
                #self.lastClose < self.ichimoku.SenkouB.Current.Value
                        #or self.lastClose <= self.buyPrice or self.lastClose < self.ichimoku.Kijun.Current.Value
                if self.lastClose <= self.stopPrice or self.lastClose <= self.buyPrice or self.lastClose <= self.ichimoku.Kijun.Current.Value :
                        if self.Portfolio.Invested:
                            self.Liquidate()
                            #self.Plot("ichimokuPlot", "Sell", self.lastClose)
# Your New Python File