coinex_swap_test.rs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. use std::collections::BTreeMap;
  2. use std::str::FromStr;
  3. use std::sync::Arc;
  4. use std::sync::atomic::AtomicBool;
  5. use rust_decimal::Decimal;
  6. use serde_json::Value;
  7. use tokio::sync::Mutex;
  8. use tracing::{error, trace};
  9. use exchanges::coinex_swap_rest::CoinexSwapRest;
  10. use exchanges::coinex_swap_ws::{CoinexSwapLogin, CoinexSwapSubscribeType, CoinexSwapWs};
  11. use exchanges::response_base::ResponseData;
  12. const ACCESS_KEY: &str = "";
  13. const SECRET_KEY: &str = "";
  14. //ws-订阅公共频道信息
  15. #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
  16. async fn ws_custom_subscribe() {
  17. global::log_utils::init_log_with_trace();
  18. let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  19. let (_read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  20. // let (write_tx, write_rx) = tokio::sync::broadcast::channel::<Message>(10);
  21. // let (read_tx, mut read_rx) = tokio::sync::broadcast::channel::<ResponseData>(10);
  22. let write_tx_am = Arc::new(Mutex::new(write_tx));
  23. let is_shutdown_arc = Arc::new(AtomicBool::new(true));
  24. //读取
  25. let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
  26. let _tr = tokio::spawn(async move {
  27. trace!("线程-数据读取-开启");
  28. loop {
  29. // 从通道中接收并丢弃所有的消息,直到通道为空
  30. while let Ok(Some(_data)) = read_rx.try_next() {
  31. // 从通道中接收并丢弃所有的消息,直到通道为空
  32. while let Ok(Some(_)) = read_rx.try_next() {
  33. // 消息被忽略
  34. }
  35. }
  36. }
  37. // trace!("线程-数据读取-结束");
  38. });
  39. //写数据
  40. // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
  41. // let write_tx_clone = Arc::clone(&write_tx_am);
  42. // let su = ws.get_subscription();
  43. // let tw = tokio::spawn(async move {
  44. // trace!("线程-数据写入-开始");
  45. // loop {
  46. // tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
  47. // // let close_frame = CloseFrame {
  48. // // code: CloseCode::Normal,
  49. // // reason: Cow::Borrowed("Bye bye"),
  50. // // };
  51. // // let message = Message::Close(Some(close_frame));
  52. //
  53. //
  54. // let message = Message::Text(su.clone());
  55. // AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
  56. // trace!("发送指令成功");
  57. // }
  58. // trace!("线程-数据写入-结束");
  59. // });
  60. let fun = move |data: ResponseData| {
  61. async move {
  62. println!("{:?}", data);
  63. }
  64. };
  65. let param = CoinexSwapLogin {
  66. api_key: ACCESS_KEY.to_string(),
  67. secret: SECRET_KEY.to_string(),
  68. };
  69. let t1 = tokio::spawn(async move {
  70. let mut ws = get_ws(Option::from(param));
  71. ws.set_symbols(vec!["FTM_USDT".to_string()]);
  72. ws.set_subscribe(vec![
  73. // CoinexSwapSubscribeType::PuFuturesDepth,
  74. CoinexSwapSubscribeType::PrFuturesOrders
  75. ]);
  76. //链接
  77. let bool_v3_clone = Arc::clone(&is_shutdown_arc);
  78. ws.ws_connect_async(bool_v3_clone, fun, &write_tx_am, write_rx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  79. trace!("test 唯一线程结束--");
  80. });
  81. tokio::try_join!(t1).unwrap();
  82. trace!("当此结束");
  83. trace!("重启!");
  84. trace!("参考交易所关闭");
  85. return;
  86. }
  87. fn get_ws(btree_map: Option<CoinexSwapLogin>) -> CoinexSwapWs {
  88. let coinex_ws = CoinexSwapWs::new(btree_map);
  89. coinex_ws
  90. }
  91. #[tokio::test]
  92. async fn rest_account_book_test() {
  93. let mut ret = get_rest();
  94. let req_data = ret.get_account().await;
  95. let res_data_json: Value = req_data.data;
  96. println!("coinex--查询合约账户--{:?}", res_data_json);
  97. let result = res_data_json.as_array().unwrap().get(0).unwrap();
  98. println!("coinex--查询合约账户--{:?}", result["ccy"]);
  99. }
  100. #[tokio::test]
  101. async fn rest_position_test() {
  102. let mut ret = get_rest();
  103. let req_data = ret.get_position("BOMEUSDT".to_string()).await;
  104. println!("coinex--查询仓位--{:?}", req_data);
  105. }
  106. #[tokio::test]
  107. async fn rest_positions_test() {
  108. let mut ret = get_rest();
  109. let req_data = ret.get_user_position().await;
  110. println!("coinex--查询用户所有仓位--{:?}", req_data);
  111. }
  112. #[tokio::test]
  113. async fn rest_ticker_test() {
  114. let mut ret = get_rest();
  115. let req_data = ret.get_ticker("BOMEUSDT".to_string()).await;
  116. println!("coinex--查询ticker--{:?}", req_data);
  117. }
  118. #[tokio::test]
  119. async fn rest_market_test() {
  120. let mut ret = get_rest();
  121. let req_data = ret.get_market_details("BOMEUSDT".to_string()).await;
  122. println!("coinex--查询market--{:?}", req_data);
  123. }
  124. #[tokio::test]
  125. async fn rest_market_list_test() {
  126. let symbol = "DOGEUSDT".to_string();
  127. let price = Decimal::from_str("0.15").unwrap();
  128. let custom_id = "436265461";
  129. let order_side;
  130. let position_side;
  131. let amount = Decimal::from_str("1769").unwrap();
  132. let ct_val = Decimal::from_str("1").unwrap();
  133. let origin_side = "kk";
  134. let size = (amount / ct_val).floor();
  135. match origin_side {
  136. "kd" => {
  137. position_side = "long";
  138. order_side = "buy";
  139. }
  140. "pd" => {
  141. position_side = "long";
  142. order_side = "sell";
  143. }
  144. "kk" => {
  145. position_side = "short";
  146. order_side = "sell";
  147. }
  148. "pk" => {
  149. position_side = "short";
  150. order_side = "buy";
  151. }
  152. _ => {
  153. error!("下单参数错误");
  154. position_side = "error";
  155. order_side = "error";
  156. }
  157. };
  158. let mut ret = get_rest();
  159. let req_data = ret.order(symbol, position_side.to_string(), order_side.to_string(), size, price, custom_id.to_string()).await;
  160. println!("coinex--查询swap_order--{:?}", req_data);
  161. }
  162. #[tokio::test]
  163. async fn rest_cancel_order_test() {
  164. let mut ret = get_rest();
  165. let req_data = ret.cancel_order("DOGEUSDT".to_string(), "", "436265461").await;
  166. println!("coinex--查询cancel_order--{} {:?}",req_data.data.is_null(), req_data);
  167. }
  168. #[tokio::test]
  169. async fn rest_cancel_all_order_test() {
  170. let mut ret = get_rest();
  171. let _ct_val = Decimal::ONE;
  172. let orders_res_data = ret.get_pending_orders().await;
  173. let mut result = vec![];
  174. if orders_res_data.code == 200 {
  175. let orders_res_data_json = orders_res_data.data.as_array().unwrap();
  176. for order in orders_res_data_json {
  177. let cancel_res_data = ret.cancel_order_all( order["market"].as_str().unwrap().to_string()).await;
  178. if cancel_res_data.code == 200 {
  179. result.push(order.clone())
  180. }
  181. }
  182. }
  183. println!("coinex--查询cancel_all_order--{:?}", result);
  184. }
  185. #[tokio::test]
  186. async fn rest_finish_order_list_test() {
  187. let mut ret = get_rest();
  188. let req_data = ret.get_finished_orders().await;
  189. println!("coinex--查询finish_order--{:?}", req_data);
  190. }
  191. #[tokio::test]
  192. async fn rest_pending_order_list_test() {
  193. let mut ret = get_rest();
  194. let req_data = ret.get_pending_orders().await;
  195. println!("coinex--查询pending_order--{:?}", req_data);
  196. }
  197. #[tokio::test]
  198. async fn rest_order_status_test() {
  199. let mut ret = get_rest();
  200. let req_data = ret.get_order_details("136925916412".to_string(), "DOGEUSDT".to_string()).await;
  201. println!("coinex--查询pending_order--{:?}", req_data);
  202. }
  203. #[tokio::test]
  204. async fn rest_setting_dual_leverage_test() {
  205. let mut ret = get_rest();
  206. let req_data = ret.setting_dual_leverage("FTMUSDT".to_string(), 10).await;
  207. println!("coinex--查询setting_dual_leverage--{:?}", req_data);
  208. }
  209. #[tokio::test]
  210. async fn rest_time() {
  211. let mut ret = get_rest();
  212. let res_data = ret.get_server_time().await;
  213. let res_data_json: Value = res_data.data;
  214. let result = res_data_json["timestamp"].to_string();
  215. println!("coinex--time--{:?}", result);
  216. }
  217. fn get_rest() -> CoinexSwapRest {
  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 = CoinexSwapRest::new(btree_map);
  222. ba_exc
  223. }