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 |
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using QuantConnect.Data; using QuantConnect.Data.Market; using QuantConnect.Indicators; using QuantConnect.Orders; using QuantConnect.Securities; using QuantConnect.Securities.Option; namespace QuantConnect.Algorithm.CSharp.Options { public class DebitBullCallSpreadAlgorithm : QCAlgorithm { const string underlyingTicker = "AAPL"; public readonly decimal cash = 1000000; public readonly int minExpirationDays = 0; public readonly int maxExpirationDays = 4; public readonly int minStrike = -20; public readonly int maxStrike = 20; public readonly Symbol underlying = QuantConnect.Symbol.Create(underlyingTicker, SecurityType.Equity, Market.USA); public readonly Symbol optionSymbol = QuantConnect.Symbol.Create(underlyingTicker, SecurityType.Option, Market.USA); int counter = 0; public override void Initialize() { this.SetStartDate(2013, 1, 1); this.SetEndDate(2013, 5, 1); this.SetCash(cash); this.AddEquity(underlyingTicker); this.SetBenchmark(this.underlying); var option = this.AddOption(underlyingTicker); option.SetFilter(universe => from symbol in universe.Strikes(minStrike, maxStrike).Expiration(TimeSpan.FromDays(this.minExpirationDays), TimeSpan.FromDays(this.maxExpirationDays)) select symbol); { // log experiment parameters string message = "DebitBullCallSpreadAlgorithm: UnderlyingTicker=[" + underlyingTicker + "]"; message += ", minStrike=[" + minStrike + "], maxStrike=[" + maxStrike + "]"; message += ", minExpirationDays=[" + minExpirationDays + "], maxExpirationDays=[" + maxExpirationDays + "], cash =[" + cash + "],"; message += ", weekly and monthly options"; Debug(message); } var stockPlot = new Chart("AAPL"); stockPlot.AddSeries(new Series("AAPL", SeriesType.Line, 0)); stockPlot.AddSeries(new Series("maxBetPut", SeriesType.Line, 0)); stockPlot.AddSeries(new Series("maxBetCall", SeriesType.Line, 0)); stockPlot.AddSeries(new Series("friday", SeriesType.Scatter, 1)); // stockPlot.AddSeries(new Series("distributionWidthPut", SeriesType.Scatter, 3)); // stockPlot.AddSeries(new Series("distributionWidthCall", SeriesType.Scatter, 4)); AddChart(stockPlot); } public override void OnData(Slice slice) { IEnumerable<OptionContract> contracts = null; { OptionChain chain; if (slice.OptionChains.TryGetValue(this.optionSymbol, out chain)) { contracts = (from contract in chain select contract); } } this.Plot(contracts); } public void Plot(IEnumerable<OptionContract> contracts) { // guard against being called after trading hours if (this.Time.TimeOfDay < new TimeSpan(9, 30, 0) || this.Time.TimeOfDay > new TimeSpan(16, 0, 0)) { return; } if (contracts == null || contracts.Count() == 0) { return; } // plot every 10 minutes counter++; if (counter == 10) { counter = 0; OptionContract maxBetPut = FindContractWithMaxDollarBet(contracts, OptionRight.Put); OptionContract maxBetCall = FindContractWithMaxDollarBet(contracts, OptionRight.Call); Plot("AAPL", "AAPL", maxBetPut.UnderlyingLastPrice); Plot("AAPL", "maxBetPut", maxBetPut.Strike); Plot("AAPL", "maxBetCall", maxBetCall.Strike); if(this.Time.DayOfWeek == DayOfWeek.Friday) { Plot("AAPL", "friday", 1); } } } private OptionContract FindContractWithMaxDollarBet(IEnumerable<OptionContract> contracts, OptionRight right) { OptionContract foundContract = null; if (right == OptionRight.Put) { foundContract = ( from contract in contracts .OrderByDescending(contract => (contract.OpenInterest * contract.LastPrice)) where contract.Right == right select contract ).FirstOrDefault(); } else { foundContract = ( from contract in contracts .OrderByDescending(contract => (contract.OpenInterest * contract.LastPrice)) where contract.Right == right select contract ).FirstOrDefault(); } if (foundContract != null) { return foundContract; } throw new Exception("Did not find contract with max dollar bet for=[" + right + "], [" + this.optionSymbol.Value + "]"); } } }