Overall Statistics |
Total Trades 67 Average Win 7.85% Average Loss -2.54% Compounding Annual Return 7.542% Drawdown 23.600% Expectancy 1.108 Net Profit 124.168% Sharpe Ratio 0.653 Probabilistic Sharpe Ratio 9.191% Loss Rate 48% Win Rate 52% Profit-Loss Ratio 3.09 Alpha 0.069 Beta -0.011 Annual Standard Deviation 0.103 Annual Variance 0.011 Information Ratio -0.315 Tracking Error 0.189 Treynor Ratio -6.404 Total Fees $166.76 |
# 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(2010, 1, 1) #self.SetEndDate(2021, 2, 3) self.SetCash(10000) self.symbol = "AAPL" 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('Tenkan', 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('SenkouACal', 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) self.rwSenkouBCal = RollingWindow[float](28) # 28# to high? should be 26 self.rwSenkouACal = RollingWindow[float](26) #27 # should I change it? 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: lowestLow = min(list(self.rwHigh)) highestHigh = max(list(self.rwHigh)) self.SenkouBCal = (highestHigh + lowestLow) / 2 #self.SenkouBCal= (self.ichimoku.DelayedMaximumSenkouB.Current.Value + self.ichimoku.DelayedMinimumSenkouB.Current.Value) / 2 self.SenkouBCal= (self.ichimoku.SenkouBMaximum.Current.Value + self.ichimoku.SenkouBMinimum.Current.Value) / 2 # correct the calculated senkou B value to be like the indicator in quantconnect. #differenceX= self.SenkouBCal- self.ichimoku.SenkouB.Current.Value #self.SenkouBCal = differenceX + self.SenkouBCal self.rwSenkouBCal.Add(self.SenkouBCal) self.SenkouACal = ( self.ichimoku.Tenkan.Current.Value + self.ichimoku.Kijun.Current.Value) / 2 self.rwSenkouACal.Add(self.SenkouACal) if self.rwSenkouBCal.IsReady and self.rwSenkouACal.IsReady: # plot self.Plot("ichimokuPlot", "Tenkan", self.ichimoku.Tenkan.Current.Value) self.Plot("ichimokuPlot", "Kijun", self.ichimoku.Kijun.Current.Value) self.Plot("ichimokuPlot", "Price", self.lastClose) self.Plot("ichimokuPlot", "Chikou", self.ichimoku.Chikou.Current.Value) self.Plot("ichimokuPlot", "SenkouA", self.ichimoku.SenkouA.Current.Value) self.Plot("ichimokuPlot", "SenkouB", self.ichimoku.SenkouB.Current.Value) self.Plot("ichimokuPlot", "SenkouBCal", self.rwSenkouBCal[self.rwSenkouBCal.Count-1]) self.Plot("ichimokuPlot", "SenkouACal", self.rwSenkouACal[self.rwSenkouACal.Count-1]) # BUY strategy: # price is above cloud # Chikou is higher than price below it and the cloud. if self.lastClose > self.rwPrice[25] : # check if there is a shadow. self.isThereShadow = False i = 0 while i <= 25: # if any of the prices from the last 26 days are inside the cloud (shadow) stop # if the price is lower than senkou A or B there is a cloud. then return if self.rwPrice[i] < self.ichimoku.SenkouA.Current.Value or self.rwPrice[i] < self.ichimoku.SenkouB.Current.Value: self.isThereShadow = True break i += 1 # if no shadow if not self.isThereShadow: # is tenkan higher than kijun? if self.ichimoku.Tenkan.Current.Value >= self.ichimoku.Kijun.Current.Value: # is tenkan is moving up? if self.ichimoku.Tenkan.Current.Value > self.rwTenkan[1]: # is future cloud is green (preferebly thick) if self.SenkouACal > self.SenkouBCal: #if not invested buy 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 # if chikou touches price, sell. or stop is hit (kijun is hit) # if chikou is lower than current price # if price 26 days ago is higher than now. chikouCurrent = self.lastClose # or self.lastClose < self.ichimoku.Kijun.Current.Value #self.rwPrice[25] <= chikouCurrent: #if self.ichimoku.Kijun.Current.Value: #if < self.ichimoku.Kijun.Current.Value * 0.98: if self.lastClose < self.ichimoku.Kijun.Current.Value: if self.Portfolio.Invested: self.Liquidate() self.Plot("ichimokuPlot", "Sell", self.lastClose)