Overall Statistics
Total Trades
19
Average Win
10.51%
Average Loss
-11.49%
Compounding Annual Return
25947.523%
Drawdown
44.100%
Expectancy
0.368
Net Profit
144.660%
Sharpe Ratio
4.732
Loss Rate
29%
Win Rate
71%
Profit-Loss Ratio
0.91
Alpha
4.675
Beta
3.139
Annual Standard Deviation
1.052
Annual Variance
1.107
Information Ratio
4.782
Tracking Error
1.021
Treynor Ratio
1.586
Total Fees
$832.50
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, 3, 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), () =>
			{
				Liquidate();
				//Change the above to Reblance(slice)???  How to get slice from sheduled events??
			});
        }

        /// <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)
            {
                // find the front contract expiring no earlier than in 90 days
                var contract = (
                    from futuresContract in chain.Value.OrderBy(x => x.Expiry)
                    where futuresContract.Expiry > Time.Date.AddDays(45)
                    select futuresContract
                ).FirstOrDefault();

                // if found, trade it
                if (contract != null)
                {
                    //Trade the ES Future Contract only
                    if (contract.Symbol.Underlying == RootES)
                    {
                     	SetHoldings(contract.Symbol, 5);
                    }
                    else {return;} //Do nothing if underlying is not ES
                    
                    
                    //Trade the ZB Future Contract only
                    if (contract.Symbol.Underlying == RootZB)
                    {
                     	SetHoldings(contract.Symbol, 5);
                    }
                    else {return;} //Do nothing if underlying is not ZB
                }
                
                else {return;} //Do nothing if contract == null
            }
        }
    }
}