public tryI32 ( Wombat.MamaFieldDescriptor descriptor, Wombat.NullableInt &result ) : bool | ||
descriptor | Wombat.MamaFieldDescriptor | |
result | Wombat.NullableInt | |
return | bool |
/// <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 bool getEntriesInfo(MamaMsg entMsg) { int priceLevelEntryActionInt = 0; ulong mPriceLevelEntrySizeUlong = 0; if (entMsg.tryI32(MamdaOrderBookFields.ENTRY_ACTION, ref priceLevelEntryActionInt)) { mPriceLevelEntryAction = (sbyte) priceLevelEntryActionInt; } entMsg.tryU64 (MamdaOrderBookFields.ENTRY_SIZE, ref mPriceLevelEntrySizeUlong); mPriceLevelEntrySize = (long) mPriceLevelEntrySizeUlong; mPriceLevelEntryTime = entMsg.getDateTime(MamdaOrderBookFields.ENTRY_TIME, mPriceLevelTime); if(entMsg.tryStringAnsi (MamdaOrderBookFields.ENTRY_ID, ref mPriceLevelEntryIdIntPtr)) { return true; } else { return false; } }
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); } } } } } }
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); } }