Overall Statistics |
Total Trades 11 Average Win 38.70% Average Loss -2.95% Compounding Annual Return 40.244% Drawdown 24.400% Expectancy 7.477 Net Profit 139.810% Sharpe Ratio 1.179 Sortino Ratio 1.172 Probabilistic Sharpe Ratio 53.729% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 13.13 Alpha 0.196 Beta 0.526 Annual Standard Deviation 0.254 Annual Variance 0.064 Information Ratio 0.43 Tracking Error 0.241 Treynor Ratio 0.569 Total Fees $145.46 Estimated Strategy Capacity $79000000.00 Lowest Capacity Asset XON R735QTJ8XC9X Portfolio Turnover 1.18% |
# region imports from AlgorithmImports import * # endregion class DonchianChannelBreakoutAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetEndDate(2022, 8, 1) self.SetCash(100000) self.symbol = self.AddEquity("XOM", Resolution.Daily).Symbol self.EnableAutomaticIndicatorWarmUp = True self.indicator = self.DCH(self.symbol, 20, 20) self.SetBenchmark(self.symbol) self.DCH_previous_Up = None self.DCH_previous_Down = None self.can_short = False def OnData(self, data: Slice): if self.symbol not in data.Bars: return bar = data.Bars[self.symbol] if self.DCH_previous_Up is not None and self.DCH_previous_Down is not None: if bar.Close > self.DCH_previous_Up and not self.Portfolio[self.symbol].IsLong: self.SetHoldings(self.symbol, 1) if bar.Close <= self.DCH_previous_Down: if self.can_short and not self.Portfolio[self.symbol].IsShort: self.SetHoldings(self.symbol, -1) if not self.can_short and self.Portfolio[self.symbol].IsLong: self.SetHoldings(self.symbol, 0) self.DCH_previous_Up = self.indicator.UpperBand.Current.Value self.DCH_previous_Down = self.indicator.LowerBand.Current.Value # Plot indicator and prices self.Plot("Custom", "Donchian Channel High", self.DCH_previous_Up) self.Plot("Custom", "High Price", bar.High) self.Plot("Custom", "Close Price", bar.Close) self.Plot("Custom", "Low Price", bar.Low) self.Plot("Custom", "Donchian Channel Low", self.DCH_previous_Down)