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. 
            }
        }
    }
}