| Overall Statistics |
|
Total Trades 7 Average Win 0% Average Loss 0% Compounding Annual Return 0.538% Drawdown 27.100% Expectancy 0 Net Profit 1.627% Sharpe Ratio 0.095 Probabilistic Sharpe Ratio 2.960% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.009 Beta 0.092 Annual Standard Deviation 0.132 Annual Variance 0.017 Information Ratio -0.13 Tracking Error 0.204 Treynor Ratio 0.136 Total Fees $0.00 |
class CryptoRaptor(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 4, 1) # Set Start Date
self.SetEndDate(2020, 4, 1)
self.SetCash(100000) # Set Strategy Cash
self.short_period = 12
self.long_period = 21
self.stopLossPercent = 0.05
self.ticket_per_symbol = {}
self.rsi_per_symbol = {}
self.short_ema_per_symbol = {}
self.long_ema_per_symbol = {}
self.buy_signal = 6.0
for ticker in ['BTCUSD', 'LTCUSD', 'EOSUSD', 'ETPUSD', 'TRXUSD', 'XTZUSD', 'VSYUSD']:
self.AddCrypto(ticker, Resolution.Hour, Market.Bitfinex)
#Add the RSI Indicator
rsi = self.RSI(ticker, self.short_period, MovingAverageType.Simple, Resolution.Daily)
self.rsi_per_symbol[ticker] = rsi
#Add the EMA Indicator
short_ema = self.EMA(ticker, self.short_period, Resolution.Daily)
self.short_ema_per_symbol[ticker] = short_ema
long_ema = self.EMA(ticker, self.short_period, Resolution.Daily)
self.long_ema_per_symbol[ticker] = long_ema
stockPlot = Chart('{0} Trade Plot'.format(ticker))
# On the Trade Plotter Chart we want 3 series: trades and price:
stockPlot.AddSeries(Series('Buy', SeriesType.Scatter, 0))
stockPlot.AddSeries(Series('EMA Short', SeriesType.Line, 0))
stockPlot.AddSeries(Series('EMA Long', SeriesType.Line, 0))
stockPlot.AddSeries(Series('Price', SeriesType.Line, 0))
self.AddChart(stockPlot)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Thursday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday), \
self.TimeRules.At(16, 0), \
Action(self.chart))
def chart(self):
for symbol in list(self.rsi_per_symbol.keys()):
close_price = self.Securities[symbol].Close
#Charting
self.Plot('{0} Trade Plot'.format(symbol), 'Price', close_price)
if symbol in self.short_ema_per_symbol:
ema = self.short_ema_per_symbol[symbol]
if ema.IsReady:
ema_value = ema.Current.Value
self.Plot('{0} Trade Plot'.format(symbol), 'EMA Short', ema_value)
if symbol in self.long_ema_per_symbol:
ema = self.long_ema_per_symbol[symbol]
if ema.IsReady:
ema_value = ema.Current.Value
self.Plot('{0} Trade Plot'.format(symbol), 'EMA Long', ema_value)
def OnOrderEvent(self, orderEvent):
order = self.Transactions.GetOrderById(orderEvent.OrderId)
if orderEvent.Status == OrderStatus.Filled:
self.Log("{0}: {1}: {2}".format(self.Time, order.Type, orderEvent))
def OnData(self, data):
for symbol in list(self.rsi_per_symbol.keys()):
open_price = self.Securities[symbol].Open
close_price = self.Securities[symbol].Close
if self.Portfolio[symbol].Invested:
self.UpdateBuy(symbol)
continue
if symbol in self.rsi_per_symbol:
rsi = self.rsi_per_symbol[symbol]
if rsi.IsReady:
# get the current RSI value
rsi_value = rsi.Current.Value
#self.Debug("Crypto Pair {0}: RSI: {1}".format(symbol, rsi_value))
if rsi_value > 0 and rsi_value < 30:
#self.Debug("RSI Buy Signal")
self.OpenBuy(symbol)
if symbol in self.short_ema_per_symbol:
ema = self.short_ema_per_symbol[symbol]
if ema.IsReady:
ema_value = ema.Current.Value
#self.Debug("Crypto Pair {0}: EMA: {1}".format(symbol, ema_value))
#self.Debug((100 - ((close_price / ema_value) * 100)))
if (100 - ((close_price / ema_value) * 100)) > self.buy_signal:
continue
#self.Debug("EMA Buy Signal")
#self.OpenBuy(symbol)
def OpenBuy(self, symbol):
# Calculate the fee adjusted quantity of shares with given buying power
target = (1 / len(self.rsi_per_symbol.keys())) * 0.1
quantity = self.CalculateOrderQuantity(symbol, target)
#Calculate the stop price
close_price = self.Securities[symbol].Close;
stop_price = round(close_price * (1 - self.stopLossPercent), 3)
self.Debug("Open Buy Order for {0} on {1}. SL: {2}".format(symbol, close_price, stop_price))
#self.Buy(symbol, quantity)
ticket = self.StopMarketOrder(symbol, quantity, stop_price)
self.ticket_per_symbol[symbol] = ticket
def UpdateBuy(self, symbol):
if symbol in self.ticket_per_symbol:
ticket = self.ticket_per_symbol[symbol]
close_price = self.Securities[symbol].Close
new_stop_price = round(close_price * (1 - self.stopLossPercent), 3)
old_stop_price = ticket.Get(OrderField.StopPrice)
if new_stop_price > old_stop_price:
self.Debug("try update")
updateSettings = UpdateOrderFields()
updateSettings.StopPrice = new_stop_price
updateSettings.Tag = "Stop Price updated"
response = ticket.Update(updateSettings)
if response.IsSuccess:
self.Debug("Stop Loss for {0} updated from {1} to {2}".format(symbol, old_stop_price, new_stop_price))