Overall Statistics |
Total Trades 7 Average Win 42.76% Average Loss -6.79% Compounding Annual Return 42.552% Drawdown 20.300% Expectancy 1.433 Net Profit 42.552% Sharpe Ratio 1.505 Probabilistic Sharpe Ratio 61.693% Loss Rate 67% Win Rate 33% Profit-Loss Ratio 6.30 Alpha 0.387 Beta -0.02 Annual Standard Deviation 0.255 Annual Variance 0.065 Information Ratio 0.462 Tracking Error 0.401 Treynor Ratio -19.63 Total Fees $17.50 Estimated Strategy Capacity $420000000.00 |
class BCTask_BuyHoldTrailStop(QCAlgorithm): # Order ticket for our stop order, Datetime when stop order was last hit stopMarketTicket = None stopMarketOrderFillTime = datetime.min highestSPYPrice = -1 def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetEndDate(2020, 12, 30) self.SetCash(100000) spy = self.AddEquity("SPY", Resolution.Daily) spy.SetDataNormalizationMode(DataNormalizationMode.Raw) def OnData(self, data): # 1. Plot the current SPY price to "Data Chart" on series "Asset Price" self.Plot("Data Chart", "Asset Price", data["SPY"].Close) if (self.Time - self.stopMarketOrderFillTime).days < 15: return if not self.Portfolio.Invested: self.MarketOrder("SPY", 500) self.stopMarketTicket = self.StopMarketOrder("SPY", -500, 0.9 * self.Securities["SPY"].Close) else: #2. Plot the moving stop price on "Data Chart" with "Stop Price" series name self.Plot("Data Chart", "Stop Price", self.stopMarketTicket.Get(OrderField.StopPrice)) if self.Securities["SPY"].Close > self.highestSPYPrice: self.highestSPYPrice = self.Securities["SPY"].Close updateFields = UpdateOrderFields() updateFields.StopPrice = self.highestSPYPrice * 0.9 self.stopMarketTicket.Update(updateFields) def OnOrderEvent(self, orderEvent): if orderEvent.Status != OrderStatus.Filled: return if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId: self.stopMarketOrderFillTime = self.Time