| Overall Statistics |
|
Total Trades 92 Average Win 2.70% Average Loss -1.12% Compounding Annual Return 0.416% Drawdown 25.100% Expectancy 0.553 Net Profit 0.165% Sharpe Ratio 0.158 Probabilistic Sharpe Ratio 26.093% Loss Rate 55% Win Rate 45% Profit-Loss Ratio 2.42 Alpha 0.069 Beta 0.305 Annual Standard Deviation 0.279 Annual Variance 0.078 Information Ratio 0.245 Tracking Error 0.519 Treynor Ratio 0.144 Total Fees $3015.20 Estimated Strategy Capacity $430000.00 Lowest Capacity Asset BTCUSD XJ |
from System.Drawing import Color
class TestAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021,4,1)
self.SetEndDate(2021,8,23)
self.SetCash("BTC", 1)
self.btc = self.AddCrypto("BTCUSD", Resolution.Hour, Market.GDAX).Symbol
self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash)
self.SetBenchmark("BTCUSD")
self.entryTicket = None
self.SetWarmUp(25)
self.smafast = self.SMA("BTCUSD", 9, Resolution.Daily)
self.smaslow = self.SMA("BTCUSD", 25, Resolution.Daily)
self.rsi = self.RSI("BTCUSD", 25, Resolution.Hour)
stockPlot = Chart("Trade Plot")
stockPlot.AddSeries(Series('Buy', SeriesType.Scatter, '$',
Color.Green, ScatterMarkerSymbol.Triangle))
stockPlot.AddSeries(Series('Buy 2', SeriesType.Scatter, '$',
Color.Black, ScatterMarkerSymbol.Triangle))
stockPlot.AddSeries(Series('Buy 3', SeriesType.Scatter, '$',
Color.Cyan, ScatterMarkerSymbol.Triangle))
stockPlot.AddSeries(Series('Sell', SeriesType.Scatter, '$',
Color.Red, ScatterMarkerSymbol.TriangleDown))
stockPlot.AddSeries(Series('Liquidate Signal', SeriesType.Scatter, '$',
Color.Blue, ScatterMarkerSymbol.Diamond))
stockPlot.AddSeries(Series('Liquidate Trend', SeriesType.Scatter, '$',
Color.Pink, ScatterMarkerSymbol.Diamond))
stockPlot.AddSeries(Series('Price', SeriesType.Line, 0))
stockPlot.AddSeries(Series('smafast', SeriesType.Line, 1))
stockPlot.AddSeries(Series('smaslow', SeriesType.Line, 1))
stockPlot.AddSeries(Series('rsi', SeriesType.Line, 2))
self.AddChart(stockPlot)
def OnData(self, data):
if self.IsWarmingUp: return
price = self.Securities["BTCUSD"].Price
tolerance = 0.00015
self.Plot("Trade Plot", "Price", price)
self.Plot("Trade Plot", "smafast", self.smafast.Current.Value)
self.Plot("Trade Plot", "smaslow", self.smaslow.Current.Value)
self.Plot("Trade Plot", "rsi", self.rsi.Current.Value)
self.trendup = self.smafast.Current.Value > self.smaslow.Current.Value *(1 + tolerance)
self.trenddown = self.smafast.Current.Value < self.smaslow.Current.Value
#Long Signal
if self.trendup == True and self.rsi.Current.Value < 25 and not self.Portfolio["BTCUSD"].IsLong:
self.entryTicket = self.MarketOrder("BTCUSD", 0.1, False, "Long One")
self.Debug("Market Order Fill Price: {0}".format(self.entryTicket.AverageFillPrice))
self.Plot("Trade Plot", "Buy", price)
#self.Log("BUY >> {0}".format(self.Securities["BTCUSD"].Price))
#Liquidate Signal
if self.Portfolio["BTCUSD"].IsLong and self.trendup == True and self.rsi.Current.Value > 60:
self.Liquidate()
self.Plot("Trade Plot", "Liquidate Signal", price)
#Liquidate Trend
if self.Portfolio["BTCUSD"].IsLong and self.trendup == False:
self.Liquidate()
self.Plot("Trade Plot", "Liquidate Trend", price)
#Short Signal
...
def OnOrderEvent(self, orderEvent):
price = self.Securities["BTCUSD"].Price
#order = self.Transactions.GetOrderById(orderEvent.OrderId)
if self.entryTicket is not None and orderEvent.Status == OrderStatus.Filled:
if self.Securities["BTCUSD"].Price < self.entryTicket.AverageFillPrice:
if self.trendup == True and self.rsi.Current.Value < 25:
self.entryTicket2 = self.MarketOrder("BTCUSD", 0.2, False, "Long Two")
#self.Debug("Market Order Fill Price: {0}".format(self.entryTicket.AverageFillPrice))
self.Plot("Trade Plot", "Buy 2", price)
self.Log("BUY >> {0}".format(self.Securities["BTCUSD"].Price))
#self.entryTicket2 = None