Last active
April 1, 2016 11:56
-
-
Save dmitru/968a4443acbef325679b to your computer and use it in GitHub Desktop.
HFTBattle Blog, article #2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @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