bitmart_swap_test.rs 8.8 KB

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