Reads a single binary ICE iMpact message from a file, dispatches on its message type and prints the decoded message. It illustrates how to deserialize raw market data messages without running a live Handler.
#include "../Common/Utils.h"
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <stdexcept>
#include <vector>
inline unsigned short rotate(unsigned short x)
{
return (x >> 8) | ((x & 0xff) << 8);
}
template <typename T>
void dump(const std::vector<char>& data)
{
std::cout << T(&data[0], data.size()) << std::endl;
}
int main(int argc, char** argv)
{
try
{
introduceMyself("Deserialization");
const std::string HELP_ARG = "--help";
if (argc == 2 && HELP_ARG == argv[1])
{
std::cout << "Usage: Deserialization <path>" << std::endl;
return EXIT_SUCCESS;
}
const char* path = argc > 1 ? argv[1] : "data/FuturesProductDefinition.bin";
std::ifstream ifs(path);
if (!ifs)
{
std::cerr << "ERROR: can't open file '" << path << "'" << std::endl;
return EXIT_FAILURE;
}
char msgType = 0;
ifs.read(&msgType, sizeof(msgType));
unsigned short msgSize = 0;
ifs.read((char*)&msgSize, sizeof(msgSize));
msgSize = rotate(msgSize);
const std::size_t fullMsgSize = sizeof(msgType) + sizeof(msgSize) + msgSize;
std::vector<char> data(fullMsgSize);
ifs.read(&data[3], msgSize);
switch (msgType)
{
dump<AddModifyOrder>(data);
break;
dump<AddPriceLevel>(data);
break;
dump<BundleMarker>(data);
break;
dump<CancelledTrade>(data);
break;
dump<ChangePriceLevel>(data);
break;
dump<ClosePrice>(data);
break;
dump<DeleteOrder>(data);
break;
dump<DeletePriceLevel>(data);
break;
dump<EndOfDayMarketSummary>(data);
break;
dump<FixingIndicativePrice>(data);
break;
dump<FixingLockdown>(data);
break;
dump<FixingTransition>(data);
break;
dump<FuturesProductDefinition>(data);
break;
dump<FuturesStrategyDefinition>(data);
break;
dump<IntervalTieredPriceLimitNotification>(data);
break;
dump<InvestigatedTrade>(data);
break;
dump<MarkerIndexPrices>(data);
break;
dump<MarketEvent>(data);
break;
dump<MarketSnapshot>(data);
break;
dump<MarketSnapshotOrder>(data);
break;
dump<MarketSnapshotPriceLevel>(data);
break;
dump<MarketStateChange>(data);
break;
dump<MarketStatistics>(data);
break;
dump<NewExpiry>(data);
break;
dump<NewFuturesStrategyDefinition>(data);
break;
dump<NewOptionsMarketDefinition>(data);
break;
dump<NewOptionsStrategyDefinition>(data);
break;
dump<OldStyleOptionsTradeAndMarketStats>(data);
break;
dump<OpenInterest>(data);
break;
dump<OpenPrice>(data);
break;
dump<OptionsProductDefinition>(data);
break;
dump<OptionsStrategyDefinition>(data);
break;
dump<OptionOpenInterest>(data);
break;
dump<OptionSettlementPrice>(data);
break;
dump<PreOpenPriceIndicator>(data);
break;
dump<Rfq>(data);
break;
dump<SettlementPrice>(data);
break;
dump<SpecialField>(data);
break;
dump<SpotMarketTrade>(data);
break;
dump<SystemText>(data);
break;
dump<Trade>(data);
break;
default:
std::cout << "ERROR: unknown message type '" << msgType << "'" << std::endl;
break;
}
}
catch (const std::exception& ex)
{
std::cerr << "Error: " << ex.what() << std::endl;
return EXIT_FAILURE;
}
catch (...)
{
std::cerr << "Unknown exception." << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}