| 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 Probabilistic 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.375 Tracking Error 0.297 Treynor Ratio 0 Total Fees $0.00 |
/*
* 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 QuantConnect.Interfaces;
using QuantConnect.Indicators;
using System.Collections.Generic;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Market;
using QuantConnect.Securities.Future;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Demonstration of how to rollover futures
/// </summary>
/// <meta name="tag" content="renko" />
/// <meta name="tag" content="indicators" />
/// <meta name="tag" content="using data" />
/// <meta name="tag" content="consolidating data" />
public class RolloverAlgorithm : QCAlgorithm
{
private FuturesContract frontmonthContract;
private Future myFuture;
private RollingWindow<string> mySymbolValue;
/// <summary>
/// Initializes the algorithm state.
/// </summary>
public override void Initialize()
{
SetStartDate(2019, 7, 7);
SetEndDate(2020, 7, 8);
//SetEndDate(DateTime.Now.Date.AddDays(-1)); // Or use a relative date.
SetCash(1000000);
// Subscribe to futures chain
myFuture = AddFuture(Futures.Indices.SP500EMini, Resolution.Minute, Market.CME, false, 0m);
// Filter for front month contracts, ignore non-front month contracts
myFuture.SetFilter(universe => universe.FrontMonth());
mySymbolValue = new RollingWindow<string>(2);
mySymbolValue.Add("foobar");
mySymbolValue.Add("foobar");
}
/// <summary>
/// We're doing our analysis in the OnRenkoBar method, but the framework verifies that this method exists, so we define it.
/// </summary>
public void OnData(TradeBars data)
{
}
public void OnData(Slice data)
{
foreach(var chain in data.FutureChains)
{
// Get trade bars for contracts in chain
var tradebars = chain.Value.TradeBars;
// Get front month contract
var contract = chain.Value.FirstOrDefault();
// Check if front month contract has been delisted/updated
if (frontmonthContract == null || (contract.Symbol != frontmonthContract.Symbol))
{
// Otherwise we have the front month contract
frontmonthContract = contract;
}
// Get symbol for front month contract
var symbol = frontmonthContract.Symbol;
// Check if tradebar contains our symbol
if (tradebars.Keys.Contains(symbol))
{
var myTradeBar = tradebars[symbol];
mySymbolValue.Add(symbol.Value);
if (!mySymbolValue.IsReady) return;
if (mySymbolValue[0] != mySymbolValue[1])
{
Debug($"{myTradeBar.Time.ToIso8601Invariant()} {symbol} {symbol.Value}");
}
}
}
}
}
}