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 MamdaBookAtomicLevelEntry to * a MamdaOrderBook */ void applyEntry (const MamdaBookAtomicLevelEntry& levelEntry) { MamdaOrderBookEntry::Action entryAction; if(mOrderBook.getQuality() == MAMA_QUALITY_OK) { entryAction = (MamdaOrderBookEntry::Action) levelEntry.getPriceLevelEntryAction(); switch(entryAction) { case MamdaOrderBookEntry::MAMDA_BOOK_ACTION_UPDATE : try { //get the price level by price mLevelPtr = mOrderBook.findLevel( levelEntry.getPriceLevelPrice(), (MamdaOrderBookPriceLevel::Side) levelEntry.getPriceLevelSide()); if(mLevelPtr != NULL) { //get the entry by id mEntryPtr = mLevelPtr->findEntry(levelEntry.getPriceLevelEntryId()); if(mEntryPtr != NULL) { mOrderBook.updateEntry( mEntryPtr, levelEntry.getPriceLevelEntrySize(), levelEntry.getPriceLevelEntryTime(), (MamdaOrderBookBasicDelta*) NULL); break; } } /* * intentional fall through to add the entry if * the entry or level cannot be found to update it */ } catch ( MamdaOrderBookInvalidEntry &e) { cout<< "atomicbookbuilder: could not update entry.\n"; cout << "Caught MamdaOrderBookInvalidEntry [" << e.what() << "]\n"; } catch (MamdaOrderBookException &e) { cout<< "atomicbookbuilder: could not update entry.\n"; cout<< "Caught MamdaOrderBookException [" << e.what() << "[\n"; } case MamdaOrderBookEntry::MAMDA_BOOK_ACTION_ADD : mEntryPtr = mOrderBook.addEntry( levelEntry.getPriceLevelEntryId(), levelEntry.getPriceLevelEntrySize(), levelEntry.getPriceLevelPrice(), (MamdaOrderBookPriceLevel::Side) levelEntry.getPriceLevelSide(), levelEntry.getPriceLevelEntryTime(), (const MamaSourceDerivative*) NULL, (MamdaOrderBookBasicDelta*) NULL); mEntryPtr->setReason( (MamdaOrderBookTypes::Reason)levelEntry.getPriceLevelEntryReason()); break; case MamdaOrderBookEntry::MAMDA_BOOK_ACTION_DELETE : try { //get the price level by price mLevelPtr = mOrderBook.findLevel( levelEntry.getPriceLevelPrice(), (MamdaOrderBookPriceLevel::Side) levelEntry.getPriceLevelSide()); if(mLevelPtr != NULL) { //get the entry by id mEntryPtr = mLevelPtr->findEntry(levelEntry.getPriceLevelEntryId()); if(mEntryPtr != NULL) mOrderBook.deleteEntry( mEntryPtr, levelEntry.getPriceLevelEntryTime(), (MamdaOrderBookBasicDelta*) NULL); } } catch ( MamdaOrderBookInvalidEntry &e) { cout<< "atomicbookbuilder: could not delete entry.\n"; cout << "Caught MamdaOrderBookInvalidEntry [" << e.what() << "]\n"; } catch (MamdaOrderBookException &e) { cout<< "atomicbookbuilder: could not delete entry.\n"; cout<< "Caught MamdaOrderBookException [" << e.what() << "[\n"; } break; default: cout << "atomicbookbuilder: Unknown entry action [" << (char)entryAction << "]\n"; break; } mEntryPtr = NULL; mLevelPtr = NULL; } }