htx_swap_test.rs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. mod exchange_test;
  2. use std::collections::BTreeMap;
  3. use std::env;
  4. use std::io::Error;
  5. use chrono::Utc;
  6. use rust_decimal_macros::dec;
  7. use tokio::sync::mpsc;
  8. use tokio::time::Instant;
  9. use tracing::{instrument, trace};
  10. use global::trace_stack::TraceStack;
  11. use standard::exchange::{Exchange, ExchangeEnum};
  12. use standard::{Order, OrderCommand, Platform, utils};
  13. use crate::exchange_test::{test_new_exchange};
  14. const SYMBOL: &str = "USTC_USDT";
  15. // 测试获取Exchange实体
  16. #[tokio::test]
  17. #[instrument(level = "TRACE")]
  18. async fn test_get_self_exchange() {
  19. global::log_utils::init_log_with_trace();
  20. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  21. let htx_get_self_exchange = htx_swap_exchange.get_self_exchange();
  22. trace!(?htx_get_self_exchange);
  23. }
  24. // 测试获取交易对信息
  25. #[tokio::test]
  26. #[instrument(level = "TRACE")]
  27. async fn test_get_self_symbol() {
  28. global::log_utils::init_log_with_trace();
  29. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  30. let htx_get_self_symbol = htx_swap_exchange.get_self_symbol();
  31. trace!(?htx_get_self_symbol);
  32. }
  33. // 测试获取是否使用高速通道
  34. #[tokio::test]
  35. #[instrument(level = "TRACE")]
  36. async fn test_get_self_is_colo() {
  37. global::log_utils::init_log_with_trace();
  38. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  39. let htx_get_self_is_colo = htx_swap_exchange.get_self_is_colo();
  40. trace!(?htx_get_self_is_colo);
  41. }
  42. // 测试获取登录params信息
  43. #[tokio::test]
  44. #[instrument(level = "TRACE")]
  45. async fn test_get_self_params() {
  46. global::log_utils::init_log_with_trace();
  47. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  48. let htx_get_self_params = htx_swap_exchange.get_self_params();
  49. trace!("htx_get_self_params={:?}",htx_get_self_params);
  50. }
  51. // 测试获取Market信息
  52. #[tokio::test]
  53. #[instrument(level = "TRACE")]
  54. async fn test_get_self_market() {
  55. global::log_utils::init_log_with_trace();
  56. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  57. let htx_get_self_market = htx_swap_exchange.get_self_market();
  58. trace!(?htx_get_self_market);
  59. }
  60. // 测试获取请求时间信息
  61. #[tokio::test]
  62. #[instrument(level = "TRACE")]
  63. async fn test_get_request_delays() {
  64. global::log_utils::init_log_with_trace();
  65. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  66. let htx_get_request_delays = htx_swap_exchange.get_request_delays();
  67. trace!(?htx_get_request_delays);
  68. }
  69. // 测试获取请求平均时间信息
  70. #[tokio::test]
  71. #[instrument(level = "TRACE")]
  72. async fn test_get_request_avg_delay() {
  73. global::log_utils::init_log_with_trace();
  74. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  75. let htx_get_request_avg_delay = htx_swap_exchange.get_request_avg_delay();
  76. trace!(?htx_get_request_avg_delay);
  77. }
  78. // 测试获取最大请求时间信息
  79. #[tokio::test]
  80. #[instrument(level = "TRACE")]
  81. async fn test_get_request_max_delay() {
  82. global::log_utils::init_log_with_trace();
  83. let htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  84. let htx_get_request_max_delay = htx_swap_exchange.get_request_max_delay();
  85. trace!(?htx_get_request_max_delay);
  86. }
  87. // 测试获取服务器时间
  88. #[tokio::test]
  89. #[instrument(level = "TRACE")]
  90. async fn test_get_server_time() {
  91. global::log_utils::init_log_with_trace();
  92. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  93. let htx_get_server_time = htx_swap_exchange.get_server_time().await;
  94. trace!(?htx_get_server_time);
  95. }
  96. // 测试获取账号信息
  97. #[tokio::test]
  98. #[instrument(level = "TRACE")]
  99. async fn test_get_account() {
  100. global::log_utils::init_log_with_trace();
  101. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  102. let htx_get_account = htx_swap_exchange.get_account().await;
  103. trace!(?htx_get_account);
  104. }
  105. // 测试获取持仓信息
  106. #[tokio::test]
  107. #[instrument(level = "TRACE")]
  108. async fn test_get_position() {
  109. global::log_utils::init_log_with_trace();
  110. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  111. let htx_get_position = htx_swap_exchange.get_position().await;
  112. trace!(?htx_get_position);
  113. }
  114. // 测试获取所有持仓信息
  115. #[tokio::test]
  116. #[instrument(level = "TRACE")]
  117. async fn test_get_positions() {
  118. global::log_utils::init_log_with_trace();
  119. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  120. let htx_get_positions = htx_swap_exchange.get_positions().await;
  121. trace!(?htx_get_positions);
  122. }
  123. // 测试获取Ticker信息
  124. #[tokio::test]
  125. #[instrument(level = "TRACE")]
  126. async fn test_get_ticker() {
  127. global::log_utils::init_log_with_trace();
  128. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  129. let htx_get_ticker = htx_swap_exchange.get_ticker().await;
  130. trace!(?htx_get_ticker);
  131. }
  132. // 测试获取Market信息
  133. #[tokio::test]
  134. #[instrument(level = "TRACE")]
  135. async fn test_get_market() {
  136. global::log_utils::init_log_with_trace();
  137. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  138. let htx_get_market = htx_swap_exchange.get_market().await;
  139. trace!(?htx_get_market);
  140. }
  141. // 测试获取Order详情信息
  142. #[tokio::test]
  143. #[instrument(level = "TRACE")]
  144. async fn test_get_order_detail() {
  145. global::log_utils::init_log_with_trace();
  146. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  147. let htx_get_order_detail = htx_swap_exchange.get_order_detail("1234925996822429696", "9999992").await;
  148. trace!(?htx_get_order_detail);
  149. }
  150. // 测试获取Order列表信息
  151. #[tokio::test]
  152. #[instrument(level = "TRACE")]
  153. async fn test_get_orders_list() {
  154. global::log_utils::init_log_with_trace();
  155. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  156. let htx_get_orders_list = htx_swap_exchange.get_orders_list("finished").await;
  157. trace!(?htx_get_orders_list);
  158. }
  159. // 测试下单
  160. #[tokio::test]
  161. #[instrument(level = "TRACE")]
  162. async fn test_take_order() {
  163. global::log_utils::init_log_with_trace();
  164. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  165. let htx_take_order = htx_swap_exchange.take_order("999999914", "kd", dec!(0.02320), dec!(20)).await;
  166. trace!(?htx_take_order);
  167. }
  168. // 测试撤销订单
  169. #[tokio::test]
  170. #[instrument(level = "TRACE")]
  171. async fn test_cancel_order() {
  172. global::log_utils::init_log_with_trace();
  173. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  174. let htx_cancel_order = htx_swap_exchange.cancel_order("", "999999900").await;
  175. trace!(?htx_cancel_order);
  176. }
  177. // 测试批量撤销订单
  178. #[tokio::test]
  179. #[instrument(level = "TRACE")]
  180. async fn test_cancel_orders() {
  181. global::log_utils::init_log_with_trace();
  182. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  183. let htx_cancel_orders = htx_swap_exchange.cancel_orders_all().await;
  184. trace!(?htx_cancel_orders);
  185. }
  186. // 测试设置持仓模式
  187. #[tokio::test]
  188. #[instrument(level = "TRACE")]
  189. async fn test_set_dual_mode() {
  190. global::log_utils::init_log_with_trace();
  191. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  192. let htx_set_dual_mode = htx_swap_exchange.set_dual_mode("usdt", true).await;
  193. trace!(?htx_set_dual_mode);
  194. }
  195. // 测试设置杠杆
  196. #[tokio::test]
  197. #[instrument(level = "TRACE")]
  198. async fn test_set_dual_leverage() {
  199. global::log_utils::init_log_with_trace();
  200. let mut htx_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::HtxSwap, SYMBOL).await;
  201. let htx_set_dual_leverage = htx_swap_exchange.set_dual_leverage("10").await;
  202. trace!(?htx_set_dual_leverage);
  203. }
  204. // 测试指令下单
  205. #[tokio::test]
  206. #[instrument(level = "TRACE")]
  207. async fn test_command_order() {
  208. global::log_utils::init_log_with_trace();
  209. utils::proxy_handle(None);
  210. let (order_sender, mut order_receiver): (mpsc::Sender<Order>, mpsc::Receiver<Order>) = mpsc::channel(1024);
  211. let (error_sender, mut error_receiver): (mpsc::Sender<Error>, mpsc::Receiver<Error>) = mpsc::channel(1024);
  212. let mut params: BTreeMap<String, String> = BTreeMap::new();
  213. let access_key = env::var("htx_access_key").unwrap_or("".to_string());
  214. let secret_key = env::var("htx_secret_key").unwrap_or("".to_string());
  215. params.insert("access_key".to_string(), access_key);
  216. params.insert("secret_key".to_string(), secret_key);
  217. let mut htx_swap_exchange: Box<dyn Platform> = Exchange::new(ExchangeEnum::HtxSwap, SYMBOL.to_string(), false, params, order_sender, error_sender).await;
  218. let mut command = OrderCommand::new();
  219. command.cancel.insert("888888".to_string(), vec!["888888".to_string(), "".to_string()]);
  220. command.limits_open.insert("888888".to_string(), vec!["100".to_string(), "kd".to_string(), "0.18".to_string(), "888888".to_string()]);
  221. command.limits_close.insert("999999".to_string(), vec!["100".to_string(), "kk".to_string(), "0.25".to_string(), "999999".to_string()]);
  222. command.check.insert("888888".to_string(), vec!["999999".to_string(), "".to_string()]);
  223. htx_swap_exchange.command_order(&mut command, &TraceStack::new(Utc::now().timestamp_micros(), Instant::now())).await;
  224. loop {
  225. if let Ok(order) = order_receiver.try_recv() {
  226. trace!(?order);
  227. }
  228. if let Ok(error) = error_receiver.try_recv() {
  229. trace!(?error);
  230. }
  231. }
  232. }