OnixS C++ B3 Binary UMDF Market Data Handler  1.8.2
API documentation
Backtesting Sample

This sample shows how to use Handler replay functional.

Source code

#include <iostream>
#include <OnixS/B3/MarketData/UMDF.h>
#include "OnixS/B3/MarketData/UMDF/Messaging.h"
using namespace std;
using namespace OnixS::B3::MarketData::UMDF;
class MyListener
: public ErrorListener
, public WarningListener
, public ReplayListener
, public MessageListener
{
public:
/// Notifications about errors.
void onError(ErrorCode::Enum code, const std::string& description) ONIXS_B3_UMDF_MD_FINAL
{
clog
<< "Error occurred, errorCode = "
<< enumToString (code)
<< ". Description: '"
<< description
<< "'"
<< endl;
}
/// Notifications about warnings.
void onWarning(const std::string& description) ONIXS_B3_UMDF_MD_FINAL
{
clog
<< "Warning occurred. Description: '"
<< description
<< "'"
<< endl;
};
void onReplayError(const std::string& errorDescription) ONIXS_B3_UMDF_MD_FINAL
{
clog << "Replay error: " << errorDescription << endl;
replaySemaphore_.release();
}
void onReplayFinished() ONIXS_B3_UMDF_MD_FINAL
{
replaySemaphore_.release();
}
/// Wait for reference data snapshot cycle end.
void waitUntilReplayFinished()
{
replaySemaphore_.acquire();
}
void onSequenceReset_1(const Messaging::SequenceReset_1 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSequence_2(const Messaging::Sequence_2 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onEmptyBook_9(const Messaging::EmptyBook_9 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onChannelReset_11(const Messaging::ChannelReset_11 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSecurityStatus_3(const Messaging::SecurityStatus_3 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSecurityGroupPhase_10(const Messaging::SecurityGroupPhase_10 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSecurityDefinition_12(const Messaging::SecurityDefinition_12 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSnapshotFullRefresh_Header_30(const Messaging::SnapshotFullRefresh_Header_30 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSnapshotFullRefresh_Orders_MBO_71(const Messaging::SnapshotFullRefresh_Orders_MBO_71 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onNews_5(const Messaging::News_5 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onClosingPrice_17(const Messaging::ClosingPrice_17 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onQuantityBand_21(const Messaging::QuantityBand_21 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onPriceBand_22(const Messaging::PriceBand_22 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onOpeningPrice_15(const Messaging::OpeningPrice_15 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onTheoreticalOpeningPrice_16(const Messaging::TheoreticalOpeningPrice_16 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onAuctionImbalance_19(const Messaging::AuctionImbalance_19 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onHighPrice_24(const Messaging::HighPrice_24 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onLowPrice_25(const Messaging::LowPrice_25 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onLastTradePrice_27(const Messaging::LastTradePrice_27 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onSettlementPrice_28(const Messaging::SettlementPrice_28 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onOpenInterest_29(const Messaging::OpenInterest_29 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onOrder_MBO_50(const Messaging::Order_MBO_50 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onDeleteOrder_MBO_51(const Messaging::DeleteOrder_MBO_51 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onMassDeleteOrders_MBO_52(const Messaging::MassDeleteOrders_MBO_52 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onTrade_53(const Messaging::Trade_53 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onForwardTrade_54(const Messaging::ForwardTrade_54 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onExecutionSummary_55(const Messaging::ExecutionSummary_55 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onExecutionStatistics_56(const Messaging::ExecutionStatistics_56 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
void onTradeBust_57(const Messaging::TradeBust_57 msg, const DataSource&) ONIXS_B3_UMDF_MD_FINAL
{
clog << msg << endl;
}
private:
/// Signaled when all reference data is received.
System::Semaphore replaySemaphore_;
};
void replayLog(HandlerSettings settings)
{
MyListener listener;
Handler handler(settings);
handler.log(LogLevel::Trace, "Replay log sample.");
handler.registerMessageListener(&listener);
ReplayOptions replayOptions;
replayOptions.listener = &listener;
replayOptions.files.push_back ("data/log.log");
handler.replayLogs(replayOptions);
listener.waitUntilReplayFinished();
}
void replayPcap(HandlerSettings settings)
{
settings.snapshotFeeds.a = Feed("233.252.8.4", 30068);
settings.instrumentFeeds.a = Feed("233.252.8.6", 10068);
settings.incrementalFeeds.a = Feed("233.252.8.5", 20068);
MyListener listener;
Handler handler(settings);
handler.log(LogLevel::Trace, "Replay pcap sample.");
handler.registerMessageListener(&listener);
ReplayOptions replayOptions;
replayOptions.listener = &listener;
replayOptions.files.push_back("data/Incremental.pcap.gz");
handler.replayPcap(replayOptions, {"data/Instrument.pcap.gz"}, {"data/Snapshot.pcap.gz"});
listener.waitUntilReplayFinished();
}
/// The main entry point.
int main ()
{
clog
<< "OnixS C++ B3 Binary UMDF Market Data Handler Backtesting sample, version "
<< Handler::version ()
<< '.'
<< endl
<< endl;
HandlerSettings settings;
settings.licenseDirectory = "../../license";
settings.loggerSettings.logDirectory = "logs";
settings.loggerSettings.logLevel = LogLevel::Debug;
settings.buildOrderBooks = true;
try
{
clog << "Will start the Handler in replay mode ..." << endl;
replayLog(settings);
replayPcap(settings);
clog << "Replay finished" << endl;
}
catch (const std::exception& ex)
{
cerr << "EXCEPTION: " << ex.what() << endl;
}
catch (...)
{
cerr << "UNKNOWN EXCEPTION" << endl;
}
return 0;
}