public getMsg ( Wombat.MamaFieldDescriptor descriptor ) : |
||
descriptor | Wombat.MamaFieldDescriptor | |
return |
private void getEntries( MamdaOrderBookPriceLevel level, MamaMsg plMsg) { /* Entries may or may not exist in the message. If they do exist, * they exist as a vector of submessages, separate submessages, or * (if there is only one entry in the message) in the price level * message itself. */ /* Optional order book fields: */ MamaMsg[] msgEntries = null; /*We won't have PL_ENTRIES if FieldAttrsOrderBookWombatMsg is not specified in the data dictionary*/ if (MamdaOrderBookFields.PL_ENTRIES != null) { /* null is passed as default value otherwise getVectorMsg throws an exception if not found*/ msgEntries = plMsg.getVectorMsg(MamdaOrderBookFields.PL_ENTRIES, null); } if (msgEntries != null) { MamdaOrderBookEntry[] entries = new MamdaOrderBookEntry[msgEntries.Length]; for (int j = 0; j < msgEntries.Length; j++) { MamaMsg entMsg = msgEntries[j]; if (entMsg != null) { MamdaOrderBookEntry entry = new MamdaOrderBookEntry(); getEntryInfo(entry, entMsg, level); level.addEntry(entry); } } return; } /* Second, try the list of entries. */ int maxEntryFields = MamdaOrderBookFields.PL_ENTRY.Length; // Get the number of attached sub messages int numEntryAttached = plMsg.getI32(MamdaOrderBookFields.PL_NUM_ATTACH, 0); // If there are no sub messages attempt to get the entry Id from this price level message if (0 == numEntryAttached) { string entID = null; // Check for the entry Id if (plMsg.tryString(MamdaOrderBookFields.ENTRY_ID, ref entID)) { // Add a new entry to the level MamdaOrderBookEntry entry = new MamdaOrderBookEntry(); getEntryInfo(entry, plMsg, level); level.addEntry(entry); } } else { // Ensure we dont' enumerate beyond the maximum number of entries if (numEntryAttached < maxEntryFields) { maxEntryFields = numEntryAttached; } // Enumerate all the entries for (int j = 1; j <= maxEntryFields; j++) { // Get the sub message MamaMsg entMsg = plMsg.getMsg(MamdaOrderBookFields.PL_ENTRY[j], null); if (entMsg != null) { // Add an entry for this level MamdaOrderBookEntry entry = new MamdaOrderBookEntry(); getEntryInfo(entry, entMsg, level); level.addEntry(entry); } } } }
private void getLevelInfoAndEntries( MamdaSubscription subscription, MamaMsg msg, MamaMsg plMsg, bool isRecap) { double priceLevelSizeChange = 0.0; int priceLevelActionInt = 0; int priceLevelSideInt = 0; MamaMsg entMsg = null; plMsg.tryPrice(MamdaOrderBookFields.PL_PRICE, ref mPriceLevelPrice); plMsg.tryF64(MamdaOrderBookFields.PL_SIZE, ref mPriceLevelSize); plMsg.tryF64(MamdaOrderBookFields.PL_NUM_ENTRIES, ref mPriceLevelNumEntries); if (plMsg.tryI32(MamdaOrderBookFields.PL_ACTION, ref priceLevelActionInt)) { mPriceLevelAction = (sbyte) priceLevelActionInt; } if (plMsg.tryI32(MamdaOrderBookFields.PL_SIDE, ref priceLevelSideInt)) { mPriceLevelSide = (sbyte) priceLevelSideInt; } // Optional order book fields: mPriceLevelTime = plMsg.getDateTime (MamdaOrderBookFields.PL_TIME, mEventTime); if ( plMsg.tryF64(MamdaOrderBookFields.PL_SIZE_CHANGE, ref priceLevelSizeChange) ) { mPriceLevelSizeChange = (long) priceLevelSizeChange; } // Call the Price Level Handler if set if (mLevelHandler!=null) { if (isRecap) { mLevelHandler.onBookAtomicLevelRecap ( subscription, this, msg, this); } else { mLevelHandler.onBookAtomicLevelDelta ( subscription, this, msg, this); } } // Handle entries. // // Note: the number of entries actually present may well // not add up to the PL_NUM_ENTRIES; it may be more than, // less than or equal to PL_NUM_ENTRIES. For example, if // the delta is a price level update then PL_NUM_ENTRIES // indicates the total number of remaining entries whereas // the array of entries in the message will only contain // those that are being added/deleted/updated. Only if the // price level action is an add should the number of // entries match. // if (mLevelEntryHandler!=null) { // clear entry cache clearLevelEntryFields(); // First try a single vector. int numEntriesInMsg = 0; MamaMsg[] msgEntries = null; /* We won't have PL_ENTRIES if FieldAttrsOrderBookWombatMsg * is not specified in the data dictionary */ if (MamdaOrderBookFields.PL_ENTRIES != null) { /* null is passed as default value otherwise * getVectorMsg throws an exception if not found */ msgEntries = plMsg.getVectorMsg(MamdaOrderBookFields.PL_ENTRIES, null); if (msgEntries != null) { numEntriesInMsg = msgEntries.Length; } } if (numEntriesInMsg > 0) { mPriceLevelActNumEntries = numEntriesInMsg; for (int j = 0; j < numEntriesInMsg; j++) { entMsg = msgEntries[j]; getEntriesInfo(entMsg); if (isRecap) { mLevelEntryHandler.onBookAtomicLevelEntryRecap ( subscription, this, msg, this); } else { mLevelEntryHandler.onBookAtomicLevelEntryDelta ( subscription, this, msg, this); } } } else { // Second, try the list of entries. int maxEntryFields = MamdaOrderBookFields.getNumEntryFields (); // getNumEntryFields() defaults to 0 but we want to go into the // below loop at least once for flattened messages scenario if (maxEntryFields == 0) { maxEntryFields = 1; } int numEntryAttached = plMsg.getI32(MamdaOrderBookFields.PL_NUM_ATTACH, 1); if (numEntryAttached < maxEntryFields) { maxEntryFields = numEntryAttached; } mPriceLevelActNumEntries = maxEntryFields; for (int j = 1; j <= maxEntryFields; j++) { if (MamdaOrderBookFields.PL_ENTRY.Length > 1) { entMsg = plMsg.getMsg(MamdaOrderBookFields.PL_ENTRY[j], null); } if ((entMsg == null) && (numEntryAttached == 1)) { // Price level fields are probably be in the main message. entMsg = plMsg; } if (entMsg != null) { if (!getEntriesInfo(entMsg)) { return; } if (isRecap) { mLevelEntryHandler.onBookAtomicLevelEntryRecap ( subscription, this, msg, this); } else { mLevelEntryHandler.onBookAtomicLevelEntryDelta ( subscription, this, msg, this); } } } } } }
/// <summary> /// Returns whether a complete book delta was received. /// /// Books without vector fields (i.e. fixed field layout) might /// come in multiple MamaMsgs. The MdMsgNum and MdTotalNum /// fields can be used to determine which message is which. /// /// When a single price level is present, it may or may not be /// encapsulated in a nested message field. Similarly, with single /// entries in a price level. /// </summary> /// <param name="delta"></param> /// <param name="msg"></param> /// <returns></returns> private bool createDeltaFromMamaMsgWithoutVectorFields( MamdaOrderBook delta, MamaMsg msg) { int msgNum = 1; int msgTotal = 1; if (msg.tryI32(MamaReservedFields.MsgNum, ref mMsgNum)) { msgNum = mMsgNum.Value; } if (msg.tryI32(MamaReservedFields.MsgTotal, ref mMsgTotal)) { msgTotal = mMsgTotal.Value; } if (msgNum == 1) { // Only clear the book if this is the first message in the // set of updates. delta.clear(); } if (!mHaveSanityCheckedBookDict) { mHaveSanityCheckedBookDict = true; if (MamdaOrderBookFields.PRICE_LEVEL.Length == 0) { throw new MamdaOrderBookException ( "data dictionary error: cannot find price level fields"); } } //for optimised feed date, wNumLevels should be assumed = 1 if not sent int numLevelFieldInMsg = 1; if (msg.tryI32(MamdaOrderBookFields.NUM_LEVELS, ref mNumLevelFields)) { numLevelFieldInMsg = mNumLevelFields.Value; } int maxLevelFields = MamdaOrderBookFields.PRICE_LEVEL.Length; if (numLevelFieldInMsg < maxLevelFields) { maxLevelFields = numLevelFieldInMsg; } for (int i = 1; i <= maxLevelFields; i++) { MamaMsg plMsg = msg.getMsg(MamdaOrderBookFields.PRICE_LEVEL[i], null); if (plMsg == null) { if (numLevelFieldInMsg == 1) { /* Price level fields are probably be in the main * message. */ plMsg = msg; } else { throw new MamdaDataException ( "cannot find price level fields in MamaMsg"); } } MamdaOrderBookPriceLevel level = new MamdaOrderBookPriceLevel(); getLevelInfo(level, plMsg, delta); getEntries(level, plMsg); delta.addLevel (level); } return msgNum == msgTotal; }
private void createDeltaFromMamaMsgWithoutVectorFields( MamdaSubscription subscription, MamaMsg msg, bool isRecap) { NullableInt numLevelFields_ = new NullableInt(); int numLevelFieldInMsg = 1; if (msg.tryI32 (MamdaOrderBookFields.NUM_LEVELS, ref numLevelFields_)) { numLevelFieldInMsg = numLevelFields_.Value; } int maxLevelFields = MamdaOrderBookFields.getNumLevelFields(); // getNumLevelFields() defaults to 0 but we want to go into the // below loop at least once for flattened messages scenario if (maxLevelFields == 0) { maxLevelFields = 1; } if (numLevelFieldInMsg < maxLevelFields) { maxLevelFields = numLevelFieldInMsg; } mPriceLevels = maxLevelFields; for (int i = 1; i <= maxLevelFields; i++) { clearLevelFields(); mPriceLevel = i; MamaMsg plMsg = null; if (MamdaOrderBookFields.PRICE_LEVEL.Length > 1) { plMsg = msg.getMsg(MamdaOrderBookFields.PRICE_LEVEL[i], null); } if (plMsg == null) { if (numLevelFieldInMsg == 1) { // Price level fields are probably be in the main message. plMsg = msg; } else { throw new MamdaDataException ( "cannot find price level fields in MamaMsg"); } } getLevelInfoAndEntries(subscription, msg, plMsg, isRecap); } }