UMDF Quick Start

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; }