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
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Securities import *
from datetime import timedelta
from QuantConnect.Securities.Future import FuturesExpiryFunctions

import datetime

class BasicTemplateFuturesAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetCash(1000* 1000 * 1000)
        # self.SetStartDate(2015, 1, 1)
        # self.SetStartDate(2016, 1, 1)
        self.SetStartDate(2020, 1, 1)
        # self.SetStartDate(2020, 11, 1)
        self.SetEndDate(2021, 1, 1)

        self.futureSP500 = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute)  # Symbol: ES
        self.futureSP500.SetFilter(timedelta(0), timedelta(365))
        benchmark = self.AddEquity("SPY")
        self.SetBenchmark(benchmark.Symbol)
        self.last_date = datetime.datetime(2000, 1, 1)


    def GetLatestFutures(self, slice):
        result = {}
        # FutureChains reference https://www.quantconnect.com/lean/documentation/topic24120.html
        for chain in slice.FutureChains:
            # FuturesContract reference https://www.quantconnect.com/lean/documentation/topic24129.html
            # Get contracts expiring no earlier than in 90 days
            contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
            front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
            result[front.Symbol.ID.Symbol] = front
        return result


    def OnData(self, slice):
        if self.last_date >= self.Time.date:
            return

        self.last_date = self.Time.date

        futures = self.GetLatestFutures(slice)
        self.MarketOrder(futures['ES'].Symbol, 2)

    def OnEndOfAlgorithm(self):
        pass
# https://github.com/QuantConnect/Lean/blob/master/Algorithm.Python/BasicTemplateFuturesAlgorithm.py

# from clr import AddReference
# AddReference("System")
# AddReference("QuantConnect.Algorithm")
# AddReference("QuantConnect.Common")

from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Securities import *
from datetime import timedelta
from QuantConnect.Securities.Future import FuturesExpiryFunctions

class BasicTemplateFuturesAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetCash(1000* 1000 * 1000)
        # self.SetStartDate(2015, 1, 1)
        # self.SetStartDate(2016, 1, 1)
        self.SetStartDate(2020, 1, 1)
        # self.SetStartDate(2020, 11, 1)
        self.SetEndDate(2021, 1, 1)

        # Subscribe and set our expiry filter for the futures chain
        self.futureSP500 = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute)  # Symbol: ES
        self.futureSP500.SetFilter(timedelta(0), timedelta(365))
        # self.future10YTreasuryNote = self.AddFuture(Futures.Financials.Y10TreasuryNote, Resolution.Minute)
        # self.future10YTreasuryNote.SetFilter(timedelta(0), timedelta(365))
        # futureGold = self.AddFuture(Futures.Metals.Gold, Resolution.Minute)
        # futureGold.SetFilter(timedelta(0), timedelta(182))
        # self.Debug('futureSP500 leveratge ' + str(self.futureSP500.Leverage))
        # self.Debug('future10YTreasuryNote leveratge ' + str(self.future10YTreasuryNote.Leverage))
        self.Debug('futureSP500 HoldingsValue ' + str(self.futureSP500.Holdings.HoldingsValue))
        benchmark = self.AddEquity("SPY")
        self.SetBenchmark(benchmark.Symbol)
        
        # self.step_flag = False
        # self.Schedule.On(self.DateRules.EveryDay("SPY"),
        #         self.TimeRules.AfterMarketOpen("SPY", 30),
        #         self.Step)
        # self.Schedule.On(self.DateRules.EveryDay(self.futureSP500.Symbol),
        #                  self.TimeRules.AfterMarketOpen("SPY", 30),
        #                  self.Step)


    def GetLatestFutures(self, slice):
        result = {}
        # FutureChains reference https://www.quantconnect.com/lean/documentation/topic24120.html
        for chain in slice.FutureChains:
            # FuturesContract reference https://www.quantconnect.com/lean/documentation/topic24129.html
            # Get contracts expiring no earlier than in 90 days
            contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
            front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
            # self.Debug('* ' + str(front.Symbol))
            # self.Debug('* ' + str(front.Expiry))
            # self.Debug('* ' + str(front.LastPrice))
            result[front.Symbol.ID.Symbol] = front
        return result

    # def ComputeTarget(self, slice):
    #     futures = self.GetLatestFutures(slice)
    #     total = self.Portfolio.TotalPortfolioValue
        
    #     self.Debug('futures...........' + str(futures.keys()))
    #     es_num = int(total*0.95 / (futures['ES'].LastPrice*50))
    #     self.Debug('compute target. ' + str(total) + '\t' +  str(futures['ES'].LastPrice))
    #     self.Debug('compute target. ' + str(es_num))
        
    #     return {futures['ES'].Symbol:es_num}

    # def Execute(self, targets):
    #     # Sell
    #     for p in [x for x in self.Portfolio.Values if x.Invested ]:
    #         # self.Debug('ha1 ' + str(p))
    #         if p.Symbol in targets.keys():
    #             if p.Quantity > targets[p.Symbol]:
    #                 self.Debug('sell method 1')
    #                 self.MarketOrder(p.Symbol, targets[p.Symbol] - p.Quantity)
    #         else:
    #             self.Debug('sell method 2')
    #             self.Liquidate(p.Symbol)

    #     # Buy
    #     for target_symbol, target_quantity in targets.items():
    #         if target_symbol in [x.Symbol for x in self.Portfolio.Values]:
    #             if target_quantity > self.Portfolio[str(target_symbol)].Quantity:
    #                 self.MarketOrder(target_symbol, target_quantity - self.Portfolio[str(target_symbol)].Quantity)
    #         else:
    #             self.MarketOrder(target_symbol, target_quantity)

    def Step(self):
        self.step_flag = True
        

    def OnData(self, slice):
        try:
            self.last_date
        except:
            self.last_date = self.Time.date
            
        if self.last_date == self.Time.date:
            return
        return
        self.last_date = self.Time.date

        futures = self.GetLatestFutures(slice)
        self.MarketOrder(futures['ES'].Symbol, 2)


    # def OnData_Old(self, slice):
    #     # if not self.step_flag:
    #     #     return
    #     # try:
    #     #     self.Debug('self.Time.date: ' + str(self.Time.date))
    #     #     self.Debug('self.last_date: ' + str(self.last_date))
    #     #     if self.last_date != self.Time.date:  
    #     #         self.last_date = self.Time.date
    #     #         return
    #     # except:
    #     #     self.last_date = self.Time.date
    #     #     return

    #     # self.step_flag = False
        
    #     futures = self.GetLatestFutures(slice)
    #     self.MarketOrder(futures['ES'].Symbol, 1)
    #     # self.MarketOrder('SPY', 1)
    #     return

    #     self.Debug('OnData: ' + str(self.Time))
        
    #     self.Debug('* totalvalue ' + str(self.Portfolio.TotalPortfolioValue))
    #     self.Debug('**  ' + str(self.ComputeTarget(slice)))
        
    #     targets = self.ComputeTarget(slice)
    #     self.Execute(targets)


    #     # SecurityHoldings reference https://www.quantconnect.com/lean/documentation/topic26942.html
    #     # Symbol reference https://www.quantconnect.com/lean/documentation/topic7826.html
    #     # SecurityIdentifier reference https://www.quantconnect.com/lean/documentation/topic7432.html
    #     invested = [x for x in self.Portfolio.Values if x.Invested ]
    #     for p in invested:
    #         self.Debug('*  Symbol: ' + str(p.Symbol))
    #         # self.Debug('*  1: ' + str(p.Symbol.ID.Date))
    #         # self.Debug('*  2: ' + str(p.Symbol.ID.Symbol))
            
    #         # self.Debug('*  1: ' + str(dir(p.Symbol)))
    #         # self.Debug('*  2: ' + str(p.Quantity))
    #         self.Debug('*  3: ' + str(p.HoldingsValue))
    #         # self.Debug('*  4: ' + str(p.AbsoluteHoldingsValue))
    #     # self.Debug("invested: " + str(invested)) 

    # def OnData(self, slice):
    #     if self.last_day == self.Time.date():
    #         return
    #     last_day = self.Time.date()
        # self.Debug(self.Time.date())

        # float(self.Portfolio.TotalPortfolioValue)
        # if not self.Portfolio.Invested:
        #     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
        #         self.MarketOrder(front.Symbol , 1)
        # else:
        #     self.Liquidate()

    def OnEndOfAlgorithm(self):
        pass
        # # 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