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
import pandas as pd

class IndexFuturesPairs(QCAlgorithm):

    def Initialize(self):
        
        # Backtesting Values
        self.SetStartDate(2018, 1, 1)  # Set Start Date
        self.SetEndDate(2018, 1, 7) # Set End Date
        self.SetCash(25000)  # Set Strategy Cash
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage)
        self.contracts = []
        
        # Import SPY
        self.AddEquity("SPY")
        
        # Import Index Futures
        self.Rusemini = self.AddFuture(Futures.Indices.Russell2000EMini, Resolution.Minute)
        self.Nasemini = self.AddFuture(Futures.Indices.NASDAQ100EMini, Resolution.Minute)
        self.Dowemini = self.AddFuture(Futures.Indices.Dow30EMini, Resolution.Minute)
        self.SPemini = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute)
        
        # Add contracts to chain for each future
        self.Rusemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen())
        self.Nasemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen())
        self.Dowemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen())
        self.SPemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen())
        self.contracts = [self.Rusemini, self.Nasemini, self.Dowemini, self.SPemini]
        
        # Set up MACD indicators
        #self.RusMACD = self.MACD(self.Rusemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute)
        #self.RegisterIndicator(self.Rusemini.Symbol, self.RusMACD, timedelta(minutes = 5))
        #self.NasMACD = self.MACD(self.Nasemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute)
        #self.RegisterIndicator(self.Nasemini.Symbol, self.NasMACD, timedelta(minutes = 5))
        #self.DowMACD = self.MACD(self.Dowemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute)
        #self.RegisterIndicator(self.Dowemini.Symbol, self.DowMACD, timedelta(minutes = 5))
        #self.SPMACD = self.MACD(self.SPemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute)
        #self.RegisterIndicator(self.SPemini.Symbol, self.SPMACD, timedelta(minutes = 5))
        
        # Set up MOMP indicators
        self.RusMOMP = self.MOMP(self.Rusemini.Symbol,10,Resolution.Daily)
        self.NasMOMP = self.MOMP(self.Nasemini.Symbol,10,Resolution.Daily)
        self.DowMOMP = self.MOMP(self.Dowemini.Symbol,10,Resolution.Daily)
        self.SPMOMP = self.MOMP(self.SPemini.Symbol,10,Resolution.Daily)
        
        # Set warm-up period
        self.SetWarmUp(timedelta(20))
           
        # Initiate order buying process 30 seconds after market open
        self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.PrepareOrder)
        
        
    def OnMarginCallWarning(self):
        self.Error("This is a margin call warning. The assets will be liquidated to cover losses.")

    def OnData(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
            Arguments:
                data: Slice object keyed by symbol containing the stock data
        '''
        
        # Check sell condition
        if self.Portfolio.Invested == True:
            self.CheckSell(Contractbought, Contractsold, data)

        
    def PrepareOrder(self):
        
        if self.IsWarmingUp == True:
            self.Log('Warm up not done')
            return
        
        self.Log('Made it to prepare order')
        
        self.PercentChange(self.contracts)
        
        if self.Maxpercentchange == self.Ruspercentchange and self.Minpercentchange == self.Naspercentchange:
            Numbuycontracts = 2
            Numsellcontracts = 1
            self.Contractbought = self.Rusemini
            self.Contractsold = self.Nasemini
            self.SendOrder(self.Rusemini, self.Nasemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Ruspercentchange and self.Minpercentchange == self.Dowpercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 1
            self.Contractbought = self.Rusemini
            self.Contractsold = self.Dowemini
            self.SendOrder(self.Rusemini, self.Dowemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Ruspercentchange and self.Minpercentchange == self.SPpercentchange:
            Numbuycontracts = 2
            Numsellcontracts = 1
            self.Contractbought = self.Rusemini
            self.Contractsold = self.SPemini
            self.SendOrder(self.Rusemini, self.SPemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Naspercentchange and self.Minpercentchange == self.Ruspercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 2
            Contractbought = self.Nasemini
            Contractsold = self.Rusemini
            self.SendOrder(self.Nasemini, self.Rusemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Naspercentchange and self.Minpercentchange == self.Dowpercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 2
            self.Contractbought = self.Nasemini
            self.Contractsold = self.Dowemini
            self.SendOrder(self.Nasemini, self.Dowemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Naspercentchange and self.Minpercentchange == self.SPpercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 2
            self.Contractbought = self.Nasemini
            self.Contractsold = self.SPemini
            self.SendOrder(self.Nasemini, self.SPemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Dowpercentchange and self.Minpercentchange == self.Ruspercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 1
            Contractbought = self.Dowemini
            Contractsold = self.Rusemini
            self.SendOrder(self.Dowemini, self.Rusemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Dowpercentchange and self.Minpercentchange == self.Naspercentchange:
            Numbuycontracts = 2
            Numsellcontracts = 1
            self.Contractbought = self.Dowemini
            self.Contractsold = self.Nasemini
            self.SendOrder(self.Dowemini, self.Nasemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.Dowpercentchange and self.Minpercentchange == self.SPpercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 1
            self.Contractbought = self.Dowemini
            self.Contractsold = self.SPemini
            self.SendOrder(self.Dowemini, self.SPemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.SPpercentchange and self.Minpercentchange == self.Ruspercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 2
            self.Contractbought = self.SPemini
            self.Contractsold = self.Rusemini
            self.SendOrder(self.SPemini, self.Rusemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.SPpercentchange and self.Minpercentchange == self.Naspercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 1
            self.Contractbought = self.SPemini
            self.Contractsold = self.Nasemini
            self.SendOrder(self.SPemini, self.Nasemini, Numbuycontracts, Numsellcontracts)
        elif self.Maxpercentchange == self.SPpercentchange and self.Minpercentchange == self.Dowpercentchange:
            Numbuycontracts = 1
            Numsellcontracts = 1
            self.Contractbought = self.SPemini
            self.Contractsold = self.Dowemini
            self.SendOrder(self.SPemini, self.Dowemini, Numbuycontracts, Numsellcontracts)
            
            
    def PercentChange(self, contracts):
        self.Ruspercentchange = self.RusMOMP.Current.Value
        self.Log('Russell2000 Percent Change: {}'.format(self.Ruspercentchange))
        self.Naspercentchange = self.NasMOMP.Current.Value
        self.Log('Nasdaq Percent Change: {}'.format(self.Naspercentchange))
        self.Dowpercentchange = self.DowMOMP.Current.Value
        self.Log('Dow Percent Change: {}'.format(self.Dowpercentchange))
        self.SPpercentchange = self.SPMOMP.Current.Value
        self.Log('S&P500 Percent Change: {}'.format(self.SPpercentchange))
        
        Percentchangelist = [self.Ruspercentchange, self.Naspercentchange, self.Dowpercentchange, self.SPpercentchange]
        self.Maxpercentchange = max(Percentchangelist)
        self.Minpercentchange = min(Percentchangelist)
        
    def SendOrder(self, Buycontract, Sellcontract, Quantitybuy, Quantitysell):
        self.Log("Buy {} contracts of {} at {}".format(Quantitybuy, Buycontract.Symbol, Buycontract.Price))
        self.Log("Sell {} contracts of {} at {}".format(Quantitysell, Sellcontract.Symbol, Sellcontract.Price))
        self.MarketOrder(Buycontract.Symbol, Quantitybuy)
        self.MarketOrder(Sellcontract.Symbol, Quantitysell)
        
    def CheckSell(self, Contractbought, Contractsold, data):    
        if self.Contractbought == self.Ruscontract and self.Contractsold == self.Nascontract:
            if self.RusMOMP <= self.NasMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Ruscontract and self.Contractsold == self.Dowcontract:
            if self.RusMOMP <= self.DowMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Ruscontract and self.Contractsold == self.SPcontract:
            if self.RusMOMP <= self.SPMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Nascontract and self.Contractsold == self.Ruscontract:
            if self.NasMOMP <= self.RusMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Nascontract and self.Contractsold == self.Dowcontract:
            if self.NasMOMP <= self.DowMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Nascontract and self.Contractsold == self.SPcontract:
            if self.NasMOMP <= self.SPMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Dowcontract and self.Contractsold == self.Ruscontract:
            if self.DowMOMP <= self.RusMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Dowcontract and self.Contractsold == self.Nascontract:
            if self.DowMOMP <= self.NasMOMP:
                self.Liquidate()
        elif self.Contractbought == self.Dowcontract and self.Contractsold == self.SPcontract:
            if self.RusMOMP <= self.NasMOMP:
                self.Liquidate()
        elif self.Contractbought == self.SPcontract and self.Contractsold == self.Ruscontract:
            if self.SPMOMP <= self.RusMOMP:
                self.Liquidate()
        elif self.Contractbought == self.SPcontract and self.Contractsold == self.Nascontract:
            if self.SPMOMP <= self.NasMOMP:
                self.Liquidate()
        elif self.Contractbought == self.SPcontract and self.Contractsold == self.Dowcontract:
            if self.SPMOMP <= self.DowMOMP:
                self.Liquidate()