private async Task HandleTableResponse(MarketDataSnapshotFullRefresh snapshot) { var symbol = snapshot.Symbol.Obj; var equFun = new Func <OrderBookItem, OrderBookItem, bool>((item1, item2) => item1.Id == item2.Id); var hashFunc = new Func <OrderBookItem, int>(item => item.Id.GetHashCode()); var orders = new List <OrderBookItem>(); for (var j = 1; j <= snapshot.NoMDEntries.Obj; j++) { var ob = snapshot.GetGroup(j, new MarketDataSnapshotFullRefresh.NoMDEntriesGroup()); var dir = ob.GetField(new MDEntryType()).Obj; var price = ob.GetField(new MDEntryPx()).Obj; var size = ob.GetField(new MDEntrySize()).Obj; var id = long.Parse(ob.GetField(new QuoteEntryID()).Obj); var ordeItem = new OrderBookItem(equFun, hashFunc) { Id = id.ToString(), Symbol = symbol, IsBuy = dir == MDEntryType.BID, Price = price, Size = size }; orders.Add(ordeItem); } await HandleOrderBookSnapshotAsync(symbol, DateTime.UtcNow, orders); }
/** * Callback chamado após o recebimento de mensagem FIX * de instantâneo de MarketData. * */ public override void onMessage( MarketDataSnapshotFullRefresh message, SessionID sessionId) { try { filaMensagensFIXInstantaneo.Push(message); } catch (Exception e) { logger.Error("Falha na leitura da fila filaMensagensFIXInstantaneo: " + e.Message); } }
public void OnMessage(MarketDataSnapshotFullRefresh message) { Debug.NotNull(this.dataGateway, nameof(this.dataGateway)); message.GetGroup(1, this.mdBidGroup); message.GetGroup(2, this.mdAskGroup); var tick = new QuoteTick( this.GetSymbol(message.GetField(Tags.Symbol)), Price.Create(this.mdBidGroup.GetDecimal(Tags.MDEntryPx)), Price.Create(this.mdAskGroup.GetDecimal(Tags.MDEntryPx)), Quantity.One(), Quantity.One(), this.tickTimestampProvider()); this.dataGateway?.OnData(tick); }
public void OnMessage(MarketDataSnapshotFullRefresh msg, SessionID sessionID) { FIX44XMLParser parser = new FIX44XMLParser(); Console.WriteLine("==========Header::=========="); Console.WriteLine(parser.getFieldName(Tags.BeginString.ToString()) + ":: " + msg.Header.GetString(Tags.BeginString)); Console.WriteLine(parser.getFieldName(Tags.BodyLength.ToString()) + ":: " + msg.Header.GetString(Tags.BodyLength)); Console.WriteLine(parser.getFieldName(Tags.MsgType.ToString()) + ":: MarketDataSnapshotFullRefresh (" + msg.Header.GetString(Tags.MsgType) + ")"); Console.WriteLine(parser.getFieldName(Tags.MsgSeqNum.ToString()) + ":: " + msg.Header.GetString(Tags.MsgSeqNum)); Console.WriteLine(parser.getFieldName(Tags.SenderCompID.ToString()) + ":: " + msg.Header.GetString(Tags.SenderCompID)); Console.WriteLine(parser.getFieldName(Tags.SendingTime.ToString()) + ":: " + msg.Header.GetString(Tags.SendingTime)); Console.WriteLine(parser.getFieldName(Tags.TargetCompID.ToString()) + ":: " + msg.Header.GetString(Tags.TargetCompID)); Console.WriteLine("==========Body:: =========="); Console.WriteLine(parser.getFieldName(Tags.Symbol.ToString()) + ":: " + msg.GetString(Tags.Symbol)); Console.WriteLine(parser.getFieldName(Tags.NoMDEntries.ToString()) + ":: " + msg.GetString(Tags.NoMDEntries)); MarketDataSnapshotFullRefresh.NoMDEntriesGroup g0 = new MarketDataSnapshotFullRefresh.NoMDEntriesGroup(); for (int grpIndex = 1; grpIndex <= msg.GetInt(Tags.NoMDEntries); grpIndex += 1) { Console.WriteLine("---------- ----------"); msg.GetGroup(grpIndex, g0); Console.WriteLine(parser.getFieldName(Tags.MDEntryType.ToString()) + ":: " + parser.getFieldName(Tags.MDEntryType.ToString(), g0.GetString(Tags.MDEntryType).ToString()) + "(" + g0.GetString(Tags.MDEntryType) + ")" ); try { Console.WriteLine(parser.getFieldName(Tags.MDEntryPx.ToString()) + ":: " + g0.GetString(Tags.MDEntryPx)); } catch (Exception ex) { Console.WriteLine(parser.getFieldName(Tags.MDEntrySize.ToString()) + ":: " + g0.GetString(Tags.MDEntrySize)); } Console.WriteLine(parser.getFieldName(Tags.MDEntryDate.ToString()) + ":: " + g0.GetString(Tags.MDEntryDate)); Console.WriteLine(parser.getFieldName(Tags.MDEntryTime.ToString()) + ":: " + g0.GetString(Tags.MDEntryTime)); } Console.WriteLine("==========Trailer:: =========="); Console.WriteLine(parser.getFieldName(Tags.CheckSum.ToString()) + ":: " + msg.Trailer.GetString(Tags.CheckSum)); }
public virtual void onMessage(MarketDataSnapshotFullRefresh message, QuickFix.SessionID session) { throw new QuickFix.UnsupportedMessageType(); }
private void trataMensagemFIX(MarketDataSnapshotFullRefresh mensagem) { listaInstrumentosFIX = new SortedDictionary <string, MarketDataSnapshotFullRefresh.NoMDEntries>(); try { int ocorrencias = mensagem.getInt(NoMDEntries.FIELD); // Apenas trata a mensagem FIX se houver ocorrências no NoMDEntries if (ocorrencias > 0) { uint ocorrencia; for (ocorrencia = 1; ocorrencia <= ocorrencias; ocorrencia++) { MarketDataSnapshotFullRefresh.NoMDEntries grupo = new MarketDataSnapshotFullRefresh.NoMDEntries(); mensagem.getGroup(ocorrencia, grupo); // Mensagens de Negocio são enviados depois de todas as outras mensagens if (grupo.getChar(MDEntryType.FIELD) == MDEntryType.TRADE) { if (!listaInstrumentosFIX.ContainsKey( grupo.getString(6032))) { listaInstrumentosFIX.Add(grupo.getString(6032), grupo); } } enviaInstantaneo( mensagem.getHeader().getInt(MsgSeqNum.FIELD), ocorrencia, mensagem, grupo); } if (listaInstrumentosFIX.Count > 0) { IEnumerator <KeyValuePair <string, MarketDataSnapshotFullRefresh.NoMDEntries> > itens = listaInstrumentosFIX.GetEnumerator(); while (itens.MoveNext()) { KeyValuePair <string, MarketDataSnapshotFullRefresh.NoMDEntries> item = itens.Current; enviaInstantaneo( Convert.ToInt32(item.Key), ocorrencia++, mensagem, item.Value); } } } else { logger.Debug("SNAPSHOT - sem elementos"); } } catch (FieldNotFound e) { logger.Error("Campo nao encontrado na mensagem: " + e.Message); } }
/** * Monta e envia mensagem Market Data de Snapshot (instantaneo) para o ESPER. * Layout da mensagem: * SeqNum 9(15) * type X(1) * symbol X(20) * securityID X(20) * body: * MDUpdateAction (279) X(1) * MDEntryID (278) X(10) * MDEntryDate (272) X(8) * MDEntryTime (273) X(8) * * MDEntryPositionNo (290) X(6) * MDEntryPx (270) X(15) * MDEntrySize (271) X(15) * NumberOfOrders (346) X(15) * OrderID (37) X(50) * MDEntryBuyer (288) X(10) * MDEntrySeller (289) X(10) * TickDirection (274) X(1) * NetChgPrevDay (451) X(11) * UniqueTradeID (6032) X(20) * OpenCloseSettlFlag (286) 9(1) * TradingSessionSubID (625) X(2) * SecurityTradingStatus (326) 9(3) * NoReferentialPrices (6932) 9(3) * ReferentialPriceType (6934) 9(1) * ReferentialPx (6933) X(15) * TransactTime (60) X(20) */ private void enviaInstantaneo( int seqNum, uint ocorrencia, MarketDataSnapshotFullRefresh mensagem, MarketDataSnapshotFullRefresh.NoMDEntries grupo) { String mensagemMDS; String instrumento = null; try { // SeqNum - 9(15) mensagemMDS = seqNum.ToString("D10"); mensagemMDS = mensagemMDS + ocorrencia.ToString("D5"); // type - X(1) mensagemMDS = mensagemMDS + grupo.getChar(MDEntryType.FIELD); // symbol - X(20) instrumento = mensagem.getString(Symbol.FIELD); mensagemMDS = mensagemMDS + instrumento.PadLeft(20); // securityID - X(20) mensagemMDS = mensagemMDS + mensagem.getString(SecurityID.FIELD).PadLeft(20); // body // Se OFERTA_COMPRA ou OFERTA_VENDA, envia NEW em MDUpdateAction if (grupo.getChar(MDEntryType.FIELD) == MDEntryType.BID || grupo.getChar(MDEntryType.FIELD) == MDEntryType.OFFER) { mensagemMDS = mensagemMDS + MDUpdateAction.NEW; } else { mensagemMDS = mensagemMDS + " "; } mensagemMDS = mensagemMDS + " ".PadLeft(10); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntryDate()) ? grupo.getString(MDEntryDate.FIELD) : "").PadLeft(8); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntryTime()) ? grupo.getString(MDEntryTime.FIELD) : "").PadLeft(8).Trim(); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntryPositionNo()) ? grupo.getString(MDEntryPositionNo.FIELD) : " ").PadLeft(6); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntryPx()) ? grupo.getString(MDEntryPx.FIELD) : " ").PadLeft(15); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntrySize()) ? grupo.getString(MDEntrySize.FIELD) : " ").PadLeft(15); mensagemMDS = mensagemMDS + (grupo.isSet(new NumberOfOrders()) ? grupo.getString(NumberOfOrders.FIELD) : " ").PadLeft(15); mensagemMDS = mensagemMDS + (grupo.isSet(new OrderID()) ? grupo.getString(OrderID.FIELD) : " ").PadLeft(50); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntryBuyer()) ? grupo.getString(MDEntryBuyer.FIELD) : " ").PadLeft(10); mensagemMDS = mensagemMDS + (grupo.isSet(new MDEntrySeller()) ? grupo.getString(MDEntrySeller.FIELD) : " ").PadLeft(10); mensagemMDS = mensagemMDS + (grupo.isSet(new TickDirection()) ? grupo.getString(TickDirection.FIELD) : " ").PadLeft(1); mensagemMDS = mensagemMDS + (mensagem.isSetField(NetChgPrevDay.FIELD) ? mensagem.getString(NetChgPrevDay.FIELD) : " ").PadLeft(11); mensagemMDS = mensagemMDS + (grupo.isSetField(6032) ? grupo.getString(6032) : " ").PadLeft(20); mensagemMDS = mensagemMDS + (grupo.isSet(new OpenCloseSettlFlag()) ? grupo.getInt(OpenCloseSettlFlag.FIELD) : 0).ToString("D1"); mensagemMDS = mensagemMDS + (grupo.isSet(new TradingSessionSubID()) ? grupo.getString(TradingSessionSubID.FIELD) : " ").PadLeft(2); mensagemMDS = mensagemMDS + (grupo.isSetField(326) ? grupo.getInt(326) : 0).ToString("D3"); if (grupo.isSetField(6932)) { int ocorrencias = grupo.getInt(6932); mensagemMDS = mensagemMDS + ocorrencias.ToString("D3"); for (uint ocorrenciaPrecos = 1; ocorrenciaPrecos <= ocorrencias; ocorrenciaPrecos++) { //ATP: Sinistraço!!!! Group grupoPrecos = new Group(6932, 6934, new int[] { 6934, 6933, 60, 0 }); grupo.getGroup(ocorrenciaPrecos, grupoPrecos); mensagemMDS = mensagemMDS + (grupoPrecos.isSetField(6934) ? grupoPrecos.getInt(6934).ToString("D1") : "0"); mensagemMDS = mensagemMDS + (grupoPrecos.isSetField(6933) ? grupoPrecos.getString(6933) : " ").PadLeft(15); mensagemMDS = mensagemMDS + (grupoPrecos.isSetField(TransactTime.FIELD) ? grupoPrecos.getString(TransactTime.FIELD) : "").PadLeft(20); } } else { mensagemMDS = mensagemMDS + "000"; } try { filaMensagensRetransmissorBMF.Push(mensagemMDS); } catch (Exception e) { logger.Error("Falha na leitura da fila filaMensagensRetransmissorBMF: " + e.Message, e); } logger.Debug("SNAPHOT - Instrumento[" + mensagem.getString(Symbol.FIELD) + "] tipo[" + grupo.getChar(MDEntryType.FIELD) + "] Mensagem[" + mensagemMDS + "]"); } catch (FieldNotFound e) { logger.Error("Instrumento[" + instrumento + "]: Campo nao encontrado na mensagem: " + e.Message); return; } catch (Exception e) { logger.Error("enviaInstantaneo: " + e.Message, e); } }
/// <summary> /// Handles <see cref="MarketDataSnapshotFullRefresh"/> messages. /// </summary> /// <param name="message">The FIX message.</param> /// <param name="sessionId">The session identifier.</param> public void OnMessage(MarketDataSnapshotFullRefresh message, SessionID sessionId) { this.FixMessageHandler.OnMessage(message); }
public virtual void Send(FIXMarketDataSnapshot Snapshot) { MarketDataSnapshotFullRefresh snapshotFullRefresh = new MarketDataSnapshotFullRefresh(new Symbol(Snapshot.Symbol)); if (Snapshot.ContainsField(262)) snapshotFullRefresh.set(new MDReqID(Snapshot.MDReqID)); if (Snapshot.ContainsField(65)) snapshotFullRefresh.set(new SymbolSfx(Snapshot.SymbolSfx)); if (Snapshot.ContainsField(48)) snapshotFullRefresh.set(new SecurityID(Snapshot.SecurityID)); if (Snapshot.ContainsField(22)) snapshotFullRefresh.set(new IDSource(Snapshot.SecurityIDSource)); if (Snapshot.ContainsField(167)) snapshotFullRefresh.set(new QuickFix.SecurityType(Snapshot.SecurityType)); if (Snapshot.ContainsField(200)) snapshotFullRefresh.set(new MaturityMonthYear(Snapshot.MaturityMonthYear)); if (Snapshot.ContainsField(202)) snapshotFullRefresh.set(new StrikePrice(Snapshot.StrikePrice)); if (Snapshot.ContainsField(206)) snapshotFullRefresh.set(new OptAttribute(Snapshot.OptAttribute)); if (Snapshot.ContainsField(231)) snapshotFullRefresh.set(new ContractMultiplier(Snapshot.ContractMultiplier)); if (Snapshot.ContainsField(223)) snapshotFullRefresh.set(new CouponRate(Snapshot.CouponRate)); if (Snapshot.ContainsField(207)) snapshotFullRefresh.set(new SecurityExchange(Snapshot.SecurityExchange)); if (Snapshot.ContainsField(106)) snapshotFullRefresh.set(new Issuer(Snapshot.Issuer)); if (Snapshot.ContainsField(348)) snapshotFullRefresh.set(new EncodedIssuerLen(Snapshot.EncodedIssuerLen)); if (Snapshot.ContainsField(349)) snapshotFullRefresh.set(new EncodedIssuer(Snapshot.EncodedIssuer)); if (Snapshot.ContainsField(107)) snapshotFullRefresh.set(new SecurityDesc(Snapshot.SecurityDesc)); if (Snapshot.ContainsField(350)) snapshotFullRefresh.set(new EncodedSecurityDescLen(Snapshot.EncodedSecurityDescLen)); if (Snapshot.ContainsField(351)) snapshotFullRefresh.set(new EncodedSecurityDesc(Snapshot.EncodedSecurityDesc)); if (Snapshot.ContainsField(291)) snapshotFullRefresh.set(new FinancialStatus(((object)Snapshot.FinancialStatus).ToString())); if (Snapshot.ContainsField(292)) snapshotFullRefresh.set(new CorporateAction(((object)Snapshot.CorporateAction).ToString())); for (int i = 0; i < Snapshot.NoMDEntries; ++i) { MarketDataSnapshotFullRefresh.NoMDEntries noMdEntries = new MarketDataSnapshotFullRefresh.NoMDEntries(); FIXMDEntriesGroup mdEntriesGroup = Snapshot.GetMDEntriesGroup(i); noMdEntries.set(new MDEntryType(mdEntriesGroup.MDEntryType)); noMdEntries.set(new MDEntryPx(mdEntriesGroup.MDEntryPx)); if (mdEntriesGroup.ContainsField(271)) noMdEntries.set(new MDEntrySize(mdEntriesGroup.MDEntrySize)); if (mdEntriesGroup.ContainsField(272)) noMdEntries.set(new MDEntryDate(mdEntriesGroup.MDEntryDate)); if (mdEntriesGroup.ContainsField(273)) noMdEntries.set(new MDEntryTime(mdEntriesGroup.MDEntryTime)); if (mdEntriesGroup.ContainsField(274)) noMdEntries.set(new TickDirection(mdEntriesGroup.TickDirection)); if (mdEntriesGroup.ContainsField(275)) noMdEntries.set(new MDMkt(mdEntriesGroup.MDMkt)); if (mdEntriesGroup.ContainsField(336)) noMdEntries.set(new TradingSessionID(mdEntriesGroup.TradingSessionID)); if (mdEntriesGroup.ContainsField(276)) noMdEntries.set(new QuoteCondition(mdEntriesGroup.QuoteCondition)); if (mdEntriesGroup.ContainsField(277)) noMdEntries.set(new TradeCondition(mdEntriesGroup.TradeCondition)); if (mdEntriesGroup.ContainsField(282)) noMdEntries.set(new MDEntryOriginator(mdEntriesGroup.MDEntryOriginator)); if (mdEntriesGroup.ContainsField(283)) noMdEntries.set(new LocationID(mdEntriesGroup.LocationID)); if (mdEntriesGroup.ContainsField(284)) noMdEntries.set(new DeskID(mdEntriesGroup.DeskID)); if (mdEntriesGroup.ContainsField(59)) noMdEntries.set(new QuickFix.TimeInForce(mdEntriesGroup.TimeInForce)); if (mdEntriesGroup.ContainsField(126)) noMdEntries.set(new ExpireTime(mdEntriesGroup.ExpireTime)); if (mdEntriesGroup.ContainsField(110)) noMdEntries.set(new MinQty(mdEntriesGroup.MinQty)); if (mdEntriesGroup.ContainsField(18)) noMdEntries.set(new ExecInst(mdEntriesGroup.ExecInst)); if (mdEntriesGroup.ContainsField(287)) noMdEntries.set(new SellerDays(mdEntriesGroup.SellerDays)); if (mdEntriesGroup.ContainsField(37)) noMdEntries.set(new OrderID(mdEntriesGroup.OrderID)); if (mdEntriesGroup.ContainsField(299)) noMdEntries.set(new QuoteEntryID(mdEntriesGroup.QuoteEntryID)); if (mdEntriesGroup.ContainsField(288)) noMdEntries.set(new MDEntryBuyer(mdEntriesGroup.MDEntryBuyer)); if (mdEntriesGroup.ContainsField(289)) noMdEntries.set(new MDEntrySeller(mdEntriesGroup.MDEntrySeller)); if (mdEntriesGroup.ContainsField(346)) noMdEntries.set(new NumberOfOrders(mdEntriesGroup.NumberOfOrders)); if (mdEntriesGroup.ContainsField(290)) noMdEntries.set(new MDEntryPositionNo(mdEntriesGroup.MDEntryPositionNo)); if (mdEntriesGroup.ContainsField(58)) noMdEntries.set(new Text(mdEntriesGroup.Text)); if (mdEntriesGroup.ContainsField(354)) noMdEntries.set(new EncodedTextLen(mdEntriesGroup.EncodedTextLen)); if (mdEntriesGroup.ContainsField(355)) noMdEntries.set(new EncodedText(mdEntriesGroup.EncodedText)); snapshotFullRefresh.addGroup((Group)noMdEntries); noMdEntries.Dispose(); } try { Session.sendToTarget((QuickFix.Message)snapshotFullRefresh, this.fSessionID); } catch (Exception ex) { Console.WriteLine(BeAEwTZGlZaeOmY5cm.J00weU3cM6(1148) + ex.Message); } }