Overall Statistics
Total Trades
28
Average Win
20.43%
Average Loss
-4.62%
Compounding Annual Return
6.098%
Drawdown
36.700%
Expectancy
0.807
Net Profit
98.321%
Sharpe Ratio
0.392
Probabilistic Sharpe Ratio
1.657%
Loss Rate
67%
Win Rate
33%
Profit-Loss Ratio
4.42
Alpha
0.101
Beta
-0.067
Annual Standard Deviation
0.225
Annual Variance
0.051
Information Ratio
-0.309
Tracking Error
0.356
Treynor Ratio
-1.325
Total Fees
$1252.51
Estimated Strategy Capacity
$560000.00
Lowest Capacity Asset
XHB TFYQNA7D69UT
class JumpingBrownCat(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)
        self.SetWarmup(90)
        
        self.SetBenchmark("XHB")
        
        periods = (30, 90)
        
        self.trade = SymbolData(self, self.AddEquity("XHB").Symbol, periods)
        self.indicator = SymbolData(self, self.AddEquity("WOOD").Symbol, periods)

    def OnData(self, data):
        if not self.indicator.is_ready():
            return
        
        if self.indicator.short_ema.Current.Value > self.indicator.long_ema.Current.Value:
            # long
            if self.Portfolio[self.trade.symbol].IsShort or not self.Portfolio.Invested:
                self.SetHoldings(self.trade.symbol, 1)
        elif self.indicator.short_ema.Current.Value < self.indicator.long_ema.Current.Value:
            # short
            if self.Portfolio[self.trade.symbol].IsLong or not self.Portfolio.Invested:
                self.SetHoldings(self.trade.symbol, -1)

class SymbolData:
    
    def __init__(self, algorithm, symbol, periods):
        self.symbol = symbol
        self.short_ema = algorithm.EMA(self.symbol, periods[0], Resolution.Daily)
        self.long_ema = algorithm.EMA(self.symbol, periods[1], Resolution.Daily)
    
    def is_ready(self):
        return self.short_ema.IsReady and self.long_ema.IsReady