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