bitmart_swap_test.rs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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::bitmart_swap_rest::BitMartSwapRest;
  8. use exchanges::bitmart_swap_ws::{BitMartSwapLogin, BitMartSwapSubscribeType, BitMartSwapWs, BitMartSwapWsType};
  9. use exchanges::proxy;
  10. use exchanges::response_base::ResponseData;
  11. const ACCESS_KEY: &str = "cf821f946b2ff9af69dd4a9fa80e862018c99bf4";
  12. const SECRET_KEY: &str = "7148eeec5c7234c5a54db446dc4b8cb6bacad3d54c0cdddf8ba9af85c6580600";
  13. const API_MEMO: &str = "local\
  14. ";
  15. //ws-订阅公共频道信息
  16. #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
  17. async fn ws_custom_subscribe() {
  18. global::log_utils::init_log_with_trace();
  19. let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  20. let (_, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  21. // let (write_tx, write_rx) = tokio::sync::broadcast::channel::<Message>(10);
  22. // let (read_tx, mut read_rx) = tokio::sync::broadcast::channel::<ResponseData>(10);
  23. let write_tx_am = Arc::new(Mutex::new(write_tx));
  24. let is_shutdown_arc = Arc::new(AtomicBool::new(true));
  25. //读取
  26. let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
  27. let _tr = tokio::spawn(async move {
  28. trace!("线程-数据读取-开启");
  29. loop {
  30. // 从通道中接收并丢弃所有的消息,直到通道为空
  31. while let Ok(Some(_)) = read_rx.try_next() {
  32. // 从通道中接收并丢弃所有的消息,直到通道为空
  33. while let Ok(Some(_)) = read_rx.try_next() {
  34. // 消息被忽略
  35. }
  36. }
  37. }
  38. // trace!("线程-数据读取-结束");
  39. });
  40. //写数据
  41. // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
  42. // let write_tx_clone = Arc::clone(&write_tx_am);
  43. // let su = ws.get_subscription();
  44. // let tw = tokio::spawn(async move {
  45. // trace!("线程-数据写入-开始");
  46. // loop {
  47. // tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
  48. // // let close_frame = CloseFrame {
  49. // // code: CloseCode::Normal,
  50. // // reason: Cow::Borrowed("Bye bye"),
  51. // // };
  52. // // let message = Message::Close(Some(close_frame));
  53. //
  54. //
  55. // let message = Message::Text(su.clone());
  56. // AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
  57. // trace!("发送指令成功");
  58. // }
  59. // trace!("线程-数据写入-结束");
  60. // });
  61. let fun = move |data: ResponseData| {
  62. async move {
  63. trace!("---传入的方法~~~~{:?}", data);
  64. }
  65. };
  66. let param = BitMartSwapLogin {
  67. api_key: ACCESS_KEY.to_string(),
  68. secret: SECRET_KEY.to_string(),
  69. api_memo: API_MEMO.to_string(),
  70. };
  71. let t1 = tokio::spawn(async move {
  72. let mut ws = get_ws(Option::from(param), BitMartSwapWsType::Private);
  73. ws.set_symbols(vec!["BTC_USDT".to_string(), "ETC_USDT".to_string()]);
  74. ws.set_subscribe(vec![
  75. // BitMartSwapSubscribeType::PuFuturesDepth,
  76. BitMartSwapSubscribeType::PrFuturesOrders,
  77. BitMartSwapSubscribeType::PrFuturesPositions,
  78. BitMartSwapSubscribeType::PrFuturesBalances,
  79. ]);
  80. //链接
  81. let bool_v3_clone = Arc::clone(&is_shutdown_arc);
  82. ws.ws_connect_async(bool_v3_clone, fun, &write_tx_am, write_rx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  83. trace!("test 唯一线程结束--");
  84. });
  85. tokio::try_join!(t1).unwrap();
  86. trace!("当此结束");
  87. trace!("重启!");
  88. trace!("参考交易所关闭");
  89. return;
  90. }
  91. fn get_ws(btree_map: Option<BitMartSwapLogin>, ws_type: BitMartSwapWsType) -> BitMartSwapWs {
  92. let bitmart_ws = BitMartSwapWs::new(btree_map, ws_type);
  93. bitmart_ws
  94. }
  95. /*获取服务器时间*/
  96. #[tokio::test]
  97. async fn rest_get_server_time_test() {
  98. global::log_utils::init_log_with_trace();
  99. proxy_handle();
  100. let mut ret = get_rest();
  101. let req_data = ret.get_server_time().await;
  102. trace!("bitmart--获取服务器时间--{:?}", req_data);
  103. trace!("bitmart--获取服务器时间--{}", req_data.data);
  104. }
  105. /*深度*/
  106. #[tokio::test]
  107. async fn rest_get_depth_test() {
  108. global::log_utils::init_log_with_trace();
  109. proxy_handle();
  110. let mut ret = get_rest();
  111. let req_data = ret.get_depth(json!({
  112. })).await;
  113. trace!("bitmart--深度--{:?}", req_data);
  114. trace!("bitmart--深度--{}", req_data.data);
  115. }
  116. /*合约信息*/
  117. #[tokio::test]
  118. async fn rest_get_market_test() {
  119. global::log_utils::init_log_with_trace();
  120. proxy_handle();
  121. let mut ret = get_rest();
  122. let req_data = ret.get_market(json!({
  123. })).await;
  124. trace!("bitmart--合约信息--{:?}", req_data);
  125. trace!("bitmart--合约信息--{}", req_data.data);
  126. }
  127. /*查询合约账户*/
  128. #[tokio::test]
  129. async fn rest_get_account_test() {
  130. global::log_utils::init_log_with_trace();
  131. // proxy_handle();
  132. let mut ret = get_rest();
  133. let req_data = ret.get_account(json!({
  134. })
  135. ).await;
  136. trace!("bitmart--查询合约账户--{:?}", req_data);
  137. trace!("bitmart--查询合约账户--{}", req_data.data);
  138. }
  139. /*用户仓位列表*/
  140. #[tokio::test]
  141. async fn rest_get_user_position_test() {
  142. global::log_utils::init_log_with_trace();
  143. // proxy_handle();
  144. let mut ret = get_rest();
  145. let req_data = ret.get_user_position(json!({
  146. })).await;
  147. trace!("bitmart--用户仓位列表--{:?}", req_data);
  148. trace!("bitmart--用户仓位列表--{}", req_data.data);
  149. }
  150. /*查询合约订单列表*/
  151. #[tokio::test]
  152. async fn rest_get_orders_test() {
  153. global::log_utils::init_log_with_trace();
  154. // proxy_handle();
  155. let mut ret = get_rest();
  156. let req_data = ret.get_orders(json!({
  157. "symbol":"BTCUSDT"
  158. })).await;
  159. trace!("bitmart--查询合约订单列表--{:?}", req_data);
  160. trace!("bitmart--查询合约订单列表--{}", req_data.data);
  161. }
  162. /*查询单个订单详情*/
  163. #[tokio::test]
  164. async fn rest_get_order_details_test() {
  165. global::log_utils::init_log_with_trace();
  166. // proxy_handle();
  167. let mut ret = get_rest();
  168. let req_data = ret.get_order_details(json!({
  169. "symbol":"BTCUSDT",
  170. "order_id":"123"
  171. })).await;
  172. trace!("bitmart--查询单个订单详情--{:?}", req_data);
  173. trace!("bitmart--查询单个订单详情--{}", req_data.data);
  174. }
  175. /*合约交易下单*/
  176. #[tokio::test]
  177. async fn rest_swap_order_test() {
  178. global::log_utils::init_log_with_trace();
  179. // proxy_handle();
  180. let mut ret = get_rest();
  181. let req_data = ret.swap_order(json!({
  182. "symbol":"SHIB-USDT",
  183. "type":"limit",
  184. "side":"limit",
  185. "leverage":"open",
  186. "direction":"buy",
  187. "price":"0.000001359",
  188. "volume":1,
  189. "lever_rate":1,
  190. })).await;
  191. trace!("bitmart--合约交易下单--{:?}", req_data);
  192. trace!("bitmart--合约交易下单--{}", req_data.data);
  193. }
  194. /*全部撤单*/
  195. #[tokio::test]
  196. async fn rest_cancel_price_order_test() {
  197. global::log_utils::init_log_with_trace();
  198. // proxy_handle();
  199. let mut ret = get_rest();
  200. let req_data = ret.cancel_price_order(json!({ })).await;
  201. trace!("bitmart--全部撤单--{:?}", req_data);
  202. trace!("bitmart--全部撤单--{}", req_data.data);
  203. }
  204. /*撤单*/
  205. #[tokio::test]
  206. async fn rest_cancel_order_test() {
  207. global::log_utils::init_log_with_trace();
  208. // proxy_handle();
  209. let mut ret = get_rest();
  210. let req_data = ret.cancel_order(json!({
  211. "order_id":"123"
  212. })).await;
  213. trace!("bitmart--撤单--{:?}", req_data);
  214. trace!("bitmart--撤单--{}", req_data.data);
  215. }
  216. // /*设置持仓模式*/
  217. // #[tokio::test]
  218. // async fn rest_setting_dual_mode_test() {
  219. // global::log_utils::init_log_with_trace();
  220. // // proxy_handle();
  221. //
  222. // let mut ret = get_rest();
  223. //
  224. // let req_data = ret.setting_dual_mode(json!({
  225. // "margin_account":"USDT",
  226. // "position_mode":"dual_side",
  227. // })).await;
  228. // trace!("bitmart--设置持仓模式--{:?}", req_data);
  229. // trace!("bitmart--设置持仓模式--{}", req_data.data);
  230. // }
  231. /*设置杠杆*/
  232. #[tokio::test]
  233. async fn rest_setting_dual_leverage_test() {
  234. global::log_utils::init_log_with_trace();
  235. // proxy_handle();
  236. let mut ret = get_rest();
  237. let req_data = ret.setting_dual_leverage(json!({
  238. "symbol":"BTCUSDT",
  239. "open_type":"cross",
  240. })).await;
  241. trace!("bitmart--设置持仓模式--{:?}", req_data);
  242. trace!("bitmart--设置持仓模式--{}", req_data.data);
  243. }
  244. fn get_rest() -> BitMartSwapRest {
  245. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  246. btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
  247. btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
  248. btree_map.insert("api_memo".to_string(), API_MEMO.to_string());
  249. let bitmart_exc = BitMartSwapRest::new(false, btree_map);
  250. bitmart_exc
  251. }
  252. // 检测是否走代理
  253. pub fn proxy_handle() {
  254. if proxy::ParsingDetail::http_enable_proxy() {
  255. trace!("检测有代理配置,配置走代理");
  256. }
  257. }