Overall Statistics |
Total Trades 2 Average Win 0% Average Loss -0.22% Compounding Annual Return 144.972% Drawdown 42.600% Expectancy -1 Net Profit 164.125% Sharpe Ratio 2.088 Probabilistic Sharpe Ratio 68.970% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 1.24 Beta 0.945 Annual Standard Deviation 0.558 Annual Variance 0.311 Information Ratio 2.348 Tracking Error 0.53 Treynor Ratio 1.233 Total Fees $2.41 Estimated Strategy Capacity $49000.00 Lowest Capacity Asset MPO WEZMX4KUKGV9 |
import numpy as np import clr clr.AddReference("System") clr.AddReference("QuantConnect.Algorithm") clr.AddReference("QuantConnect.Indicators") clr.AddReference("QuantConnect.Common") from AlgorithmImports import * from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * import decimal as d class QEMA(QCAlgorithm): openingBar = None currentBar = None def Initialize(self): self.SetTimeZone(TimeZones.NewYork) self.SetStartDate(2021, 9, 20) self.SetEndDate(2022, 10, 20) self.SetCash(1000) # Set Strategy Cash self.symbol = self.AddEquity("AMPY", Resolution.Minute, dataNormalizationMode=DataNormalizationMode.Raw).Symbol self.timedelta_consolidator = self.Consolidate(self.symbol, \ timedelta(minutes=(int(self.GetParameter("timeframe")))), self.OnDataConsolidated) self.entryTicket = None self.stopMarketTicket = None self.lookback = 1.0010 self.ceiling, self.floor = 1.0015, 1.0075 self.initialStopRisk = 0.95 self.trailingStopRisk = 0.99 self.fast = self.EMA(self.symbol, 9) self.RegisterIndicator(self.symbol, self.fast) self.mid = self.EMA(self.symbol, 21) self.RegisterIndicator(self.symbol, self.mid) self.slow = self.EMA(self.symbol, 55) self.RegisterIndicator(self.symbol, self.slow) self.vfast = self.EMA(self.symbol, 5) self.RegisterIndicator(self.symbol, self.vfast) self.SetWarmup(55) self.previous = None def OnData(self, data: Slice): if not self.slow.IsReady: return if self.previous is not None and self.previous.date() == self.Time.date(): return close = self.History(self.symbol, 201, Resolution.Daily)["close"] todayvol = np.std(close[1:201]) yesterdayvol = np.std(close[0:200]) deltavol = (todayvol - yesterdayvol) / todayvol self.lookback = round(self.lookback * (1 + deltavol)) # Account for upper/lower limit of lockback length if self.lookback > self.ceiling: self.lookback = self.ceiling elif self.lookback < self.floor: self.lookback = self.floor # hist = self.History(self.symbol, int(self.GetParameter("HighestPrice.delta")), Resolution.Minute) # self.breakoutlvl = max(hist["high"]) # self.highestPrice = self.breakoutlvl # define a small tolerance on our checks to avoid bouncing tolerance = float(1.0010) holdings = self.Portfolio[self.symbol].Quantity if holdings <= 0: # if the fast is greater than the slow, we'll go long if self.Securities[self.symbol].Price > self.fast.Current.Value and \ self.fast.Current.Value > self.mid.Current.Value * self.lookback and \ self.mid.Current.Value > self.slow.Current.Value * self.lookback: self.Log("BUY >> {0}".format(self.Securities[self.symbol].Close)) self.SetHoldings(self.symbol, 1) self.stopMarketTicket = self.StopMarketOrder(self.symbol, -1, self.initialStopRisk * self.Securities[self.symbol].Close, "Stop Loss") self.Plot("Data Chart", "Stop Price", self.stopMarketTicket) self.Plot("Benchmark", "Stock Price", self.Securities[self.symbol].Close) # we only want to liquidate if we're currently long # if the fast is less than the slow we'll liquidate our long if holdings > 0 and self.vfast.Current.Value == self.fast.Current.Value: # or \ # self.Portfolio.TotalUnrealisedProfit >= self.Portfolio.TotalPortfolioValue * 1.05: self.Log("SELL >> {0}".format(self.Securities[self.symbol].Price)) self.Liquidate(self.symbol, "Exit order") self.previous = self.Time def OnDataConsolidated(self, bar): self.currentBar = bar def OnOrderEvent(self, orderEvent): if orderEvent == OrderStatus.Filled: self.lastOrderEvent = orderEvent self.Debug(str(OrderId))