htx_swap_test.rs 8.9 KB

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