| Overall Statistics |
|
Total Trades 51 Average Win 0.37% Average Loss -0.19% Compounding Annual Return 7.827% Drawdown 1.100% Expectancy 1.001 Net Profit 3.379% Sharpe Ratio 1.682 Loss Rate 33% Win Rate 67% Profit-Loss Ratio 2.00 Alpha 0.195 Beta -6.004 Annual Standard Deviation 0.045 Annual Variance 0.002 Information Ratio 1.239 Tracking Error 0.045 Treynor Ratio -0.013 Total Fees $92.32 |
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