Overall Statistics |
Total Trades 7 Average Win 18.04% Average Loss 0% Compounding Annual Return 98.364% Drawdown 42.800% Expectancy 0 Net Profit 87.520% Sharpe Ratio 1.327 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.095 Beta 4.898 Annual Standard Deviation 0.507 Annual Variance 0.257 Information Ratio 1.323 Tracking Error 0.42 Treynor Ratio 0.137 Total Fees $414.40 |
using System; using System.Collections.Generic; using System.Linq; using QuantConnect.Data; using QuantConnect.Interfaces; using QuantConnect.Securities; namespace QuantConnect.Algorithm.CSharp { /// <summary> /// This example demonstrates how to add futures for a given underlying asset. /// It also shows how you can prefilter contracts easily based on expirations, and how you /// can inspect the futures chain to pick a specific contract to trade. /// </summary> /// <meta name="tag" content="using data" /> /// <meta name="tag" content="benchmarks" /> /// <meta name="tag" content="futures" /> //public class BasicTemplateFuturesAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition public class BasicTemplateFuturesAlgorithm : QCAlgorithm { // S&P 500 EMini futures private const string RootES = Futures.Indices.SP500EMini; public Symbol ES = QuantConnect.Symbol.Create(RootES, SecurityType.Future, Market.USA); // 30-yr Treasury futures private const string RootZB = Futures.Financials.Y30TreasuryBond; public Symbol ZB = QuantConnect.Symbol.Create(RootZB, SecurityType.Future, Market.USA); // 10-yr Treasury futures private const string RootZN = Futures.Financials.Y10TreasuryNote; public Symbol ZN = QuantConnect.Symbol.Create(RootZN, SecurityType.Future, Market.USA); // Gold futures private const string RootGC = Futures.Metals.Gold; public Symbol GC = QuantConnect.Symbol.Create(RootGC, SecurityType.Future, Market.USA); // S&P 500 EMini futures private const string RootCL = Futures.Energies.CrudeOilWTI; public Symbol CL = QuantConnect.Symbol.Create(RootCL, SecurityType.Future, Market.USA); /// <summary> /// Initialize your algorithm and add desired assets. /// </summary> public override void Initialize() { SetStartDate(2014, 1, 1); SetEndDate(2014, 12, 1); SetCash(500000); var futureES = AddFuture(RootES); //eMini SP500 var futureZB = AddFuture(RootZB); //30-Year Treasury var futureZN = AddFuture(RootZN); //10-Year Treasury var futureCL = AddFuture(RootCL); //Crude Oil var futureGC = AddFuture(RootGC); //Gold // set our expiry filter for this futures chain futureES.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); futureZB.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); futureZN.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); futureCL.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); futureGC.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); var benchmark = AddEquity("SPY"); SetBenchmark(benchmark.Symbol); Schedule.On(DateRules.MonthStart("SPY"), TimeRules.AfterMarketOpen("SPY", 10), () => { Log("SpecificTime: Fired at : " + Time); //Here you do not need to call Rebalance() because on Scheduled Date, the algorithm will trigger OnData() and you have already called Rebalance(slice) in OnData() }); } /// <summary> /// Event - v3.0 DATA EVENT HANDLER: (Pattern) Basic template for user to override for receiving all subscription data in a single event /// </summary> /// <param name="slice">The current slice of data keyed by symbol string</param> public override void OnData(Slice slice) { if (!Portfolio.Invested) { Rebalance(slice); } } /// <summary> // This is the reblancing code to set the current portfolio to the desired leverage /// </summary> public void Rebalance(Slice slice) { foreach(var chain in slice.FutureChains) { var symbol = chain.Key; // Do nothing if not ES or ZB if (symbol != ES && symbol != ZB) continue; // find the front contract expiring no earlier than in 90 days var contracts = from futuresContract in chain.Value.OrderBy(x => x.Expiry) where futuresContract.Expiry > Time.Date.AddDays(45) select futuresContract; if (contracts.Count() == 0) continue; var contract = contracts.First(); SetHoldings(contract.Symbol, 5); return;// After SetHoldings(), return so that only one order is placed. } } } }