/** * Monta e envia mensagem de Instrumento da BM&F para o ESPER. * Layout da mensagem: * SeqNum 9(15) * type X(1) ( '.' - Instrumento ) * symbol X(20) * securityID X(20) * body: * SecurityIDSource (22) X(1) * Product (460) 9(3) * CFICode (461) X(6) * SecurityType (167) X(32) * SecuritySubType (762) X(32) * MaturityMonthYear (200) 9(6) * MaturityDate (541) 9(8) * IssueDate (225) 9(8) * CountryOfIssue (470) X(2) * ContractMultiplier (231) X(15) * SecurityExchange (207) X(10) * SecurityDesc (107) X(100) * ContractSettlMonth (667) 9(6) * DatedDate (873) 9(8) * Currency (15) X(10) * RoundLot (561) 9(15) * MinTradeVol (562) 9(15) * Asset (6937) X(10) * StrikePrice (202) X(15) * SecurityGroup (9918) X(15) * * @param msgSeqNum * @param ocorrencia * @param grupo * */ private void enviaInstrumento( int msgSeqNum, uint ocorrencia, SecurityList.NoRelatedSym grupo) { string mensagemMDS; try { // SeqNum - 9(15) mensagemMDS = msgSeqNum.ToString("D10"); mensagemMDS = mensagemMDS + ocorrencia.ToString("D5"); // type - X(1) mensagemMDS = mensagemMDS + '.'; // QuickFix.MDEntryType.INSTRUMENT; // symbol - X(20) mensagemMDS = mensagemMDS + grupo.getString(Symbol.FIELD).PadLeft(20); // securityID - X(20) mensagemMDS = mensagemMDS + grupo.getString(SecurityID.FIELD).PadLeft(20); // body mensagemMDS = mensagemMDS + (grupo.isSet(new SecurityIDSource()) ? grupo.getString(SecurityIDSource.FIELD) : " ").PadLeft(1); mensagemMDS = mensagemMDS + (grupo.isSet(new Product()) ? grupo.getInt(Product.FIELD) : 0).ToString("D3"); mensagemMDS = mensagemMDS + (grupo.isSet(new CFICode()) ? grupo.getString(CFICode.FIELD) : " ").PadLeft(6); mensagemMDS = mensagemMDS + (grupo.isSet(new SecurityType()) ? grupo.getString(SecurityType.FIELD) : " ").PadLeft(32); mensagemMDS = mensagemMDS + (grupo.isSet(new SecuritySubType()) ? grupo.getString(SecuritySubType.FIELD) : " ").PadLeft(32); mensagemMDS = mensagemMDS + (grupo.isSet(new MaturityMonthYear()) ? grupo.getInt(MaturityMonthYear.FIELD) : 0).ToString("D6"); mensagemMDS = mensagemMDS + (grupo.isSet(new MaturityDate()) ? grupo.getInt(MaturityDate.FIELD) : 0).ToString("D8"); mensagemMDS = mensagemMDS + (grupo.isSet(new IssueDate()) ? grupo.getInt(IssueDate.FIELD) : 0).ToString("D8"); mensagemMDS = mensagemMDS + (grupo.isSet(new CountryOfIssue()) ? grupo.getString(CountryOfIssue.FIELD) : " ").PadLeft(2); mensagemMDS = mensagemMDS + (grupo.isSet(new ContractMultiplier()) ? grupo.getString(ContractMultiplier.FIELD) : " ").PadLeft(15); mensagemMDS = mensagemMDS + (grupo.isSet(new SecurityExchange()) ? grupo.getString(SecurityExchange.FIELD) : " ").PadLeft(10); mensagemMDS = mensagemMDS + (grupo.isSet(new SecurityDesc()) ? grupo.getString(SecurityDesc.FIELD) : "").PadLeft(100); mensagemMDS = mensagemMDS + (grupo.isSet(new ContractSettlMonth()) ? grupo.getInt(ContractSettlMonth.FIELD) : 0).ToString("D6"); mensagemMDS = mensagemMDS + (grupo.isSet(new DatedDate()) ? grupo.getInt(DatedDate.FIELD) : 0).ToString("D8"); mensagemMDS = mensagemMDS + (grupo.isSet(new Currency()) ? grupo.getString(Currency.FIELD) : " ").PadLeft(10); mensagemMDS = mensagemMDS + (grupo.isSet(new RoundLot()) ? grupo.getInt(RoundLot.FIELD) : 0).ToString("D15"); mensagemMDS = mensagemMDS + (grupo.isSet(new MinTradeVol()) ? grupo.getInt(MinTradeVol.FIELD) : 0).ToString("D15"); // Asset mensagemMDS = mensagemMDS + (grupo.isSetField(6937) ? grupo.getString(6937) : " ").PadLeft(10); mensagemMDS = mensagemMDS + (grupo.isSet(new StrikePrice()) ? grupo.getString(StrikePrice.FIELD) : " ").PadLeft(15); // SecurityGroup mensagemMDS = mensagemMDS + (grupo.isSetField(9918) ? grupo.getString(9918) : " ").PadLeft(15); try { filaMensagensRetransmissorBMF.Push(mensagemMDS); } catch (Exception e) { logger.Error("Falha na leitura da fila filaMensagensRetransmissorBMF: " + e.Message); } logger.Debug("INSTRUMENT - Instrumento[" + grupo.getString(Symbol.FIELD) + "] Mensagem[" + mensagemMDS + "]"); } catch (FieldNotFound e) { logger.Error("Campo nao encontrado na mensagem: " + e.Message, e); return; } catch (Exception ex) { logger.Error("enviaInstrumento(): " + ex.Message, ex); return; } }
/** * Callback chamado após o recebimento de mensagem FIX de lista de * Instrumentos. * */ public override void onMessage(QuickFix44.SecurityList message, SessionID sessionId) { try { int ocorrencias = message.getInt(NoRelatedSym.FIELD); logger.Info("LISTA_INSTRUMENTO Sequencial[" + message.getHeader().getString(MsgSeqNum.FIELD) + "] Ocorrencias[" + ocorrencias + "]"); for (uint ocorrencia = 1; ocorrencia <= ocorrencias; ocorrencia++) { SecurityList.NoRelatedSym grupo = new SecurityList.NoRelatedSym(); message.getGroup(ocorrencia, ((QuickFix.Group)grupo)); if (padraoInstrumentos != null) { // Se instrumento combinar com o padrao de instrumentos, // efetua assinatura if (padraoInstrumentos.IsMatch(grupo.getString(Symbol.FIELD))) { logger.InfoFormat("Requisitando assinatura {0}-{1}-{2}", grupo.getString(Symbol.FIELD), grupo.getString(SecurityID.FIELD), grupo.getString(SecurityIDSource.FIELD)); requisitaInstrumento( SubscriptionRequestType.SNAPSHOT_PLUS_UPDATES, grupo.getString(Symbol.FIELD), grupo.getString(SecurityID.FIELD), grupo.getString(SecurityIDSource.FIELD)); assinados = true; if (!instrumentosAssinados.ContainsKey( grupo.getString(Symbol.FIELD))) { instrumentosAssinados.Add( grupo.getString(Symbol.FIELD), new DadosInstrumentosBMF( grupo.getString(SecurityID.FIELD), grupo.getString(SecurityIDSource.FIELD))); } } } enviaInstrumento( message.getHeader().getInt(MsgSeqNum.FIELD), ocorrencia, grupo); logger.Debug("INSTRUMENTO [" + grupo.getString(Symbol.FIELD) + "] Descricao[" + grupo.getString(SecurityDesc.FIELD) + "]"); } } catch (FieldNotFound e) { logger.Error("Campo nao encontrado na mensagem: " + e.Message, e); } }