93 lines
2.8 KiB
C++
93 lines
2.8 KiB
C++
|
|
#include "SecurityMapper.h"
|
|
#include "PriceSize.h"
|
|
#include "UserSymbol.h"
|
|
#include "lib/config/config.h"
|
|
#include "lib/config/protos/cme_reference_data.pb.h"
|
|
#include "lib/config/protos/market_data.pb.h"
|
|
#include "lib/utils/parse_enum.h"
|
|
|
|
#ifndef _WIN32
|
|
#include <btree/map.h>
|
|
|
|
namespace bts {
|
|
namespace md {
|
|
struct DisplayFactorMapper : public ISecurityMapper {
|
|
btree::map<UserSymbol, int> _mapped;
|
|
DisplayFactorMapper() : _mapped() {
|
|
for (const auto &ov : config::get<DisplayFactorOverrideList>().items()) {
|
|
if (ov.price_multiplier() != 0) {
|
|
auto venue = parse_enum<api::Venue>(
|
|
ov.exchange(), "VENUE", api::Venue_Parse);
|
|
bts_assert_msg(
|
|
venue, fmt::format("Invalid venue `{}`", ov.exchange()));
|
|
auto type = parse_enum<SecurityType>(
|
|
ov.type(), "SECURITYTYPE", api::SecurityType_Parse);
|
|
|
|
if (type) {
|
|
_mapped.insert(std::make_pair(
|
|
UserSymbol{uppercase_copy(ov.symbol()), *venue, *type},
|
|
-to_exponent(ov.price_multiplier())));
|
|
} else {
|
|
for (auto t : {
|
|
SecurityType::SECURITYTYPE_FUTURE,
|
|
SecurityType::SECURITYTYPE_SPREAD,
|
|
SecurityType::SECURITYTYPE_OPTION,
|
|
SecurityType::SECURITYTYPE_SPOT,
|
|
}) {
|
|
_mapped.insert(std::make_pair(
|
|
UserSymbol{uppercase_copy(ov.symbol()), *venue, t},
|
|
-to_exponent(ov.price_multiplier())));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void apply(FixedSecurity &f) const override {
|
|
UserSymbol key{f.symbol(), f.exchange, f.type};
|
|
auto iter = _mapped.find(key);
|
|
if (iter != _mapped.end()) {
|
|
f.display_factor = iter->second;
|
|
}
|
|
}
|
|
};
|
|
|
|
struct CppOverride : public ISecurityMapper {
|
|
btree::map<std::string, double> _map;
|
|
CppOverride() : _map() {
|
|
for (const auto &p : config::get<config::CppConfig>().cpp_entry()) {
|
|
_map.insert(p);
|
|
}
|
|
}
|
|
|
|
void apply(FixedSecurity &f) const override {
|
|
auto iter = _map.find(f.symbol());
|
|
if (iter != _map.end()) {
|
|
f.cash_per_point = iter->second;
|
|
}
|
|
}
|
|
};
|
|
|
|
SecurityMapper::SecurityMapper(bool enabled) : _impl() {
|
|
if (enabled) {
|
|
_impl.push_back(std::make_unique<DisplayFactorMapper>());
|
|
_impl.push_back(std::make_unique<CppOverride>());
|
|
// Register more mappers HERE
|
|
}
|
|
}
|
|
|
|
#else
|
|
namespace bts {
|
|
namespace md {
|
|
SecurityMapper::SecurityMapper(bool) : _impl() {}
|
|
#endif
|
|
|
|
SecurityMapper::~SecurityMapper() {}
|
|
void SecurityMapper::apply(FixedSecurity &security) {
|
|
for (const auto &m : _impl) {
|
|
m->apply(security);
|
|
}
|
|
}
|
|
}
|
|
} // namespace
|