| Overall Statistics |
|
Total Trades 15 Average Win 0% Average Loss -3.45% Compounding Annual Return -72.043% Drawdown 70.600% Expectancy -1 Net Profit -65.482% Sharpe Ratio -0.885 Probabilistic Sharpe Ratio 0.542% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.009 Beta -2.45 Annual Standard Deviation 0.575 Annual Variance 0.33 Information Ratio -1.134 Tracking Error 0.628 Treynor Ratio 0.208 Total Fees $15.00 Estimated Strategy Capacity $52000000.00 Lowest Capacity Asset TSLA UNU3P8Y3WFAD |
class FatBrownBison(QCAlgorithm):
def Initialize(self):
self.cash = 100000
self.ticker = "TSLA"
self.tp = 0.02
self.risk = 0.01
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2021, 11, 1)
self.SetCash(self.cash)
self.AddEquity(self.ticker, Resolution.Minute)
#indicators and rolling windows
self.emaFast = self.EMA(self.ticker, 12)
self.emaFast.Updated += self.FastEmaUpdated
self.fastWin = RollingWindow[IndicatorDataPoint](5)
self.emaSlow = self.EMA(self.ticker, 26)
self.emaSlow.Updated += self.SlowEmaUpdated
self.slowWin = RollingWindow[IndicatorDataPoint](5)
self.SetWarmUp(31)
#self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.005))
def OnData(self, data):
if self.IsWarmingUp or not self.emaFast.IsReady or not self.emaSlow.IsReady or not self.fastWin.IsReady or not self.slowWin.IsReady: return
currSlowEMA = self.slowWin[0]
prevSlowEMA = self.slowWin[1]
currFastEMA = self.fastWin[0]
prevFastEMA = self.fastWin[1]
if not self.Portfolio.Invested:
#short logic w/ stop loss
if prevFastEMA.Value > prevSlowEMA.Value and currFastEMA.Value < currSlowEMA.Value:
self.SetHoldings(self.ticker, -1)
self.StopMarketOrder(self.ticker, self.Portfolio[self.ticker].Quantity, self.Portfolio[self.ticker].Price * (1 - self.tp))
#long logic w/ stop loss
elif prevFastEMA.Value < prevSlowEMA.Value and currFastEMA.Value > currSlowEMA.Value:
self.SetHoldings(self.ticker, 1)
self.StopMarketOrder(self.ticker, -self.Portfolio[self.ticker].Quantity, self.Portfolio[self.ticker].Price * (1 + self.tp))
#short take profit logic
elif self.Portfolio[self.ticker].IsShort:
if self.Securities[self.ticker].Price <= (self.Portfolio[self.ticker].Price * (1 - self.tp)):
self.Transactions.CancelOpenOrders()
self.Liquidate()
#long take profit logic
elif self.Portfolio[self.ticker].IsLong:
if self.Securities[self.ticker].Price >= (self.Portfolio[self.ticker].Price * (1 + self.tp)):
self.Transactions.CancelOpenOrders()
self.Liquidate()
def FastEmaUpdated(self, sender, updated):
self.fastWin.Add(updated)
def SlowEmaUpdated(self, sender, updated):
self.slowWin.Add(updated)