Advertisement
den4ik2003

Untitled

Feb 28th, 2024
690
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1.     void MakeNewOrdersWithGrid(std::vector<order_t>& orders) {
  2.         auto call_config = connector::call_config{ // можно перейти на операцию ИЛИ (operator |) в коннекторе от известных конфигов, хз пока как лучше
  3.                                                     .enable_grid = true,
  4.                                                     .except_on_error = false,
  5.                                                     .local_preprocessing = true,
  6.                                                 };
  7.  
  8.         auto grid = market_->local().grid().snapshot(symbol_); // <int64_t, int64_t> -> по цене количество
  9.  
  10.         for (const auto& [scaled_price, scaled_qty] : grid) {
  11.             bool was_found = false;
  12.             for (const auto& order : orders) {
  13.                 if (order.price == precised_float::from_scaled(scaled_price, symbol_->quote_asset_precision)) { // т.е. такой уровень уже был
  14.                     was_found = true;
  15.                     auto grid_qty = precised_float::from_scaled(scaled_qty, symbol_->base_asset_precision);
  16.                     grid_qty *= (order.side == e_side::SELL ? -1 : 1);
  17.                     if (order.amount != grid_qty) { // но количество отличается
  18.                         auto order_id_res = market_->local().get_order(call_config, symbol_, scaled_price, std::nullopt); // TODO: handle error code
  19.                         market_->cancel_order(call_config, symbol_, order_id_res.value());
  20.                         market_->new_order(call_config, order);
  21.                     }
  22.                 }
  23.             }
  24.             if (!was_found) { // Случай, когда в новых ордерах нет такого уровня
  25.                 auto order_id_res = market_->local().get_order(call_config, symbol_, scaled_price, std::nullopt); // TODO: handle error code
  26.                 market_->cancel_order(call_config, symbol_, order_id_res.value());
  27.                 grid.erase(scaled_price);
  28.             }
  29.         }
  30.  
  31.         // к этому моменту в гриде актуальное всё выставлено, за исключением отсутствующих ранее уровней
  32.         for (const auto& order : orders) {
  33.             if (grid.find(order.price.to_scaled()) == grid.end()) {
  34.                 market_->new_order(call_config, order);
  35.             }
  36.         }
  37.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement