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)