| Overall Statistics |
|
Total Trades 2235 Average Win 2.62% Average Loss -1.06% Compounding Annual Return 584.629% Drawdown 38.100% Expectancy 0.197 Net Profit 705.493% Sharpe Ratio 4.189 Probabilistic Sharpe Ratio 85.152% Loss Rate 65% Win Rate 35% Profit-Loss Ratio 2.46 Alpha 4.787 Beta 1.006 Annual Standard Deviation 1.177 Annual Variance 1.385 Information Ratio 4.087 Tracking Error 1.172 Treynor Ratio 4.898 Total Fees $0.00 Estimated Strategy Capacity $500000.00 Lowest Capacity Asset BTCUSD E3 |
from datetime import datetime, timedelta
class SimplePullBackStrategy(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1) # Set Start Date
self.InitCash = 10000
self.SetCash(self.InitCash)
self.profitTargetPercent = 0.02
self.trailingStopLossPercent = 0.01
btc = self.AddCrypto("BTCUSD", Resolution.Minute, Market.Bitfinex)
self.btc = btc.Symbol
self.SetWarmUp(14)
self.entryPrice = 0
self.period = timedelta(minutes=120)
self.nextEntryTime = self.Time
# relative strength index
self.rsi = self.RSI(self.btc, 14, MovingAverageType.Wilders, Resolution.Minute)
def OnData(self, data):
price = self.Securities[self.btc].Price
if not self.Portfolio.Invested:
if self.nextEntryTime <= self.Time and self.rsi.Current.Value < 30 and not self.IsWarmingUp:
self.SetHoldings(self.btc, 1, True)
qty = self.Portfolio[self.btc].Quantity
self.Log("Bought " + "{:.2f}".format(qty) + " BTC @" + str(int(price)))
self.entryPrice = price
elif self.entryPrice * (1 + self.profitTargetPercent) < price or self.entryPrice * (1 - self.trailingStopLossPercent) > price:
pnl = self.Portfolio.TotalUnrealisedProfit
qty = self.Portfolio[self.btc].Quantity
self.Liquidate()
self.Log("Sold " + "{:.2f}".format(qty) + " BTC @" + str(int(price)) + ' for a profit of ' + str(int(pnl)) )
self.nextEntryTime = self.Time + self.period