Overall Statistics |
Total Trades 7 Average Win 0% Average Loss 0% Compounding Annual Return 4.723% Drawdown 1.400% Expectancy 0 Net Profit 0.952% Sharpe Ratio 0.948 Probabilistic Sharpe Ratio 48.553% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.022 Beta 0.244 Annual Standard Deviation 0.035 Annual Variance 0.001 Information Ratio -1.886 Tracking Error 0.102 Treynor Ratio 0.137 Total Fees $7.00 Estimated Strategy Capacity $2700000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
# region imports from AlgorithmImports import * import pandas as pd import numpy as np from datetime import time, datetime, timedelta # endregion class RollingWindowAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2021,1,1) self.SetEndDate(2021,3, 16) self.SetCash(10000) self.spy = self.AddEquity("SPY", Resolution.Daily) self.spy.SetDataNormalizationMode(DataNormalizationMode.Raw) # TOGGLES self.invest = True self.sell = True self.liquidate = True log_plot = Chart('Custom Chart') log_plot.AddSeries(Series('Orders',SeriesType.Scatter,0)) log_plot.AddSeries(Series('Close Price', SeriesType.Line,0)) self.AddChart(log_plot) # Creates a Rolling Window self.trade_bars = RollingWindow[TradeBar](3) def OnData(self, data): self.Plot('Custom Chart', 'Close Price', self.Securities[self.spy.Symbol].Close) profit = self.Portfolio[self.spy.Symbol].UnrealizedProfitPercent spy_price = self.Securities[self.spy.Symbol].Price # Add SPY TradeBar in rollling window self.trade_bars.Add(data["SPY"]) # Wait for trade_bars to be ready. if not (self.trade_bars.IsReady): return third_bar = self.trade_bars[0] # Current Day second_bar = self.trade_bars[1] first_bar = self.trade_bars[2] # 1-2u if (second_bar.High < first_bar.High) and (second_bar.Low > first_bar.Low): if (third_bar.Price > second_bar.High): shares_to_buy = int(self.Portfolio.Cash / data[self.spy.Symbol].Open) self.MarketOrder(self.spy.Symbol, (shares_to_buy*0.1)) # 2d-2u if (second_bar.High < first_bar.High) and (second_bar.Low < first_bar.Low): if (third_bar.Price > second_bar.High): shares_to_buy = int(self.Portfolio.Cash / data[self.spy.Symbol].Open) self.MarketOrder(self.spy.Symbol, (shares_to_buy*0.1)) def OnOrderEvent(self, orderEvent): if orderEvent.FillQuantity == 0: return fetched = self.Transactions.GetOrderById(orderEvent.OrderId) symbol = orderEvent.Symbol fill_price = orderEvent.FillPrice self.Plot('Custom Chart', 'Orders', fill_price) self.Log(f"{str(fetched.Type)} was filled. Symbol: {str(orderEvent.Symbol)}. \ Quantity: {str(orderEvent.FillQuantity)}. Direction: {str(orderEvent.Direction)}")