Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-4.327
Tracking Error
0.138
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
class FiveOneFractalBreakoutCopy(QCAlgorithm):
    consolidator_by_symbol = {}

    def Initialize(self):
        self.SetStartDate(2021, 12, 1)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash
        
        self.contracts = []
        self.symbolData = dict()
        for ticker in [
        Futures.Metals.Gold,
        Futures.Energies.CrudeOilWTI,
        Futures.Metals.Copper,
        Futures.Energies.NaturalGas,
        Futures.Indices.NASDAQ100EMini]:
            future = self.AddFuture(ticker, Resolution.Minute)
            future.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen())
        
        # VARIABLES & LIST
        # THESE DICTIONARY NAMES CANNOT CHANGE. THE CUSTOM LIBRARY DEPENDS ON IT...
        self.rulesDict = {}
        self.bearFiveDict = {}
        self.bullFiveDict = {}
        self.bullOneDict = {}
        self.bearOneDict = {}
        self.FiveUpDict = {}
        self.FiveDownDict = {}
        self.first_lowDict = {}
        self.second_lowDict = {}
        self.first_highDict = {}
        self.second_highDict = {}
        #Used to check if the first trade in a thesis was a loser.
        self.bull_losing_outcomeDict = {}
        self.bear_losing_outcomeDict = {}
        #A set of variables used to limit re-entries to only happen once per thesis
        self.first_position_bullDict = {}
        self.second_position_bullDict = {}
        self.first_position_bearDict = {}
        self.second_position_bearDict = {}
        #Used for making sure re-entries happen on a new fractal
        self.entry_minuteDict = {}
        #DIRECTION VARIABLES
        self.supportDict = {}
        self.resistanceDict = {}
        self.breakoutDict = {}
        self.breakdownDict = {}
        # ORDER VARIABLES
        self.short_stopDict = {}
        self.second_short_stopDict = {}
        self.long_stopDict = {}
        self.second_long_stopDict = {}
        self.long_entryDict = {}
        self.second_long_entryDict = {}
        self.short_entryDict = {}
        self.second_short_entryDict = {}
        self.long_exitDict = {}
        self.second_long_exitDict = {}
        self.short_exitDict = {}
        self.second_short_exitDict = {}
        self.longOrdersDict = {}
        self.shortOrdersDict = {}
        self.partial_exit_fill_safety_longDict = {}
        self.partial_fill_liq_priceDict = {}
        self.partial_exit_fill_safety_shortDict = {}
        self.risk_targetDict = {}
        self.buying_powerDict = {}
        self.share_sizeDict = {}
        self.dollar_sizeDict = {}
        self.max_price_longDict = {}
        self.max_price_shortDict = {}
        self.trading_hoursDict = {}
        self.symbolEntryPriceDict = {}
        self.symbolStopPriceDict = {}
        self.symbolExitPriceDict = {}
        self.longDict = {}
        self.shortDict = {}
        self.portfolioAmmount = self.Portfolio.Cash
        
    def OnSecuritiesChanged(self, changes):
        for security in changes.AddedSecurities:
            contractString = str(security.Symbol)
            
            # Don't consolidate or add the actual future.
            if contractString[0] == "/":
                continue
            
            market = contractString.split()[0]
            
            # Don't add the same contract twice.
            if security.Symbol in self.consolidator_by_symbol.keys():
                continue
            
            # Create list of symbol strings.
            stringContracts = []
            for prevContract in self.consolidator_by_symbol.keys():
                stringContracts.append(str(prevContract))
            
            # Only allow one contract per Future to be added.
            if any(market in s for s in stringContracts):
                continue
            
            # Make check to ensure it's only adding valid contracts. 
            # When converting a symbol to a string the string length is normally 15 characters long for valid contracts.
            # This check is probably unnecessary.
            if (len(contractString) > 10):
                self.Log("Adding consolidator for: " + str(security.Symbol))
                # Set the Rolling Windows for the contract
                self.symbolData[security.Symbol] = SymbolData()
                # Consolidate the contract
                consolidator = QuoteBarConsolidator(timedelta(minutes=5))
                consolidator.DataConsolidated += self.OnDataConsolidated
                self.SubscriptionManager.AddConsolidator(security.Symbol, consolidator)
                # Add contract consolidator to dictionary
                self.consolidator_by_symbol[security.Symbol] = consolidator
                # Add contract to contract list.
                self.contracts.append(security.Symbol)

    def OnDataConsolidated(self, sender, quoteBar):
        pass
            
class SymbolData(object):    
    def __init__(self):
        self.quickTradeBarWindow = RollingWindow[QuoteBar](5)
        self.longTradeBarWindow = RollingWindow[QuoteBar](5)