private void ProcessMarketDataMessage(MarketDataMessage mdMsg) { switch (mdMsg.DataType) { case MarketDataTypes.Level1: { SendCommand(mdMsg.IsSubscribe ? new SubscribeMessage { Quotations = { mdMsg.SecurityId } } : new UnsubscribeMessage { Quotations = { mdMsg.SecurityId } }); break; } case MarketDataTypes.MarketDepth: { SendCommand(mdMsg.IsSubscribe ? new SubscribeMessage { Quotes = { mdMsg.SecurityId } } : new UnsubscribeMessage { Quotes = { mdMsg.SecurityId } }); break; } case MarketDataTypes.Trades: { if (mdMsg.IsSubscribe) { //Подписаться/отписаться на тики можно двумя способами: //SubscribeMessage/UnsubscribeMessage - тики приходят с момента подписки //SubscribeTicksMessage - Тики приходят с момента подиски(TradeNo = 0), или с любого номера. При повторном запросе отписка получения тиков по предыдущему запросу. //var command = new SubscribeMessage(); //command.AllTrades.Add(security.GetTransaqId()); //ApiClient.Send(new Tuple<BaseCommandMessage, Action<BaseResponse>>(command, ProcessResult)); //--- _registeredSecurityIds.Add(mdMsg.SecurityId); var command = new SubscribeTicksMessage { Filter = true }; //Filter только сделки нормально периода торгов foreach (var id in _registeredSecurityIds) { command.Items.Add(new SubscribeTicksSecurity { SecId = (int)id.Native, TradeNo = id.Equals(mdMsg.SecurityId) ? 1 : 0, }); } SendCommand(command); } else { //var command = new UnsubscribeMessage(); //command.AllTrades.Add(security.GetTransaqId()); //ApiClient.Send(new Tuple<BaseCommandMessage, Action<BaseResponse>>(command, ProcessResult)); //--- _registeredSecurityIds.Remove(mdMsg.SecurityId); var command = new SubscribeTicksMessage { Filter = true }; //Filter только сделки нормально периода торгов foreach (var id in _registeredSecurityIds) { command.Items.Add(new SubscribeTicksSecurity { SecId = (int)id.Native, TradeNo = 0, }); } SendCommand(command); } break; } case MarketDataTypes.News: { if (mdMsg.IsSubscribe) { if (mdMsg.NewsId.IsEmpty()) { var count = (int)mdMsg.Count; if (count <= 0) { throw new InvalidOperationException(LocalizedStrings.Str3511Params.Put(count)); } if (count > MaxNewsHeaderCount) { throw new InvalidOperationException(LocalizedStrings.Str3512Params.Put(count, MaxNewsHeaderCount)); } SendCommand(new RequestOldNewsMessage { Count = count }); } else { SendCommand(new RequestNewsBodyMessage { NewsId = mdMsg.NewsId.To <int>() }); } } break; } case MarketDataTypes.CandleTimeFrame: { if (mdMsg.IsSubscribe) { var periodId = _candlePeriods.GetKeys((TimeSpan)mdMsg.Arg).First(); _candleTransactions.Add(Tuple.Create((int)mdMsg.SecurityId.Native, periodId), mdMsg.TransactionId); var command = new RequestHistoryDataMessage { SecId = (int)mdMsg.SecurityId.Native, Period = periodId, Count = mdMsg.Count, Reset = mdMsg.To == DateTimeOffset.MaxValue, }; SendCommand(command); } break; } default: throw new ArgumentOutOfRangeException("mdMsg", mdMsg.DataType, LocalizedStrings.Str1618); } var reply = (MarketDataMessage)mdMsg.Clone(); reply.OriginalTransactionId = mdMsg.TransactionId; SendOutMessage(reply); }
private void ProcessMarketDataMessage(MarketDataMessage mdMsg) { switch (mdMsg.DataType) { case MarketDataTypes.Level1: { SendCommand(mdMsg.IsSubscribe ? new SubscribeMessage { Quotations = { mdMsg.SecurityId } } : new UnsubscribeMessage { Quotations = { mdMsg.SecurityId } }); break; } case MarketDataTypes.MarketDepth: { SendCommand(mdMsg.IsSubscribe ? new SubscribeMessage { Quotes = { mdMsg.SecurityId } } : new UnsubscribeMessage { Quotes = { mdMsg.SecurityId } }); break; } case MarketDataTypes.Trades: { if (mdMsg.IsSubscribe) { //Подписаться/отписаться на тики можно двумя способами: //SubscribeMessage/UnsubscribeMessage - тики приходят с момента подписки //SubscribeTicksMessage - Тики приходят с момента подиски(TradeNo = 0), или с любого номера. При повторном запросе отписка получения тиков по предыдущему запросу. //var command = new SubscribeMessage(); //command.AllTrades.Add(security.GetTransaqId()); //ApiClient.Send(new Tuple<BaseCommandMessage, Action<BaseResponse>>(command, ProcessResult)); //--- _registeredSecurityIds.Add(mdMsg.SecurityId); var command = new SubscribeTicksMessage { Filter = true }; //Filter только сделки нормально периода торгов foreach (var id in _registeredSecurityIds) { command.Items.Add(new SubscribeTicksSecurity { SecId = (int)id.Native, // http://stocksharp.com/forum/yaf_postsm35978_Obnovlieniie-Tranzak-do-viersii-2-16-1.aspx#post35978 //TradeNo = id.Equals(mdMsg.SecurityId) ? 1 : 0, TradeNo = 1, }); } SendCommand(command); } else { //var command = new UnsubscribeMessage(); //command.AllTrades.Add(security.GetTransaqId()); //ApiClient.Send(new Tuple<BaseCommandMessage, Action<BaseResponse>>(command, ProcessResult)); //--- _registeredSecurityIds.Remove(mdMsg.SecurityId); var command = new SubscribeTicksMessage { Filter = true }; //Filter только сделки нормально периода торгов foreach (var id in _registeredSecurityIds) { command.Items.Add(new SubscribeTicksSecurity { SecId = (int)id.Native, TradeNo = 0, }); } SendCommand(command); } break; } case MarketDataTypes.News: { if (mdMsg.IsSubscribe) { if (mdMsg.NewsId.IsEmpty()) { var count = mdMsg.Count; if (count == null) { count = MaxNewsHeaderCount; } else { if (count < 0) { throw new InvalidOperationException(LocalizedStrings.Str3511Params.Put(count)); } if (count > MaxNewsHeaderCount) { throw new InvalidOperationException(LocalizedStrings.Str3512Params.Put(count, MaxNewsHeaderCount)); } } SendCommand(new RequestOldNewsMessage { Count = (int)count.Value }); } else { SendCommand(new RequestNewsBodyMessage { NewsId = mdMsg.NewsId.To <int>() }); } } break; } case MarketDataTypes.CandleTimeFrame: { if (mdMsg.IsSubscribe) { var periodId = _candlePeriods.GetKeys((TimeSpan)mdMsg.Arg).First(); var secId = (int)mdMsg.SecurityId.Native; var key = Tuple.Create(secId, periodId); _candleTransactions.Add(key, mdMsg.TransactionId); var command = new RequestHistoryDataMessage { SecId = secId, Period = periodId, Count = mdMsg.Count ?? 0, Reset = mdMsg.To == null, }; try { SendCommand(command); } catch (Exception) { _candleTransactions.Remove(key); throw; } } break; } default: { SendOutMarketDataNotSupported(mdMsg.TransactionId); return; } } var reply = (MarketDataMessage)mdMsg.Clone(); reply.OriginalTransactionId = mdMsg.TransactionId; SendOutMessage(reply); }