UMDF Quick Start

These chapters describe the creation of a simple Bovespa application step-by step with samples.

Follow these instructions to get it to work:

  • Initialize FIX engine
  • Create BovespaApplication
  • Subscribe to symbol
  • Process incoming market data
  • Stop, release resources

Engine initialization

Execute the following instruction to initialize FIX engine.


// Initializes engine.
Engine::FixEngine::init();


The engine.properties file is required to read the engine configuration parameters. It must, by default, be present in the current directory. If the file is located elsewhere or has a different name specify the properties file name and path explicitly.


// Initializes engine.
Engine::FixEngine::init ("engine.properties");


If an error occurs during initialization (the properties file is not found, a required property is missing etc.) the exception will be thrown.


// Initializes engine.
try {
   Engine::FixEngine::init("engine.properties");
} 
catch( const Utils::Exception& ex ) {
   cout << "ERROR: " << ex.what() << endl;
}

BovespaApplication creation

You can create an BovespaApplication in three steps:

  • Configure BovespaApplication parameters
  • Create an BovespaApplication object


        // Initialize parameters   
        BovespaApplicationParams params;

        // XML configs
        params.templatesFn_ = "templates.xml";
        params.configXml_ = "config.xml";

        // TCP Replay parameters
        params.tcpReplayParams_.senderCompId_ = "Sender";
        params.tcpReplayParams_.targetCompId_ = "Target";
        params.tcpReplayParams_.username_ = "username";
        params.tcpReplayParams_.password_ = "12345";
        params.tcpReplayParams_.ip_ = "1.2.3.4;";
        params.tcpReplayParams_.port_ = 3001;

        // Create Application object    
        app_ = Engine::FixEngine::singleton()->createBovespaApplication(params);

Subscription

You will start receiving market data from after you subscribe to a symbol and provide per-instrument listener.

Use the BovespaApplication::subscribe method for that. Market data will be delivered to the listener's callbacks


auto listener = new PerInstrumentListener();

BovespaSubscriptionItem item;
item.symbol_ = symbol;

app_->subscribeToInstrument(item, listener);

Releasing resources

Use the BovespaApplication::release() method to release the resources. Calling unsubscribe is optional.

Full sample

The sample below illustrates all above mentioned instructions combined in one application.

#include <iostream>
#include <string>

#include <B2BITS_FixEngine.h>
#include <B2BITS_BovespaApplication.h>
#include <B2BITS_BovespaApplicationListeners.h>


using namespace Bovespa;

struct PerInstrumentListener : public InstrumentListener
{
    void onSubscribed(BovespaSubscriptionItem const& item)
    {
        // instrument subscribed, 
    }

    virtual void onUnsubscribed(BovespaSubscriptionItem const& subsItem)
    {
        // delete this
        this->release();
    }

    virtual bool onSecurityDefinition(BovespaSubscriptionItem const& subsItem, Engine::FIXMessage const& dMsg) override {
        // process security definition message, 35=d
    }

    virtual bool onIncrement(BovespaSubscriptionItem const& subsItem, Engine::FIXMessage const* const* msgs, size_t count) {
        // process incremental message, 35=X
    }

    virtual bool onNaturalRefresh(BovespaSubscriptionItem const& subsItem, Engine::FIXMessage const* const* nrMsgs, size_t count, bool isNewSequence) override {
        // if NaturalRefresh is enabled updates will be available here,  35=X
    }

    virtual void onSnapshot(BovespaSubscriptionItem const& subsItem, Engine::FIXMessage const* msg) override {
        // process snapshot message,  35=W
    }

    virtual void process(BovespaSubscriptionItem const& subsItem, Engine::FIXMessage const* msg) override {
        // process other 35!=X, 35!=W
    }

    virtual void onRecoveryStarted(BovespaSubscriptionItem const& subsItem) override {
        // mark instrument as invalid
        recovered_ = false;
    }

    virtual void onRecoveryStopped(BovespaSubscriptionItem const& subsItem, RecoveryReason reason) {
        // mark instrument as valid
        recovered_ = true;
    }

    virtual void onError(BovespaSubscriptionItem const& subsItem, Engine::AsciiString const& error) {
        // log error
        std::cerr << error << std::endl;
    }

    virtual void onBookReset(BovespaSubscriptionItem const& subsItem) override {
        // reset instrument book
    }

    bool recovered_ = true;
};

class BovespaClient
{
public:
    BovespaClient()
    {
        // Initialize parameters   
        BovespaApplicationParams params;

        // XML configs
        params.templatesFn_ = "templates.xml";
        params.configXml_ = "config.xml";

        // TCP Replay parameters
        params.tcpReplayParams_.senderCompId_ = "Sender";
        params.tcpReplayParams_.targetCompId_ = "Target";
        params.tcpReplayParams_.username_ = "username";
        params.tcpReplayParams_.password_ = "12345";
        params.tcpReplayParams_.ip_ = "1.2.3.4;";
        params.tcpReplayParams_.port_ = 3001;

        // Create Application object    
        app_ = Engine::FixEngine::singleton()->createBovespaApplication(params);
    }

    void subscribe(std::string const& symbol)
    {
        auto listener = new PerInstrumentListener();
        BovespaSubscriptionItem item;
        item.symbol_ = symbol;
        item.recovery_ = RO_USE_MARKET_TCP_AS_POSIBLE_RECOVERY;

        app_->subscribeToInstrument(item, listener);
    }

    void release() {
        app_->release();
        app_ = NULL;
    }
private:
    BovespaApplication* app_ = nullptr;
};

int main(int argc, char* argv[])
{
    try
    {
        // Initialize engine.
        Engine::FixEngine::init();

        // Create Application instance
        BovespaClient application;

        // Subscribe for symbol
        application.subscribe("EZTC3");

        // Wait, receiving market data
        char c;
        std::cin >> c;

        // release resources
        application.release();
        Engine::FixEngine::destroy();
    }
    catch (const Utils::Exception& ex)
    {
        std::cout << " ERROR: " << ex.what() << std::endl;
        return -1;
    }
    return 0;
}