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