| Overall Statistics |
|
Total Trades 19 Average Win 10.51% Average Loss -11.49% Compounding Annual Return 25947.523% Drawdown 44.100% Expectancy 0.368 Net Profit 144.660% Sharpe Ratio 4.732 Loss Rate 29% Win Rate 71% Profit-Loss Ratio 0.91 Alpha 4.675 Beta 3.139 Annual Standard Deviation 1.052 Annual Variance 1.107 Information Ratio 4.782 Tracking Error 1.021 Treynor Ratio 1.586 Total Fees $832.50 |
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, 3, 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), () =>
{
Liquidate();
//Change the above to Reblance(slice)??? How to get slice from sheduled events??
});
}
/// <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)
{
// 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(45)
select futuresContract
).FirstOrDefault();
// if found, trade it
if (contract != null)
{
//Trade the ES Future Contract only
if (contract.Symbol.Underlying == RootES)
{
SetHoldings(contract.Symbol, 5);
}
else {return;} //Do nothing if underlying is not ES
//Trade the ZB Future Contract only
if (contract.Symbol.Underlying == RootZB)
{
SetHoldings(contract.Symbol, 5);
}
else {return;} //Do nothing if underlying is not ZB
}
else {return;} //Do nothing if contract == null
}
}
}
}