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 { public partial class IronCondorSeller : QCAlgorithm { string _symbol = "SPY"; string _equitySymbol; string _optionSymbol; private Slice lastSlice = null; private bool orderedOnce = false; public override void Initialize() { //Start and End Date range for the backtest: SetStartDate(2016, 01, 01); SetEndDate(2016, 06, 3); //Cash allocation SetCash(25000); var equity = AddEquity(_symbol, Resolution.Minute); _equitySymbol = equity.Symbol; Securities[_symbol].SetDataNormalizationMode(DataNormalizationMode.TotalReturn); var option = AddOption(_symbol); _optionSymbol = option.Symbol; option.SetFilter( universe => from symbol in universe .Expiration(TimeSpan.FromDays(10), TimeSpan.FromDays(55)) where symbol.ID.OptionRight == OptionRight.Put && (symbol.ID.StrikePrice - universe.Underlying.Price) / universe.Underlying.Price >= -0.15m select symbol ); Schedule.On(DateRules.EveryDay(_symbol), TimeRules.At(9, 35), () => { ConsiderTrade(); }); } //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol. public void OnData(Slice data) { if (IsWarmingUp) { return;} lastSlice = data; } public override void OnEndOfDay() { //if (Time.Date == new DateTime(2012,09,22)) // Comment this out in live mode (for controlled backtest) { if (lastSlice == null) { return; } Log(String.Format("{0} closed at {1}", _symbol, lastSlice.Bars[_symbol].Close.ToString("#.####") )); } } private void ConsiderTrade() { //if (orderedOnce) { return; } //if (Time.Date == new DateTime(2012,08,22)) // Comment this out in live mode (for controlled backtest) { Debug("Consider"); if (lastSlice == null) { Debug("Noslice"); return; } if (lastSlice.Bars == null) { Debug("Noslice bars"); return;} if (!lastSlice.Bars.ContainsKey(_symbol)) { Debug("Noslice bars symbol"); return; } OrderCallOption(lastSlice); } } public void OrderCallOption(Slice slice) { Debug("Order"); OptionChain chain; if (slice.OptionChains.TryGetValue(_optionSymbol, out chain)) { // find the first call strike under market price expiring today var contracts = ( from optionContract in chain.OrderByDescending(x => x.Strike) where optionContract.Right == OptionRight.Put where optionContract.Expiry > Time.Date where optionContract.Strike < chain.Underlying.Price select optionContract ).Take(100); // Show Chain OptionContract contract = null; foreach (OptionContract _contract in contracts) { Decimal pctOtm = ((_contract.Strike - _contract.UnderlyingLastPrice) / _contract.UnderlyingLastPrice) * 100; /*Log(String.Format("Chain => Option Contract. Strike {0}, ULPrice={1}, Bid={2}, Ask={3}, Expiry={4} {5}, {6}%", _contract.Strike, _contract.UnderlyingLastPrice, _contract.BidPrice, _contract.AskPrice, _contract.Expiry, _contract.Expiry.DayOfWeek.ToString(), pctOtm.ToString("#.####") ));*/ if (contract == null) { contract = _contract; } } if (contract != null) { Debug("Ordering"); orderedOnce = true; int numContracts = -10; string message = String.Format("Order Option Contract. Strike {0} x {1}, ULPrice={2}, Bid={3}, Ask={4}, Expiry={5} {6}",numContracts,contract.Strike,contract.UnderlyingLastPrice,contract.BidPrice,contract.AskPrice,contract.Expiry,contract.Expiry.DayOfWeek.ToString()); Log(message); MarketOrder(contract.Symbol, numContracts,tag:"Sell Option"); }else{ Debug("No Option Contract Found"); } }else{ Debug("No Option Contract Found [TryGetValue]"); } } public override void OnOrderEvent(OrderEvent fill) { // if (fill.Status.IsFill()) { string message = String.Format("Order {0} {1} x {2} at {3} commission={4} OrderId={5}", fill.Status.ToString(), fill.FillQuantity, fill.Symbol, fill.FillPrice, fill.OrderFee, fill.OrderId); Log(message); } } } }