Overall Statistics |
Total Trades 70 Average Win 2.16% Average Loss -0.32% Compounding Annual Return 10.703% Drawdown 14.200% Expectancy 0.760 Net Profit 10.058% Sharpe Ratio 0.81 Probabilistic Sharpe Ratio 41.974% Loss Rate 77% Win Rate 23% Profit-Loss Ratio 6.70 Alpha 0.089 Beta -0.005 Annual Standard Deviation 0.11 Annual Variance 0.012 Information Ratio 0.422 Tracking Error 0.181 Treynor Ratio -16.923 Total Fees $175.00 |
class BootCampTask(QCAlgorithm): # Order ticket for our stop order, Datetime when stop order was last hit stopMarketTicket = None stopMarketOrderFillTime = datetime.min highestSPYPrice = -1 lowestSPYPrice = 9999999 stopLossTicket = None def Initialize(self): self.SetStartDate(2018, 1, 1) self.SetEndDate(2018, 12, 10) self.SetCash(100000) spy = self.AddEquity("SPY", Resolution.Minute) spy.SetDataNormalizationMode(DataNormalizationMode.Raw) def OnData(self, data): close = self.Securities["SPY"].Close if not self.Portfolio["SPY"].Invested: #placing your time restriction here ensures we can still update our Order Tickets if (self.Time - self.stopMarketOrderFillTime).days < 1: return #Our Entry Stop Market Order, We want to enter with only 1 trade if self.stopMarketTicket is None: self.stopMarketTicket = self.StopMarketOrder("SPY", 500, 1.002 * close) #As long as we are not filled in our entry order, we must update our stop entry price if necessary if self.Securities["SPY"].Close < self.lowestSPYPrice: self.lowestSPYPrice = close self.stopMarketTicket.UpdateStopPrice(self.lowestSPYPrice * 1.002) else: #If we have shares of SPY it means we have also opened a stop loss order in OnOrderEvent #so we must update our stop loss update to trail if close > self.highestSPYPrice: self.highestSPYPrice = close self.stopLossTicket.UpdateStopPrice(self.highestSPYPrice * 0.998) def OnOrderEvent(self, orderEvent): if orderEvent.Status != OrderStatus.Filled: return #if our market entry order is filled, we must open a stop loss if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId: self.stopMarketOrderFillTime = self.Time self.stopLossTicket = self.StopMarketOrder("SPY", -500, 0.998 * self.Securities["SPY"].Close) #if our stop loss is filled, we should reset our stopMarketTicket if self.stopLossTicket is not None and self.stopLossTicket.OrderId == orderEvent.OrderId: self.stopMarketTicket = None