/// <inheritdoc />
        protected override void OnInnerAdapterNewOutMessage(Message message)
        {
            PositionChangeMessage change = null;

            if (message.Type != MessageTypes.Reset &&
                message.Type != MessageTypes.Connect &&
                message.Type != MessageTypes.Disconnect)
            {
                lock (_sync)
                    change = _positionManager.ProcessMessage(message);
            }

            base.OnInnerAdapterNewOutMessage(message);

            if (change != null)
            {
                var subscriptions = change.StrategyId.IsEmpty() ? _subscriptions.Cache : _strategySubscriptions.TryGetValue(change.StrategyId)?.Cache;

                if (subscriptions?.Length > 0)
                {
                    change.SetSubscriptionIds(subscriptions);
                }

                base.OnInnerAdapterNewOutMessage(change);
            }
        }
        private void ProcessPositionChange(PositionChangeMessage message)
        {
            if (message.StrategyId != EnsureGetId())
            {
                return;
            }

            var connector = SafeGetConnector();

            var security  = connector.LookupById(message.SecurityId);
            var portfolio = connector.LookupByPortfolioName(message.PortfolioName);

            var position = _positions.SafeAdd(CreateKey(security, portfolio), k => new Position
            {
                Security   = security,
                Portfolio  = portfolio,
                StrategyId = message.StrategyId,
            }, out var isNew);

            position.ApplyChanges(message);

            if (isNew)
            {
                _newPosition?.Invoke(position);
            }
            else
            {
                _positionChanged?.Invoke(position);
            }

            RaisePositionChanged();
        }
Example #3
0
 private static string PositionToString(PositionChangeMessage position)
 {
     return(string.Format("{0};{1};{2};{3};{4}",
                          position.SecurityId.SecurityCode,
                          position.PortfolioName,
                          position.Changes[PositionChangeTypes.BeginValue],
                          position.Changes[PositionChangeTypes.CurrentValue],
                          position.Changes[PositionChangeTypes.AveragePrice]));
 }
Example #4
0
        private void ProcessPositionChangeMessage(PositionChangeMessage message)
        {
            if (Connector.KeepStrategiesPositions)
            {
                return;
            }

            if (message.StrategyId == EnsureGetId())
            {
                ProcessPositionChangeMessageImpl(message);
            }
        }
        private void ProcessPortfolioLookupMessage(PortfolioLookupMessage message)
        {
            var portfolios = _client.GetPortfolios();

            foreach (var portfolio in portfolios)
            {
                SendOutMessage(new PortfolioMessage
                {
                    PortfolioName         = portfolio.bstrAcct,
                    State                 = PortfolioStates.Active,     // ???
                    OriginalTransactionId = message.TransactionId,
                });
            }

            var pos = _client.GetPositions();

            foreach (var position in pos)
            {
                var m = new PositionMessage
                {
                    PortfolioName = position.bstrAcct,
                    SecurityId    = new SecurityId {
                        SecurityCode = position.bstrSym, BoardCode = "All", SecurityType = position.bstrInstrument.ToSecurityType()
                    },
                    OriginalTransactionId = message.TransactionId,
                };

                SendOutMessage(m);

                var changeMsg = new PositionChangeMessage
                {
                    PortfolioName = position.bstrAcct,
                    SecurityId    = new SecurityId {
                        SecurityCode = position.bstrSym, BoardCode = "All", SecurityType = position.bstrInstrument.ToSecurityType()
                    },
                    ServerTime = CurrentTime
                };

                changeMsg.TryAdd(PositionChangeTypes.RealizedPnL, (decimal)position.fReal);
                changeMsg.TryAdd(PositionChangeTypes.BeginValue, (decimal)position.nOpeningPosition);
                changeMsg.TryAdd(PositionChangeTypes.CurrentValue, (decimal)(position.nOpeningPosition + (position.nSharesBot - position.nSharesSld)));
                changeMsg.TryAdd(PositionChangeTypes.Commission, (decimal)position.fPositionCost);

                SendOutMessage(message);
            }

            SendOutMessage(new PortfolioLookupResultMessage {
                OriginalTransactionId = message.TransactionId
            });
        }
        private void SessionOnStiPositionUpdate(ref structSTIPositionUpdate msg)
        {
            var message = new PositionChangeMessage
            {
                PortfolioName = msg.bstrAcct,
                SecurityId    = new SecurityId {
                    SecurityCode = msg.bstrSym, BoardCode = "All"
                },
            };

            message.TryAdd(PositionChangeTypes.RealizedPnL, (decimal)msg.fReal);
            message.TryAdd(PositionChangeTypes.BeginValue, (decimal)msg.nOpeningPosition);
            message.TryAdd(PositionChangeTypes.CurrentValue, (decimal)(msg.nOpeningPosition + (msg.nSharesBot - msg.nSharesSld)));
            message.TryAdd(PositionChangeTypes.Commission, (decimal)msg.fPositionCost);

            SendOutMessage(message);
        }
        /// <inheritdoc />
        protected override void OnInnerAdapterNewOutMessage(Message message)
        {
            PositionChangeMessage change = null;

            if (message.Type != MessageTypes.Reset)
            {
                change = _positionManager.ProcessMessage(message);
            }

            base.OnInnerAdapterNewOutMessage(message);

            if (change != null)
            {
                _buffer?.ProcessOutMessage(change);
                base.OnInnerAdapterNewOutMessage(change);
            }
        }
