| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -4.677 Tracking Error 0.605 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 |
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Brokerages import *
from QuantConnect.Orders import *
class BasicTemplateCryptoAlgorithm(QCAlgorithm):
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._macd = {}
self._stoch = {}
self.SetStartDate(2020, 1, 1) #Set Start Date
self.SetEndDate(2021, 4, 1) #Set End Date
self.SetCash(1000)
# Set Strategy Cash (EUR)
# EUR/USD conversion rate will be updated dynamically
# self.SetCash("EUR", 10000)
# self.SetCash("BTC", 1)
# self.SetCash("ETH", 5)
self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash)
symbol = self.AddCrypto("BTCUSD", Resolution.Minute).Symbol
# self.AddCrypto("ETHUSD", Resolution.Minute)
# self.AddCrypto("BTCEUR", Resolution.Minute)
self.MACD(symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute).Histogram.Updated += self.MacdHistoUpdated
self.MACD(symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute).Updated += self.MacdUpdated
self.MACD(symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute).Signal.Updated += self.MacdSignalUpdated
self.macdHistogram = RollingWindow[IndicatorDataPoint](5)
self.Macd = RollingWindow[IndicatorDataPoint](5)
self.macdSignal = RollingWindow[IndicatorDataPoint](5)
self.STO(symbol, 14, Resolution.Minute).StochK.Updated += self.StochKUpdated
self.STO(symbol, 14, Resolution.Minute).StochD.Updated += self.StochDUpdated
self.stochk = RollingWindow[IndicatorDataPoint](5)
self.stochd = RollingWindow[IndicatorDataPoint](5)
self.SetWarmup(40, Resolution.Minute)
self.control = False
def MacdSignalUpdated(self, sender, updated):
self.macdSignal.Add(updated)
def MacdUpdated(self, sender, updated):
self.Macd.Add(updated)
def MacdHistoUpdated(self, sender, updated):
self.macdHistogram.Add(updated)
def StochKUpdated(self, sender, updated):
self.stochk.Add(updated)
def StochDUpdated(self, sender, updated):
self.stochd.Add(updated)
def OnData(self, data):
# if not (self._macd["Histogram"].IsReady and self._macd["MACD"].IsReady and self._macd["SIGNAL"].IsReady and self._stoch['StochK'].IsReady and self._stoch['StochD'].IsReady): return
# and self.macdSignal and self.Macd and self.macdHistogram
if not (self.IsWarmingUp and self.macdHistogram.IsReady):
return
if self.macdHistogram[0] < self.macdHistogram[1] and ((self.stochk[0] > self.stochd[0] and self.stochk[1] < self.stochd[1]) or self.stochk[0] > self.stochd[0]) and self.macdHistogram[0] < 0 and self.stochd[0] < 40 and self.control == False:
self.control = True
usdTotal = self.Portfolio.CashBook["USD"].Amount
limitPrice = round(self.Securities["BTCUSD"].Price * 0.95, 2)
# use only half of our total USD
quantity = usdTotal * 0.5 / limitPrice
self.MarketOrder("BTCUSD", quantity)
elif (self.macdSignal[0] > self.Macd[0] and self.macdSignal[1] < self.Macd[1])and self.control == True:
self.control = False
limitPrice = round(self.Securities["BTCUSD"].Price * 1.00, 2)
quantity = self.Portfolio.CashBook["BTC"].Amount
self.MarketOrder("BTCUSD", -quantity)
def OnOrderEvent(self, orderEvent):
self.Debug("{} {}".format(self.Time, orderEvent.ToString()))
def OnEndOfAlgorithm(self):
self.Log("{} - TotalPortfolioValue: {}".format(self.Time, self.Portfolio.TotalPortfolioValue))
self.Log("{} - CashBook: {}".format(self.Time, self.Portfolio.CashBook))