Overall Statistics |
Total Trades 343 Average Win 0.00% Average Loss -0.22% Compounding Annual Return 0.358% Drawdown 0.200% Expectancy 0.007 Net Profit 0.224% Sharpe Ratio 1.511 Loss Rate 1% Win Rate 99% Profit-Loss Ratio 0.01 Alpha 0.006 Beta -0.176 Annual Standard Deviation 0.002 Annual Variance 0 Information Ratio -6.696 Tracking Error 0.002 Treynor Ratio -0.017 Total Fees $43.75 |
using System.Drawing; using System.Threading; using System.Threading.Tasks; namespace QuantConnect { public partial class ShortStrangle : QCAlgorithm { string iSymbol = "SPY"; DateTime iTime; public override void Initialize() { SetCash(100000); SetStartDate(2018, 1, 1); SetEndDate(DateTime.Now.Date); SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage); AddEquity(iSymbol, Resolution.Minute); } public void OnData(TradeBars data) { if (IsMarketOpen(iSymbol) == false) { return; } if (IsNewBar(TimeSpan.FromHours(1)) == false) { return; } var price = Securities[iSymbol].Price; if (Portfolio[iSymbol].Invested) { Liquidate(); } if (Portfolio.Invested == false) { var contracts = OptionChainProvider.GetOptionContractList(iSymbol, Time); var longPut = contracts .Where(c => c.ID.OptionRight == OptionRight.Put) .Where(c => price - c.ID.StrikePrice >= 0 && price - c.ID.StrikePrice <= 5) .OrderBy(c => c.ID.Date) .ThenBy(c => c.ID.StrikePrice) .FirstOrDefault(); var longCall = contracts .Where(c => c.ID.OptionRight == OptionRight.Call) .Where(c => c.ID.StrikePrice - price >= 0 && c.ID.StrikePrice - price <= 5) .OrderBy(c => c.ID.Date) .ThenByDescending(c => c.ID.StrikePrice) .FirstOrDefault(); var shortPut = contracts .Where(c => c.ID.OptionRight == OptionRight.Put) .Where(c => price - c.ID.StrikePrice > 5 && price - c.ID.StrikePrice <= 10) .OrderBy(c => c.ID.Date) .ThenBy(c => c.ID.StrikePrice) .FirstOrDefault(); var shortCall = contracts .Where(c => c.ID.OptionRight == OptionRight.Call) .Where(c => c.ID.StrikePrice - price > 5 && c.ID.StrikePrice - price <= 10) .OrderBy(c => c.ID.Date) .ThenByDescending(c => c.ID.StrikePrice) .FirstOrDefault(); if (longCall != null && longPut != null && shortCall != null && shortPut != null) { AddOptionContract(longPut, Resolution.Minute); AddOptionContract(longCall, Resolution.Minute); AddOptionContract(shortPut, Resolution.Minute); AddOptionContract(shortCall, Resolution.Minute); MarketOrder(longPut, -1); MarketOrder(longCall, -1); MarketOrder(shortPut, -1); MarketOrder(shortCall, -1); } } } public bool IsNewBar(TimeSpan interval, int points = 1) { var date = Securities[iSymbol].LocalTime; if ((date - iTime).TotalSeconds > interval.TotalSeconds * points) { iTime = new DateTime(date.Ticks - date.Ticks % interval.Ticks, date.Kind); return true; } return false; } } }