Overall Statistics
Total Trades
5
Average Win
0%
Average Loss
0%
Compounding Annual Return
-63.956%
Drawdown
3.700%
Expectancy
0
Net Profit
-1.112%
Sharpe Ratio
-3.567
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
1.186
Beta
10.795
Annual Standard Deviation
0.253
Annual Variance
0.064
Information Ratio
-3.088
Tracking Error
0.23
Treynor Ratio
-0.084
Total Fees
$5.60
Estimated Strategy Capacity
$4000000.00
Lowest Capacity Asset
NGG ROOA6XQS4GH1
#region imports
from AlgorithmImports import *
#endregion
import numpy as np
import pandas as pd
class Tgang(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2022, 2, 25)  # Set Start Date
        self.SetEndDate(2022, 2, 28)  # Set End Date
        self.SetCash(30000)  # Set Strategy Cash
        #self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) #set brokerage and account type for consideration of trading fees
        
        # self.activeStocks = set()
        # can set PDT models for 4x leverage but have to do on security level? (e.g. self.Securities["AAPL"].MarginModel =  PatternDayTradingMarginModel())
        #add SPY for scheduling events
        self.AddEquity("SPY", Resolution.Minute)
        self.AddEquity("TSLA", Resolution.Minute)
        self.SetBenchmark("SPY") # set benchmark
        
        # add universe and update settings
        self.AddUniverse(self.UniverseCoarseFilter, self.UniverseFineFilter)
        self.UniverseSettings.Resolution = Resolution.Minute
        #self.UniverseSettings.SetDataNormalizationMode = DataNormalizationMode.SplitAdjusted
        #self.UniverseSettings.FeeModel = ConstantFeeModel(1.0)
        #self.UniverseSettings.Leverage = 2
        

        self.previousClose = {}
        self.pp = {}
        self.pp_s1 = {}
        self.pp_s2 = {}
        self.pp_r1 = {}
        self.pp_r2 = {}
        self.monthlyBar = {}

        #schedule yday close once per day to identify stocks > 2% move
        #self.ScheduleOn(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.YdayClose)
        #schedule update of previous close for universe stocks
        self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose("SPY", 1), self.UpdateYdayClose)
        self.Schedule.On(self.DateRules.MonthStart("SPY", 1), self.TimeRules.AfterMarketOpen("SPY", 1), self.UpdatePivots)

        #self.percentagebuy = 0.08
        # self.AddEquity("SPY", Resolution.Minute)
        
    def UniverseCoarseFilter(self, coarse):
        #universe runs daily at midnight
        filtered = [x.Symbol for x in coarse if x.Price > 10 and x.DollarVolume > 1000000]
        return filtered
    
    def UniverseFineFilter(self, fine):
        #universe runs daily at midnight
        filtered = [x.Symbol for x in fine if x.MarketCap > 50000000000 and x.EarningReports.FileDate + timedelta(days=5) < self.Time]
        
        return filtered
        
    def OnSecuritiesChanged(self, changes):



        #add previous close and pivot points
        for security in changes.AddedSecurities:
            symbol = security.Symbol

            #get previous close
            if symbol not in self.previousClose:
                history = self.History(symbol, 1, Resolution.Daily)
                if not history.empty:
                    history = history.close.unstack(0)[symbol]
                    if not history.empty:
                        self.previousClose[symbol] = history[0]
            
            #setup monthly bars
            if symbol not in self.monthlyBar:
                self.monthlyBar[symbol] = MonthlyBar(self, symbol)

            #get pp's from monthly bars
            #--------------------------------------------------------------------------
            #if symbol not in self.pp:
             #   history = self.monthlyBar[symbol].close
              #  self.pp[symbol] = history[0]
            #--------------------------------------------------------------------------
        #remove previous close and pp's
        for security in changes.RemovedSecurities:
            symbol = security.Symbol
            
            #remove previous close
            if symbol in self.previousClose:
                self.previousClose.pop(symbol, None)

            #remove monthly bar
            #if symbol in self.monthlyBar:
             #   monthlyBar = self.monthlyBar.pop(symbol, None)
              #  self.SubscriptionManager.RemoveConsolidator(symbol, monthlyBar.consolidator)


        
        
        # prevent code delay after order --> set true after market order (e.g. self.MarketOrder("TSLA", 50, True))
        # you can check if an indicator is ready and return if not (e.g. if not self.sma.IsReady: Return)
        
        # check if trade event active before searching new trade events. This prevents algo from processing data when not ready for new position.
        
        # you can plot in this area (e.g. self.Plot("Benchmark", "52w-High", high))
        
    def OnData(self, data):
        
        #if have positions, no need to scan for new trades
        #if self.Portfolio.Count > 1:
        #    return
        #dictionary for percent change from last close
        percentChangeDaily = {}
        if self.Portfolio.Invested:
            return
        #populate dictionary
        for symbol, previousClose in self.previousClose.items():
            if self.CurrentSlice.ContainsKey(symbol):
                price = self.CurrentSlice[symbol].Close
                change = (price - previousClose) / previousClose
                percentChangeDaily[symbol] = change

        symbols = list(percentChangeDaily.keys())
        sortedSymbols = sorted(symbols, key=lambda x: percentChangeDaily[x], reverse=True)
        selected = sortedSymbols[:5]
        
        for symbol in selected:
            self.SetHoldings(symbol, 0.2)
        #for symbol in selected:
         #   self.SetHoldings(symbol, 1)
            #self.StopMarketOrder(symbol, self.Portfolio[symbol].Quantity, self.CurrentSlice[symbol].Close * 0.95)

        #Check time for live debugging
        checkhour = self.Time.hour
        checkminute = self.Time.minute
        #TRADING EXECUTION
        #self.buyquantity = round((self.percentagebuy*self.Portfolio.TotalPortfolioValue)/data[symbol].Close)
    
        
    def OnOrderEvent(self, orderEvent):
        # set target orders
        pass
    def UpdateYdayClose(self):
        for symbol in self.previousClose:
            if self.CurrentSlice.ContainsKey(symbol):
                self.previousClose[symbol] = self.CurrentSlice[symbol].Close
        
    def UpdatePivots(self):
        pass
    
        for symbol in self.pp:
            if self.CurrentSlice.ContainsKey(symbol):
                history = self.monthlyBar
                #self.pp[symbol] = (history.high(0)[symbol] + history.low(0)[symbol] + history.close(0)[symbol]) / 3

    
    
    # credit Louis tutorial videos

class MonthlyBar:
    
    def __init__(self, algorithm, symbol):
        self.algorithm = algorithm
        self.symbol = symbol
    

        
        self.consolidator = TradeBarConsolidator(self.CustomMonthly)
        self.consolidator.DataConsolidated += self.OnDataConsolidated
        
        algorithm.SubscriptionManager.AddConsolidator(symbol, self.consolidator)
        
        
    def OnDataConsolidated(self, sender, bar):
        self.algorithm.Debug(f"Data Consolidatoed for {self.symbol} at {bar.EndTime} with bar: {bar}")

    def CustomMonthly(self, dt):
        start = dt.replace(day=1).date()
        end = dt.replace(day=28) + timedelta(4)
        end = (end - timedelta(end.day-1)).date()
        return CalendarInfo(start, end - start)