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()