/// <summary> /// Slices this collection, returning a new collection containing only /// positions with the specified <paramref name="right"/> /// </summary> public OptionPositionCollection Slice(OptionRight right, bool includeUnderlying = true) { var rights = _rights.Remove(right.Invert()); var positions = ImmutableDictionary <Symbol, OptionPosition> .Empty; if (includeUnderlying && HasUnderlying) { positions = positions.Add(Underlying, UnderlyingPosition); } var sides = ImmutableDictionary <PositionSide, ImmutableHashSet <Symbol> > .Empty; var strikes = ImmutableSortedDictionary <decimal, ImmutableHashSet <Symbol> > .Empty; var expirations = ImmutableSortedDictionary <DateTime, ImmutableHashSet <Symbol> > .Empty; foreach (var symbol in rights.SelectMany(kvp => kvp.Value)) { var position = _positions[symbol]; sides = sides.Add(position.Side, symbol); positions = positions.Add(symbol, position); strikes = strikes.Add(position.Strike, symbol); expirations = expirations.Add(position.Expiration, symbol); } return(new OptionPositionCollection(positions, rights, sides, strikes, expirations)); }
private SecurityHolding CreateHolding(int quantity) => CreateHolding(Symbol.CreateOption(Symbols.SPY, Market.USA, OptionStyle.American, _previousRight.Invert(), _previousStrike + 1, Expirations.Dequeue()), quantity);