private void ChangePosition(Security security, Portfolio portfolio, decimal diff) { if (security == null) { throw new ArgumentNullException("security"); } if (portfolio == null) { throw new ArgumentNullException("portfolio"); } bool isNew; var position = _positions.SafeAdd(Tuple.Create(security, portfolio), key => new Position { Security = key.Item1, Portfolio = key.Item2 }, out isNew); position.CurrentValue += diff; if (isNew) { NewPosition.SafeInvoke(position); } else { PositionChanged.SafeInvoke(position); } }
private void RaisePositionChanged(Position position) { PositionChanged.SafeInvoke(position); var multiEvt = PositionsChanged; if (multiEvt == null) { return; } multiEvt.SafeInvoke(new[] { position }); }
internal void OnUpdatePosition(string portfolioName, string securityId, double avPrice, double amount, double planned) { PositionChanged.SafeInvoke(portfolioName, securityId, avPrice.ToDecimal(), amount.ToDecimal(), planned.ToDecimal()); }
/// <summary> /// To calculate position. /// </summary> /// <param name="message">Message.</param> /// <returns>The position by order or trade.</returns> public decimal?ProcessMessage(Message message) { switch (message.Type) { case MessageTypes.Reset: { Reset(); break; } case MessageTypes.Execution: { var execMsg = (ExecutionMessage)message; var key = Tuple.Create(execMsg.SecurityId, execMsg.PortfolioName); switch (execMsg.ExecutionType) { case ExecutionTypes.Order: { if (!ByOrders) { return(0); } var orderId = execMsg.OriginalTransactionId; var newPosition = execMsg.GetPosition(); bool? isNew = null; decimal position; lock (_positions.SyncRoot) { Tuple <Sides, decimal> oldPosition; if (_byOrderPositions.TryGetValue(orderId, out oldPosition)) { if (newPosition != oldPosition.Item2) { _byOrderPositions[orderId] = Tuple.Create(execMsg.Side, newPosition); isNew = false; } position = newPosition - oldPosition.Item2; } else { _byOrderPositions.Add(orderId, Tuple.Create(execMsg.Side, newPosition)); position = newPosition; isNew = true; } _positions[key] = _positions.TryGetValue(key) + position; Position += position; } if (isNew == true) { NewPosition.SafeInvoke(new KeyValuePair <Tuple <SecurityId, string>, decimal>(key, position)); } else if (isNew == false) { PositionChanged.SafeInvoke(new KeyValuePair <Tuple <SecurityId, string>, decimal>(key, position)); } return(position); } case ExecutionTypes.Trade: { if (ByOrders) { return(0); } var position = execMsg.GetPosition(); if (position == 0) { break; } bool isNew; lock (_positions.SyncRoot) { decimal prev; isNew = _positions.TryGetValue(key, out prev); _positions[key] = prev + position; Position += position; } if (isNew) { NewPosition.SafeInvoke(new KeyValuePair <Tuple <SecurityId, string>, decimal>(key, position)); } else { PositionChanged.SafeInvoke(new KeyValuePair <Tuple <SecurityId, string>, decimal>(key, position)); } return(position); } } break; } } return(null); }
internal void OnUpdatePosition(string portfolioName, string securityId, double avPrice, double amount, double planned) { PositionChanged.SafeInvoke(portfolioName, securityId, SafeCast(avPrice), SafeCast(amount), SafeCast(planned)); }
private void PositionChangedHandler(Position position) { AddGuiAction(() => PositionChanged.SafeInvoke(position)); }