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()); } } }