public static SubscriptionKey CreateKey(this MarketDataMessage message, SecurityId?securityId = null) { if (message == null) { throw new ArgumentNullException(nameof(message)); } var isRealTime = message.To == null; var range = isRealTime ? null : Tuple.Create(message.From, message.To, message.Count); return(new SubscriptionKey(message.DataType, securityId ?? message.SecurityId, message.Arg, message.MaxDepth, range)); }
private void ProcessMessage <TMessage>(SecurityId securityId, TMessage message, Func <TMessage, TMessage, TMessage> processSuspend) where TMessage : Message { var native = securityId.Native; if (native != null) { SecurityId?fullSecurityId; lock (_syncRoot) fullSecurityId = _securityIds.TryGetValue2(native); if (fullSecurityId == null) { lock (_syncRoot) { var tuple = _suspendedOutMessages.SafeAdd(securityId, key => RefTuple.Create((List <Message>)null, (Dictionary <MessageTypes, Message>)null)); var clone = message.Clone(); if (processSuspend == null) { if (tuple.First == null) { tuple.First = new List <Message>(); } tuple.First.Add(clone); } else { if (tuple.Second == null) { tuple.Second = new Dictionary <MessageTypes, Message>(); } var prev = tuple.Second.TryGetValue(clone.Type); tuple.Second[clone.Type] = prev == null ? clone : processSuspend((TMessage)prev, (TMessage)clone); } } return; } message.ReplaceSecurityId(fullSecurityId.Value); } else { var securityCode = securityId.SecurityCode; var boardCode = securityId.BoardCode; var isSecCodeEmpty = securityCode.IsEmpty(); if (isSecCodeEmpty && message.Type != MessageTypes.Execution) { throw new InvalidOperationException(); } if (!isSecCodeEmpty && boardCode.IsEmpty()) { SecurityId?foundId = null; lock (_syncRoot) { foreach (var id in _securityIds.Values) { if (!id.SecurityCode.CompareIgnoreCase(securityCode)) { continue; } if (securityId.SecurityType != null && securityId.SecurityType != id.SecurityType) { continue; } foundId = id; } if (foundId == null) { var tuple = _suspendedOutMessages.SafeAdd(securityId, key => RefTuple.Create(new List <Message>(), (Dictionary <MessageTypes, Message>)null)); tuple.First.Add(message.Clone()); return; } } message.ReplaceSecurityId(foundId.Value); //// если указан код и тип инструмента, то пытаемся найти инструмент по ним //if (securityId.SecurityType != null) //{ //} //else // throw new ArgumentException(nameof(securityId), LocalizedStrings.Str682Params.Put(securityCode, securityId.SecurityType)); } } base.OnInnerAdapterNewOutMessage(message); }
public static Tuple <MarketDataTypes, SecurityId, object, DateTimeOffset?, DateTimeOffset?, long?, int?> CreateKey(this MarketDataMessage message, SecurityId?securityId = null) { if (message == null) { throw new ArgumentNullException(nameof(message)); } return(Tuple.Create(message.DataType, securityId ?? message.SecurityId, message.Arg, message.From, message.To, message.Count, message.MaxDepth)); }