void onSecurityCreate (
        MamdaSubscription*             subscription,
        MamdaMultiSecurityManager&     manager,
        const char*                    securitySymbol,
        bool                           isPrimary)
    {
        // Create a trade and quote listener for the security
        MamdaTradeListener* aTradeListener = new MamdaTradeListener;
        MamdaQuoteListener* aQuoteListener = new MamdaQuoteListener;
        ComboTicker*        aTicker = new ComboTicker (*aTradeListener,
                                                       *aQuoteListener);

        aQuoteListener->addHandler (aTicker);
        aTradeListener->addHandler (aTicker);
        manager.addSecurityListener (aQuoteListener, securitySymbol);
        manager.addSecurityListener (aTradeListener, securitySymbol);
    }
int main (int argc, const char **argv)
{
    try
    {
        CommonCommandLineParser     cmdLine (argc, argv);
        // Initialise the MAMA API
        mamaBridge bridge = cmdLine.getBridge();
        Mama::open ();

        const vector<const char*>&  symbolList    = cmdLine.getSymbolList ();
        MamaSource*                 source        = cmdLine.getSource();
        MamaSource*                 optionSource  = cmdLine.getOptionSource();
        int                         duration      = cmdLine.getOptInt ("duration");
        double                      timeout       = cmdLine.getTimeout ();
        MamaLogLevel                subscLogLevel = cmdLine.getSubscLogLevel();
        MamaQueueGroup  queues (cmdLine.getNumThreads(), bridge);

        double  throttleRate  = cmdLine.getThrottleRate ();
        if ((throttleRate > 100.0) || (throttleRate <= 0.0))
        {
            // We don't really want to swamp the FHs with these types of
            // subscriptions.  
            throttleRate = 100.0;
        }
        source->getTransport()->setOutboundThrottle (throttleRate,
                                                     MAMA_THROTTLE_DEFAULT);

        DictRequester   dictRequester (bridge);
        dictRequester.requestDictionary (cmdLine.getDictSource());
        MamdaTradeFields::setDictionary (*dictRequester.getDictionary());
        MamdaQuoteFields::setDictionary (*dictRequester.getDictionary());
        MamdaFundamentalFields::setDictionary (*dictRequester.getDictionary());
        MamdaOptionFields::setDictionary (*dictRequester.getDictionary());

        const char* symbolMapFile = cmdLine.getSymbolMapFile ();
        if (symbolMapFile)
        {
            MamaSymbolMapFile* aMap = new MamaSymbolMapFile;
            if (MAMA_STATUS_OK == aMap->load (symbolMapFile))
            {
                source->getTransport()->setSymbolMap (aMap);
                optionSource->getTransport()->setSymbolMap (aMap);
            }
        }

        for (vector<const char*>::const_iterator i = symbolList.begin ();
            i != symbolList.end ();
            ++i)
        {
            const char* symbol = *i;
            MamaQueue* queue = queues.getNextQueue();

            // Create chain and listener objects.
            MamdaTradeListener* aBaseTradeListener = new MamdaTradeListener;
            MamdaQuoteListener* aBaseQuoteListener = new MamdaQuoteListener;
            MamdaFundamentalListener* aFundamentalListener
                = new MamdaFundamentalListener;
            MamdaOptionChain*   anOptionChain = new MamdaOptionChain (symbol);
            anOptionChain->setUnderlyingQuoteListener (aBaseQuoteListener);
            anOptionChain->setUnderlyingTradeListener (aBaseTradeListener);
            MamdaOptionChainListener*  anOptionListener =
                new MamdaOptionChainListener (anOptionChain);

            // By Default Expirate Date , Strike Price and PutCall fields
            // are considered manditory to the creation of an option contract
            // Clear monditory status of each of these fields if so directed
            // n the command line.
            anOptionListener->setManditoryFields (
                !cmdLine.getOptBool ("noExpire"),
                !cmdLine.getOptBool ("noStrike"),
                !cmdLine.getOptBool ("noPutCall"));

            // Create our handlers (the UnderlyingTicker and
            // OptionChainDisplay could be a single class).
            UnderlyingTicker*   aBaseTicker = 
                new UnderlyingTicker (*anOptionChain);
            OptionChainDisplay*  aDisplay = 
                new OptionChainDisplay (*anOptionChain);

            // Create subscriptions for underlying and option chain:
            MamdaSubscription*  anOptionSubscription = new MamdaSubscription;

            // Register for underlying quote and trade events.
            aBaseTradeListener->addHandler (aBaseTicker);
            aBaseQuoteListener->addHandler (aBaseTicker);
            aFundamentalListener->addHandler (aBaseTicker);
 


            // Register for underlying option events.
            anOptionListener->addHandler (aDisplay);

            // The timeout defaults to 1 for this example because we
            // currently use the timeout feature to determine when
            // to say that we have received all of the initials.     
            anOptionSubscription->setTimeout (timeout);
            anOptionSubscription->addMsgListener (anOptionListener);
            anOptionSubscription->addQualityListener (aDisplay);
            anOptionSubscription->addErrorListener (aDisplay);
            anOptionSubscription->setType (MAMA_SUBSC_TYPE_GROUP);
            anOptionSubscription->create (queue, source, symbol);
            // logger...
            anOptionSubscription->getMamaSubscription ()->
                setDebugLevel (subscLogLevel);
        }
        
        ShutdownTimer shutdownCallback (bridge);
        MamaTimer     shutdownTimer;
        if (duration > 0)
        {
            shutdownTimer.create (Mama::getDefaultEventQueue (bridge), 
                                  &shutdownCallback, duration, 
                                  queues.getNextQueue());
        }
        Mama::start(bridge);
    }
    catch (MamaStatus &e)
    {
        
        // This exception can be thrown from Mama::start (),
        // Mama::createTransport (transportName) and from
        // MamdaSubscription constructor when entitlements is enabled.
        cerr << "Exception in main (): " << e.toString () << endl;
        exit (1);
    }
    catch (exception &ex)
    {
        cerr << "Exception in main (): " << ex.what () << endl;
        exit (1);
    }
    catch (...)
    {
        cerr << "Unknown Exception in main ()." << endl;
        exit (1);
    }
}
Exemplo n.º 3
0
int main (int argc, const char **argv)
{
    setbuf (stdout, NULL);
    try
    {
        CommonCommandLineParser     cmdLine (argc, argv);
        // Initialise the MAMA API
        mamaBridge bridge = cmdLine.getBridge();
        Mama::open ();
        
        const vector<const char*>& symbolList = cmdLine.getSymbolList ();
        MamaSource*                source     = cmdLine.getSource();
        MamaQueueGroup   queues (cmdLine.getNumThreads(), bridge);

        DictRequester    dictRequester (bridge);
        dictRequester.requestDictionary (cmdLine.getDictSource());
        MamdaCommonFields::setDictionary (*dictRequester.getDictionary());
        MamdaTradeFields::setDictionary (*dictRequester.getDictionary());

        const char* symbolMapFile = cmdLine.getSymbolMapFile ();
        if (symbolMapFile)
        {
            MamaSymbolMapFile* aMap = new MamaSymbolMapFile;
            if (MAMA_STATUS_OK == aMap->load (symbolMapFile))
            {
                source->getTransport()->setSymbolMap (aMap);
            }
        }

        for (vector<const char*>::const_iterator i = symbolList.begin ();
            i != symbolList.end ();
            ++i)
        {
            const char* symbol = *i;
            MamdaSubscription*  aSubscription  = new MamdaSubscription;
            MamdaTradeListener* aTradeListener = new MamdaTradeListener;
            TradeTicker*        aTicker        = new TradeTicker;

            aTradeListener->addHandler (aTicker);
            aSubscription->addMsgListener (aTradeListener);
            aSubscription->addQualityListener (aTicker);
            aSubscription->addErrorListener (aTicker);
            aSubscription->create (queues.getNextQueue(), source, symbol);
        }

        Mama::start(bridge);
    }
    catch (MamaStatus &e)
    {
        // This exception can be thrown from Mama::open ()
        // Mama::createTransport (transportName) and from
        // MamdaSubscription constructor when entitlements is enabled.
        cerr << "MamaStatus exception in main (): " << e.toString () << endl;
        exit (1);
    }
    catch (exception &ex)
    {
        cerr << "Exception in main (): " << ex.what () << endl;
        exit (1);
    }
    catch (...)
    {
        cerr << "Unknown Exception in main ()." << endl;
        exit (1);
    }
    return 1;
}