Example #8
0
        private void ProcessPositionChangeMessage(PositionChangeMessage message)
        {
            if (Connector.KeepStrategiesPositions)
            {
                return;
            }

            if (message.StrategyId != EnsureGetId())
            {
                return;
            }

            var connector = SafeGetConnector();

            var security  = connector.LookupById(message.SecurityId);
            var portfolio = connector.LookupByPortfolioName(message.PortfolioName);

            var position = _positions.SafeAdd(CreateKey(security, portfolio), k => new Position
            {
                Security   = security,
                Portfolio  = portfolio,
                StrategyId = message.StrategyId,
            }, out var isNew);

            position.ApplyChanges(message);

            if (isNew)
            {
                _newPosition?.Invoke(position);
            }
            else
            {
                _positionChanged?.Invoke(position);
            }

            RaisePositionChanged();

            foreach (var id in message.GetSubscriptionIds())
            {
                if (_subscriptionsById.TryGetValue(id, out var subscription))
                {
                    PositionReceived?.Invoke(subscription, position);
                }
            }
        }
Example #9
0
    private void BroadcastPositionChangeToRelevantPlayers()
    {
        if (m_RelChecker.RelevantTo.Count == 0)
        {
            return;
        }

        var msg = new PositionChangeMessage
        {
            Pos         = m_LastPos,
            TargetNetID = netId
        };

        foreach (var nc in m_RelChecker.RelevantTo)
        {
            nc.Send(MessageType.PositionChange, msg);
        }
    }
Example #10
0
        /// <inheritdoc />
        public void Update(PositionChangeMessage posMsg, Action <Message> result)
        {
            var beginValue = posMsg.TryGetDecimal(PositionChangeTypes.BeginValue);

            if (posMsg.IsMoney())
            {
                if (beginValue == null)
                {
                    return;
                }

                _currentMoney = _beginMoney = (decimal)beginValue;

                RequestPortfolioState(posMsg.ServerTime, result);
                return;
            }

            var info = GetPosition(posMsg.SecurityId);

            var prevPrice = info.PositionPrice;

            info.PositionBeginValue   = beginValue ?? 0L;
            info.PositionAveragePrice = posMsg.TryGetDecimal(PositionChangeTypes.AveragePrice) ?? info.PositionAveragePrice;

            //if (beginValue == 0m)
            //	return;

            result(posMsg.Clone());

            _totalBlockedMoney = _totalBlockedMoney - prevPrice + info.PositionPrice;

            result(
                new PositionChangeMessage
            {
                SecurityId    = SecurityId.Money,
                ServerTime    = posMsg.ServerTime,
                LocalTime     = posMsg.LocalTime,
                PortfolioName = _portfolioName,
            }.Add(PositionChangeTypes.BlockedValue, _totalBlockedMoney)
                );
        }
		private void ProcessPositionChangeMessage(PositionChangeMessage message)
		{
			var security = LookupSecurity(message.SecurityId);
			var portfolio = GetPortfolio(message.PortfolioName);

			var valueInLots = message.Changes.TryGetValue(PositionChangeTypes.CurrentValueInLots);
			if (valueInLots != null)
			{
				if (!message.Changes.ContainsKey(PositionChangeTypes.CurrentValue))
				{
					var currValue = (decimal)valueInLots / (security.VolumeStep ?? 1);
					message.Add(PositionChangeTypes.CurrentValue, currValue);
				}

				message.Changes.Remove(PositionChangeTypes.CurrentValueInLots);
			}

			var position = GetPosition(portfolio, security, message.ClientCode, message.DepoName, message.LimitType, message.Description);
			position.ApplyChanges(message);

			RaisePositionChanged(position);
		}
        private void ProcessPositionChange(PositionChangeMessage message)
        {
            if (message.StrategyId != EnsureGetId())
            {
                return;
            }

            var security = SafeGetConnector().LookupById(message.SecurityId);
            var pf       = SafeGetConnector().LookupByPortfolioName(message.PortfolioName);

            var position = GetPosition(security, pf, out var isNew);

            position.ApplyChanges(message);

            if (isNew)
            {
                _newPosition?.Invoke(position);
            }
            else
            {
                _positionChanged?.Invoke(position);
            }
        }
        /// <inheritdoc />
        protected override void OnInnerAdapterNewOutMessage(Message message)
        {
            PositionChangeMessage change = null;

            if (message.Type != MessageTypes.Reset)
            {
                change = _positionManager.ProcessMessage(message);
            }

            base.OnInnerAdapterNewOutMessage(message);

            if (change != null)
            {
                var subscriptions = _subscriptions.Cache;

                if (subscriptions.Length > 0)
                {
                    change.SetSubscriptionIds(subscriptions);
                }

                base.OnInnerAdapterNewOutMessage(change);
            }
        }
