bitmart_swap_test.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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 = "80618e45710812162b04892c7ee5ead4a3cc3e56";
  12. const SECRET_KEY: &str = "6c6c98544461bbe71db2bca4c6d7fd0021e0ba9efc215f9c6ad41852df9d9df9";
  13. const API_MEMO: &str = "test001";
  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 (_, 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(_)) = 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. trace!("---传入的方法~~~~{:?}", data);
  63. }
  64. };
  65. let param = BitMartSwapLogin {
  66. api_key: ACCESS_KEY.to_string(),
  67. secret: SECRET_KEY.to_string(),
  68. api_memo: API_MEMO.to_string(),
  69. };
  70. let t1 = tokio::spawn(async move {
  71. let mut ws = get_ws(Option::from(param), BitMartSwapWsType::Public);
  72. ws.set_symbols(vec!["BTC_USDT".to_string(), "ETC_USDT".to_string()]);
  73. ws.set_subscribe(vec![
  74. BitMartSwapSubscribeType::PuFuturesDepth,
  75. // BitMartSwapSubscribeType::PrFuturesOrders,
  76. // BitMartSwapSubscribeType::PrFuturesPositions,
  77. // BitMartSwapSubscribeType::PrFuturesBalances,
  78. ]);
  79. //链接
  80. let bool_v3_clone = Arc::clone(&is_shutdown_arc);
  81. ws.ws_connect_async(bool_v3_clone, fun, &write_tx_am, write_rx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  82. trace!("test 唯一线程结束--");
  83. });
  84. tokio::try_join!(t1).unwrap();
  85. trace!("当此结束");
  86. trace!("重启!");
  87. trace!("参考交易所关闭");
  88. return;
  89. }
  90. fn get_ws(btree_map: Option<BitMartSwapLogin>, ws_type: BitMartSwapWsType) -> BitMartSwapWs {
  91. let bitmart_ws = BitMartSwapWs::new(btree_map, ws_type);
  92. bitmart_ws
  93. }
  94. /*深度*/
  95. #[tokio::test]
  96. async fn rest_get_depth_test() {
  97. global::log_utils::init_log_with_trace();
  98. proxy_handle();
  99. let mut ret = get_rest();
  100. let req_data = ret.get_depth("BTCUSDT".to_string()).await;
  101. trace!("htx--深度--{:?}", req_data);
  102. trace!("htx--深度--{}", req_data.data);
  103. }
  104. /*合约信息*/
  105. #[tokio::test]
  106. async fn rest_get_market_test() {
  107. global::log_utils::init_log_with_trace();
  108. proxy_handle();
  109. let mut ret = get_rest();
  110. let req_data = ret.get_market("BTCUSDT".to_string()).await;
  111. trace!("htx--合约信息--{:?}", req_data);
  112. trace!("htx--合约信息--{}", req_data.data);
  113. }
  114. /*查询合约账户*/
  115. #[tokio::test]
  116. async fn rest_get_account_test() {
  117. global::log_utils::init_log_with_trace();
  118. // proxy_handle();
  119. let mut ret = get_rest();
  120. let req_data = ret.get_account(json!({
  121. })
  122. ).await;
  123. trace!("htx--查询合约账户--{:?}", req_data);
  124. trace!("htx--查询合约账户--{}", req_data.data);
  125. }
  126. /*用户仓位列表*/
  127. #[tokio::test]
  128. async fn rest_get_user_position_test() {
  129. global::log_utils::init_log_with_trace();
  130. // proxy_handle();
  131. let mut ret = get_rest();
  132. let req_data = ret.get_user_position("BTCUSDT".to_string()).await;
  133. trace!("htx--用户仓位列表--{:?}", req_data);
  134. trace!("htx--用户仓位列表--{}", req_data.data);
  135. }
  136. /*查询合约订单列表*/
  137. #[tokio::test]
  138. async fn rest_get_orders_test() {
  139. global::log_utils::init_log_with_trace();
  140. // proxy_handle();
  141. let mut ret = get_rest();
  142. let req_data = ret.get_orders(json!({
  143. "symbol":"BTCUSDT"
  144. })).await;
  145. trace!("htx--查询合约订单列表--{:?}", req_data);
  146. trace!("htx--查询合约订单列表--{}", req_data.data);
  147. }
  148. /*查询单个订单详情*/
  149. #[tokio::test]
  150. async fn rest_get_order_details_test() {
  151. global::log_utils::init_log_with_trace();
  152. // proxy_handle();
  153. let mut ret = get_rest();
  154. let req_data = ret.get_order_details(json!({
  155. "symbol":"BTCUSDT",
  156. "order_id":"123"
  157. })).await;
  158. trace!("htx--查询单个订单详情--{:?}", req_data);
  159. trace!("htx--查询单个订单详情--{}", req_data.data);
  160. }
  161. /*合约交易下单*/
  162. #[tokio::test]
  163. async fn rest_swap_order_test() {
  164. global::log_utils::init_log_with_trace();
  165. // proxy_handle();
  166. let mut ret = get_rest();
  167. let req_data = ret.swap_order(json!({
  168. "symbol":"SHIB-USDT",
  169. "type":"limit",
  170. "side":"limit",
  171. "leverage":"open",
  172. "direction":"buy",
  173. "price":"0.000001359",
  174. "volume":1,
  175. "lever_rate":1,
  176. })).await;
  177. trace!("htx--合约交易下单--{:?}", req_data);
  178. trace!("htx--合约交易下单--{}", req_data.data);
  179. }
  180. /*全部撤单*/
  181. #[tokio::test]
  182. async fn rest_cancel_price_order_test() {
  183. global::log_utils::init_log_with_trace();
  184. // proxy_handle();
  185. let mut ret = get_rest();
  186. let req_data = ret.cancel_price_order(json!({ })).await;
  187. trace!("htx--全部撤单--{:?}", req_data);
  188. trace!("htx--全部撤单--{}", req_data.data);
  189. }
  190. /*撤单*/
  191. #[tokio::test]
  192. async fn rest_cancel_order_test() {
  193. global::log_utils::init_log_with_trace();
  194. // proxy_handle();
  195. let mut ret = get_rest();
  196. let req_data = ret.cancel_order(json!({
  197. "order_id":"123"
  198. })).await;
  199. trace!("htx--撤单--{:?}", req_data);
  200. trace!("htx--撤单--{}", req_data.data);
  201. }
  202. // /*设置持仓模式*/
  203. // #[tokio::test]
  204. // async fn rest_setting_dual_mode_test() {
  205. // global::log_utils::init_log_with_trace();
  206. // // proxy_handle();
  207. //
  208. // let mut ret = get_rest();
  209. //
  210. // let req_data = ret.setting_dual_mode(json!({
  211. // "margin_account":"USDT",
  212. // "position_mode":"dual_side",
  213. // })).await;
  214. // trace!("htx--设置持仓模式--{:?}", req_data);
  215. // trace!("htx--设置持仓模式--{}", req_data.data);
  216. // }
  217. /*设置杠杆*/
  218. #[tokio::test]
  219. async fn rest_setting_dual_leverage_test() {
  220. global::log_utils::init_log_with_trace();
  221. // proxy_handle();
  222. let mut ret = get_rest();
  223. let req_data = ret.setting_dual_leverage(json!({
  224. "symbol":"BTCUSDT",
  225. "open_type":"cross",
  226. })).await;
  227. trace!("htx--设置持仓模式--{:?}", req_data);
  228. trace!("htx--设置持仓模式--{}", req_data.data);
  229. }
  230. fn get_rest() -> BitMartSwapRest {
  231. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  232. btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
  233. btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
  234. btree_map.insert("api_memo".to_string(), API_MEMO.to_string());
  235. let bitmart_exc = BitMartSwapRest::new(false, btree_map);
  236. bitmart_exc
  237. }
  238. // 检测是否走代理
  239. pub fn proxy_handle() {
  240. if proxy::ParsingDetail::http_enable_proxy() {
  241. trace!("检测有代理配置,配置走代理");
  242. }
  243. }