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