Advertisement
den4ik2003

Untitled

Jun 10th, 2024
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. #ifndef __parsing_events_hpp
  2. #define __parsing_events_hpp
  3.  
  4. #include <parsing/types.hpp>
  5. #include <chrono>
  6.  
  7. namespace mira {
  8.  
  9.     template <typename Type>
  10.     class basic_event {
  11.     public:
  12.         Type type;
  13.         size_t orig_ns;
  14.         const ticker_t* symbol = nullptr;
  15.  
  16.         void set_symbol(const ticker_t* new_symbol) {
  17.             symbol = new_symbol;
  18.             if (event_) {
  19.                 event_->set_symbol(symbol);
  20.             }
  21.         }
  22.  
  23.         template <typename Event>
  24.         const Event& get() const {
  25.             if (!event_) {
  26.                 return *static_cast<const Event*>(this);
  27.             }
  28.             return *static_cast<const Event*>(event_.get());
  29.         }
  30.  
  31.         template <typename Event>
  32.         void set(Event&& event) {
  33.             type = event.type;
  34.             event_ = std::make_shared<Event>(std::move(event));
  35.         }
  36.  
  37.     protected:
  38.         std::shared_ptr<basic_event> event_;
  39.     };
  40.  
  41.     template <typename In>
  42.     class basic_handler {
  43.     public:
  44.         virtual void handle(In event) = 0;
  45.     };
  46.  
  47.     template <>
  48.     class basic_handler<void> {
  49.     public:
  50.         virtual void handle() = 0;
  51.     };
  52.  
  53.     template <typename Out>
  54.     class callback_storage {
  55.     public:
  56.         void add_callback(basic_handler<Out>* callback_obj, const ticker_t* symbol = nullptr) {
  57.             callbacks_.push_back(std::make_pair(callback_obj, symbol));
  58.         }
  59.  
  60.     protected:
  61.         using callback = std::pair<basic_handler<Out>*, const ticker_t*>;
  62.         std::vector<callback> callbacks_;
  63.     };
  64.  
  65.     template <typename In, typename Out>
  66.     class advanced_handler : public basic_handler<In>, virtual public callback_storage<Out> {
  67.     public:
  68.         using callback_storage<Out>::callbacks_;
  69.  
  70.         void handle(In event) {
  71.             if constexpr (std::is_same<Out, void>::value) {
  72.                 _process(event);
  73.             } else {
  74.                 Out result = _process(event);
  75.                 if (result.type == decltype(result.type)::NONE) {
  76.                     return;
  77.                 }
  78.                 result.set_symbol(event.symbol);
  79.                 for (auto callback_obj : callbacks_) {
  80.                     if (callback_obj.second == nullptr || event.symbol == callback_obj.second) {
  81.                         callback_obj.first->handle(result);
  82.                     }
  83.                 }
  84.             }
  85.         }
  86.  
  87.         // void add_callback(basic_handler<Out>* callback_obj) {
  88.         //     callbacks_.push_back(std::make_pair(callback_obj, nullptr));
  89.         // }
  90.  
  91.         virtual ~advanced_handler() {}
  92.  
  93.     protected:
  94.         virtual Out _process(const In& event) = 0;
  95.     };
  96.  
  97.     enum class e_stream : size_t {
  98.         TRADE,
  99.         PART_DEPTH,
  100.         DIFF_DEPTH,
  101.         BOOK,
  102.         ACCOUNT_UPDATE,
  103.         ACCOUNT_TRADE,
  104.         ACCOUNT_ORDER,
  105.         TICK,
  106.         NONE
  107.     };
  108.    
  109.     class ws_event : public basic_event<e_stream> {
  110.     public:
  111.         size_t event_time;
  112.     };
  113.  
  114.     class ws_trade_event : public ws_event {
  115.     public:
  116.         std::vector<trade_t> trades;
  117.     };
  118.  
  119.     class ws_part_depth_event : public ws_event {
  120.     public:
  121.         depth_t depth;
  122.     };
  123.  
  124.     class ws_diff_depth_event : public ws_event {
  125.     public:
  126.         depth_t depth;
  127.         size_t first_version;
  128.         size_t last_version;
  129.     };
  130.  
  131.     class ws_book_event : public ws_event {
  132.     public:
  133.         book_t book;
  134.     };
  135.  
  136.     class ws_account_update_event : public ws_event {
  137.     public:
  138.         balance_t balance;
  139.     };
  140.  
  141.     class ws_account_trade_event : public ws_event {
  142.     public:
  143.         trade_t trade;
  144.         size_t client_order_id;
  145.         commission_t commission;
  146.         bool is_self_trade;
  147.         bool is_maker;
  148.     };
  149.  
  150.     class ws_account_order_event : public ws_event {
  151.     public:
  152.         order_t order;
  153.     };
  154.  
  155.     struct stream_description_t {
  156.         e_stream stream;
  157.         std::unordered_map<std::string, std::string> args;
  158.     };
  159.  
  160. }
  161.  
  162. #endif
  163.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement