Overall Statistics
Total Trades
78
Average Win
68.67%
Average Loss
-5.12%
Compounding Annual Return
361.684%
Drawdown
62.100%
Expectancy
7.137
Net Profit
318638.549%
Sharpe Ratio
3.879
Probabilistic Sharpe Ratio
99.669%
Loss Rate
44%
Win Rate
56%
Profit-Loss Ratio
13.42
Alpha
2.072
Beta
0.413
Annual Standard Deviation
0.656
Annual Variance
0.43
Information Ratio
1.96
Tracking Error
0.714
Treynor Ratio
6.159
Total Fees
$0.00
Estimated Strategy Capacity
$21000000.00
Lowest Capacity Asset
ETHUSD XJ
class CalmAsparagusJackal(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2016, 10, 21)
  
        self.SetCash(202)
        self.SetBenchmark(SecurityType.Crypto, "BTCUSD")
        self.AddCrypto("BTCUSD", Resolution.Daily)
        self.AddCrypto("ETHUSD", Resolution.Daily)
        self.btcma = self.EMA("BTCUSD", 2, Resolution.Daily)
        self.mama = self.EMA("ETHUSD", 2, Resolution.Daily)
        self.baseline = self.ALMA("BTCUSD", 200, Resolution.Daily)
        self.btcma.Updated += self.btcmaUpdated
        self.btcWin = RollingWindow[IndicatorDataPoint](50)
        self.mama.Updated += self.mamaUpdated
        self.mamaWin = RollingWindow[IndicatorDataPoint](50)
        self.action = False
        self.SetWarmUp(200, Resolution.Daily)
        
    def btcmaUpdated(self, sender, updated):
        self.btcWin.Add(updated)
        
    def mamaUpdated(self, sender, updated):
        self.mamaWin.Add(updated)
        
    def OnData(self, data):
        
        if not self.baseline.IsReady:
            return
        
        bp1 = self.btcWin[49].Value
        bp2 = self.btcWin[0].Value
        mp1 = self.mamaWin[49].Value
        mp2 = self.mamaWin[0].Value
        
        btc_pct = ((bp2 - bp1)/bp1)
        eth_pct = ((mp2 - mp1)/mp1)
        dif_1 = eth_pct - btc_pct
        dif_2 = btc_pct - eth_pct
        
        if self.Portfolio["BTCUSD"].Quantity == 0 and self.Portfolio["ETHUSD"].Quantity == 0:
            if self.Securities["BTCUSD"].Close > self.baseline.Current.Value*1.01:
                if dif_1 >= .01:
                    self.SetHoldings("ETHUSD", 1)
                elif dif_2 >= .01:
                    self.SetHoldings("BTCUSD", 1)
                else: return
            else: return
        else:
            if self.Securities["BTCUSD"].Close > self.baseline.Current.Value:
                if dif_1 >= .05:
                    limitPrice = round(self.Securities["BTCUSD"].Price * 1.01, 2)
                    quantity = self.Portfolio.CashBook["BTC"].Amount
                    self.MarketOrder("BTCUSD", -quantity)
                elif dif_2 >= .05:
                    limitPrice = round(self.Securities["ETHUSD"].Price * 1.01, 2)
                    quantity = self.Portfolio.CashBook["ETH"].Amount
                    self.MarketOrder("ETHUSD", -quantity)
                else: return
            else:
                quantitye = self.Portfolio.CashBook["ETH"].Amount
                self.MarketOrder("ETHUSD", -quantitye)
                quantityb = self.Portfolio.CashBook["BTC"].Amount
                self.MarketOrder("BTCUSD", -quantityb)