/** * Helper function to store a MamdaBookAtomicLevel in * the resuabale MamdaOrderBookPriceLevel */ void storeLevel(const MamdaBookAtomicLevel& level) { mReusablePriceLevel.clear(); mReusablePriceLevel.setPrice (level.getPriceLevelPrice()); mReusablePriceLevel.setSide ((MamdaOrderBookPriceLevel::Side)level.getPriceLevelSide()); mReusablePriceLevel.setTime (level.getPriceLevelTime()); /** * As per the MAMDA Developers Guide, the following three accessors on a MamdaBookAtomicLevel * object should not be used for V5 entry updates. Here, these calls are used and * the resulting MamdaOrderBookPriceLevel is only used when the callbacks received * indicate that the update was not a V5 entry update. */ mReusablePriceLevel.setSize (level.getPriceLevelSize()); mReusablePriceLevel.setAction ((MamdaOrderBookPriceLevel::Action) level.getPriceLevelAction()); mReusablePriceLevel.setNumEntries ((mama_u32_t)level.getPriceLevelNumEntries()); }
void BookPublisher::processOrder () { MamdaOrderBookPriceLevel* level = NULL; MamdaOrderBookEntry* entry = NULL; order thisOrder = orderArray[mOrderCount]; mBookTime.setToNow(); if (mProcessEntries) { switch (thisOrder.entAction) { case ENTDELETE: { level = mBook->getLevelAtPrice (thisOrder.price, thisOrder.side); if (level) entry = level->findEntry (thisOrder.entId); if (entry) mBook->deleteEntry (entry, mBookTime, NULL); break; } case ENTADD: { mBook->addEntry (thisOrder.entId, thisOrder.entSize, thisOrder.price, thisOrder.side, mBookTime, NULL, NULL); break; } case ENTUPDATE: { entry = level->findEntry (thisOrder.entId); mBook->updateEntry (entry, thisOrder.entSize, mBookTime, NULL); break; } } } else { level = mBook->getLevelAtPrice(thisOrder.price, thisOrder.side); if (level) { level->setSizeChange (thisOrder.sizeChange); level->setPrice (thisOrder.price); level->setSize (thisOrder.volume); level->setNumEntries (thisOrder.numEntries); level->setTime (mBookTime); level->setAction (thisOrder.plAction); } else { level = new MamdaOrderBookPriceLevel(); level->setSide (thisOrder.side); level->setSizeChange (thisOrder.sizeChange); level->setPrice (thisOrder.price); level->setSize (thisOrder.volume); level->setNumEntries (thisOrder.numEntries); level->setTime (mBookTime); level->setAction (thisOrder.plAction); } switch (thisOrder.plAction) { case PLDELETE: mBook->deleteLevel(*level); break; case PLADD: mBook->addLevel(*level); break; case PLUPDATE: mBook->updateLevel(*level); break; } } mOrderCount++; }
/** * Helper function to apply a MamdaOrderBookPriceLevel to * a MamdaOrderBook */ void applyLevel (MamdaOrderBookPriceLevel& level) { if(mOrderBook.getQuality() == MAMA_QUALITY_OK) { switch(level.getAction()) { case MamdaOrderBookPriceLevel::MAMDA_BOOK_ACTION_UPDATE : try { /* * When in the order book the only Action which makes sense is * ADD */ level.setAction(MamdaOrderBookPriceLevel::MAMDA_BOOK_ACTION_ADD); mOrderBook.updateLevel(level); } catch ( MamdaOrderBookException &e) { //Exception is thrown when updating level which does not exist //level will be added so handled internally } break; case MamdaOrderBookPriceLevel::MAMDA_BOOK_ACTION_ADD : try { mLevelPtr = new MamdaOrderBookPriceLevel(level); /* * When in the order book the only Action which makes sense is * ADD */ mLevelPtr->setAction(MamdaOrderBookPriceLevel::MAMDA_BOOK_ACTION_ADD); mOrderBook.addLevel(*mLevelPtr); //ownership of ptr passed to MamdaOrderBook } catch ( MamdaOrderBookException &e) { //Exception is thrown if adding a level already in book //handled internally by updating level delete mLevelPtr; } break; case MamdaOrderBookPriceLevel::MAMDA_BOOK_ACTION_DELETE : try { mOrderBook.deleteLevel(mReusablePriceLevel); } catch (MamdaOrderBookException &e) { //Thrown if the level cannot be found in the book //No need for handling as level is deleted } break; default: cout << "atomicbookbuilder: Unknown price level [" << level.getAction() << "]\n"; break; } mLevelPtr = NULL; } }