/// <summary> /// Decode price FIX message /// </summary> /// <param name="FIXMsg"></param> /// <returns></returns> public bool DecodeFIXMessage(IFIXMessage FIXMsg) { try { IFIXGroup fixCountGroup = FIXMsg.GetGroupByTag(FIXTagConstants.esFIXTagESNoSecurityPositions, null); if (fixCountGroup != null) { for (int i = 0; i < fixCountGroup.get_NumberOfGroups(null); i++) { IFIXGroup fixRptGroup = fixCountGroup.GetGroupByIndex(i); string strMnemonic = fixRptGroup.get_AsString(FIXTagConstants.esFIXTagESTickerMnemonic); string strSecExchange = fixRptGroup.get_AsString(FIXTagConstants.esFIXTagSecurityExchange); string strContractGroup = fixRptGroup.get_AsString(FIXTagConstants.esFIXTagESContractGroup); string strContractGroupOffset = fixRptGroup.get_AsString(FIXTagConstants.esFIXTagESMarginGroupOffset); Position thePosition; if (m_Positions.ContainsKey(strMnemonic)) thePosition = m_Positions[strMnemonic]; else { thePosition = new Position(m_iAccountID); thePosition.Symbol = strMnemonic; m_Positions.Add(strMnemonic, thePosition); } thePosition.DecodeFIXGroup(fixRptGroup); } } IFIXGroup group = FIXMsg.GetGroupByTag(FIXTagConstants.esFIXTagESNoSecurityExchanges, null); if (group != null) { int nCount = group.get_NumberOfGroups(null); for (int i = 0; i < nCount; i++) { IFIXGroup singleGroup = group.GetGroupByIndex(i); string sExchange = singleGroup.get_AsString(FIXTagConstants.esFIXTagSecurityExchange); AddTicker(sExchange, singleGroup); } } return true; } catch (Exception ex) { return false; } }
/// <summary> /// Decode price FIX message /// </summary> /// <param name="FIXMsg"></param> /// <param name="bSnapFull"></param> /// <returns></returns> public bool DecodeFIX(IFIXMessage FIXMsg,bool bSnapFull) { bool bReturn = false; m_sSymbol = FIXMsg.get_AsString(FIXTagConstants.esFIXTagESTickerMnemonic); int nTotal = 0; if (FIXMsg.GetNumber(out nTotal, FIXTagConstants.esFIXTagTotalVolumeTraded)) m_nTotalTradeVolume = nTotal; IFIXGroup group = FIXMsg.GetGroupByTag(FIXTagConstants.esFIXTagNoMDEntries, null); if (group != null) { int nCount = group.get_NumberOfGroups(null); for (int i = 0; i < nCount; i++) { IFIXGroup singleGroup = group.GetGroupByIndex(i); string sType = singleGroup.get_AsString(FIXTagConstants.esFIXTagMDEntryType); int nImplied = singleGroup.get_AsNumber(FIXTagConstants.esFIXTagESMDEntryIsImplied); string sTime = singleGroup.get_AsString(FIXTagConstants.esFIXTagMDEntryTime); bReturn = true; switch (sType) { case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeBestAsk: { switch (nImplied) { case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestFromActual: case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestFromActualAndImplied: case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestFromImplied: case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestImpliedNoActual: m_eAskOrderType = (Implied)nImplied; SetPrice(out m_Ask, singleGroup); break; } break; } case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeBestBid: { switch (nImplied) { case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestFromActual: case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestFromActualAndImplied: case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestFromImplied: case (int)MESSAGEFIX3Lib.FIXESIsImpliedConstants.esFIXESIsImpliedBestImpliedNoActual: m_eBidOrderType = (Implied)nImplied; SetPrice(out m_Bid, singleGroup); break; } break; break; } case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeSettlementPrice: { int nType = singleGroup.get_AsNumber(FIXTagConstants.esFIXTagOpenCloseSettlementFlag); MESSAGEFIX3Lib.FIXSettlementFlagConstants type = (MESSAGEFIX3Lib.FIXSettlementFlagConstants)nType; double dPrice = singleGroup.get_AsDouble(FIXTagConstants.esFIXTagMDEntryPx); if (type == MESSAGEFIX3Lib.FIXSettlementFlagConstants.esFIXSettlementOpenCloseYesterday) { m_dSettlement = dPrice; m_sSettlementTime = singleGroup.get_AsString(FIXTagConstants.esFIXTagMDEntryTime); m_sSettlementDate = singleGroup.get_AsString(FIXTagConstants.esFIXTagMDEntryDate); } else { m_dPrevSettlement = dPrice; m_sPrevSettlementTime = singleGroup.get_AsString(FIXTagConstants.esFIXTagMDEntryTime); m_sPrevSettlementDate = singleGroup.get_AsString(FIXTagConstants.esFIXTagMDEntryDate); } break; } case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeClosingPrice: { m_dClose = singleGroup.get_AsDouble(FIXTagConstants.esFIXTagMDEntryPx); break; } case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeTrade: { SetPrice(out m_Trade, singleGroup); break; } case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeSessionHighPrice: { m_SessionHigh = singleGroup.get_AsDouble(FIXTagConstants.esFIXTagMDEntryPx); break; } case MESSAGEFIX3Lib.FIXMarketDataTypeConstants.esFIXMarketDataTypeSessionLowPrice: { m_SessionLow = singleGroup.get_AsDouble(FIXTagConstants.esFIXTagMDEntryPx); break; } } } } m_bSnapshot = bSnapFull; return bReturn; }