Skip to content

Instantly share code, notes, and snippets.

@dmitru
Last active April 1, 2016 11:56
Show Gist options
  • Save dmitru/968a4443acbef325679b to your computer and use it in GitHub Desktop.
Save dmitru/968a4443acbef325679b to your computer and use it in GitHub Desktop.
HFTBattle Blog, article #2
void delete_all_at_price(Dir dir, Price price) {
auto orders_map = trading_book_info.orders().get_orders_by_dir_to_map(dir);
auto it = orders_map.find(price);
if (it == orders_map.end()) {
return;
}
auto& active_orders = it->second;
for (auto& order : active_orders) {
delete_order(order);
}
}
// @wanted_amount -- объём заявок, который мы хотим оставить на данной цене.
// Если текущий объём заявок превышает @wanted_amount, то мы снимем лишние заявки.
// Если текущий объём заявок меньше, чем @wanted_amount, мы поставим недостающие заявки.
void manage_amount_on_price(Price price, Amount wanted_amount, Dir dir, const std::vector<OrderSnapshot>& current_orders) {
// dir_sign(Dir dir) -- функция, возвращающая 1 для BID и -1 для ASK.
int sign = -dir_sign(dir);
// index -- переменная, показывающая порядковый индекс текущей цены относительно лучшей. Лучшая цена имеет индекс 0.
size_t index = trading_book.get_index_by_price(dir, price);
auto current_amount = std::accumulate(current_orders.cbegin(), current_orders.cend(), 0,
[](Amount current_amount, const OrderSnapshot &order) {
return current_amount + order->amount;
});
// @max_amount_to_run_from_best -- переменная, указывающая минимальный допустимый объём заявок на лучшей цене.
// Если объём заявок становится меньше этого значения, мы не добавляем новые заявки на эту цену и снимаем все предыдущие.
if (index == 0 && trading_book_info.best_volume(dir) - current_amount < max_amount_to_run_from_best) {
delete_all_at_price(current_orders); // Удаляем все наши заявки с текущей цены.
return;
}
if (current_amount == wanted_amount) {
return;
}
// Если текущий объём заявок превышает @wanted_amount, снимаем лишние заявки.
// Заметим, что при удалении заявок их объём может стать меньше, чем @wanted_amount.
// Например, в случае, на данной цене у нас есть две заявки объёмом 2 лота каждая, а мы хотим оставить суммарный объём, равный трём лотам.
// Мы не можем снять <<половину>> заявки, поэтому нам придётся снять одну заявку, а потом поставить заявку с недостающим объёмом.
if (current_amount > wanted_amount) {
for(auto it = current_orders.rbegin(); it != current_orders.rend(); ++it) {
auto order = *it;
current_amount -= order->amount_rest();
delete_order(order);
if (current_amount <= wanted_amount) {
break;
}
}
}
// Если изначальный объём был меньше, чем @wanted_amount, или в процессе снятия заявок
// суммарный объём стал меньше этого значения, нам нужно добавить заявку с недостающим объёмом.
if (current_amount < wanted_amount) {
add_limit_order(dir, price, wanted_amount - current_amount);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment