예제 #1
0
        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);
            }
        }
예제 #2
0
        /**
         * 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);
            }
        }