Overall Statistics
Total Trades
40
Average Win
0%
Average Loss
-0.07%
Compounding Annual Return
-13.676%
Drawdown
1.300%
Expectancy
-1
Net Profit
-1.296%
Sharpe Ratio
-24.797
Probabilistic Sharpe Ratio
0.000%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0.005
Annual Variance
0
Information Ratio
-24.797
Tracking Error
0.005
Treynor Ratio
0
Total Fees
$74.00
Estimated Strategy Capacity
$66000000.00
Lowest Capacity Asset
ES WSVU0MELFS3L
import pandas as pd

class IndexFuturesPairs(QCAlgorithm):

    def Initialize(self):
        
        # Backtesting Values
        self.SetStartDate(2018, 1, 1)  # Set Start Date
        self.SetEndDate(2018, 1, 30) # 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.Symbol, self.Nasemini.Symbol, self.Dowemini.Symbol, self.SPemini.Symbol]
       
        # 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:
           if self.contractData[self.contractBought].Current.Value<self.contractData[self.ContractSold].Current.Value:
               self.Liquidate()

    def Handler(self,sender,bar):
        self.Debug("Bar recived:"+str(self.Time))
    def PrepareOrder(self):
        
        if self.IsWarmingUp == True:
            self.Log('Warm up not done')
            return
        self.contractData = {}
        for symbol in self.contracts:
            contracts = self.FutureChainProvider.GetFutureContractList(symbol, self.Time)
            if len(contracts)==0:
              self.Debug("No contract available")
              continue
            self.Debug("Contract found")
            contract = contracts[0]
            
            self.AddFutureContract(contract, Resolution.Minute).Symbol
            self.contractData[contract] = self.MOMP(contract,10,Resolution.Daily)
            
           # self.consolidator += self.Handler
            history = self.History(contract, 1000, Resolution.Minute)
            for index, row in history.iterrows():
                #self.Debug(str(index)+":"+str(row.close))
                self.contractData[contract].Update(index[0],row.close)
            
        max = -1
        min = 10000
        self.ContractBought = None
        self.ContractSold = None
        for key,value in self.contractData.items():
            self.Debug(str(value.Current.Value))
            if value.Current.Value>max:self.ContractBought = key
            if value.Current.Value<min: self.ContractSold = key
        if self.ContractBought is None or self.ContractSold is None:return
        self.MarketOrder(self.ContractSold,-1)
        self.MarketOrder(self.ContractBought,1)
        #self.Log("Buy {} contracts of {} ".format(1, self.ContractBought)
       # self.Log("Sell {} contracts of {} ".format(1, self.ContractSold))