Overall Statistics |
Total Trades 15394 Average Win 0.01% Average Loss 0.00% Compounding Annual Return 1.272% Drawdown 0.400% Expectancy 18442.870 Net Profit 0.214% Sharpe Ratio 1.029 Probabilistic Sharpe Ratio 50.489% Loss Rate 9% Win Rate 91% Profit-Loss Ratio 20287.26 Alpha 0.01 Beta 0.021 Annual Standard Deviation 0.009 Annual Variance 0 Information Ratio 0.312 Tracking Error 0.182 Treynor Ratio 0.418 Total Fees $15450.57 Estimated Strategy Capacity $140000000000.00 Lowest Capacity Asset AMZN R735QTJ8XC9X |
from datetime import datetime from datetime import timedelta class BasicTemplateAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2022,2,20) self.SetCash(50000000) self.Data_Symbol = {} tickers = ["SPY", "AAPL", "MSFT", "AMZN", ] self.SetWarmUp(30, Resolution.Daily) for stock in tickers: symbol = self.AddEquity(stock, Resolution.Minute).Symbol self.Data_Symbol[symbol] = SymbolData(self, symbol) ## Dictionary for whether symbol was traded; we will reset this every day self.symbolTraded = { symbol: False for symbol in self.Data_Symbol.keys() } self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose('SPY', 0), self.ResetSymbolTraded) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.Every(timedelta(minutes=1)), self.EveryDayAfterMarketOpen) def EveryDayAfterMarketOpen(self): if self.IsWarmingUp: return for symbol, symbol_data in self.Data_Symbol.items(): if not symbol_data.cci.IsReady: continue holdings = self.Portfolio[symbol] invested = holdings.Invested nowprice = holdings.Price aveprice = holdings.AveragePrice quantity = holdings.Quantity cci = symbol_data.cci.Current.Value ## Check whether the symbol was traded sold_today = self.symbolTraded[symbol] #Buy symbol only if if CCI < 100 and that symbol was not sold today if (not invested) and (not sold_today) and (cci < -100): self.MarketOrder(symbol, 1) self.Debug (symbol) self.Debug (self.Time.date) what_to_buy = (symbol) when_to_buy = (self.Time.date) tobuy = what_to_buy and when_to_buy if invested and (nowprice > aveprice * 1.01): self.MarketOrder (symbol, (-1 * quantity)) self.Debug (symbol) self.Debug (self.Time.date) #sold_symbol = (symbol) when_sold = (self.Time.date) #sold_today = sold_symbol and when_sold ## Note: Assuming if this triggers you want to stop the buy signal? ## Then add a `self.symbolTraded[symbol] = True` here self.symbolTraded[symbol] = True def ResetSymbolTraded(self): ## We reset this to False at end of each day self.symbolTraded = { symbol: False for symbol in self.Data_Symbol.keys() } class SymbolData: def __init__ (self,algo,symbol): self.algorithm = algo self.symbol = symbol #CCI Functions self.cci = algo.CCI(symbol, 14, MovingAverageType.Simple, Resolution.Daily)