/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ using System; using System.Linq; using QuantConnect.Data; using QuantConnect.Orders; using QuantConnect.Securities; namespace QuantConnect.Algorithm.CSharp { /// /// 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. /// /// /// /// 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); /// /// Initialize your algorithm and add desired assets. /// public override void Initialize() { SetStartDate(2013, 10, 07); SetEndDate(2013, 10, 11); SetCash(1000000); var futureSP500 = AddFuture(RootSP500); var futureGold = AddFuture(RootGold); // set our expiry filter for this futures chain futureSP500.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); futureGold.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); var benchmark = AddEquity("SPY"); SetBenchmark(benchmark.Symbol); } /// /// Event - v3.0 DATA EVENT HANDLER: (Pattern) Basic template for user to override for receiving all subscription data in a single event /// /// The current slice of data keyed by symbol string public override void OnData(Slice slice) { 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(); } } /// /// Order fill event handler. On an order fill update the resulting information is passed to this method. /// /// Order event details containing details of the evemts /// 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 public override void OnOrderEvent(OrderEvent orderEvent) { Log(orderEvent.ToString()); } } }