| Overall Statistics |
|
Total Trades 43 Average Win 0% Average Loss 0% Compounding Annual Return 504122047062988000% Drawdown 6.600% Expectancy 0 Net Profit 97.591% Sharpe Ratio 2049439617745.75 Probabilistic Sharpe Ratio 99.816% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 3106455531641.41 Beta 26.696 Annual Standard Deviation 1.516 Annual Variance 2.298 Information Ratio 2115191049538.3 Tracking Error 1.469 Treynor Ratio 116364481548.874 Total Fees $79.55 |
import clr
import decimal as d
import pandas as pd
class FuturesMovingAverageCrossOverExample2(QCAlgorithm):
def Initialize(self):
self.contract = None
self.SetStartDate(2018, 1, 1) #Set Start Date
self.SetEndDate(2018, 1,6) #Set End Date
self.SetCash(100000) #Set Strategy Cash
self.SetWarmUp(TimeSpan.FromDays(5)) # Set warm up
self.SetTimeZone('America/Los_Angeles') # Set timezone
self.new_day = True
self.reset = True
self.limitOrderTicket = None
self.profitTargetOrderTicket = None
self.stopLossOrderTicket = None
# Risk management
# Subscribe and set our expiry filter for the futures chain
futureES = self.AddFuture(Futures.Indices.SP500EMini)
futureES.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(360))
# Indicators
def OnData(self, slice):
if not self.InitUpdateContract(slice):
return
# Reset any open positions based on a contract rollover.
if self.reset:
self.reset = False
self.Log('RESET: closing all positions')
self.Liquidate()
def InitUpdateContract(self, slice):
# Reset daily - everyday we check whether futures need to be rolled
if not self.new_day:
return True
if self.contract != None and (self.contract.Expiry - self.Time).days >= 3: # rolling 3 days before expiry
return True
for chain in slice.FutureChains.Values:
# When selecting contract, if on expiry date then skip first as it would be the same one.
idx = 0
if self.contract != None:
self.Log('Expiry days away {} - {}'.format((self.contract.Expiry-self.Time).days, self.contract.Expiry))
if self.contract != None and (self.contract.Expiry - self.Time).days < 3:
idx = 1
contracts = list(chain.Contracts.Values)
chain_contracts = list(contracts) #[contract for contract in chain]
chain_contracts = sorted(chain_contracts, key=lambda x: x.Expiry)
if len(chain_contracts) < 2:
return False
first = chain_contracts[idx]
second = chain_contracts[idx+1]
if (first.Expiry - self.Time).days >= 3:
self.contract = first
elif (first.Expiry - self.Time).days < 3 and (second.Expiry - self.Time).days >= 3:
self.contract = second
self.Log("Setting contract to: {}".format(self.contract.Symbol.Value))
self.new_day = False
self.reset = True
# Set up consolidators.
one_hour = TradeBarConsolidator(TimeSpan.FromMinutes(1))
one_hour.DataConsolidated += self.OnHour
self.SubscriptionManager.AddConsolidator(self.contract.Symbol, one_hour)
# Set up indicators.
self.__macd = self.MACD(self.contract.Symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Minute)
self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal)
history = self.History(self.contract.Symbol, 60, Resolution.Minute).reset_index(drop=False)
for bar in history.itertuples():
#if bar.time.minute == 0 and ((self.Time-bar.time)/pd.Timedelta(minutes=1)) >= 2:
self.__macd.Update(bar.time, bar.close)
return True
return False
def OnHour(self, sender, bar):
if (self.__macd != None and self.__macd.IsReady):
if bar.Symbol == self.contract.Symbol:
price = bar.Close
tolerance = 0.003
holdings = self.Portfolio[self.contract.Symbol].Quantity
future = self.Securities[self.contract.Symbol]
signalDeltaPercent = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)
currentPrice = self.contract.LastPrice
stopLossPrice = currentPrice - 100
profitTargetPrice = currentPrice + 50
#Change_1 Original: if holdings <= 0 and signalDeltaPercent > 0 and signalDeltaPercent < tolerance
if holdings <= 0 and signalDeltaPercent < 0 and signalDeltaPercent < -tolerance :
# Go long
self.Buy(self.contract.Symbol, 1)
self.LimitOrder(self.contract.Symbol, -1, profitTargetPrice)
self.StopMarketOrder(self.contract.Symbol, -1, stopLossPrice)
if holdings >= 0 and signalDeltaPercent > 0 and signalDeltaPercent > tolerance :
#Go short
self.Buy(self.contract.Symbol, -1)
self.LimitOrder(self.contract.Symbol, 1, profitTargetPrice)
self.StopMarketOrder(self.contract.Symbol, 1, stopLossPrice)
# self.Log("SELL >> {}".format(price))
#self.Liquidate()
else:
self.Log('MACDs not ready yet')
def OnEndOfDay(self):
self.new_day = True