| 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}")