binance_swap_test.rs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. use std::collections::BTreeMap;
  2. use std::sync::Arc;
  3. use std::sync::atomic::AtomicBool;
  4. use std::time::Duration;
  5. use chrono::Utc;
  6. use futures_util::StreamExt;
  7. use serde_json::json;
  8. use tokio::sync::Mutex;
  9. use tokio_tungstenite::tungstenite::Message;
  10. use tracing::trace;
  11. use exchanges::binance_swap_rest::BinanceSwapRest;
  12. use exchanges::binance_swap_ws::{BinanceSwapLogin, BinanceSwapSubscribeType, BinanceSwapWs, BinanceSwapWsType};
  13. use exchanges::socket_tool::AbstractWsMode;
  14. const ACCESS_KEY: &str = "";
  15. const SECRET_KEY: &str = "";
  16. //ws-订阅公共频道信息
  17. #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
  18. async fn ws_custom_subscribe() {
  19. global::log_utils::init_log_with_trace();
  20. let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  21. let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
  22. // let (write_tx, write_rx) = tokio::sync::broadcast::channel::<Message>(10);
  23. // let (read_tx, mut read_rx) = tokio::sync::broadcast::channel::<ResponseData>(10);
  24. let login_param = BinanceSwapLogin {
  25. api_key: ACCESS_KEY.to_string(),
  26. api_secret: SECRET_KEY.to_string(),
  27. };
  28. let mut ws = get_ws(Option::from(login_param));
  29. ws.set_symbols(vec!["BTC_USDT".to_string()]);
  30. ws.set_subscribe(vec![
  31. // BinanceSwapSubscribeType::PuBookTicker,
  32. // BinanceSwapSubscribeType::PuAggTrade,
  33. BinanceSwapSubscribeType::PuMarkPrice,
  34. // BinanceSwapSubscribeType::PuDepth20levels100ms,
  35. BinanceSwapSubscribeType::PrAccount,
  36. ]);
  37. let write_tx_am = Arc::new(Mutex::new(write_tx));
  38. let bool_v1 = Arc::new(AtomicBool::new(true));
  39. //读取
  40. let _bool_v1_clone = Arc::clone(&bool_v1);
  41. let _tr = tokio::spawn(async move {
  42. trace!("线程-数据读取-开启");
  43. loop {
  44. if let Some(data) = read_rx.next().await {
  45. trace!("读取数据data:{:?}",data)
  46. }
  47. }
  48. // trace!("线程-数据读取-结束");
  49. });
  50. //写数据
  51. // let bool_v2_clone = Arc::clone(&bool_v1);
  52. // let write_tx_clone = Arc::clone(&write_tx_am);
  53. // let su = ws.get_subscription();
  54. // let tw = tokio::spawn(async move {
  55. // trace!("线程-数据写入-开始");
  56. // loop {
  57. // tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
  58. // // let close_frame = CloseFrame {
  59. // // code: CloseCode::Normal,
  60. // // reason: Cow::Borrowed("Bye bye"),
  61. // // };
  62. // // let message = Message::Close(Some(close_frame));
  63. //
  64. //
  65. // let message = Message::Text(su.clone());
  66. // AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
  67. // trace!("发送指令成功");
  68. // }
  69. // trace!("线程-数据写入-结束");
  70. // });
  71. let t1 = tokio::spawn(async move {
  72. //链接
  73. let bool_v3_clone = Arc::clone(&bool_v1);
  74. ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  75. trace!("test 唯一线程结束--");
  76. });
  77. tokio::try_join!(t1).unwrap();
  78. trace!("当此结束");
  79. trace!("重启!");
  80. trace!("参考交易所关闭");
  81. return;
  82. }
  83. //rest-获取服务器时间
  84. #[tokio::test]
  85. async fn rest_get_server_time_test() {
  86. global::log_utils::init_log_with_trace();
  87. let mut rest = get_rest();
  88. let rep_data = rest.get_server_time().await;
  89. trace!(?rep_data)
  90. }
  91. //rest-获取交易规则和交易对
  92. #[tokio::test]
  93. async fn rest_get_exchange_info_test() {
  94. global::log_utils::init_log_with_trace();
  95. let mut rest = get_rest();
  96. let rep_data = rest.get_exchange_info().await;
  97. trace!(?rep_data)
  98. }
  99. //rest-账户信息
  100. #[tokio::test]
  101. async fn rest_get_account_test() {
  102. global::log_utils::init_log_with_trace();
  103. let mut rest = get_rest();
  104. let rep_data = rest.get_account().await;
  105. trace!(?rep_data)
  106. }
  107. //rest-根据币对 撤销全部订单
  108. #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
  109. async fn rest_cancel_order_all_test() {
  110. global::log_utils::init_log_with_trace();
  111. let mut rest = get_rest();
  112. let rep_data1 = rest.get_server_time().await;
  113. trace!(?rep_data1);
  114. trace!("开始时间:{:?}",chrono::Utc::now().timestamp_millis().to_string());
  115. let rep_data = rest.cancel_order_all("BTCUSDT".to_string()).await;
  116. trace!(?rep_data);
  117. trace!("结束时间:{:?}",chrono::Utc::now().timestamp_millis().to_string());
  118. }
  119. //rest-账户成交历史
  120. #[tokio::test]
  121. async fn rest_get_user_trades_test() {
  122. global::log_utils::init_log_with_trace();
  123. let mut rest = get_rest();
  124. let rep_data = rest.get_user_trades("BTCUSDT".to_string(), -1, -1, 500).await;
  125. trace!(?rep_data)
  126. }
  127. //rest-生成 listenKey
  128. #[tokio::test]
  129. async fn rest_get_listenKey_test() {
  130. global::log_utils::init_log_with_trace();
  131. let mut rest = get_rest();
  132. let rep_data = rest.get_listenKey().await;
  133. trace!(?rep_data)
  134. }
  135. //杠杆设置
  136. #[tokio::test]
  137. async fn rest_change_pos_side_test() {
  138. global::log_utils::init_log_with_trace();
  139. let mut rest = get_rest();
  140. let rep_data = rest.change_pos_side(true).await;
  141. trace!(?rep_data)
  142. }
  143. //下单
  144. #[tokio::test]
  145. async fn rest_swap_order_test() {
  146. global::log_utils::init_log_with_trace();
  147. let mut rest = get_rest();
  148. let timestamp = Utc::now().timestamp_millis() / 1000;
  149. let timestamp_600 = (timestamp + 700);
  150. trace!("{:?}-==={:?}---{:?}--",timestamp,timestamp_600,(timestamp_600 > (timestamp + 600)));
  151. let json_str = json!({
  152. "symbol":"XRPUSDT",
  153. "side":"BUY",
  154. "type":"LIMIT",
  155. "quantity":"10",
  156. "price":"0.59",
  157. "timeInForce":"GTC",
  158. "goodTillDate":timestamp_600,
  159. });
  160. let rep_data = rest.swap_order(json_str).await;
  161. trace!(?rep_data)
  162. }
  163. fn get_ws(btree_map: Option<BinanceSwapLogin>) -> BinanceSwapWs {
  164. let binance_ws = BinanceSwapWs::new(false,
  165. btree_map,
  166. BinanceSwapWsType::PublicAndPrivate);
  167. binance_ws
  168. }
  169. fn get_rest() -> BinanceSwapRest {
  170. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  171. btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
  172. btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
  173. let ba_exc = BinanceSwapRest::new(false, btree_map);
  174. ba_exc
  175. }