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++;
}
Esempio n. 2
0
    /**
     * 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;
        }
    }