Overall Statistics
from datetime import timedelta
import decimal
class BasicTemplateFuturesAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2019, 1, 7)
        self.SetEndDate(2019, 6, 15)
        self.SetCash(25000)
        slowperiod = 1720
        self.SetWarmUp(slowperiod)
        
        self.tmf = self.AddEquity("TMF", Resolution.Minute, Market.USA)
        self.spxl = self.AddEquity("SPXL", Resolution.Minute, Market.USA)
        self.spxs = self.AddEquity("SPXS", Resolution.Minute, Market.USA)
        
        self.bearSMA = self.SMA("SPXS", 20, Resolution.Minute)
        self.bullSMA = self.SMA("SPXL", 20, Resolution.Minute)
        self.marketSMA = IndicatorExtensions.Minus(self.bullSMA, self.bearSMA)
        
        self.symbols = ["SPXS", "SPXL", "TMF"]
        for symbol in self.symbols:
            self.Consolidate(symbol, timedelta(minutes=60), self.twoforty)
            
        #Add the spread plot and mark the long/short spread point
        spreadPlot = Chart("Spread Plot")
        spreadPlot.AddSeries(Series("CurrentSMA", SeriesType.Line, 0))
        spreadPlot.AddSeries(Series("Long Spread Trade", SeriesType.Scatter, 0))
        spreadPlot.AddSeries(Series("Short Spread Trade", SeriesType.Scatter, 0))
        spreadPlot.AddSeries(Series("marketSMA", SeriesType.Line, 0))
        self.AddChart(spreadPlot)
        
    def OnData(self,slice):
        #if (not data.ContainsKey(self.spxl) or ( not data.ContainsKey(self.spxs)): return
        pass   
    def OnOrderEvent(self, orderEvent):
        self.Log(str(orderEvent))
        pass
    def twoforty(self, consolidated):
        ''' This is our event handler for our 45 minute consolidated defined using the Consolidate method'''
        self.consolidated45Minute = True
        
        if self.IsWarmingUp: return
        if (not self.bullSMA.IsReady) or ( not self.bearSMA.IsReady): return
        CurrentSMA = (self.Securities["SPXL"].Price - self.Securities["SPXS"].Price)
        tolerance = decimal.Decimal(0.50)
        if not self.Portfolio.Invested and CurrentSMA <= (self.marketSMA.Current.Value - tolerance):
            self.SetHoldings("SPXL", -0.2)
            self.SetHoldings("SPXS", 0.2)
            self.SetHoldings("TMF", 0.4)
            self.Plot("Spread Plot", "Long Spread Trade", CurrentSMA)
            #self.Log("We are Long, Total Margin Used is: " + str(self.Portfolio.TotalAbsoluteHoldingsCost))
            #self.Log("currentspread is less than esnq tolerance: " + str(CurrentSMA) + " < " + str(self.esnqsma.Current.Value - tolerance))
            #self.Log("What contracts are available??" + str(self.frontES) + " and " + str(self.frontNQ))    
            self.Notify.Sms("+17574091415", "LONG, Paper Forex")
        if not self.Portfolio.Invested and CurrentSMA >= (self.marketSMA.Current.Value + tolerance):
            self.SetHoldings("SPXL", 0.2)
            self.SetHoldings("SPXS", -0.2)
            self.SetHoldings("TMF", -0.4)
            self.Notify.Sms("+17574091415", "Liquidate, Paper Forex")
            self.Plot("Spread Plot", "Short Spread Trade", CurrentSMA)
            #self.Log("We are Short, Total Margin Used is: " + str(self.Portfolio.TotalAbsoluteHoldingsCost))
            #self.Log("currentspread is greater than esnq tolerance: " + str(CurrentSMA) + " > " + str(self.esnqsma.Current.Value + tolerance))
            #self.Log("Did we purchase any contracts??" + str(self.frontES.Symbol) + " and " + str(self.frontNQ.Symbol))
        if self.Portfolio.Invested:
            if (self.marketSMA.Current.Value + 0.10) >= CurrentSMA >= (self.marketSMA.Current.Value - 0.10):
                self.Liquidate()
        self.Plot("Spread Plot", "marketSMA", self.marketSMA.Current.Value)
        self.Plot("Spread Plot", "currentspread", CurrentSMA)
        
    def OnEndOfDay(self):
        #self.Log("Settled Cash is: " + str(self.Portfolio.Cash))
        #self.Log("Total Margin Used is: " + str(self.Portfolio.TotalAbsoluteHoldingsCost))
        #self.Log("Total Units held is: " + str(self.Portfolio.TotalHoldingsValue))
        #self.Log("Invested in SPXL is: " + str(self.Portfolio["SPXL"].Invested))
        #self.Log("Invested in SPXS is: " + str(self.Portfolio["SPXS"].Invested))
        #self.Log("Invested in TMF is: " + str(self.Portfolio["TMF"].Invested))
        pass