Example #14
0
        private void ProcessPositionMessage(PositionMessage posMsg)
        {
            if (posMsg.ExtensionInfo != null && posMsg.ExtensionInfo.ContainsKey("GetPositions"))
            {
                var pos = SessionHolder.Session.GetPositions();

                foreach (var position in pos)
                {
                    var m = new PositionMessage
                    {
                        PortfolioName = position.bstrAcct,
                        SecurityId    = new SecurityId {
                            SecurityCode = position.bstrSym, BoardCode = "All", SecurityType = position.bstrInstrument.ToSecurityType()
                        },
                    };

                    SendOutMessage(m);

                    var message = new PositionChangeMessage
                    {
                        PortfolioName = position.bstrAcct,
                        SecurityId    = new SecurityId {
                            SecurityCode = position.bstrSym, BoardCode = "All", SecurityType = position.bstrInstrument.ToSecurityType()
                        },
                        ServerTime = SessionHolder.CurrentTime
                    };

                    message.Changes.TryAdd(new KeyValuePair <PositionChangeTypes, object>(PositionChangeTypes.RealizedPnL, (decimal)position.fReal));
                    message.Changes.TryAdd(new KeyValuePair <PositionChangeTypes, object>(PositionChangeTypes.BeginValue, (decimal)position.nOpeningPosition));
                    message.Changes.TryAdd(new KeyValuePair <PositionChangeTypes, object>(PositionChangeTypes.CurrentValue, (decimal)(position.nOpeningPosition + (position.nSharesBot - position.nSharesSld))));
                    message.Changes.TryAdd(new KeyValuePair <PositionChangeTypes, object>(PositionChangeTypes.Commission, (decimal)position.fPositionCost));

                    SendOutMessage(message);
                }
            }
        }
Example #15
0
 private static string PositionToString(PositionChangeMessage position)
 {
     return($"{position.SecurityId.SecurityCode};{position.PortfolioName};{position.Changes[PositionChangeTypes.BeginValue]};{position.Changes[PositionChangeTypes.CurrentValue]};{position.Changes[PositionChangeTypes.AveragePrice]}");
 }
Example #16
0
        /// <inheritdoc />
        protected override bool?OnRead(IFixReader reader, string msgType, Action <Message> messageHandler)
        {
            switch (msgType)
            {
            // reading custom CFH message (not compatible with FIX standard)
            case CfhFixMessages.AccountInfo:
            {
                string        account     = null;
                var           sendingTime = default(DateTimeOffset);
                decimal?      closedPnL   = null;
                decimal?      openPnL     = null;
                decimal?      balance     = null;
                CurrencyTypes?currency    = null;

                var isOk = reader.ReadMessage(tag =>
                    {
                        switch (tag)
                        {
                        case FixTags.Account:
                            account = reader.ReadString();
                            return(true);

                        case FixTags.SendingTime:
                            sendingTime = reader.ReadUtc(TimeStampParser);
                            return(true);

                        case CfhFixTags.ClosedPnL:
                            closedPnL = reader.ReadDecimal();
                            return(true);

                        case CfhFixTags.OpenPnL:
                            openPnL = reader.ReadDecimal();
                            return(true);

                        case CfhFixTags.Balance:
                            balance = reader.ReadDecimal();
                            return(true);

                        case FixTags.Currency:
                            currency = reader.ReadString().FromMicexCurrencyName(this.AddErrorLog);
                            return(true);

                        default:
                            return(false);
                        }
                    });

                if (!isOk)
                {
                    return(null);
                }

                var msg = new PositionChangeMessage
                {
                    SecurityId    = SecurityId.Money,
                    PortfolioName = account,
                    ServerTime    = sendingTime
                }
                .TryAdd(PositionChangeTypes.RealizedPnL, closedPnL, true)
                .TryAdd(PositionChangeTypes.UnrealizedPnL, openPnL, true)
                .TryAdd(PositionChangeTypes.CurrentValue, balance, true);

                if (currency != null)
                {
                    msg.Add(PositionChangeTypes.Currency, currency.Value);
                }

                messageHandler(msg);
                return(true);
            }

            default:
                return(base.OnRead(reader, msgType, messageHandler));
            }
        }
