Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-1.200%
Drawdown
0.200%
Expectancy
0
Net Profit
-0.121%
Sharpe Ratio
-1.748
Probabilistic Sharpe Ratio
15.574%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.002
Beta
0.022
Annual Standard Deviation
0.004
Annual Variance
0
Information Ratio
1.312
Tracking Error
0.201
Treynor Ratio
-0.363
Total Fees
$0.57
Estimated Strategy Capacity
$690000000.00
Lowest Capacity Asset
MES XZDYPWUWC7I9
Portfolio Turnover
0.06%
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from AlgorithmImports import *

### <summary>
### This example demonstrates how to add futures for a given underlying asset.
### It also shows how you can prefilter contracts easily based on expirations, and how you
### can inspect the futures chain to pick a specific contract to trade.
### </summary>
### <meta name="tag" content="using data" />
### <meta name="tag" content="benchmarks" />
### <meta name="tag" content="futures" />
class BasicTemplateFuturesAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2022, 2, 7)
        self.SetEndDate(2022, 3, 15) 
        self.SetCash(1000000)

        self.contractSymbol = None

        # Subscribe and set our expiry filter for the futures chain
        #futureSP500 = self.AddFuture(Futures.Indices.SP500EMini)
        self.futureSP500 = self.AddFuture(Futures.Indices.MicroSP500EMini)
        
        #futureNQ = self.AddFuture(Futures.Indices.MicroNASDAQ100EMini)
        #futureYM = self.AddFuture(Futures.Indices.Dow30EMini)
        #futureCL = self.AddFuture(Futures.Energies.MicroCrudeOilWTI)
        #futureGold = self.AddFuture(Futures.Metals.Gold)

        # set our expiry filter for this futures chain
        # SetFilter method accepts timedelta objects or integer for days.
        # The following statements yield the same filtering criteria
        self.futureSP500.SetFilter(timedelta(0), timedelta(182))
        #futureNQ.SetFilter(timedelta(0), timedelta(182))
        #futureYM.SetFilter(timedelta(0), timedelta(182))
        #futureCL.SetFilter(timedelta(0), timedelta(182))

        #futureGold.SetFilter(0, 182)

        benchmark = self.AddEquity("SPY")
        self.SetBenchmark(benchmark.Symbol)

        seeder = FuncSecuritySeeder(self.GetLastKnownPrices)
        self.SetSecurityInitializer(lambda security: seeder.SeedSecurity(security))

        history = self.History(
            tickers=[self.futureSP500.Symbol], 
            start=self.Time - timedelta(days=15), 
            end=self.Time, 
            resolution=Resolution.Minute, 
            fillForward=False, 
            extendedMarketHours=False, 
            dataMappingMode=DataMappingMode.OpenInterest, 
            dataNormalizationMode=DataNormalizationMode.Raw, 
            contractDepthOffset=0)

        checkHere=1
    def OnData(self,slice):
        for chain in slice.FutureChains:
             # Get contracts expiring no earlier than in 90 days
            contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))

            # if there is any contract, trade the front contract
            if len(contracts) == 0: continue
            front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
            self.contractSymbol = front.Symbol   
            
        price = slice[self.contractSymbol].Price #price RIGHT NOW
        price_Cont = slice[self.futureSP500.Symbol].Price
        #self.Debug(front.Symbol.Value + "=" + str(price)+"     Continuous="+ str(price_Cont))

        self.Plot("Futures", "Price - Continuous", price)
        self.Plot("Futures", "Price - Front Month", price_Cont)
        self.Plot("Diff", "Cont - FM", price_Cont - price)

        if not self.Portfolio.Invested:
                self.MarketOrder(front.Symbol , 1)
        else:
            BuyHold=1
            #self.Liquidate()

    def OnEndOfAlgorithm(self):
        # Get the margin requirements
        buyingPowerModel = self.Securities[self.contractSymbol].BuyingPowerModel
        name = type(buyingPowerModel).__name__
        if name != 'FutureMarginModel':
            raise Exception(f"Invalid buying power model. Found: {name}. Expected: FutureMarginModel")

        initialOvernight = buyingPowerModel.InitialOvernightMarginRequirement
        maintenanceOvernight = buyingPowerModel.MaintenanceOvernightMarginRequirement
        initialIntraday = buyingPowerModel.InitialIntradayMarginRequirement
        maintenanceIntraday = buyingPowerModel.MaintenanceIntradayMarginRequirement

    def OnSecuritiesChanged(self, changes):
        for addedSecurity in changes.AddedSecurities:
            if addedSecurity.Symbol.SecurityType == SecurityType.Future and not addedSecurity.Symbol.IsCanonical() and not addedSecurity.HasData:
                raise Exception(f"Future contracts did not work up as expected: {addedSecurity.Symbol}")