binance_swap_test.rs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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]
  109. async fn rest_get_leverage_test() {
  110. global::log_utils::init_log_with_trace();
  111. let mut rest = get_rest();
  112. let rep_data = rest.get_leverage("DOGEUSDT".to_string(),1).await;
  113. trace!(?rep_data)
  114. }
  115. //rest-查询订单
  116. #[tokio::test]
  117. async fn rest_get_order_test() {
  118. global::log_utils::init_log_with_trace();
  119. let mut rest = get_rest();
  120. let rep_data = rest.get_order("DOGEUSDT".to_string(),-1,"".to_string()).await;
  121. trace!(?rep_data)
  122. }
  123. //rest-查看当前全部挂单
  124. #[tokio::test]
  125. async fn rest_get_open_orders_test() {
  126. global::log_utils::init_log_with_trace();
  127. let mut rest = get_rest();
  128. let rep_data = rest.get_open_orders("DOGEUSDT".to_string()).await;
  129. trace!(?rep_data)
  130. }
  131. //rest-查询所有订单(包括历史订单)
  132. #[tokio::test]
  133. async fn rest_get_all_orders_test() {
  134. global::log_utils::init_log_with_trace();
  135. let mut rest = get_rest();
  136. let rep_data = rest.get_all_orders("DOGEUSDT".to_string(),100,0,0).await;
  137. trace!(?rep_data)
  138. }
  139. //rest-当前最优挂单
  140. #[tokio::test]
  141. async fn rest_get_book_ticker_test() {
  142. global::log_utils::init_log_with_trace();
  143. let mut rest = get_rest();
  144. let rep_data = rest.get_book_ticker("DOGEUSDT".to_string()).await;
  145. trace!(?rep_data)
  146. }
  147. //rest-用户持仓风险V2
  148. #[tokio::test]
  149. async fn rest_get_position_risk_test() {
  150. global::log_utils::init_log_with_trace();
  151. let mut rest = get_rest();
  152. let rep_data = rest.get_position_risk("DOGEUSDT".to_string()).await;
  153. trace!(?rep_data)
  154. }
  155. //rest-根据币对 撤销全部订单
  156. #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
  157. async fn rest_cancel_order_all_test() {
  158. global::log_utils::init_log_with_trace();
  159. let mut rest = get_rest();
  160. let rep_data1 = rest.get_server_time().await;
  161. trace!(?rep_data1);
  162. trace!("开始时间:{:?}",chrono::Utc::now().timestamp_millis().to_string());
  163. let rep_data = rest.cancel_order_all("BTCUSDT".to_string()).await;
  164. trace!(?rep_data);
  165. trace!("结束时间:{:?}",chrono::Utc::now().timestamp_millis().to_string());
  166. }
  167. //rest-账户成交历史
  168. #[tokio::test]
  169. async fn rest_get_user_trades_test() {
  170. global::log_utils::init_log_with_trace();
  171. let mut rest = get_rest();
  172. let rep_data = rest.get_user_trades("BTCUSDT".to_string(), -1, -1, 500).await;
  173. trace!(?rep_data)
  174. }
  175. //rest-生成 listenKey
  176. #[tokio::test]
  177. async fn rest_get_listenKey_test() {
  178. global::log_utils::init_log_with_trace();
  179. let mut rest = get_rest();
  180. let rep_data = rest.get_listen_key().await;
  181. trace!(?rep_data)
  182. }
  183. //杠杆设置
  184. #[tokio::test]
  185. async fn rest_change_pos_side_test() {
  186. global::log_utils::init_log_with_trace();
  187. let mut rest = get_rest();
  188. let rep_data = rest.change_pos_side(true).await;
  189. trace!(?rep_data)
  190. }
  191. //下单
  192. #[tokio::test]
  193. async fn rest_swap_order_test() {
  194. global::log_utils::init_log_with_trace();
  195. let mut rest = get_rest();
  196. let timestamp = Utc::now().timestamp_millis() / 1000;
  197. let timestamp_600 = (timestamp + 700);
  198. trace!("{:?}-==={:?}---{:?}--",timestamp,timestamp_600,(timestamp_600 > (timestamp + 600)));
  199. let json_str = json!({
  200. "symbol":"XRPUSDT",
  201. "side":"BUY",
  202. "type":"LIMIT",
  203. "quantity":"10",
  204. "price":"0.59",
  205. "timeInForce":"GTC",
  206. "goodTillDate":timestamp_600,
  207. });
  208. let rep_data = rest.swap_order(json_str).await;
  209. trace!(?rep_data)
  210. }
  211. fn get_ws(btree_map: Option<BinanceSwapLogin>) -> BinanceSwapWs {
  212. let binance_ws = BinanceSwapWs::new(false,
  213. btree_map,
  214. BinanceSwapWsType::PublicAndPrivate);
  215. binance_ws
  216. }
  217. fn get_rest() -> BinanceSwapRest {
  218. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  219. btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
  220. btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
  221. let ba_exc = BinanceSwapRest::new(false, btree_map);
  222. ba_exc
  223. }