class FuturesAlgo(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2016, 1, 5)
self.SetEndDate(2016, 1, 31)
self.SetCash(100000)
self.es = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute)
# Filter contracts to only front month contract
self.es.SetFilter(lambda x : x.FrontMonth())
# 5 period SMA
self.rsi = self.RSI(self.es.Symbol, 14, MovingAverageType.Wilders, Resolution.Minute)
#self.ema = ExponentialMovingAverage(200)
# Pointer to track front month contract
self.frontmonthContract = None
self.lastrsi = None
def OnData(self, data):
for chain in data.FutureChains:
# Trades bars for contracts in chain
tradebars = chain.Value.TradeBars
contracts = [contract for contract in chain.Value]
# If front month contract is updated
if self.frontmonthContract == None or contracts[0].Symbol != self.frontmonthContract.Symbol:
# contracts has only 1 element, the front month contract
self.frontmonthContract = contracts[0]
symbol = self.frontmonthContract.Symbol
price = 0
if symbol in tradebars.Keys:
tradebar = tradebars[symbol]
price = tradebar.Close
self.rsi.Update(tradebar.EndTime, tradebar.Close)
if self.rsi.IsReady:
if self.lastrsi is None:
self.lastrsi = self.rsi.Current.Value
return
if self.lastrsi < 30 and self.rsi.Current.Value > 30:
if not self.Portfolio[symbol].Invested:
self.OrderTick = self.MarketOrder(symbol, 1)
self.Debug(f"LONG, Bid: {self.frontmonthContract.BidPrice}, Ask: {self.frontmonthContract.AskPrice}, Last: {self.frontmonthContract.LastPrice}, FillPrice: {self.OrderTick.AverageFillPrice}, {self.rsi.Current.Value}")
if self.lastrsi > 70 and self.rsi.Current.Value < 70:
if not self.Portfolio[symbol].Invested:
self.OrderTick = self.MarketOrder(symbol, -1)
self.Debug(f"SHORT, Bid: {self.frontmonthContract.BidPrice}, Ask: {self.frontmonthContract.AskPrice}, Last: {self.frontmonthContract.LastPrice}, FillPrice: {self.OrderTick.AverageFillPrice}, {self.rsi.Current.Value}")
if self.Portfolio[symbol].Invested:
if self.Portfolio[self.OrderTick.Symbol].UnrealizedProfit > 250:
if self.Portfolio[self.OrderTick.Symbol].IsLong:
self.MarketOrder(self.OrderTick.Symbol, -1)
self.Debug("Out of long for 400")
else:
self.MarketOrder(self.OrderTick.Symbol, 1)
self.Debug("Out of short for 400")
elif self.Portfolio[self.OrderTick.Symbol].UnrealizedProfit < -200:
if self.Portfolio[self.OrderTick.Symbol].IsLong:
OrderSell = self.MarketOrder(self.OrderTick.Symbol, -1)
self.Debug(f"LONG EXIT, Ask: {self.frontmonthContract.AskPrice}, FillPrice: {OrderSell.AverageFillPrice}")
else:
OrderSell = self.MarketOrder(self.OrderTick.Symbol, 1)
self.Debug(f"SHORT EXIT, Ask: {self.frontmonthContract.AskPrice}, FillPrice: {OrderSell.AverageFillPrice}")
self.lastrsi = self.rsi.Current.Value