/// <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(); }
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])); }
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); } }
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); } } }
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); } }
/// <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); } }
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); } } }
private static string PositionToString(PositionChangeMessage position) { return($"{position.SecurityId.SecurityCode};{position.PortfolioName};{position.Changes[PositionChangeTypes.BeginValue]};{position.Changes[PositionChangeTypes.CurrentValue]};{position.Changes[PositionChangeTypes.AveragePrice]}"); }
/// <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)); } }
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 }); }
/// <summary> /// /// </summary> /// <param name="message"></param> public void SaveDirect(PositionChangeMessage message) { OnInnerAdapterNewOutMessage(message); }
private static string PositionToString(PositionChangeMessage position) { return $"{position.SecurityId.SecurityCode};{position.PortfolioName};{position.Changes[PositionChangeTypes.BeginValue]};{position.Changes[PositionChangeTypes.CurrentValue]};{position.Changes[PositionChangeTypes.AveragePrice]}"; }
public static void WritePosition(this PositionChangeMessage position) { MemoryToFile(PositionToString(position), _positionsFilePath); }
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]); }
private void ProcessPositionChangeMessage(PositionChangeMessage posChgMsg) { }