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 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
namespace QuantConnect.Algorithm.CSharp { public class FuturesWithCustomIndicator : QCAlgorithm { private const string RootSP500 = Futures.Indices.SP500EMini; public Symbol SP500 = QuantConnect.Symbol.Create(RootSP500, SecurityType.Future, Market.USA); FuturesContract _contract = null; CustomIndicator _yesterdayIndicator = null; CustomIndicator _todayIndicator = null; bool readyToTrade = false; public override void Initialize() { SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin); SetStartDate(2018, 8, 10); SetEndDate(2018, 8, 20); SetCash(100000); var futureSP500 = AddFuture(RootSP500, Resolution.Minute); futureSP500.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182)); } public override void OnData(Slice slice) { if (!readyToTrade) { if (_contract == null) { foreach(var chain in slice.FutureChains) { _contract = (from futuresContract in chain.Value.OrderBy(x => x.Expiry) where futuresContract.Expiry > Time.Date.AddDays(10) select futuresContract).FirstOrDefault(); setUpConsolidator(_contract); } } } else { if (!Portfolio.Invested) { MarketOrder(_contract.Symbol, 1); } } } public void OnHalfHour(object sender, TradeBar halfHourBar) { //UpdateIndicators(halfHourBar); } private void setUpConsolidator(FuturesContract contract) { var thirtyMinutes = new TradeBarConsolidator(TimeSpan.FromMinutes(30)); thirtyMinutes.DataConsolidated += OnHalfHour; SubscriptionManager.AddConsolidator(contract.Symbol, thirtyMinutes); } private void UpdateIndicators(TradeBar halfHourBar) { int barDayOfYear = halfHourBar.EndTime.DayOfYear; if (_todayIndicator == null) { _todayIndicator = CustomIndicator("ES", 5, barDayOfYear); } else if (_todayIndicator.dayOfYear != barDayOfYear) //New day - move old values to "yesterday" { _yesterdayIndicator = _todayIndicator; _todayIndicator = CustomIndicator("ES", 5, barDayOfYear); this.readyToTrade = true; //We have filled up yesterdays value area } _todayIndicator.Update(halfHourBar); } public CustomIndicator CustomIndicator(string symbol, int length, int dayOfYear, Resolution? resolution = null) { var name = CreateIndicatorName(symbol, string.Format("CUST({0}, day {1})", length, dayOfYear), resolution); var ind = new CustomIndicator(name, length, dayOfYear); RegisterIndicator(symbol, ind, resolution); return ind; } } public class CustomIndicator : BarIndicator, QuantConnect.Indicators.IIndicator<IBaseDataBar> { private string name; private int length; private RollingWindow<decimal> _values; public int dayOfYear {get;} public CustomIndicator(string name, int length, int dayOfYear) : base(name) { this.name = name; this.length = length; this.dayOfYear = dayOfYear; this._values = new RollingWindow<decimal>(length); } protected override decimal ComputeNextValue(IBaseDataBar halfHourBar) { //Fill data into the RollingWindow //Console.WriteLine(" In Compute...: " + this.dayOfYear + " " + halfHourBar.Open + " " + halfHourBar.Low + " " + halfHourBar.High + " " + halfHourBar.Close); return 0m; } public override bool IsReady { get { return _values != null && _values.Count > 0; } } } }