| Overall Statistics |
|
Total Trades 16 Average Win 2.92% Average Loss -2.45% Compounding Annual Return -13.667% Drawdown 17.000% Expectancy -0.453 Net Profit -8.880% Sharpe Ratio -1.167 Loss Rate 75% Win Rate 25% Profit-Loss Ratio 1.19 Alpha -0.131 Beta 2.377 Annual Standard Deviation 0.084 Annual Variance 0.007 Information Ratio -1.331 Tracking Error 0.084 Treynor Ratio -0.041 Total Fees $29.60 |
from datetime import timedelta
import decimal as d
import numpy as np
### PSAR with SP500 E-mini futures
### In this example, we demostrate how to trade futures contracts using
### a equity to generate the trading signals
### It also shows how you can prefilter contracts easily based on expirations.
### It also shows how you can inspect the futures chain to pick a specific contract to trade.
class futuresPSAR(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2016, 1, 1)
self.SetEndDate(2016, 8, 18)
self.SetCash(100000)
self.IsUpTrend = False
self.IsDownTrend = False
# Adds SPY to be used in PSAR
self.symbol = "SPY"
equity = self.AddEquity(self.symbol, Resolution.Daily)
self._psar = self.PSAR(equity.Symbol, 0.02, 0.02, 0.2, Resolution.Daily)
# 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))
# Set time zone
self.SetTimeZone(TimeZones.NewYork)
# Set exchange
self.exchange = self.Securities["SPY"].Exchange;
def OnData(self, slice):
if not self._psar.IsReady: return
# Only trade during regular market hours
if not self.exchange.ExchangeOpen: return
self.IsUpTrend = self._psar.Current.Value > self.Portfolio[self.symbol].Price
self.IsDownTrend = self._psar.Current.Value < self.Portfolio[self.symbol].Price
if (not self.Portfolio.Invested) and self.IsUpTrend:
for chain in slice.FuturesChains:
contracts = None
# find the front contract expiring no earlier than in 90 days
contracts = 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.Log("self.Time.hour: "+str(self.Time.hour) + " - self.Time.minute "+ str(self.Time.minute))
self.MarketOrder(contract.Symbol , -1)
if self.Portfolio.Invested and self.IsDownTrend:
self.Liquidate()
def OnEndOfDay(self):
if self.IsUpTrend:
self.Plot("Indicator Signal", "EOD",1)
elif self.IsDownTrend:
self.Plot("Indicator Signal", "EOD",-1)
elif self._psar.IsReady:
self.Plot("Indicator Signal", "EOD",0)
def OnOrderEvent(self, orderEvent):
self.Log(str(orderEvent))