| Overall Statistics |
|
Total Trades 7 Average Win 18.04% Average Loss 0% Compounding Annual Return 98.364% Drawdown 42.800% Expectancy 0 Net Profit 87.520% Sharpe Ratio 1.327 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.095 Beta 4.898 Annual Standard Deviation 0.507 Annual Variance 0.257 Information Ratio 1.323 Tracking Error 0.42 Treynor Ratio 0.137 Total Fees $414.40 |
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, 12, 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), () =>
{
Log("SpecificTime: Fired at : " + Time);
//Here you do not need to call Rebalance() because on Scheduled Date, the algorithm will trigger OnData() and you have already called Rebalance(slice) in OnData()
});
}
/// <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)
{
var symbol = chain.Key;
// Do nothing if not ES or ZB
if (symbol != ES && symbol != ZB) continue;
// find the front contract expiring no earlier than in 90 days
var contracts = from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Time.Date.AddDays(45)
select futuresContract;
if (contracts.Count() == 0) continue;
var contract = contracts.First();
SetHoldings(contract.Symbol, 5);
return;// After SetHoldings(), return so that only one order is placed.
}
}
}
}