Overall Statistics
Total Trades
308
Average Win
1.64%
Average Loss
-0.79%
Compounding Annual Return
5510.265%
Drawdown
23.000%
Expectancy
0.841
Net Profit
170.679%
Sharpe Ratio
6.101
Loss Rate
40%
Win Rate
60%
Profit-Loss Ratio
2.08
Alpha
0
Beta
208.535
Annual Standard Deviation
0.467
Annual Variance
0.218
Information Ratio
6.072
Tracking Error
0.467
Treynor Ratio
0.014
Total Fees
$77065.18
import clr
clr.AddReference("System")
clr.AddReference("QuantConnect.Algorithm")
clr.AddReference("QuantConnect.Indicators")
clr.AddReference("QuantConnect.Common")

from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
import decimal as d

class MovingCrossAlgorithm(QCAlgorithm):
    '''Basic template algorithm simply initializes the date range and cash'''

    def Initialize(self):
        '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
        
        self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash)
        self.SetStartDate(2018,1,1)  # Set Start Date
        self.SetEndDate(2018,3,23)   # Set End Date
        self.SetCash(100000)         # Set Strategy Cash
        # Find more symbols here: http://quantconnect.com/data
        self.AddCrypto("BTCUSD", Resolution.Hour)
        self.SetWarmUp(200) #Warm up 200 bars for all subscribed data.
        
        # Set EMAs
        # These will be used for buy / sell signals
        self.fast = self.EMA("BTCUSD", 5, Resolution.Hour);
        self.slow = self.EMA("BTCUSD", 10, Resolution.Hour);
        
        # These will be used to indicate size of position
        self.twentyema = self.EMA("BTCUSD", 20, Resolution.Hour);
        self.fiftyema = self.EMA("BTCUSD", 50, Resolution.Hour);
        self.onehundredema = self.EMA("BTCUSD", 100, Resolution.Hour);
        self.twohundredema = self.EMA("BTCUSD", 200, Resolution.Hour);

        
    def OnData(self, data):
        
        # If the 10EMA is not ready, don't do anything else
        if not self.slow.IsReady:
            return
        
        # define a small tolerance on our checks to avoid bouncing
        tolerance = 0.00015;
        
        # define confidence for position size
        confidence = 0;
        
        #Debug data
        self.Debug("Current Position "+str(self.Portfolio.CashBook["BTC"].Amount)+" BTC")
        self.Debug("The price is now $"+str(self.Securities["BTCUSD"].Price))
        self.Debug("5EMA: "+str(self.fast.Current.Value))
        self.Debug("10EMA: "+str(self.slow.Current.Value))
        self.Debug("10EMA adjusted: "+str(self.slow.Current.Value * d.Decimal(1 + tolerance)))
        self.Debug("20EMA: "+str(self.twentyema.Current.Value))
        self.Debug("50EMA: "+str(self.fiftyema.Current.Value))
        self.Debug("100EMA: "+str(self.onehundredema.Current.Value))
        self.Debug("200EMA: "+str(self.twohundredema.Current.Value))
        
        if self.Portfolio.CashBook["BTC"].Amount == 0: # If we have no position currently
            if self.fast.Current.Value > self.slow.Current.Value * d.Decimal(1 + tolerance): # If the fast EMA is above the slow EMA
                if self.Securities["BTCUSD"].Price > self.fast.Current.Value: # If the price is above the fast EMA
                        if self.Securities["BTCUSD"].Price > self.twentyema.Current.Value: # Increase position size if above the 20EMA
                            confidence += .25
                        if self.Securities["BTCUSD"].Price > self.fiftyema.Current.Value: # Increase position size if above the 50EMA
                            confidence += .25
                        if self.Securities["BTCUSD"].Price > self.onehundredema.Current.Value: # Increase position size if above the 100EMA
                            confidence += .25
                        if self.Securities["BTCUSD"].Price > self.twohundredema.Current.Value: # Increase position size if above the 200EMA
                            confidence += .25
                        if confidence > 0:
                            self.SetHoldings("BTCUSD", confidence) # Then initiate a position whose size corresponds to the number of EMAs price is above
                            self.Debug("Initiated a "+str(confidence)+" position")
                        
        if self.Portfolio.CashBook["BTC"].Amount > 0 and self.Securities["BTCUSD"].Price < self.fast.Current.Value: # If we have a position and price is below the fast EMA
            self.Liquidate("BTCUSD") # Then sell all
            self.Debug("LIQUIDATE")