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
-0.889
Tracking Error
0.146
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
# region imports
from AlgorithmImports import *
# endregion

class CryingYellowGreenCrocodile(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 1, 1)  # Set Start Date
        self.SetCash(100000)            # Set Strategy Cash

        self.nq = self.AddFuture("NQ", Resolution.Daily)   # is the same as:
        self.nq.SetFilter(0, 240)
        # self.AddFuture(Futures.Indices.NASDAQ100EMini)
        
        # self.min = self.MIN(self.nq, 14, Resolution.Minute)
        # self.max = self.MAX(self.nq, 14, Resolution.Minute)

        self.symbols = []
        self.count = 0
        self.day_count = 0


    def OnData(self, data):
        chains_count = 0
        for chain in data.FutureChains:
            self.day_count += 1
            chains_count += 1
            self.count += 1
            contracts = [contract for contract in chain.Value if contract.Expiry > self.Time + timedelta(days=8)]
            sorted_contracts = sorted(contracts, key=lambda x: x.Expiry)
            if len(sorted_contracts) == 0:
                continue
            
            # for x in contracts:
            self.symbols.append(str(sorted_contracts[0].Symbol))

        if self.count < 20:
            self.Debug(f'{chains_count}, @{self.Time}')

    def OnEndOfAlgorithm(self):
        self.Debug(f'Day amount; {self.day_count}')
        self.Debug(f'len(symbols) = {len(self.symbols)}')
        self.Debug(f'{self.symbols}')

# conclusion: yes, it selects the correct one
# region imports
from AlgorithmImports import *
# endregion

class CryingYellowGreenCrocodile(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 5, 10)  # Set Start Date
        self.SetCash(100000)            # Set Strategy Cash

        self.nq = self.AddFuture(Futures.Indices.NASDAQ100EMini, Resolution.Minute)   # is the same as:
        self.nq.SetFilter(8, 240)
        # self.AddFuture(Futures.Indices.NASDAQ100EMini)

        self.Indicators = {
            'sma': SimpleMovingAverage(11),
            'ema_fast': ExponentialMovingAverage(12),
            'ema_slow': ExponentialMovingAverage(26),
            'min': Minimum(14),
            'max': Maximum(14),
        }
   
        self.symbol = []
        self.consolidator = None

    def OnData(self, data):
        holding = None if self.symbol is None else self.Portfolio.get(self.symbol)
        if holding is None:
            return      

        if not data.Bars.ContainsKey(self.symbol):
            return

        # if self.Indicators['ema_fast'].Current.Value > self.Indicators['ema_slow'].Current.Value:
        if not holding.Invested:
            self.SetHoldings(self.symbol, 0.1)

        elif holding.Invested:
            self.Liquidate(self.symbol)

    def OnSecuritiesChanged(self, changes):
        if len(changes.RemovedSecurities) > 0:
            # Remove the consolidator for the previous contract
            # and reset the indicators
            if self.symbol is not None and self.consolidator is not None:
                self.SubscriptionManager.RemoveConsolidator(self.symbol, self.consolidator)

                for indicator in self.Indicators:
                    self.Indicators[indicator].Reset()

            # We don't need to call Liquidate(_symbol),
            # since its positions are liquidated because the contract has expired.

        if len(changes.AddedSecurities) == 0:
            return
        # Only one security will be added: the new front contract
        self.symbol = changes.AddedSecurities[0].Symbol

        # Create a new consolidator and register the indicators to it
        self.consolidator = self.ResolveConsolidator(self.symbol, Resolution.Minute)

        for indicator in self.Indicators:
            self.RegisterIndicator(self.symbol, self.Indicators[indicator], self.consolidator)
            self.WarmUpIndicator(self.symbol, self.Indicators[indicator], Resolution.Minute)

    def MinutesHandler(self, sender, bar):
        # close_window.Add(bar.Close)
        # high_window.Add(bar.High)
        # low_window.Add(bar.low)
        pass

    def OnEndOfAlgorithm(self):
        pass