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; }
		}
	}    
}