1 #ifndef jb_itch5_price_levels_hpp 2 #define jb_itch5_price_levels_hpp 19 template <
typename price_field_t>
22 price_field_t::denom >= 10000,
23 "price_levels() does not work with denom < 10000");
25 price_field_t::denom % 10000 == 0,
26 "price_levels() does not work with (denom % 10000) != 0");
28 price_field_t
const unit = price_field_t::dollar_price();
29 auto constexpr penny = price_field_t::denom / 100;
30 auto constexpr mill = penny / 100;
33 throw std::range_error(
"invalid price range in price_levels()");
38 return (hi.as_integer() - lo.as_integer()) / penny;
43 return (hi.as_integer() - lo.as_integer()) / mill;
45 if (lo.as_integer() == 0) {
48 return 10000 + (hi.as_integer() - unit.as_integer()) / penny;
61 template <
typename price_field_t>
64 price_field_t::denom >= 10000,
65 "price_levels() does not work with denom < 10000");
67 price_field_t::denom % 10000 == 0,
68 "price_levels() does not work with (denom % 10000) != 0");
70 price_field_t
const max_price = max_price_field_value<price_field_t>();
71 std::size_t
const max_level =
price_levels(price_field_t(0), max_price);
72 if (p_level > max_level) {
73 throw std::range_error(
"invalid price range in price_levels()");
75 if (p_level <= price_field_t::denom) {
76 return price_field_t(p_level);
78 int rem = (p_level - price_field_t::denom) * 100 + price_field_t::denom;
79 return price_field_t(rem);
85 #endif // jb_itch5_price_levels_hpp auto level_to_price(typename price_field_t::wire_type const p_level)
Compute the absolute price of a price level.
std::size_t price_levels(price_field_t lo, price_field_t hi)
Compute the number of price levels between two prices.
The top-level namespace for the JayBeams library.