Esempio n. 1
0
    /*
     * Helper function to print a MamdaOrderBookPriceLevel
     */
    void prettyPrint(
        MamdaSubscription*                  subscription,
        const MamdaOrderBookPriceLevel&     level)
    {
        // Print Entry Level Info
        const char* symbol        = subscription->getSymbol ();
        const char* time          = level.getTime().getTimeAsString();
        double      price         = level.getPrice ();
        char        side          = level.getSide();
        char        action        = level.getAction ();
        double      size          = level.getSize ();

        cout << "LEVEL "
             << symbol << " "
             << time   << " "
             << action << " "
             << price  << " "
             << side   << " "
             << size   << endl;
    }
void MamdaQuoteToBookListenerImpl::handleQuote (MamdaSubscription*  subscription,
                                                const MamaMsg&      msg)
{
    checkQuoteCount (subscription, msg);

    MamdaOrderBookPriceLevel* level = NULL;
    if (mQuoteCache.mGotBidSize || mQuoteCache.mGotBidPrice)
    {
        // get current level
        MamdaOrderBook::bidIterator bidIter = mFullBook->bidBegin();
        if (bidIter == mFullBook->bidEnd())
            level = NULL;
        else
            level = *bidIter;
        if (level == NULL)
        {
            if (mQuoteCache.mBidSize == (mama_quantity_t)0 || mQuoteCache.mBidPrice.isZero())
            {
                if (mQuoteCache.mBidSize == (mama_quantity_t)0 && mQuoteCache.mBidPrice.isZero())
                {
                    mama_log (MAMA_LOG_LEVEL_WARN,
                              "MamdaQuoteToBookListener: Got bid update, but price and size are 0\n");
                }
            }
            else
            {
                addLevel (level, 
                          mQuoteCache.mBidPrice.getValue(), 
                          mQuoteCache.mBidSize, 
                          MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_BID, 
                          mQuoteCache.mQuoteTime);
            }
        }
        else
        {
            if ((mQuoteCache.mBidSize == 0) || (mQuoteCache.mBidPrice.isZero()))
            {
                deleteLevel (level, MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_BID, mQuoteCache.mQuoteTime);
            }
            else if (mQuoteCache.mBidPrice == level->getPrice())
            {
                updateLevel (level,  
                             mQuoteCache.mBidSize, 
                             mQuoteCache.mBidSize - level->getSize(), 
                             MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_BID, 
                             mQuoteCache.mQuoteTime);
            }
            else
            {
                deleteLevel (level, 
                             MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_BID, 
                             mQuoteCache.mQuoteTime);
                addLevel (level, 
                          mQuoteCache.mBidPrice.getValue(), 
                          mQuoteCache.mBidSize, 
                          MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_BID,
                          mQuoteCache.mQuoteTime);
            }
        }
    } 

    if (mQuoteCache.mGotAskSize || mQuoteCache.mGotAskPrice)
    {
        // get current level
        MamdaOrderBook::askIterator askIter = mFullBook->askBegin();
        if (askIter == mFullBook->askEnd())
            level = NULL;
        else
            level = *askIter;
        if (level == NULL)
        {
            if (mQuoteCache.mAskSize == (mama_quantity_t)0 || mQuoteCache.mAskPrice.isZero())
            {
                if (mQuoteCache.mAskSize == (mama_quantity_t)0 && mQuoteCache.mAskPrice.isZero())
                {
                    mama_log (MAMA_LOG_LEVEL_WARN,
                        "MamdaQuoteToBookListener: Got ask update, but price and size are 0\n");
                }
            }
            else
            {
                addLevel (level, 
                          mQuoteCache.mAskPrice.getValue(), 
                          mQuoteCache.mAskSize, 
                          MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_ASK, 
                          mQuoteCache.mQuoteTime);
            }
        }
        else
        {
            if ((mQuoteCache.mAskSize == 0) || (mQuoteCache.mAskPrice.isZero()))
            {
                deleteLevel (level, MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_ASK, mQuoteCache.mQuoteTime);
            }
            else if (mQuoteCache.mAskPrice == level->getPrice())
            {
                updateLevel (level, 
                             mQuoteCache.mAskSize, 
                             mQuoteCache.mAskSize - level->getSize(),
                             MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_ASK, 
                             mQuoteCache.mQuoteTime);
            }
            else
            {
                deleteLevel (level, 
                             MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_ASK, 
                             mQuoteCache.mQuoteTime);
                addLevel (level, 
                          mQuoteCache.mAskPrice.getValue(), 
                          mQuoteCache.mAskSize, 
                          MamdaOrderBookPriceLevel::MAMDA_BOOK_SIDE_ASK, 
                          mQuoteCache.mQuoteTime);
            }
        }
    }
    
    if (mUpdateInconsistentBook || mFullBook->getIsConsistent())
    {
        invokeDeltaHandlers (subscription, &msg);
    } 
}
    void MamdaOrderBookPriceLevel::setAsDifference (
        const MamdaOrderBookPriceLevel&  lhs,
        const MamdaOrderBookPriceLevel&  rhs)
    {
        assert (lhs.getPrice() == rhs.getPrice());

        MamdaOrderBookPriceLevel::iterator lhsEnd  = end();
        MamdaOrderBookPriceLevel::iterator lhsIter = begin();
        MamdaOrderBookPriceLevel::iterator rhsEnd  = end();
        MamdaOrderBookPriceLevel::iterator rhsIter = begin();

        while ((lhsIter != lhsEnd) && (rhsIter != rhsEnd))
        {
            const char*      lhsId   = NULL;
            const char*      rhsId   = NULL;
            mama_quantity_t  lhsSize = 0.0;
            mama_quantity_t  rhsSize = 0.0;

            if (lhsIter != lhsEnd)
            {
                const MamdaOrderBookEntry* entry = *lhsIter;
                lhsId   = entry->getId();
                lhsSize = entry->getSize();
            }
            if (rhsIter != rhsEnd)
            {
                const MamdaOrderBookEntry* entry = *rhsIter;
                rhsId   = entry->getId();
                rhsSize = entry->getSize();
            }

            if (lhsId && rhsId)
            {
                if (strcmp(lhsId,rhsId)==0)
                {
                    // Same ID, maybe different size.
                    if (mama_isQuantityEqual (lhsSize, rhsSize))
                    {
                        MamdaOrderBookEntry* updateEntry =
                            new MamdaOrderBookEntry (**rhsIter);
                        updateEntry->setAction(
                            MamdaOrderBookEntry::MAMDA_BOOK_ACTION_UPDATE);
                        addEntry (updateEntry);
                    }
                    ++lhsIter;
                    ++rhsIter;
                    continue;
                }
                else
                {
                    // Different ID (either something exists on the LHS
                    // and not on RHS or vice versa).
                    MamdaOrderBookPriceLevel::const_iterator rhsFound = 
                        findEntryAfter (rhsIter, lhsId);
                    if (rhsFound != rhsEnd)
                    {
                        // The ID from the LHS was found on the RHS, so
                        // there must have been additional entries on the
                        // RHS, which we now need to add.
                        do
                        {
                            MamdaOrderBookEntry* entry =
                                new MamdaOrderBookEntry(**rhsIter);
                            addEntry (entry);
                            ++rhsIter;
                        }
                        while (rhsIter != rhsFound);
                    }
                    else
                    {
                        // The ID from the LHS was not present on the RHS,
                        // so add the LHS entry.  Note: it would probably
                        // be faster to iterate over the LHS side rather
                        // than begin the loop again.
                        MamdaOrderBookEntry* entry =
                            new MamdaOrderBookEntry(**lhsIter);
                        addEntry (entry);
                        ++lhsIter;
                    }
                }
            }
        }

        setPrice (rhs.getPrice());
        setSizeChange (rhs.getSize() - lhs.getSize());
        setSize (rhs.getSize());
        setNumEntries (rhs.getNumEntries());
        setAction (MamdaOrderBookPriceLevel::MAMDA_BOOK_ACTION_UPDATE);
        setTime (rhs.getTime());
        setSide (rhs.getSide());
    }