Overall Statistics |
Total Trades 209 Average Win 1.41% Average Loss -0.61% Compounding Annual Return 8077.096% Drawdown 10.600% Expectancy 1.148 Net Profit 103.779% Sharpe Ratio 7.35 Loss Rate 36% Win Rate 64% Profit-Loss Ratio 2.33 Alpha 0.319 Beta 204.372 Annual Standard Deviation 0.421 Annual Variance 0.177 Information Ratio 7.318 Tracking Error 0.421 Treynor Ratio 0.015 Total Fees $0.00 |
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.SetStartDate(2018,1,1) #Set Start Date self.SetEndDate(2018,2,28) #Set End Date self.SetCash(100000) #Set Strategy Cash # Find more symbols here: http://quantconnect.com/data self.AddCrypto("BTCUSD", Resolution.Hour) # 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); # Make sure you're not chasing self.longchase = 1; self.shortchase = 1; def OnData(self, data): #If the 10EMA is ready and the 5EMA is below the 10EMA, we can set #self.longchase = 0 so we know we're not chasing a trend that started #before the algorithm did if self.fast.Current.Value < self.slow.Current.Value and self.slow.IsReady: self.longchase = 0 #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; if self.Portfolio["BTCUSD"].Quantity == 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.longchase == 0: #If we're not chasing 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 self.Debug("LONG "+str(confidence)+" position >> {0}".format(self.Securities["BTCUSD"].Price)) self.SetHoldings("BTCUSD", confidence) #Then initiate a position whose size corresponds to the number of EMAs price is above if self.Portfolio["BTCUSD"].Quantity > 0 and self.Securities["BTCUSD"].Price < self.fast.Current.Value: #If we have a position and price is below the fast EMA self.Debug("SELL >> {0}".format(self.Securities["BTCUSD"].Price)) self.Liquidate("BTCUSD") #Then sell all