Overall Statistics
Total Orders
4
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Sortino 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
Tracking Error
0
Treynor Ratio
0
Total Fees
$8.60
Estimated Strategy Capacity
$460000000.00
Lowest Capacity Asset
NQ YBTZ4GAP5HJ5
Portfolio Turnover
60.91%
# region imports
from AlgorithmImports import *
from datetime import time, timedelta
from QuantConnect.Indicators import ExponentialMovingAverage
from datetime import datetime

class MOOMOCAlgo(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2023, 8, 29)  # Set Start Date
        self.SetEndDate(2023, 8, 30)  # Set End Date
        self.SetCash(1000000)  # Set Strategy Cash

        # Shortened Days/ Days market is closed
        self.holidays = [
        datetime(2023, 1, 2).date(),
        datetime(2023, 1, 16).date(),
        datetime(2023, 2, 20).date(),
        datetime(2023, 4, 7).date(),
        datetime(2023, 5, 29).date(),
        datetime(2023, 6, 19).date(),
        datetime(2023, 7, 4).date(),
        datetime(2023, 9, 4).date(),
        datetime(2023, 11, 23).date(),
        datetime(2023, 12, 25).date(),
        datetime(2023, 7, 3).date(),
        datetime(2023, 11, 24).date(),
        datetime(2023, 12, 24).date()
        ]

        #Add SPY
        self.spy = self.AddEquity("SPY", Resolution.Minute, extendedMarketHours= True)
        
        # Add Future for NQ  
        self.future = self.AddFuture(Futures.Indices.NASDAQ100EMini, Resolution.Minute, extendedMarketHours = True)
        self.future.SetFilter(timedelta(days=0), timedelta(days=180))  # Filter for contracts expiring within 0 to 180 days
        
        # Set a 5-minute Consolidator
        self.Consolidate(self.future.Symbol, timedelta(minutes=5), self.OnDataConsolidated)

        # # Schedule function to buy at the close of the 6:25 AM PST candle (9:25 AM EST)
        self.Schedule.On(self.DateRules.EveryDay(self.future.Symbol), self.TimeRules.At(8, 30), self.BuyFuture)
        
        # # Schedule function to sell at the close of the 12:55 PM PST candle (3:55 PM EST)
        self.Schedule.On(self.DateRules.EveryDay(self.future.Symbol), self.TimeRules.At(16, 00), self.SellFuture)

        self.targetSymbol = None

    def OnDataConsolidated(self, bar):
        # This method is called for every 5-minute bar
        # Use this if you need to analyze 5-minute bars
        self.Plot("Price Chart", "Price", bar.Close)



    def BuyFuture(self):
        if self.Time.date() in self.holidays:
            return
        if not self.Portfolio.Invested and self.targetSymbol is not None and self.Time.weekday() < 5:
            self.Debug(str(self.Time.date))
            self.MarketOrder(self.targetSymbol, 1)

    def SellFuture(self):
        if self.Time.date() in self.holidays:
            return
        if self.Portfolio.Invested and self.Time.weekday() < 5:
            self.MarketOrder(self.targetSymbol, -1)


    def OnData(self, data):
        if not self.Portfolio.Invested:
            for chain in data.FutureChains:
                contracts = sorted(chain.Value, key=lambda x: x.OpenInterest, reverse= True)
                if len(contracts) > 0:
                    self.targetSymbol = contracts[0].Symbol
                    break

    def OnOrderEvent(self, orderEvent):
        # Log every order event with detailed information
        order = self.Transactions.GetOrderById(orderEvent.OrderId)
        self.Log(f"Order event for {order.Symbol}: {orderEvent}. Order status: {order.Status}. Fill price: {orderEvent.FillPrice if orderEvent.FillPrice else 'N/A'}, Fill quantity: {orderEvent.FillQuantity if orderEvent.FillQuantity else 'N/A'}")
        
        # Additional logging for specific order events
        if orderEvent.Status == OrderStatus.Filled:
            self.Log(f"Order filled for {order.Symbol}. Quantity: {order.Quantity}, FillPrice: {orderEvent.FillPrice}")
        elif orderEvent.Status == OrderStatus.PartiallyFilled:
            self.Log(f"Order partially filled for {order.Symbol}. Quantity: {order.Quantity}, FillPrice: {orderEvent.FillPrice}")
        elif orderEvent.Status in [OrderStatus.Canceled, OrderStatus.Invalid]:
            self.Log(f"Order canceled/invalid for {order.Symbol}. Reason: {orderEvent.Message}")