| Overall Statistics |
|
Total Trades 383 Average Win 0.37% Average Loss -0.16% Compounding Annual Return 281.134% Drawdown 6.800% Expectancy 1.960 Net Profit 94.720% Sharpe Ratio 7.14 Probabilistic Sharpe Ratio 99.943% Loss Rate 11% Win Rate 89% Profit-Loss Ratio 2.32 Alpha 1.58 Beta -0.026 Annual Standard Deviation 0.221 Annual Variance 0.049 Information Ratio 6.323 Tracking Error 0.229 Treynor Ratio -60.962 Total Fees $67.09 |
class EMACrossoverCrypto(QCAlgorithm):
def Initialize(self):
#Set our main strategy parameters
self.SetStartDate(2017,1, 1)
self.SetEndDate(2017,6,30)
self.SetCash(5000)
self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash)
self.crypto = [
self.AddCrypto("BTCUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("ETHUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("LTCUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("EOSUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("ETCUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("XLMUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("XRPUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("XTZUSD", Resolution.Daily, Market.GDAX).Symbol,
self.AddCrypto("ZRXUSD", Resolution.Daily, Market.GDAX).Symbol,
]
ema_fast_period = 8
ema_medium_period = 21
ema_slow_period = 200
self.allocate = 0.1
self.emafast = {}
self.emamedium = {}
self.emaslow = {}
for symbol in self.crypto:
self.emafast[symbol] = self.EMA(symbol, ema_fast_period)
self.emamedium[symbol] = self.EMA(symbol,ema_medium_period)
self.emaslow[symbol] = self.EMA(symbol, ema_slow_period)
#Ensure that the indicator has enough data before trading
self.SetWarmUp(ema_slow_period)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the asset data
'''
#Ensure indicators are warmed up
if self.IsWarmingUp:
return
pass
for symbol in self.crypto:
if self.emafast[symbol].IsReady and self.emamedium[symbol].IsReady and self.emaslow[symbol].IsReady:
if self.emamedium [symbol] > self.emaslow[symbol]:
if self.emafast[symbol] > self.emamedium[symbol]:
self.SetHoldings(symbol, self.allocate)
elif self.emafast[symbol] < self.emamedium[symbol]:
self.Liquidate(symbol)