Overall Statistics
Total Trades
159
Average Win
1.90%
Average Loss
-1.37%
Compounding Annual Return
150.300%
Drawdown
11.100%
Expectancy
0.418
Net Profit
52.466%
Sharpe Ratio
1.709
Loss Rate
41%
Win Rate
59%
Profit-Loss Ratio
1.38
Alpha
0
Beta
52.161
Annual Standard Deviation
0.419
Annual Variance
0.175
Information Ratio
1.676
Tracking Error
0.419
Treynor Ratio
0.014
Total Fees
$0.00
from datetime import datetime

class MACDNaiveBTCTrader(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2019,1,1)  #Set Start Date
        self.SetCash(1000000)        #Set Strategy Cash

        self.AddCrypto("BTCUSD", Resolution.Daily)
        self.Securities["BTCUSD"].SetDataNormalizationMode(DataNormalizationMode.Raw);

        # daily macd(12,26) with a 9 day signal
        self.__macd = self.MACD("BTCUSD", 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily)
        self.__previous = datetime.min
        self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal)
        self.PlotIndicator("BTCUSD", self.__macd.Fast, self.__macd.Slow)


    def OnData(self, data):
        # wait for macd to initialize
        if not self.__macd.IsReady: return

        # only once per day
        if self.__previous.date() == self.Time.date(): return

        # small tolerance to avoid bouncing
        tolerance = 0.0001;

        # get holdings amount
        holdings = self.Portfolio["BTCUSD"].Quantity

        # calculate signal delta
        signalDeltaPercent = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)/self.__macd.Fast.Current.Value

        # if no holdings and macd is greater than signal, then go long (90% of equity)
        if holdings <= 0 and abs(signalDeltaPercent) > tolerance:
            self.SetHoldings("BTCUSD", 0.9)

        # if some holdings are here and macd is greater than signal, then liquidate
        elif holdings > 0 and abs(signalDeltaPercent) > tolerance:
            self.Liquidate("BTCUSD")

        # run once per day
        self.__previous = self.Time