| Overall Statistics |
|
Total Trades 231 Average Win 1.81% Average Loss -0.69% Compounding Annual Return 18.354% Drawdown 28.800% Expectancy 0.136 Net Profit 12.546% Sharpe Ratio 0.735 Probabilistic Sharpe Ratio 38.124% Loss Rate 69% Win Rate 31% Profit-Loss Ratio 2.63 Alpha 0.152 Beta 0.393 Annual Standard Deviation 0.244 Annual Variance 0.06 Information Ratio 0.38 Tracking Error 0.29 Treynor Ratio 0.457 Total Fees $427.35 |
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Securities import *
from datetime import timedelta
import numpy as np
class FuturesMomentumAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 9, 14)
self.SetEndDate(2020, 5, 26)
#times: 2018, 1, 1 : 2018, 5, 1
#times: 2018, 9, 1 : 2019, 1, 1
self.SetCash(100000)
# Adds SPY to be used in our EMA indicators
equity = self.AddEquity("SPY", Resolution.Minute)
# Adds the future that will be traded and
# set our expiry filter for this futures chain
future = self.AddFuture(Futures.Indices.SP500EMini)
future.SetFilter(timedelta(0), timedelta(182))
self.Schedule.On(self.DateRules.EveryDay("SPY"), \
self.TimeRules.BeforeMarketClose("SPY", 1), \
self.EveryDayBeforeMarketClose)
self.hma = self.HMA("SPY", 1200, Resolution.Minute)
self.HMA("SPY", 1200).Updated += self.hmaUpdated
self.hmaWindow=RollingWindow[IndicatorDataPoint](5)
self.fasthma = self.HMA("SPY", 10, Resolution.Minute)
self.HMA("SPY", 10).Updated += self.fasthmaUpdated
self.fasthmaWindow=RollingWindow[IndicatorDataPoint](5)
self.close = self.SMA("SPY", 1, Resolution.Minute)
self.adx = self.ADX("SPY", 840, Resolution.Minute)
self.ADX("SPY", 840).Updated += self.adxUpdated
self.adxWindow=RollingWindow[IndicatorDataPoint](5)
self.rsi = self.RSI("SPY", 3300, Resolution.Hour)
def hmaUpdated(self, sender, updated):
self.hmaWindow.Add(updated)
def fasthmaUpdated(self, sender, updated):
self.fasthmaWindow.Add(updated)
def adxUpdated(self, sender, updated):
self.adxWindow.Add(updated)
def OnData(self, slice):
if not (self.hmaWindow.IsReady and self.fasthmaWindow.IsReady and self.adxWindow.IsReady): return
bhma = self.fasthma.Current.Value > self.hma.Current.Value
shma = self.fasthma.Current.Value < self.hma.Current.Value
#adx is increasing
hmadelta = self.hmaWindow[0].Value - self.hmaWindow[1].Value
prevdelta = self.hmaWindow[1].Value - self.hmaWindow[2].Value
badx = self.adx.Current.Value < self.adxWindow[1].Value
sadx = self.adx.Current.Value < self.adxWindow[1].Value
#directly below is buy criteria
#TO DO: Increase probability of right
if (not self.Portfolio.Invested) and hmadelta > 0 and prevdelta < 0:
for chain in slice.FuturesChains:
# find the front contract expiring no earlier than in 90 days
contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
# if there is any contract, trade the front contract
if len(contracts) == 0: continue
contract = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
self.MarketOrder(contract.Symbol , 1)
self.Notify.Sms("+1 123-456-7890", "Bought E-mini:")
if self.Portfolio.Invested > 0 and hmadelta < 0:
self.Liquidate()
def EveryDayBeforeMarketClose(self):
pass
# self.Log("EveryDay.SPY 1 min before close: Fired at: {0}".format(self.Time))
# if self.Portfolio.Invested > 0 and (self.Securities["SPY"].Close * 0.95) > self.close.Current.Value or self.Portfolio.Invested < 0 and (self.Securities["SPY"].Close * 1.05) < self.close.Current.Value:
# self.Liquidate()
# else:
# pass
#def OnEndOfDay(self):
# #want to close open positions at end of the day
# if self.Portfolio.Invested:
# self.Liquidate()
def OnOrderEvent(self, orderEvent):
self.Log(str(orderEvent))from Selection.FutureUniverseSelectionModel import FutureUniverseSelectionModel
from datetime import date, timedelta
class FuturesUniverseSelectionModel(FutureUniverseSelectionModel):
def __init__(self, select_future_chain_symbols):
super().__init__(timedelta(1), select_future_chain_symbols)
def Filter(self, filter):
return (filter.Expiration(timedelta(0), timedelta(90))
.OnlyApplyFilterAtMarketOpen())