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