Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void MakeNewOrdersWithGrid(std::vector<order_t>& orders) {
- auto call_config = connector::call_config{ // можно перейти на операцию ИЛИ (operator |) в коннекторе от известных конфигов, хз пока как лучше
- .enable_grid = true,
- .except_on_error = false,
- .local_preprocessing = true,
- };
- auto grid = market_->local().grid().snapshot(symbol_); // <int64_t, int64_t> -> по цене количество
- for (const auto& [scaled_price, scaled_qty] : grid) {
- bool was_found = false;
- for (const auto& order : orders) {
- if (order.price == precised_float::from_scaled(scaled_price, symbol_->quote_asset_precision)) { // т.е. такой уровень уже был
- was_found = true;
- auto grid_qty = precised_float::from_scaled(scaled_qty, symbol_->base_asset_precision);
- grid_qty *= (order.side == e_side::SELL ? -1 : 1);
- if (order.amount != grid_qty) { // но количество отличается
- auto order_id_res = market_->local().get_order(call_config, symbol_, scaled_price, std::nullopt); // TODO: handle error code
- market_->cancel_order(call_config, symbol_, order_id_res.value());
- market_->new_order(call_config, order);
- }
- }
- }
- if (!was_found) { // Случай, когда в новых ордерах нет такого уровня
- auto order_id_res = market_->local().get_order(call_config, symbol_, scaled_price, std::nullopt); // TODO: handle error code
- market_->cancel_order(call_config, symbol_, order_id_res.value());
- grid.erase(scaled_price);
- }
- }
- // к этому моменту в гриде актуальное всё выставлено, за исключением отсутствующих ранее уровней
- for (const auto& order : orders) {
- if (grid.find(order.price.to_scaled()) == grid.end()) {
- market_->new_order(call_config, order);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement