Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net;
using QuantConnect.Brokerages;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Market;
using QuantConnect.Indicators;
using QuantConnect.Data;
using QuantConnect.Orders;
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
    {
        // S&P 500 EMini futures
        private const string RootSP500 = Futures.Indices.SP500EMini;
        public Symbol SP500 = QuantConnect.Symbol.Create(RootSP500, SecurityType.Future, Market.USA);

        // Gold futures
        private const string RootGold = Futures.Metals.Gold;
        public Symbol Gold = QuantConnect.Symbol.Create(RootGold, SecurityType.Future, Market.USA);

        private const string RootCrudeOil = Futures.Energies.CrudeOilWTI;
		public Symbol CrudeOil = QuantConnect.Symbol.Create(RootCrudeOil, SecurityType.Future, Market.USA);

	    public Chart Price_Chart = new Chart("Price");
        /// <summary>
        /// Initialize your algorithm and add desired assets.
        /// </summary>
        public override void Initialize()
        {
            SetStartDate(2016, 10, 07);
            SetEndDate(DateTime.Now);
            SetCash(1000000);

            // var futureSP500 = AddFuture(RootSP500);
            // var futureGold = AddFuture(RootGold);
            var futureCrude = AddFuture(RootCrudeOil);
            
			Price_Chart.AddSeries(new Series("Close", SeriesType.Line, string.Empty, Color.Black));
			Price_Chart.AddSeries(new Series("High", SeriesType.Line, string.Empty, Color.Lime));
			Price_Chart.AddSeries(new Series("Low", SeriesType.Line, string.Empty, Color.Red));
			AddChart(Price_Chart);

            // set our expiry filter for this futures chain
            // futureSP500.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182));
            // futureGold.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182));
            futureCrude.SetFilter(TimeSpan.Zero,TimeSpan.FromDays(40));

            var benchmark = AddEquity("SPY");
            SetBenchmark(benchmark.Symbol);
        }

        /// <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)
        {
        	Console.Write("Futures Chains: " + slice.FutureChains.Count);
        	bool Has_Data = false;
        	// var nearestContract;
        	if (slice.FutureChains.ContainsKey(CrudeOil)) {
	        	var Crude_Oil_Chain = slice.FutureChains[CrudeOil];
				var contracts = Crude_Oil_Chain.OrderBy(x => x.Expiry);
		        var nearestContract = contracts.FirstOrDefault();
        		Has_Data = true;
				if (Has_Data
				&& nearestContract != null
				&& nearestContract.LastPrice != null) {
					if (nearestContract.Time.Minute == 0 
					&& nearestContract.Time.Hour == 9) {
			        	Console.Write("Nearest Contract Price: " + nearestContract.LastPrice + " " + 
			        	nearestContract.Symbol + " Time: " + nearestContract.Time + " Expiry: " 
			        	+ nearestContract.Expiry);
					}
					if (nearestContract.Time.Minute == 0) {
			        	Plot("Price", "High", nearestContract.AskPrice);
			        	Plot("Price", "Close", nearestContract.LastPrice);
			        	Plot("Price", "Low", nearestContract.BidPrice);
					}
				}
        	}
            foreach(var chain in slice.FutureChains) {
            	// Console.Write("Chain: " + chain);
            	// Console.Write("Chain Symbol: " + chain.Value.Symbol);
            }
            if (!Portfolio.Invested)
            {
                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(90)
                        select futuresContract
                        ).FirstOrDefault();

                    // if found, trade it
                    if (contract != null)
                    {
                        MarketOrder(contract.Symbol, 1);
                    }
                }
            }
            else
            {
                Liquidate();
            }
        }

        /// <summary>
        /// Order fill event handler. On an order fill update the resulting information is passed to this method.
        /// </summary>
        /// <param name="orderEvent">Order event details containing details of the evemts</param>
        /// <remarks>This method can be called asynchronously and so should only be used by seasoned C# experts. Ensure you use proper locks on thread-unsafe objects</remarks>
        public override void OnOrderEvent(OrderEvent orderEvent)
        {
            Log(orderEvent.ToString());
        }
    }
}