phemex_swap_test.rs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. use std::collections::BTreeMap;
  2. use std::sync::Arc;
  3. use std::sync::atomic::AtomicBool;
  4. use serde_json::json;
  5. use tokio::sync::Mutex;
  6. use tracing::trace;
  7. use exchanges::phemex_swap_rest::PhemexSwapRest;
  8. use exchanges::phemex_swap_ws::{PhemexSwapLogin, PhemexSwapSubscribeType, PhemexSwapWs, PhemexSwapWsType};
  9. use exchanges::response_base::ResponseData;
  10. const ACCESS_KEY: &str = "cc3593f1-e5f5-4810-897d-29f5fec174c6";
  11. const SECRET_KEY: &str = "FB6QMZGsQMn1mrhTuoM2HkDVAJbeRaEgulHaApvD3EE2NWQ2ODljOS1mODdmLTRhMDgtYjliNy1kMDM0MWQ1MmZjNzA";
  12. #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
  13. async fn ws_custom_subscribe() {
  14. global::log_utils::init_log_with_trace();
  15. let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  16. let (_, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  17. // let (write_tx, write_rx) = tokio::sync::broadcast::channel::<Message>(10);
  18. // let (read_tx, mut read_rx) = tokio::sync::broadcast::channel::<ResponseData>(10);
  19. let write_tx_am = Arc::new(Mutex::new(write_tx));
  20. let is_shutdown_arc = Arc::new(AtomicBool::new(true));
  21. //读取
  22. let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
  23. let _tr = tokio::spawn(async move {
  24. trace!("线程-数据读取-开启");
  25. loop {
  26. // 从通道中接收并丢弃所有的消息,直到通道为空
  27. while let Ok(Some(_)) = read_rx.try_next() {
  28. // 从通道中接收并丢弃所有的消息,直到通道为空
  29. while let Ok(Some(_)) = read_rx.try_next() {
  30. // 消息被忽略
  31. }
  32. }
  33. }
  34. // trace!("线程-数据读取-结束");
  35. });
  36. //写数据
  37. // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
  38. // let write_tx_clone = Arc::clone(&write_tx_am);
  39. // let su = ws.get_subscription();
  40. // let tw = tokio::spawn(async move {
  41. // trace!("线程-数据写入-开始");
  42. // loop {
  43. // tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
  44. // // let close_frame = CloseFrame {
  45. // // code: CloseCode::Normal,
  46. // // reason: Cow::Borrowed("Bye bye"),
  47. // // };
  48. // // let message = Message::Close(Some(close_frame));
  49. //
  50. //
  51. // let message = Message::Text(su.clone());
  52. // AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
  53. // trace!("发送指令成功");
  54. // }
  55. // trace!("线程-数据写入-结束");
  56. // });
  57. let fun = move |data: ResponseData| {
  58. async move {
  59. trace!("---传入的方法~~~~{:?}", data);
  60. }
  61. };
  62. let param = PhemexSwapLogin {
  63. access_key: ACCESS_KEY.to_string(),
  64. secret_key: SECRET_KEY.to_string(),
  65. };
  66. let t1 = tokio::spawn(async move {
  67. let mut ws = get_ws(Option::from(param), PhemexSwapWsType::PublicAndPrivate);
  68. ws.set_symbols(vec!["BTC_USDT".to_string(), "ETC_USDT".to_string()]);
  69. ws.set_subscribe(vec![
  70. // PhemexSwapSubscribeType::PuFuturesTrades,
  71. // PhemexSwapSubscribeType::PuFuturesOrderBook,
  72. // PhemexSwapSubscribeType::PuFuturesRecords,
  73. PhemexSwapSubscribeType::PrFuturesAccountOrderPosition,
  74. ]);
  75. //链接
  76. let bool_v3_clone = Arc::clone(&is_shutdown_arc);
  77. ws.ws_connect_async(bool_v3_clone, fun, &write_tx_am, write_rx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  78. trace!("test 唯一线程结束--");
  79. });
  80. tokio::try_join!(t1).unwrap();
  81. trace!("当此结束");
  82. trace!("重启!");
  83. trace!("参考交易所关闭");
  84. return;
  85. }
  86. fn get_ws(btree_map: Option<PhemexSwapLogin>, ws_type: PhemexSwapWsType) -> PhemexSwapWs {
  87. let phemex_ws = PhemexSwapWs::new(false, btree_map, ws_type);
  88. phemex_ws
  89. }
  90. //服务器时间
  91. #[tokio::test]
  92. async fn rest_get_server_test() {
  93. global::log_utils::init_log_with_trace();
  94. let mut ret = get_rest();
  95. let req_data = ret.get_server().await;
  96. println!("Phemex--服务器时间--{:?}", req_data);
  97. }
  98. //查詢合約基礎信息
  99. #[tokio::test]
  100. async fn rest_get_market_test() {
  101. global::log_utils::init_log_with_trace();
  102. let mut ret = get_rest();
  103. let req_data = ret.get_market(json!({
  104. })).await;
  105. println!("Phemex--查詢合約基礎信息--");
  106. }
  107. //查詢ticker
  108. #[tokio::test]
  109. async fn rest_get_ticker_test() {
  110. global::log_utils::init_log_with_trace();
  111. let mut ret = get_rest();
  112. let req_data = ret.get_ticker(json!({
  113. "symbol":"BTCUSDT"
  114. })).await;
  115. println!("Phemex--查詢ticker--{:?}",req_data);
  116. }
  117. //持仓(查询交易账户和仓位)
  118. #[tokio::test]
  119. async fn rest_get_account_and_positions_test() {
  120. global::log_utils::init_log_with_trace();
  121. let mut ret = get_rest();
  122. let req_data = ret.get_account_and_positions(
  123. json!({
  124. "currency":"USDT"
  125. })
  126. ).await;
  127. println!("Phemex--持仓(查询交易账户和仓位)--{:?}", req_data);
  128. }
  129. //设置杠杆
  130. #[tokio::test]
  131. async fn rest_set_leverage_test() {
  132. global::log_utils::init_log_with_trace();
  133. let mut ret = get_rest();
  134. let req_data = ret.set_leverage(json!({
  135. "symbol":"ZKUSDT",
  136. "leverageRr":"1"
  137. })).await;
  138. println!("Phemex--设置杠杆)--{:?}", req_data);
  139. }
  140. //下单
  141. #[tokio::test]
  142. async fn rest_orders_test() {
  143. global::log_utils::init_log_with_trace();
  144. let mut ret = get_rest();
  145. let req_data = ret.orders(json!({
  146. "symbol": "BTCUSDT",
  147. "side": "Buy",
  148. "posSide": "Long",
  149. })).await;
  150. println!("Phemex--下单)--{:?}", req_data);
  151. }
  152. //撤单
  153. #[tokio::test]
  154. async fn rest_cancel_order_test() {
  155. global::log_utils::init_log_with_trace();
  156. let mut ret = get_rest();
  157. let req_data = ret.cancel_order(json!({
  158. "symbol ": "BTCUSDT",
  159. "posSide": "Long",
  160. "clOrdID": "1231312"
  161. })).await;
  162. println!("Phemex--撤单)--{:?}", req_data);
  163. }
  164. //撤销所有
  165. #[tokio::test]
  166. async fn rest_cancel_order_all_test() {
  167. global::log_utils::init_log_with_trace();
  168. let mut ret = get_rest();
  169. let req_data = ret.cancel_order_all(json!({
  170. })).await;
  171. println!("Phemex--撤销所有)--{:?}", req_data);
  172. }
  173. //订单列表
  174. #[tokio::test]
  175. async fn rest_get_orders_test() {
  176. global::log_utils::init_log_with_trace();
  177. let mut ret = get_rest();
  178. let req_data = ret.get_orders(json!({
  179. "symbol": "BTCUSDT"
  180. })).await;
  181. println!("Phemex--订单列表)--{:?}", req_data);
  182. }
  183. //根据id查询订单
  184. #[tokio::test]
  185. async fn rest_get_orders_by_id_test() {
  186. global::log_utils::init_log_with_trace();
  187. let mut ret = get_rest();
  188. let req_data = ret.get_orders_by_id(json!({
  189. "symbol":"BTCUSDT",
  190. "orderID":"123"
  191. })).await;
  192. println!("Phemex--根据id查询订单)--{:?}", req_data);
  193. }
  194. fn get_rest() -> PhemexSwapRest {
  195. // proxy::ParsingDetail::http_enable_proxy(Some("phemex"));
  196. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  197. btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
  198. btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
  199. let phemex_exc = PhemexSwapRest::new(false, btree_map.clone());
  200. phemex_exc
  201. }