Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        private void RaisePositionChanged(Position position)
        {
            PositionChanged.SafeInvoke(position);

            var multiEvt = PositionsChanged;

            if (multiEvt == null)
            {
                return;
            }

            multiEvt.SafeInvoke(new[] { position });
        }
Ejemplo n.º 3
0
 internal void OnUpdatePosition(string portfolioName, string securityId, double avPrice, double amount, double planned)
 {
     PositionChanged.SafeInvoke(portfolioName, securityId, avPrice.ToDecimal(), amount.ToDecimal(), planned.ToDecimal());
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 internal void OnUpdatePosition(string portfolioName, string securityId, double avPrice, double amount, double planned)
 {
     PositionChanged.SafeInvoke(portfolioName, securityId, SafeCast(avPrice), SafeCast(amount), SafeCast(planned));
 }
Ejemplo n.º 6
0
 private void PositionChangedHandler(Position position)
 {
     AddGuiAction(() => PositionChanged.SafeInvoke(position));
 }