| 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.264 Tracking Error 0.104 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
using QuantConnect.Securities.Future;
namespace QuantConnect.Algorithm.CSharp
{
public class ESFuturesGlobexConsolidator : QCAlgorithm
{
private Future es;
private RollingWindow<TradeBar> esDaily;
private TradeBar esYesterday;
private TradeBar firstBar;
private HashSet<Symbol> _esFutureContracts = new HashSet<Symbol>();
private Dictionary<Symbol, TradeBarConsolidator> consolidators;
Func<DateTime, CalendarInfo> GlobexDay = dt =>
{
DateTime start;
if (dt.TimeOfDay >= TimeSpan.FromHours(17))
{
start = new DateTime(dt.Year, dt.Month, dt.Day, 17, 00, 00);
}
else
{
DateTime temp = dt.AddDays(-1);
start = new DateTime(temp.Year, temp.Month, temp.Day, 17, 00, 00);
}
DateTime end;
if (dt.TimeOfDay >= TimeSpan.FromHours(17))
{
DateTime temp = dt.AddDays(1);
end = new DateTime(temp.Year, temp.Month, temp.Day, 16, 00, 00);
}
else
{
end = new DateTime(dt.Year, dt.Month, dt.Day, 16, 00, 00);
}
return new CalendarInfo(start, end - start);
};
public override void Initialize()
{
// set timezone to CST - US/Chicago
SetTimeZone(TimeZones.NewYork);
// set start and end date for backtesting
SetStartDate(2021, 10, 01);
//SetEndDate(2021, 04, 02);
SetEndDate(DateTime.Now.Date.AddDays(-1)); // we test until EOD yesterday
// warm up 2 days of data, we need at least 2 days of data to determine the gap up/down entry for this algo
SetWarmUp(TimeSpan.FromDays(2));
// set portfolio cash to 100000 USD ; increased to compensate margin
SetCash(100000);
// add E-mini S&P 500 futures contract
es = AddFuture(Futures.Indices.SP500EMini, Resolution.Minute);
// select only the front month contracts
es.SetFilter(x => x.FrontMonth().OnlyApplyFilterAtMarketOpen());
// Creates a Rolling Window indicator to keep the 2 TradeBar
esDaily = new RollingWindow<TradeBar>(1);
consolidators = new Dictionary<Symbol, TradeBarConsolidator>();
}
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// Slice object keyed by symbol containing the stock data
public override void OnData(Slice data)
{
// foreach(var chain in data.FutureChains)
// {
// var popularContracts = chain.Value.Where(x=> x.OpenInterest > 1000).ToList();
// if (popularContracts.Count == 0)
// {
// continue;
// }
// var sortedByOIContracts = popularContracts.OrderByDescending(x => x.OpenInterest).ToList();
// var liquidContract = sortedByOIContracts.FirstOrDefault();
// if (!_esFutureContracts.Contains(liquidContract.Symbol))
// {
// _esFutureContracts.Add(liquidContract.Symbol);
// var consolidator = new TradeBarConsolidator(GlobexDay);
// consolidator.DataConsolidated += OnDataConsolidated;
// SubscriptionManager.AddConsolidator(liquidContract.Symbol, consolidator);
// //Log("Added new consolidator for " + liquidContract.Symbol.Value);
// }
// }
}
public void OnDataConsolidated(object sender, TradeBar tradeBar)
{
Debug(String.Format("OnDataConsolidated called at {0}", Time.Date.ToString()));
esDaily.Add(tradeBar);
Debug(tradeBar.ToString());
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
if (changes.AddedSecurities.Count > 0)
{
foreach( var futuresContract in changes.AddedSecurities)
{
var consolidator = new TradeBarConsolidator(GlobexDay);
consolidator.DataConsolidated += OnDataConsolidated;
SubscriptionManager.AddConsolidator(futuresContract.Symbol, consolidator);
consolidators[futuresContract.Symbol] = consolidator;
}
Debug("Securities added: " +
string.Join(",", changes.AddedSecurities.Select(x => x.Symbol.Value)));
}
if (changes.RemovedSecurities.Count > 0)
{
foreach( var futuresContract in changes.RemovedSecurities)
{
var consolidator = consolidators[futuresContract.Symbol];
SubscriptionManager.RemoveConsolidator(futuresContract.Symbol, consolidator);
consolidator.DataConsolidated -= OnDataConsolidated;
consolidators.Remove(futuresContract.Symbol);
}
Debug("Securities removed: " +
string.Join(",", changes.RemovedSecurities.Select(x => x.Symbol.Value)));
}
}
}
}