exchange_test.rs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. use std::collections::{BTreeMap};
  2. use std::io::{Error};
  3. use std::sync::Arc;
  4. use std::sync::atomic::AtomicBool;
  5. use futures::StreamExt;
  6. use rust_decimal_macros::dec;
  7. use tokio::sync::mpsc::{channel, Receiver, Sender};
  8. use tokio::sync::Mutex;
  9. use tokio::try_join;
  10. use tracing::{error, trace};
  11. // use exchanges::binance_spot_ws::{BinanceSpotLogin, BinanceSpotSubscribeType, BinanceSpotWs, BinanceSpotWsType};
  12. // use exchanges::binance_swap_ws::{BinanceSwapLogin, BinanceSwapSubscribeType, BinanceSwapWs, BinanceSwapWsType};
  13. // use exchanges::kucoin_swap_ws::{KucoinSwapLogin, KucoinSwapSubscribeType, KucoinSwapWs, KucoinSwapWsType};
  14. use exchanges::kucoin_spot_ws::{KucoinSpotLogin, KucoinSpotSubscribeType, KucoinSpotWs, KucoinSpotWsType};
  15. // use exchanges::bitget_spot_ws::{BitgetSpotWs, BitgetSpotSubscribeType, BitgetSpotWsType, BitgetSpotLogin};
  16. // use exchanges::okx_swap_ws::{OkxSubscribeType, OkxSwapWs, OkxWsType};
  17. use exchanges::response_base::ResponseData;
  18. use standard::exchange::{Exchange, ExchangeEnum};
  19. // use standard::{binance_spot_handle, Order, Platform, utils};
  20. // use standard::{binance_handle, Order, Platform, utils};
  21. // use standard::{kucoin_handle, Order, Platform, utils};
  22. use standard::{kucoin_spot_handle, Order, Platform, utils};
  23. // use standard::{bitget_spot_handle, Order, Platform, utils};
  24. // use standard::{okx_handle, Order, Platform, utils};
  25. // 创建实体
  26. #[allow(dead_code)]
  27. pub async fn test_new_exchange(exchange: ExchangeEnum, symbol: &str) -> Box<dyn Platform> {
  28. utils::proxy_handle();
  29. let (order_sender, _order_receiver): (Sender<Order>, Receiver<Order>) = channel(1024);
  30. let (error_sender, _error_receiver): (Sender<Error>, Receiver<Error>) = channel(1024);
  31. let account_info = global::account_info::get_account_info("../test_account.toml");
  32. match exchange {
  33. ExchangeEnum::BinanceSwap => {
  34. let mut params: BTreeMap<String, String> = BTreeMap::new();
  35. let access_key = account_info.binance_access_key;
  36. let secret_key = account_info.binance_secret_key;
  37. params.insert("access_key".to_string(), access_key);
  38. params.insert("secret_key".to_string(), secret_key);
  39. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  40. }
  41. ExchangeEnum::BinanceSpot => {
  42. let mut params: BTreeMap<String, String> = BTreeMap::new();
  43. let access_key = account_info.binance_access_key;
  44. let secret_key = account_info.binance_secret_key;
  45. params.insert("access_key".to_string(), access_key);
  46. params.insert("secret_key".to_string(), secret_key);
  47. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  48. }
  49. ExchangeEnum::GateSwap => {
  50. let mut params: BTreeMap<String, String> = BTreeMap::new();
  51. let access_key = account_info.gate_access_key;
  52. let secret_key = account_info.gate_secret_key;
  53. params.insert("access_key".to_string(), access_key);
  54. params.insert("secret_key".to_string(), secret_key);
  55. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  56. }
  57. ExchangeEnum::GateSpot => {
  58. let mut params: BTreeMap<String, String> = BTreeMap::new();
  59. let access_key = account_info.gate_access_key;
  60. let secret_key = account_info.gate_secret_key;
  61. params.insert("access_key".to_string(), access_key);
  62. params.insert("secret_key".to_string(), secret_key);
  63. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  64. }
  65. ExchangeEnum::KucoinSwap => {
  66. let mut params: BTreeMap<String, String> = BTreeMap::new();
  67. let access_key = account_info.kucoin_access_key;
  68. let secret_key = account_info.kucoin_secret_key;
  69. let pass_key = account_info.kucoin_pass;
  70. params.insert("access_key".to_string(), access_key);
  71. params.insert("secret_key".to_string(), secret_key);
  72. params.insert("pass_key".to_string(), pass_key);
  73. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  74. }
  75. ExchangeEnum::KucoinSpot => {
  76. let mut params: BTreeMap<String, String> = BTreeMap::new();
  77. let access_key = account_info.kucoin_access_key;
  78. let secret_key = account_info.kucoin_secret_key;
  79. let pass_key = account_info.kucoin_pass;
  80. params.insert("access_key".to_string(), access_key);
  81. params.insert("secret_key".to_string(), secret_key);
  82. params.insert("pass_key".to_string(), pass_key);
  83. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  84. }
  85. ExchangeEnum::OkxSwap => {
  86. let mut params: BTreeMap<String, String> = BTreeMap::new();
  87. let access_key = account_info.okx_access_key;
  88. let secret_key = account_info.okx_secret_key;
  89. let pass_key = account_info.okx_pass;
  90. params.insert("access_key".to_string(), access_key);
  91. params.insert("secret_key".to_string(), secret_key);
  92. params.insert("pass_key".to_string(), pass_key);
  93. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  94. }
  95. ExchangeEnum::BitgetSpot => {
  96. let mut params: BTreeMap<String, String> = BTreeMap::new();
  97. let access_key = account_info.bitget_access_key;
  98. let secret_key = account_info.bitget_secret_key;
  99. let pass_key = account_info.bitget_pass;
  100. params.insert("access_key".to_string(), access_key);
  101. params.insert("secret_key".to_string(), secret_key);
  102. params.insert("pass_key".to_string(), pass_key);
  103. Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
  104. }
  105. }
  106. }
  107. #[allow(dead_code)]
  108. pub async fn test_new_exchange_wss<T>(exchange: ExchangeEnum, symbol: &str, subscriber_type: T, mold: &str) where Vec<KucoinSpotSubscribeType>: From<T> {
  109. utils::proxy_handle();
  110. let account_info = global::account_info::get_account_info("../test_account.toml");
  111. match exchange {
  112. ExchangeEnum::BinanceSpot => {
  113. // let symbol_format = utils::format_symbol(symbol.to_string(), "").to_uppercase();
  114. // trace!(symbol_format);
  115. // let name = format!("binance_spot@{}", symbol.to_string().to_lowercase());
  116. // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  117. // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  118. // let write_tx_am = Arc::new(Mutex::new(write_tx));
  119. // let bool_v1 = Arc::new(AtomicBool::new(true));
  120. //
  121. // let params = BinanceSpotLogin {
  122. // api_key: account_info.binance_access_key,
  123. // api_secret: account_info.binance_secret_key,
  124. // };
  125. // let mut exchange_wss;
  126. // exchange_wss = BinanceSpotWs::new_label(name, false, Option::from(params), BinanceSpotWsType::PublicAndPrivate);
  127. // exchange_wss.set_symbols(vec![symbol_format]);
  128. // exchange_wss.set_subscribe(subscriber_type.into());
  129. //
  130. //
  131. // let mold_arc = Arc::new(mold.to_string());
  132. // //读取
  133. // tokio::spawn(async move {
  134. // let mold_clone = Arc::clone(&mold_arc);
  135. // loop {
  136. // if let Some(data) = read_rx.next().await {
  137. // trace!("原始数据 data:{:?}",data);
  138. // match mold_clone.as_str() {
  139. // "depth" => {
  140. // if data.data != "" {
  141. // let result = binance_spot_handle::handle_special_depth(data);
  142. // trace!(?result)
  143. // }
  144. // }
  145. // "ticker" => {
  146. // if data.data != "" {
  147. // let result = binance_spot_handle::handle_special_ticker(data);
  148. // trace!(?result)
  149. // }
  150. // }
  151. // _ => {
  152. // error!("没有该命令!mode={}", mold_clone);
  153. // panic!("没有该命令!mode={}", mold_clone)
  154. // }
  155. // }
  156. // }
  157. // };
  158. // });
  159. //
  160. // let t1 = tokio::spawn(async move {
  161. // //链接
  162. // let bool_v3_clone = Arc::clone(&bool_v1);
  163. // exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  164. // });
  165. // try_join!(t1).unwrap();
  166. }
  167. ExchangeEnum::BinanceSwap => {
  168. // let symbol_format = utils::format_symbol(symbol.to_string(), "").to_uppercase();
  169. // trace!(symbol_format);
  170. // let name = format!("binance_swap@{}", symbol.to_string().to_lowercase());
  171. // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  172. // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  173. // let write_tx_am = Arc::new(Mutex::new(write_tx));
  174. // let bool_v1 = Arc::new(AtomicBool::new(true));
  175. //
  176. // let api_key = env::var("binance_access_key").unwrap_or("".to_string());
  177. // let api_secret = env::var("binance_secret_key").unwrap_or("".to_string());
  178. // let params = BinanceSwapLogin {
  179. // api_key: account_info.binance_access_key,
  180. // api_secret: account_info.binance_secret_key,
  181. // };
  182. // let mut exchange_wss;
  183. // exchange_wss = BinanceSwapWs::new_label(name, false, Option::from(params), BinanceSwapWsType::PublicAndPrivate);
  184. // exchange_wss.set_symbols(vec![symbol_format]);
  185. // exchange_wss.set_subscribe(subscriber_type.into());
  186. //
  187. //
  188. // let mold_arc = Arc::new(mold.to_string());
  189. // //读取
  190. // tokio::spawn(async move {
  191. // let mold_clone = Arc::clone(&mold_arc);
  192. // loop {
  193. // if let Some(data) = read_rx.next().await {
  194. // trace!("原始数据 data:{:?}",data);
  195. // match mold_clone.as_str() {
  196. // "depth" => {
  197. // if data.data != "" {
  198. // let result = binance_handle::handle_special_depth(data);
  199. // trace!(?result)
  200. // }
  201. // }
  202. // "ticker" => {
  203. // if data.data != "" {
  204. // let result = binance_handle::handle_special_ticker(data);
  205. // trace!(?result)
  206. // }
  207. // }
  208. // _ => {
  209. // error!("没有该命令!mode={}", mold_clone);
  210. // panic!("没有该命令!mode={}", mold_clone)
  211. // }
  212. // }
  213. // }
  214. // };
  215. // });
  216. //
  217. // let t1 = tokio::spawn(async move {
  218. // //链接
  219. // let bool_v3_clone = Arc::clone(&bool_v1);
  220. // exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  221. // });
  222. // try_join!(t1).unwrap();
  223. }
  224. ExchangeEnum::KucoinSwap => {
  225. // let symbol_format = format!("{}M", utils::format_symbol(symbol.to_string(), ""));
  226. // let symbol_back = utils::format_symbol(symbol.to_string(), "_");
  227. //
  228. // let name = format!("kucoin_swap@{}", symbol.to_string().to_lowercase());
  229. // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  230. // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  231. // let write_tx_am = Arc::new(Mutex::new(write_tx));
  232. // let bool_v1 = Arc::new(AtomicBool::new(true));
  233. //
  234. // let params = KucoinSwapLogin {
  235. // access_key: account_info.kucoin_access_key,
  236. // secret_key: account_info.kucoin_secret_key,
  237. // pass_key: account_info.kucoin_pass,
  238. // };
  239. // let mut exchange_wss;
  240. // if ["depth", "ticker"].contains(&mold) {
  241. // exchange_wss = KucoinSwapWs::new_label(name, false, Option::from(params), KucoinSwapWsType::Public).await;
  242. // } else {
  243. // exchange_wss = KucoinSwapWs::new_label(name, false, Option::from(params), KucoinSwapWsType::Private).await;
  244. // }
  245. // exchange_wss.set_symbols(vec![symbol_format]);
  246. // exchange_wss.set_subscribe(subscriber_type.into());
  247. //
  248. // let mold_arc = Arc::new(mold.to_string());
  249. // tokio::spawn(async move {
  250. // let mold_clone = Arc::clone(&mold_arc);
  251. // loop {
  252. // if let Some(data) = read_rx.next().await {
  253. // trace!("原始数据 data:{:?}",data);
  254. // match mold_clone.as_str() {
  255. // "depth" => {
  256. // let result = kucoin_handle::handle_special_depth(data);
  257. // trace!(?result)
  258. // }
  259. // "ticker" => {
  260. // let result = kucoin_handle::handle_special_ticker(data);
  261. // trace!(?result)
  262. // }
  263. // "account" => {
  264. // let result = kucoin_handle::handle_account_info(data, symbol_back.clone());
  265. // trace!(?result)
  266. // }
  267. // "position" => {
  268. // let result = kucoin_handle::handle_position(data, dec!(1));
  269. // trace!(?result)
  270. // }
  271. // "orders" => {
  272. // let result = kucoin_handle::handle_order(data, dec!(0.001));
  273. // trace!(?result)
  274. // }
  275. // _ => {
  276. // error!("没有该命令!mode={}", mold_clone);
  277. // panic!("没有该命令!mode={}", mold_clone)
  278. // }
  279. // }
  280. // }
  281. // }
  282. // });
  283. //
  284. // let t1 = tokio::spawn(async move {
  285. // //链接
  286. // let bool_v3_clone = Arc::clone(&bool_v1);
  287. // exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  288. // });
  289. // try_join!(t1).unwrap();
  290. }
  291. ExchangeEnum::KucoinSpot => {
  292. let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
  293. let symbol_back = utils::format_symbol(symbol.to_string(), "_");
  294. trace!(symbol_format);
  295. let name = format!("kucoin_spot@{}", symbol.to_string().to_lowercase());
  296. let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  297. let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  298. let write_tx_am = Arc::new(Mutex::new(write_tx));
  299. let bool_v1 = Arc::new(AtomicBool::new(true));
  300. let params = KucoinSpotLogin {
  301. access_key: account_info.kucoin_access_key,
  302. secret_key: account_info.kucoin_secret_key,
  303. pass_key: account_info.kucoin_pass,
  304. };
  305. let mut exchange_wss = if ["depth", "ticker"].contains(&mold) {
  306. KucoinSpotWs::new_label(name, false, Option::from(params), KucoinSpotWsType::Public).await
  307. } else {
  308. KucoinSpotWs::new_label(name, false, Option::from(params), KucoinSpotWsType::Private).await
  309. };
  310. exchange_wss.set_symbols(vec![symbol_format]);
  311. exchange_wss.set_subscribe(subscriber_type.into());
  312. let mold_arc = Arc::new(mold.to_string());
  313. tokio::spawn(async move {
  314. let mold_clone = Arc::clone(&mold_arc);
  315. loop {
  316. if let Some(data) = read_rx.next().await {
  317. trace!("原始数据 data:{:?}",data);
  318. match mold_clone.as_str() {
  319. "depth" => {
  320. if data.data != "" {
  321. let result = kucoin_spot_handle::handle_special_depth(data);
  322. trace!(?result)
  323. }
  324. }
  325. "ticker" => {
  326. if data.data != "" {
  327. let result = kucoin_spot_handle::handle_special_ticker(data);
  328. trace!(?result)
  329. }
  330. }
  331. "account" => {
  332. if data.data != "" {
  333. let result = kucoin_spot_handle::handle_account_info(data, symbol_back.clone());
  334. trace!(?result)
  335. }
  336. }
  337. "orders" => {
  338. if data.data != "" {
  339. let result = kucoin_spot_handle::handle_order(data, dec!(1));
  340. trace!(?result)
  341. }
  342. }
  343. _ => {
  344. error!("没有该命令!mode={}", mold_clone);
  345. panic!("没有该命令!mode={}", mold_clone)
  346. }
  347. }
  348. }
  349. }
  350. });
  351. let t1 = tokio::spawn(async move {
  352. //链接
  353. let bool_v3_clone = Arc::clone(&bool_v1);
  354. exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  355. });
  356. try_join!(t1).unwrap();
  357. }
  358. ExchangeEnum::GateSwap => {
  359. error!("该交易所不支持!test_new_exchange_wss:{:?}",exchange);
  360. panic!("该交易所不支持!test_new_exchange_wss:{:?}", exchange)
  361. }
  362. ExchangeEnum::BitgetSpot => {
  363. // let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
  364. // let symbol_back = utils::format_symbol(symbol.to_string(), "_");
  365. // trace!(symbol_format);
  366. // let name = format!("bitget_spot@{}", symbol.to_string().to_lowercase());
  367. // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
  368. // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
  369. // let write_tx_am = Arc::new(Mutex::new(write_tx));
  370. // let bool_v1 = Arc::new(AtomicBool::new(true));
  371. //
  372. // let api_key = env::var("bitget_access_key").unwrap_or("".to_string());
  373. // let secret_key = env::var("bitget_secret_key").unwrap_or("".to_string());
  374. // let passphrase_key = env::var("bitget_pass_key").unwrap_or("".to_string());
  375. // let params = BitgetSpotLogin {
  376. // api_key,
  377. // secret_key,
  378. // passphrase_key,
  379. // };
  380. //
  381. // let mut exchange_wss = if ["depth", "ticker"].contains(&mold) {
  382. // BitgetSpotWs::new_label(name, false, Option::from(params), BitgetSpotWsType::Public)
  383. // } else {
  384. // BitgetSpotWs::new_label(name, false, Option::from(params), BitgetSpotWsType::Private)
  385. // };
  386. // exchange_wss.set_symbols(vec![symbol_format]);
  387. // exchange_wss.set_subscribe(subscriber_type.into());
  388. //
  389. // let mold_arc = Arc::new(mold.to_string());
  390. // //读取
  391. // tokio::spawn(async move {
  392. // loop {
  393. // let mold_clone = Arc::clone(&mold_arc);
  394. // if let Some(data) = read_rx.next().await {
  395. // trace!("原始数据 data:{:?}",data);
  396. // match mold_clone.as_str() {
  397. // "depth" => {
  398. // if data.data != "" {
  399. // let result = bitget_spot_handle::handle_special_depth(data);
  400. // trace!(?result)
  401. // }
  402. // }
  403. // "ticker" => {
  404. // if data.data != "" {
  405. // let result = bitget_spot_handle::handle_special_ticker(data);
  406. // trace!(?result)
  407. // }
  408. // }
  409. // "account" => {
  410. // if data.data != "" {
  411. // let result = bitget_spot_handle::handle_account_info(data, symbol_back.clone());
  412. // trace!(?result)
  413. // }
  414. // }
  415. // "orders" => {
  416. // if data.data != "" {
  417. // let result = bitget_spot_handle::handle_order(data, dec!(1));
  418. // trace!(?result)
  419. // }
  420. // }
  421. // _ => {
  422. // error!("没有该命令!mode={}", mold_clone);
  423. // panic!("没有该命令!mode={}", mold_clone)
  424. // }
  425. // }
  426. // }
  427. // }
  428. // });
  429. // let t1 = tokio::spawn(async move {
  430. // //链接
  431. // let bool_v3_clone = Arc::clone(&bool_v1);
  432. // exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
  433. // });
  434. // try_join!(t1).unwrap();
  435. }
  436. ExchangeEnum::OkxSwap => {
  437. // let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
  438. // let symbol_back = utils::format_symbol(symbol.to_string(), "_");
  439. // trace!(symbol_format);
  440. // let name = format!("okx_usdt_swap@{}", symbol.to_string().to_lowercase());
  441. // let bool_v1 = Arc::new(AtomicBool::new(true));
  442. //
  443. // let (res_sender, mut res_receiver): (Sender<ResponseData>, Receiver<ResponseData>) = channel(1024);
  444. // let mut params: BTreeMap<String, String> = BTreeMap::new();
  445. // let access_key = env::var("okx_access_key").unwrap_or("".to_string());
  446. // let secret_key = env::var("okx_secret_key").unwrap_or("".to_string());
  447. // let passphrase = env::var("okx_passphrase").unwrap_or("".to_string());
  448. // params.insert("access_key".to_string(), access_key);
  449. // params.insert("secret_key".to_string(), secret_key);
  450. // params.insert("pass_key".to_string(), passphrase);
  451. //
  452. // let mut exchange_wss = if ["depth", "ticker"].contains(&mold) {
  453. // OkxSwapWs::new_label(name, false, params, OkxWsType::Public, res_sender)
  454. // } else if ["account", "orders", "position"].contains(&mold) {
  455. // OkxSwapWs::new_label(name, false, params, OkxWsType::Private, res_sender)
  456. // } else {
  457. // OkxSwapWs::new_label(name, false, params, OkxWsType::Business, res_sender)
  458. // };
  459. //
  460. // exchange_wss.set_subscribe(subscriber_type.into());
  461. //
  462. // let t1 = tokio::spawn(async move {
  463. // exchange_wss.custom_subscribe(bool_v1, vec![symbol_format]).await;
  464. // });
  465. // let mold_arc = Arc::new(mold.to_string());
  466. // let t2 = tokio::spawn(async move {
  467. // let mold_clone = Arc::clone(&mold_arc);
  468. // loop {
  469. // tokio::time::sleep(Duration::from_millis(1)).await;
  470. // if let Ok(received) = res_receiver.try_recv() {
  471. // match mold_clone.as_str() {
  472. // "depth" => {
  473. // if received.data != "" {
  474. // let result = okx_handle::handle_special_depth(received);
  475. // trace!(?result)
  476. // }
  477. // }
  478. // "ticker" => {
  479. // if received.data != "" {
  480. // let result = okx_handle::handle_special_ticker(received);
  481. // trace!(?result)
  482. // }
  483. // }
  484. // "account" => {
  485. // if received.data != "" {
  486. // let result = okx_handle::handle_account_info(received, symbol_back.clone());
  487. // trace!(?result)
  488. // }
  489. // }
  490. // "position" => {
  491. // if received.data != "" {
  492. // let result = okx_handle::handle_position(received, dec!(10));
  493. // trace!(?result)
  494. // }
  495. // }
  496. // "orders" => {
  497. // if received.data != "" {
  498. // let result = okx_handle::handle_order(received, dec!(10));
  499. // trace!(?result)
  500. // }
  501. // }
  502. // _ => {
  503. // error!("没有该命令!mode={}", mold_clone);
  504. // panic!("没有该命令!mode={}", mold_clone)
  505. // }
  506. // }
  507. // }
  508. // }
  509. // });
  510. // try_join!(t1, t2).unwrap();
  511. }
  512. _ => {
  513. error!("该交易所不支持!test_new_exchange_wss:{:?}",exchange);
  514. panic!("该交易所不支持!test_new_exchange_wss:{:?}", exchange)
  515. }
  516. }
  517. }