Overall Statistics |
Total Trades 659 Average Win 3.11% Average Loss -1.80% Compounding Annual Return 93.879% Drawdown 28.600% Expectancy 0.669 Net Profit 3280.641% Sharpe Ratio 2.471 Probabilistic Sharpe Ratio 99.597% Loss Rate 39% Win Rate 61% Profit-Loss Ratio 1.73 Alpha 0.824 Beta -0.122 Annual Standard Deviation 0.329 Annual Variance 0.108 Information Ratio 1.93 Tracking Error 0.379 Treynor Ratio -6.663 Total Fees $660.08 |
### <summary> ### Simple RSI Strategy intended to provide a minimal algorithm example using ### one indicator ### </summary> from System.Drawing import Color class RSIAlgorithm(QCAlgorithm): # Order ticket for our stop order, Datetime when stop order was last hit stopMarketTicket = None stopMarketOrderFillTime = datetime.min highestSPYPrice = 0 def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' # Set our main strategy parameters self.SetStartDate(2015,1, 1) # Set Start Date self.SetEndDate(2020,4,25) # Set End Date self.SetCash(10000) # Set Strategy Cash self.Equities = ["AMZN"] # self.AddEquity("AMZN").Symbol # self.Securities["AMZN"].SetLeverage(2.0) self.HK = dict() # Create dict to hold all our HK Indicators for Equity in self.Equities: # Find more symbols here: http://quantconnect.com/data self.AddEquity(Equity, Resolution.Daily) self.HK[Equity] = self.HeikinAshi(Equity, Resolution.Daily) # Plotting Suggestion 1: Line chart # -------------------------------------- # Note: This has been commented out as # we are limited to 10 series per # backtest. To test, uncomment the # lines below and then comment out # either suggestion 3 or 4. # --------------------------------------- #self.PlotIndicator( # Equity + " - Line", # self.HK[Equity].Open, # self.HK[Equity].High, # self.HK[Equity].Low, # self.HK[Equity].Close # ) # Plotting Suggestion 2: Candle Chart # --------------------------------------- CandChart = Chart(Equity + "- Candle", ChartType.Stacked) CandChart.AddSeries(Series('Heikinashi', SeriesType.Candle)) self.AddChart(CandChart) # Plotting Suggestion 3: Scatter Chart # --------------------------------------- ScatPlot = Chart(Equity + "- X", ChartType.Stacked) ScatPlot.AddSeries(Series('Open', SeriesType.Scatter, '$', Color.Black, ScatterMarkerSymbol.Circle)) ScatPlot.AddSeries(Series('High', SeriesType.Scatter, '$', Color.Green, ScatterMarkerSymbol.Triangle)) ScatPlot.AddSeries(Series('Low', SeriesType.Scatter, '$', Color.Red, ScatterMarkerSymbol.TriangleDown)) ScatPlot.AddSeries(Series('Close', SeriesType.Scatter, '$', Color.Black, ScatterMarkerSymbol.Square)) self.AddChart(ScatPlot) # Plotting Suggestion 4: Mixed # --------------------------------------- SAPlot = Chart(Equity + "- Mix", ChartType.Stacked) SAPlot.AddSeries(Series('Price', SeriesType.Line, "$", Color.Black)) SAPlot.AddSeries(Series('Bullish', SeriesType.Scatter, "$", Color.Green, ScatterMarkerSymbol.Circle)) SAPlot.AddSeries(Series('Bearish', SeriesType.Scatter, "$", Color.Red, ScatterMarkerSymbol.Circle)) SAPlot.AddSeries(Series('Neutral', SeriesType.Scatter, "$", Color.Black, ScatterMarkerSymbol.Circle)) SAPlot.AddSeries(Series('High', SeriesType.Scatter, '$', Color.Black, ScatterMarkerSymbol.Triangle)) SAPlot.AddSeries(Series('Low', SeriesType.Scatter, '$', Color.Black, ScatterMarkerSymbol.TriangleDown)) self.AddChart(SAPlot) def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' for Equity in self.Equities: # Aliases # ----------------------------------------------------------------- # Heikin HK_O = self.HK[Equity].Open.Current.Value HK_H = self.HK[Equity].High.Current.Value HK_L = self.HK[Equity].Low.Current.Value HK_C = self.HK[Equity].Close.Current.Value HK_P = self.HK[Equity].Current.Price # OHLC O = data[Equity].Open H = data[Equity].High L = data[Equity].Low C = data[Equity].Close P = data[Equity].Price # ----------------------------------------------------------------- # Work out Heikin Sentiment # --------------------------------------- if HK_O < HK_C: HK_S = "Bull" elif HK_O > HK_C: HK_S = "Bear" else: HK_S = "Neut" # Plotting Option 2: Candle Chart # --------------------------------------- self.Plot(Equity + "- Candle", 'Heikinashi', HK_P) # Plotting Option 3: Scatter Chart # --------------------------------------- self.Plot(Equity + "- X", 'Open', HK_O) self.Plot(Equity + "- X", 'High', HK_H) self.Plot(Equity + "- X", 'Low', HK_L) self.Plot(Equity + "- X", 'Close', HK_C) # Plotting Option 4: Mixed # --------------------------------------- self.Plot(Equity + "- Mix", 'Price', HK_P) self.Plot(Equity + "- Mix", 'High', HK_H) self.Plot(Equity + "- Mix", 'Low', HK_L) if HK_S == "Bull": self.Plot(Equity + "- Mix", 'Bullish', HK_P) elif HK_S == "Bear": self.Plot(Equity + "- Mix", 'Bearish', HK_P) else: self.Plot(Equity + "- Mix", 'Neutral', HK_P) # Logging # ----------------------------------------------------------------- self.Log("{0} OHLC >> O: {1} H: {2} L:{3}, C:{4} | Price: {5}".format(Equity, O,H,L,C,P)) self.Log("{0} Heikin >> O: {1} H: {2} L:{3}, C:{4} | Price: {5} | Sentiment: {6}".format(Equity, HK_O,HK_H,HK_L,HK_C,HK_P,HK_S)) # Entry / Exit Criteria # ----------------------------------------------------------------- if (self.Time - self.stopMarketOrderFillTime).days < 150: return # Check if we are in the market if not self.Portfolio.Invested: # If not, we check HK sentiment is bullish if HK_S == "Bull": self.SetHoldings(Equity, 1) # self.stopMarketTicket = self.StopMarketOrder(Equity, -0.5, 0.97 * self.Securities[Equity].Close) else: #1. Check if the SPY price is higher that highestSPYPrice. # if self.Securities['AMZN'].Close > self.highestSPYPrice: # #2. Save the new high to highestSPYPrice; then update the stop price to 90% of highestSPYPrice # self.highestSPYPrice = self.Securities['AMZN'].Close # updateFields = UpdateOrderFields() # updateFields.StopPrice = self.Securities['AMZN'].Close * 0.50 # self.stopMarketTicket.Update(updateFields) if HK_S == "Bear": self.Liquidate(Equity) def OnOrderEvent(self, orderEvent): if orderEvent.Direction == 1: self.StopMarketOrder(orderEvent.Symbol, -orderEvent.FillQuantity, 0.95 * self.Securities[orderEvent.Symbol].Close) # else: # self.StopMarketOrder(orderEvent.Symbol, orderEvent.FillQuantity, 0.97 * self.Securities[orderEvent.Symbol].Close) if orderEvent.Status != OrderStatus.Filled: return if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId: self.Debug("NUMBER OF SHARES ->>>" + str(orderEvent.FillQuantity)) self.stopMarketOrderFillTime = self.Time