coinex_swap_test.rs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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_spot_account_book_test() {
  102. let mut ret = get_rest();
  103. let req_data = ret.get_spot_account().await;
  104. let res_data_json: Value = req_data.data;
  105. println!("coinex--查询现货账户--{:?}", res_data_json);
  106. let result = res_data_json.as_array().unwrap().get(0).unwrap();
  107. println!("coinex--查询现货账户--{:?}", result["ccy"]);
  108. }
  109. #[tokio::test]
  110. async fn rest_position_test() {
  111. let mut ret = get_rest();
  112. let req_data = ret.get_position("BOMEUSDT".to_string()).await;
  113. println!("coinex--查询仓位--{:?}", req_data);
  114. }
  115. #[tokio::test]
  116. async fn rest_positions_test() {
  117. let mut ret = get_rest();
  118. let req_data = ret.get_user_position().await;
  119. println!("coinex--查询用户所有仓位--{:?}", req_data);
  120. }
  121. #[tokio::test]
  122. async fn rest_ticker_test() {
  123. let mut ret = get_rest();
  124. let req_data = ret.get_ticker("BOMEUSDT".to_string()).await;
  125. println!("coinex--查询ticker--{:?}", req_data);
  126. }
  127. #[tokio::test]
  128. async fn rest_market_test() {
  129. let mut ret = get_rest();
  130. let req_data = ret.get_market_details("BOMEUSDT".to_string()).await;
  131. println!("coinex--查询market--{:?}", req_data);
  132. }
  133. #[tokio::test]
  134. async fn rest_market_list_test() {
  135. let symbol = "DOGEUSDT".to_string();
  136. let price = Decimal::from_str("0.15").unwrap();
  137. let custom_id = "436265461";
  138. let order_side;
  139. let position_side;
  140. let amount = Decimal::from_str("1769").unwrap();
  141. let ct_val = Decimal::from_str("1").unwrap();
  142. let origin_side = "kk";
  143. let size = (amount / ct_val).floor();
  144. match origin_side {
  145. "kd" => {
  146. position_side = "long";
  147. order_side = "buy";
  148. }
  149. "pd" => {
  150. position_side = "long";
  151. order_side = "sell";
  152. }
  153. "kk" => {
  154. position_side = "short";
  155. order_side = "sell";
  156. }
  157. "pk" => {
  158. position_side = "short";
  159. order_side = "buy";
  160. }
  161. _ => {
  162. error!("下单参数错误");
  163. position_side = "error";
  164. order_side = "error";
  165. }
  166. };
  167. let mut ret = get_rest();
  168. let req_data = ret.order(symbol, position_side.to_string(), order_side.to_string(), size, price, custom_id.to_string()).await;
  169. println!("coinex--查询swap_order--{:?}", req_data);
  170. }
  171. #[tokio::test]
  172. async fn rest_cancel_order_test() {
  173. let mut ret = get_rest();
  174. let req_data = ret.cancel_order("DOGEUSDT".to_string(), "", "436265461").await;
  175. println!("coinex--查询cancel_order--{} {:?}",req_data.data.is_null(), req_data);
  176. }
  177. #[tokio::test]
  178. async fn rest_cancel_all_order_test() {
  179. let mut ret = get_rest();
  180. let _ct_val = Decimal::ONE;
  181. let orders_res_data = ret.get_pending_orders().await;
  182. let mut result = vec![];
  183. if orders_res_data.code == 200 {
  184. let orders_res_data_json = orders_res_data.data.as_array().unwrap();
  185. for order in orders_res_data_json {
  186. let cancel_res_data = ret.cancel_order_all( order["market"].as_str().unwrap().to_string()).await;
  187. if cancel_res_data.code == 200 {
  188. result.push(order.clone())
  189. }
  190. }
  191. }
  192. println!("coinex--查询cancel_all_order--{:?}", result);
  193. }
  194. #[tokio::test]
  195. async fn rest_finish_order_list_test() {
  196. let mut ret = get_rest();
  197. let req_data = ret.get_finished_orders().await;
  198. println!("coinex--查询finish_order--{:?}", req_data);
  199. }
  200. #[tokio::test]
  201. async fn rest_pending_order_list_test() {
  202. let mut ret = get_rest();
  203. let req_data = ret.get_pending_orders().await;
  204. println!("coinex--查询pending_order--{:?}", req_data);
  205. }
  206. #[tokio::test]
  207. async fn rest_order_status_test() {
  208. let mut ret = get_rest();
  209. let req_data = ret.get_order_details("136925916412".to_string(), "DOGEUSDT".to_string()).await;
  210. println!("coinex--查询pending_order--{:?}", req_data);
  211. }
  212. #[tokio::test]
  213. async fn rest_setting_dual_leverage_test() {
  214. let mut ret = get_rest();
  215. let req_data = ret.setting_dual_leverage("FTMUSDT".to_string(), 10).await;
  216. println!("coinex--查询setting_dual_leverage--{:?}", req_data);
  217. }
  218. #[tokio::test]
  219. async fn rest_time() {
  220. let mut ret = get_rest();
  221. let res_data = ret.get_server_time().await;
  222. let res_data_json: Value = res_data.data;
  223. let result = res_data_json["timestamp"].to_string();
  224. println!("coinex--time--{:?}", result);
  225. }
  226. fn get_rest() -> CoinexSwapRest {
  227. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  228. btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
  229. btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
  230. let ba_exc = CoinexSwapRest::new(btree_map);
  231. ba_exc
  232. }