Example #17
0
 public void ReceivePositionChangeMessage(PositionChangeMessage msg)
 {
     m_SyncPos = msg.Pos;
 }
		private void SessionOnStiPositionUpdate(ref structSTIPositionUpdate msg)
		{
			var message = new PositionChangeMessage
			{
				PortfolioName = msg.bstrAcct,
				SecurityId = new SecurityId { SecurityCode = msg.bstrSym, BoardCode = AssociatedBoardCode },
			};

			message.TryAdd(PositionChangeTypes.RealizedPnL, (decimal)msg.fReal);
			message.TryAdd(PositionChangeTypes.BeginValue, (decimal)msg.nOpeningPosition);
			message.TryAdd(PositionChangeTypes.CurrentValue, (decimal)(msg.nOpeningPosition + (msg.nSharesBot - msg.nSharesSld)));
			message.TryAdd(PositionChangeTypes.Commission, (decimal)msg.fPositionCost);

			SendOutMessage(message);
		}
		private void ProcessPortfolioLookupMessage(PortfolioLookupMessage message)
		{
			var portfolios = _client.GetPortfolios();

			foreach (var portfolio in portfolios)
			{
				SendOutMessage(new PortfolioMessage
				{
					PortfolioName = portfolio.bstrAcct,
					State = PortfolioStates.Active, // ???
					OriginalTransactionId = message.TransactionId,
				});
			}

			var pos = _client.GetPositions();

			foreach (var position in pos)
			{
				var m = new PositionMessage
				{
					PortfolioName = position.bstrAcct,
					SecurityId = new SecurityId { SecurityCode = position.bstrSym, BoardCode = AssociatedBoardCode, SecurityType = position.bstrInstrument.ToSecurityType() },
					OriginalTransactionId = message.TransactionId,
				};

				SendOutMessage(m);

				var changeMsg = new PositionChangeMessage
				{
					PortfolioName = position.bstrAcct,
					SecurityId = new SecurityId { SecurityCode = position.bstrSym, BoardCode = AssociatedBoardCode, SecurityType = position.bstrInstrument.ToSecurityType() },
					ServerTime = CurrentTime
				};

				changeMsg.TryAdd(PositionChangeTypes.RealizedPnL, (decimal)position.fReal);
				changeMsg.TryAdd(PositionChangeTypes.BeginValue, (decimal)position.nOpeningPosition);
				changeMsg.TryAdd(PositionChangeTypes.CurrentValue, (decimal)(position.nOpeningPosition + (position.nSharesBot - position.nSharesSld)));
				changeMsg.TryAdd(PositionChangeTypes.Commission, (decimal)position.fPositionCost);

				SendOutMessage(message);
			}

			SendOutMessage(new PortfolioLookupResultMessage { OriginalTransactionId = message.TransactionId });
		}
Example #20
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="message"></param>
 public void SaveDirect(PositionChangeMessage message)
 {
     OnInnerAdapterNewOutMessage(message);
 }
Example #21
0
 private static string PositionToString(PositionChangeMessage position)
 {
     return $"{position.SecurityId.SecurityCode};{position.PortfolioName};{position.Changes[PositionChangeTypes.BeginValue]};{position.Changes[PositionChangeTypes.CurrentValue]};{position.Changes[PositionChangeTypes.AveragePrice]}";
 }
Example #22
0
 public static void WritePosition(this PositionChangeMessage position)
 {
     MemoryToFile(PositionToString(position), _positionsFilePath);
 }
Example #23
0
 private static string PositionToString(PositionChangeMessage position)
 {
     return string.Format("{0};{1};{2};{3};{4}",
         position.SecurityId.SecurityCode,
         position.PortfolioName,
         position.Changes[PositionChangeTypes.BeginValue],
         position.Changes[PositionChangeTypes.CurrentValue],
         position.Changes[PositionChangeTypes.AveragePrice]);
 }
Example #24
0
 private void ProcessPositionChangeMessage(PositionChangeMessage posChgMsg)
 {
 }