Advertisement
den4ik2003

Untitled

Jan 21st, 2025
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.03 KB | None | 0 0
  1. #ifndef __lbank_spot__api_hpp
  2. #define __lbank_spot__api_hpp
  3.  
  4. #include <parsing/api.hpp>
  5. #include <parsing/core.hpp>
  6. #include <parsing/parsing.hpp>
  7. #include <parsing/markets/lbank_spot/errors.hpp>
  8. #include <stdexcept>
  9. #include <cstdlib>
  10. #include <vector>
  11.  
  12. namespace mira {
  13.  
  14. class lbank_spot_api : public basic_api {
  15. protected:
  16. static constexpr e_order_status _e_order_status_from_str(std::string_view status) {
  17. if (status == "-1" || status == "3" || status == "4") {
  18. return e_order_status::CANCELED;
  19. }
  20. if (status == "0") {
  21. return e_order_status::NEW;
  22. }
  23. if (status == "1") {
  24. return e_order_status::PARTIALLY_FILLED;
  25. }
  26. if (status == "2") {
  27. return e_order_status::FILLED;
  28. }
  29. std::cerr << "mira::lbank_spot_api::e_status_from_str: unknown status: " << status << std::endl;
  30. abort();
  31. }
  32.  
  33. static constexpr e_order_type _e_order_type_from_str(std::string_view type) {
  34. size_t pos = type.find("_"); // TODO: ok?
  35. if (pos == std::string::npos || type.substr(pos) == "maker") {
  36. return e_order_type::LIMIT;
  37. } else if (type.substr(pos) == "market") {
  38. return e_order_type::MARKET;
  39. } else {
  40. std::cerr << "lbank_spot_api::cancel_order_wrapper::response_filler: unknown order type: " << type << std::endl;
  41. abort();
  42. }
  43. }
  44.  
  45. template <typename Output, typename Error, typename... Args>
  46. class basic_wrapper {
  47. public:
  48. virtual market_error to_market_error(Error e) = 0;
  49.  
  50. FutureHandle<result_t<Output, market_error>> run(std::string_view&& raw_request) {
  51. std::function<result_t<Output, market_error>(std::string&&)> transformer = [this] (std::string&& response_str) {
  52. field_t response = field_t::deserialize(response_str);
  53. result_t<Output, market_error> market_res;
  54. if (response.count("_LE")) {
  55. market_error err;
  56. std::cout << "LocalError: " + response.serialize() + "\n";
  57. err.code = static_cast<e_market_error>(-response.at("_LE").i());
  58. market_res.set_error(err);
  59. return market_res;
  60. }
  61. result_t<Output, Error> res = process(std::move(response));
  62. if (res) {
  63. market_res.set_value(std::move(res.value()));
  64. } else {
  65. market_res.set_error(to_market_error(res.code()));
  66. }
  67. return market_res;
  68. };
  69. return execute(std::move(raw_request)).transform(std::move(transformer));
  70. }
  71.  
  72. FutureHandle<result_t<Output, market_error>> operator()(Args... args) {
  73. return run(request_filler(std::forward<Args>(args)...));
  74. }
  75.  
  76. virtual result_t<Output, Error> process(field_t&& response) = 0;
  77. virtual FutureHandle<std::string> execute(std::string_view request) = 0;
  78. virtual std::string request_filler(Args... args) = 0;
  79. virtual Output response_filler(field_t&& response) = 0;
  80.  
  81. protected:
  82. lbank_spot_api* api_;
  83. };
  84.  
  85. template <typename Output, typename... Args>
  86. class lbank_spot_wrapper : public basic_wrapper<Output, e_lbank_spot_error, Args...> {
  87. public:
  88. market_error to_market_error(e_lbank_spot_error error) override {
  89. return lbank_spot_to_market(error);
  90. }
  91.  
  92. result_t<Output, e_lbank_spot_error> process(field_t&& response) override {
  93. result_t<Output, e_lbank_spot_error> res;
  94. e_http_error http_error_code = e_http_error_from_str(response.at("code").s());
  95. response = response.at("data");
  96. switch (http_error_code) {
  97. case e_http_error::OK:
  98. res.set_value(std::move(response_filler(std::move(response))));
  99. break;
  100. case e_http_error::BAD_REQUEST:
  101. std::cerr << response.serialize() << '\n';
  102. res.set_error(static_cast<e_lbank_spot_error>(response.at("code").i()));
  103. break;
  104. default:
  105. // throw std::runtime_error("mira::lbank_spot_wrapper::operator(): unknown http error: " + std::to_string(static_cast<int>(http_error_code)));
  106. std::cerr << "mira::lbank_spot_wrapper::operator(): unknown http error: " + std::to_string(static_cast<int>(http_error_code)) << std::endl;
  107. abort();
  108. }
  109. return res;
  110. }
  111.  
  112. virtual FutureHandle<std::string> execute(std::string_view request) override = 0;
  113. virtual std::string request_filler(Args... args) override = 0;
  114. virtual Output response_filler(field_t&& response) override = 0;
  115. };
  116.  
  117. class new_order_wrapper : public lbank_spot_wrapper<order_t, const order_request_t&> {
  118. public:
  119. new_order_wrapper(lbank_spot_api* api) {
  120. api_ = api;
  121. }
  122.  
  123. FutureHandle<std::string> execute(std::string_view request) override;
  124. std::string request_filler(const order_request_t& order) override;
  125. order_t response_filler(field_t&& response) override;
  126.  
  127. } _new_order{this};
  128.  
  129. class cancel_order_wrapper : public lbank_spot_wrapper<order_t, const ticker_t*, const order_identifier_t&> {
  130. public:
  131. cancel_order_wrapper(lbank_spot_api* api) {
  132. api_ = api;
  133. }
  134.  
  135. FutureHandle<std::string> execute(std::string_view request) override;
  136. std::string request_filler(const ticker_t* symbol, const order_identifier_t& id) override;
  137. order_t response_filler(field_t&& response) override;
  138. private:
  139. const ticker_t* symbol_;
  140. } _cancel_order{this};
  141.  
  142. class cancel_open_orders_wrapper : public lbank_spot_wrapper<std::vector<order_t>, const ticker_t*> {
  143. public:
  144. cancel_open_orders_wrapper(lbank_spot_api* api) {
  145. api_ = api;
  146. }
  147.  
  148. FutureHandle<std::string> execute(std::string_view request) override;
  149. std::string request_filler(const ticker_t* symbol) override;
  150. std::vector<order_t> response_filler(field_t&& response) override;
  151. private:
  152. const ticker_t* symbol_;
  153. } _cancel_open_orders{this};
  154.  
  155. class get_open_orders_wrapper : public lbank_spot_wrapper<std::vector<order_t>, const ticker_t*> {
  156. public:
  157. get_open_orders_wrapper(lbank_spot_api* api) {
  158. api_ = api;
  159. }
  160.  
  161. FutureHandle<std::string> execute(std::string_view request) override;
  162. std::string request_filler(const ticker_t* symbol) override;
  163. std::vector<order_t> response_filler(field_t&& response) override;
  164. } _get_open_orders{this};
  165.  
  166. class get_exchange_info_wrapper : public lbank_spot_wrapper<std::vector<ticker_t>, std::optional<std::string>> {
  167. public:
  168. get_exchange_info_wrapper(lbank_spot_api* api) {
  169. api_ = api;
  170. }
  171.  
  172. FutureHandle<std::string> execute(std::string_view request) override;
  173. std::string request_filler(std::optional<std::string> symbol) override;
  174. std::vector<ticker_t> response_filler(field_t&& response) override;
  175.  
  176. } _get_exchange_info{this};
  177.  
  178. class get_depth_wrapper : public lbank_spot_wrapper<depth_t, const ticker_t*, std::optional<size_t>> {
  179. public:
  180. get_depth_wrapper(lbank_spot_api* api) {
  181. api_ = api;
  182. }
  183.  
  184. FutureHandle<std::string> execute(std::string_view request) override;
  185. std::string request_filler(const ticker_t* symbol, std::optional<size_t> limit) override;
  186. depth_t response_filler(field_t&& response) override;
  187.  
  188. private:
  189. const ticker_t* symbol_;
  190. } _get_depth{this};
  191.  
  192. class get_account_wrapper : public lbank_spot_wrapper<account_t> {
  193. public:
  194. get_account_wrapper(lbank_spot_api* api) {
  195. api_ = api;
  196. }
  197.  
  198. FutureHandle<std::string> execute(std::string_view request) override;
  199. std::string request_filler() override;
  200. account_t response_filler(field_t&& response) override;
  201.  
  202. } _get_account{this};
  203.  
  204. struct listen_key_manager {
  205. public:
  206. listen_key_manager(lbank_spot_api* api) : api_(api) {}
  207.  
  208. struct new_listen_key_wrapper : public lbank_spot_wrapper<std::string> {
  209.  
  210. listen_key_manager* manager_;
  211.  
  212. new_listen_key_wrapper(listen_key_manager* api) {
  213. api_ = api->api_;
  214. }
  215.  
  216. FutureHandle<std::string> execute(std::string_view request) override;
  217. std::string request_filler() override;
  218. std::string response_filler(field_t&& response) override;
  219.  
  220. } _new_listen_key{this};
  221.  
  222. struct keep_alive_listen_key_wrapper : public lbank_spot_wrapper<std::string> {
  223.  
  224. listen_key_manager* manager_;
  225.  
  226. keep_alive_listen_key_wrapper(listen_key_manager* api) {
  227. api_ = api->api_;
  228. }
  229.  
  230. FutureHandle<std::string> execute(std::string_view request) override;
  231. std::string request_filler() override;
  232. std::string response_filler(field_t&& response) override;
  233.  
  234. } _keep_alive_listen_key{this};
  235.  
  236. private:
  237. lbank_spot_api* api_;
  238. std::string current_listen_key_;
  239.  
  240. friend class keep_alive_listen_key_wrapper;
  241. friend class new_listen_key_wrapper;
  242.  
  243. } _listen_key_manager{this};
  244.  
  245. result_t<std::vector<ws_event>, e_stream_error> _feed_process(const char* feed) override;
  246.  
  247. ws_trade_event _trade_filler(field_t&& feed);
  248.  
  249. ws_diff_depth_event _diff_depth_filler(field_t&& feed);
  250.  
  251. ws_part_depth_event _part_depth_filler(field_t&& feed);
  252.  
  253. ws_book_event _book_filler(field_t&& feed);
  254.  
  255. ws_account_balance_event _account_balance_filler(field_t&& feed);
  256.  
  257. ws_account_trade_event _account_trade_filler(field_t&& feed);
  258.  
  259. ws_account_order_event _account_order_filler(field_t&& feed);
  260.  
  261. webcore::headers_t gen_headers(char* buf, const field_t& signed_query);
  262.  
  263. field_t form_signed_query(field_t query);
  264.  
  265. void _run_ws() override;
  266.  
  267. std::string listen_key_;
  268. void *ws_client_;
  269. void *ws_mutex_;
  270. webcore core_;
  271. webcore::str_callback* ws_callback_;
  272.  
  273. std::string api_ = "", secret_ = "";
  274.  
  275. // унести в utils
  276. const char* letters_[62] = {
  277. "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  278. "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
  279. "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
  280. "u", "v", "w", "x", "y", "z",
  281. "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
  282. "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
  283. "U", "V", "W", "X", "Y", "Z",
  284. };
  285.  
  286. constexpr static const char* header_names_[4] = {"accept-language", "timestamp", "signature_method", "echostr"};
  287.  
  288. public:
  289. static constexpr std::string_view HOST_URL = "https://www.lbkex.net";
  290.  
  291. lbank_spot_api(const account_name_t& name);
  292.  
  293. lbank_spot_api(const account_name_t& name, const std::unordered_map<std::string, std::string>& args);
  294.  
  295. FutureHandle<result_t<order_t, market_error>> new_order(const order_request_t& order) override;
  296.  
  297. FutureHandle<result_t<order_t, market_error>> cancel_order(const cancel_request_t& request) override;
  298.  
  299. FutureHandle<result_t<std::vector<order_t>, market_error>> cancel_open_orders(const ticker_t* symbol, std::optional<e_order_group> order_group) override;
  300.  
  301. FutureHandle<result_t<std::vector<order_t>, market_error>> get_open_orders(const ticker_t* symbol) override;
  302.  
  303. FutureHandle<result_t<std::vector<ticker_t>, market_error>> get_exchange_info(std::optional<std::string> symbol = {}) override;
  304.  
  305. FutureHandle<result_t<depth_t, market_error>> get_depth(const ticker_t* symbol, std::optional<size_t> limit = {}) override;
  306.  
  307. FutureHandle<result_t<account_t, market_error>> get_account() override;
  308.  
  309. void ws_blocking_call(std::function<void()> call) override {
  310. core_.ws_blocking_call(call, ws_mutex_);
  311. }
  312.  
  313. ~lbank_spot_api() {}
  314.  
  315. };
  316.  
  317. }
  318.  
  319. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement