Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <unordered_map>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. enum class Side {
  9. BID = 0,
  10. ASK = 1,
  11. };
  12.  
  13. struct Order {
  14. int Price;
  15. int Amount;
  16. int OrderID;
  17. Side side;
  18. };
  19.  
  20. struct Deal {
  21. int Price;
  22. int Amount;
  23. int OrderID_ASK;
  24. int OrderID_BID;
  25. };
  26.  
  27. class OrderBook {
  28. private:
  29. using Price = int;
  30. using Time = int;
  31. using Id = int;
  32. using Amount = int;
  33.  
  34. struct Comp_bid {
  35. bool operator () (const tuple<Price, Time, Id> &a, const tuple<Price, Time, Id> &b) const {
  36. if(get<0>(a) == get<0>(b)) {
  37. if(get<1>(a) == get<1>(b)) {
  38. return get<2>(a) < get<2>(b);
  39. }
  40. return get<1>(a) < get<1>(b);
  41. }
  42. return get<0>(a) > get<0>(b);
  43. }
  44. };
  45.  
  46. set<tuple<Price, Time, Id>, Comp_bid> bid_s;
  47. set<tuple<Price, Time, Id>> ask_s;
  48. unordered_map<Id, tuple<Price, Time, Amount, Side>> id_to_info;
  49.  
  50. Time tm_ = 0;
  51. Time get_time() {
  52. return tm_++;
  53. }
  54.  
  55. bool price_comp(Side side, Price a, Price b) {
  56. if(side == Side::ASK) {
  57. return a >= b;
  58. }
  59. else {
  60. return a <= b;
  61. }
  62. }
  63.  
  64. template <typename T>
  65. vector<Deal> add_order_(const Order& order, T& orders) {
  66. vector<Deal> deals;
  67. Amount order_amount = order.Amount;
  68. Price pr = order.Price;
  69. Time tm = get_time();
  70. Id order_id = order.OrderID;
  71. Side order_side = order.side;
  72. while(!orders.empty() && order_amount > 0 && price_comp(order_side, get<0>(*orders.begin()), pr)) {
  73. auto pot_order_it = orders.begin();
  74. Id pot_order_id = get<2>(*pot_order_it);
  75. auto& pot_order_info = id_to_info[pot_order_id];
  76. Amount new_amount = get<2>(pot_order_info) - order_amount;
  77. if(new_amount > 0) {
  78. id_to_info[pot_order_id] = {get<0>(pot_order_info), get<1>(pot_order_info), new_amount, get<3>(pot_order_info)};
  79. }
  80. else {
  81. orders.erase(orders.begin());
  82. id_to_info.erase(pot_order_id);
  83. }
  84. Deal deal;
  85. deal.Amount = min(order_amount, get<2>(pot_order_info));
  86. deal.Price = get<1>(pot_order_info);
  87. if(order.side == Side::ASK) {
  88. deal.OrderID_ASK = order_id;
  89. deal.OrderID_BID = pot_order_id;
  90. }
  91. else {
  92. deal.OrderID_ASK = pot_order_id;
  93. deal.OrderID_BID = order_id;
  94. }
  95. deals.push_back(deal);
  96. order_amount = max(0, - new_amount);
  97. }
  98. if(order_amount > 0) {
  99. if(order.side == Side::ASK) {
  100. ask_s.insert({pr, tm, order_id});
  101. }
  102. else {
  103. bid_s.insert({pr, tm, order_id});
  104. }
  105. id_to_info[order_id] = {pr, tm, order_amount, order_side};
  106. }
  107. return deals;
  108. }
  109.  
  110. public:
  111. vector<Deal> add_order(const Order& order) {
  112. if(order.side == Side::ASK) {
  113. return add_order_(order, bid_s);
  114. }
  115. else {
  116. return add_order_(order, ask_s);
  117. }
  118. }
  119.  
  120. Amount delete_order(Id order_id) {
  121. auto& order_info = id_to_info[order_id];
  122. Side sd = get<3>(order_info);
  123. Price pr = get<0>(order_info);
  124. Time tm = get<1>(order_info);
  125. Amount amnt = get<2>(order_info);
  126. if(sd == Side::ASK) {
  127. ask_s.erase({pr, tm, order_id});
  128. }
  129. else {
  130. bid_s.erase({pr, tm, order_id});
  131. }
  132. id_to_info.erase(order_id);
  133. return amnt;
  134. }
  135. };
  136.  
  137.  
  138.  
  139. int main() {
  140. OrderBook book;
  141. book.add_order({10, 5, 1, Side::ASK});
  142. book.add_order({5, 2, 2, Side::ASK});
  143. book.add_order({11, 4, 3, Side::BID});
  144.  
  145. book.add_order({8, 1, 4, Side::BID});
  146. book.add_order({8, 1, 4, Side::ASK});
  147. book.delete_order(1);
  148. return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement