소스 검색

注释报错部分

JiahengHe 8 달 전
부모
커밋
b77d31ef45

+ 92 - 92
derive/src/binance_swap_export.rs

@@ -1,92 +1,92 @@
-use std::collections::BTreeMap;
-use async_trait::async_trait;
-use chrono::{FixedOffset, NaiveDateTime, TimeZone};
-use serde::{Deserialize, Serialize};
-use tracing::warn;
-use exchanges::binance_swap_rest::BinanceSwapRest;
-use standard::utils;
-use crate::ExportConnector;
-
-pub struct BinanceSwapExport {
-    request: BinanceSwapRest,
-}
-
-impl BinanceSwapExport {
-    pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> BinanceSwapExport {
-        BinanceSwapExport {
-            request: BinanceSwapRest::new(is_colo, params.clone())
-        }
-    }
-}
-
-/// TradesSwap
-/// - `buyer`: bool, 是否是买方
-/// - `commission`: String, 手续费
-/// - `commission_asset`: String, 手续费计价单位
-/// - `id`: i64, 交易ID
-/// - `maker`: bool, 是否是挂单方
-/// - `order_id`: i64, 订单编号
-/// - `price`: String, 成交价
-/// - `qty`: String, 成交量
-/// - `quote_qty`: String, 成交额
-/// - `realized_pnl`: String, 实现盈亏
-/// - `side`: String, 买卖方向
-/// - `position_side`: String, 持仓方向
-/// - `symbol`: String, 交易对
-/// - `time`: i64 时间
-#[derive(Debug, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-struct TradesSwap {
-    buyer: bool,
-    commission: String,
-    commission_asset: String,
-    id: i64,
-    maker: bool,
-    order_id: i64,
-    price: String,
-    qty: String,
-    quote_qty: String,
-    realized_pnl: String,
-    side: String,
-    position_side: String,
-    symbol: String,
-    time: i64,
-}
-
-#[async_trait]
-impl ExportConnector for BinanceSwapExport {
-    async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
-        let symbol_format = utils::format_symbol(symbol.clone(), "");
-        let limit_params = if limit > 1000 {
-            warn!("查询条数最大为1000条,已修改为1000条!");
-            1000
-        } else { limit };
-        let res_data = self.request.get_user_trades(symbol_format, start_time, end_time, limit_params).await;
-        if res_data.code == "200" {
-            let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
-            let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "交易时间"];
-            let mut data_array: Vec<Vec<String>> = Vec::new();
-            for (index, value) in trades_info.iter().enumerate() {
-                if index >= data_array.len() {
-                    data_array.push(Vec::new());
-                }
-                let time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.time.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-
-                data_array[index] = vec![
-                    value.id.to_string(),
-                    value.order_id.to_string(),
-                    value.symbol.clone(),
-                    value.side.clone(),
-                    value.price.clone(),
-                    value.qty.clone(),
-                    value.quote_qty.clone(),
-                    value.commission.clone(),
-                    time,
-                ];
-            }
-            global::export_utils::export_excel(header_array, data_array, prefix_name)
-        } else {
-            res_data.to_string()
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use async_trait::async_trait;
+// use chrono::{FixedOffset, NaiveDateTime, TimeZone};
+// use serde::{Deserialize, Serialize};
+// use tracing::warn;
+// use exchanges::binance_swap_rest::BinanceSwapRest;
+// use standard::utils;
+// use crate::ExportConnector;
+// 
+// pub struct BinanceSwapExport {
+//     request: BinanceSwapRest,
+// }
+// 
+// impl BinanceSwapExport {
+//     pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> BinanceSwapExport {
+//         BinanceSwapExport {
+//             request: BinanceSwapRest::new(is_colo, params.clone())
+//         }
+//     }
+// }
+// 
+// /// TradesSwap
+// /// - `buyer`: bool, 是否是买方
+// /// - `commission`: String, 手续费
+// /// - `commission_asset`: String, 手续费计价单位
+// /// - `id`: i64, 交易ID
+// /// - `maker`: bool, 是否是挂单方
+// /// - `order_id`: i64, 订单编号
+// /// - `price`: String, 成交价
+// /// - `qty`: String, 成交量
+// /// - `quote_qty`: String, 成交额
+// /// - `realized_pnl`: String, 实现盈亏
+// /// - `side`: String, 买卖方向
+// /// - `position_side`: String, 持仓方向
+// /// - `symbol`: String, 交易对
+// /// - `time`: i64 时间
+// #[derive(Debug, Deserialize, Serialize)]
+// #[serde(rename_all = "camelCase")]
+// struct TradesSwap {
+//     buyer: bool,
+//     commission: String,
+//     commission_asset: String,
+//     id: i64,
+//     maker: bool,
+//     order_id: i64,
+//     price: String,
+//     qty: String,
+//     quote_qty: String,
+//     realized_pnl: String,
+//     side: String,
+//     position_side: String,
+//     symbol: String,
+//     time: i64,
+// }
+// 
+// #[async_trait]
+// impl ExportConnector for BinanceSwapExport {
+//     async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
+//         let symbol_format = utils::format_symbol(symbol.clone(), "");
+//         let limit_params = if limit > 1000 {
+//             warn!("查询条数最大为1000条,已修改为1000条!");
+//             1000
+//         } else { limit };
+//         let res_data = self.request.get_user_trades(symbol_format, start_time, end_time, limit_params).await;
+//         if res_data.code == "200" {
+//             let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
+//             let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "交易时间"];
+//             let mut data_array: Vec<Vec<String>> = Vec::new();
+//             for (index, value) in trades_info.iter().enumerate() {
+//                 if index >= data_array.len() {
+//                     data_array.push(Vec::new());
+//                 }
+//                 let time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.time.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+// 
+//                 data_array[index] = vec![
+//                     value.id.to_string(),
+//                     value.order_id.to_string(),
+//                     value.symbol.clone(),
+//                     value.side.clone(),
+//                     value.price.clone(),
+//                     value.qty.clone(),
+//                     value.quote_qty.clone(),
+//                     value.commission.clone(),
+//                     time,
+//                 ];
+//             }
+//             global::export_utils::export_excel(header_array, data_array, prefix_name)
+//         } else {
+//             res_data.to_string()
+//         }
+//     }
+// }

+ 78 - 78
derive/src/bitget_spot_export.rs

@@ -1,78 +1,78 @@
-use std::collections::BTreeMap;
-use std::str::FromStr;
-use async_trait::async_trait;
-use chrono::{FixedOffset, NaiveDateTime, TimeZone};
-use rust_decimal::Decimal;
-use serde::{Deserialize, Serialize};
-use tracing::warn;
-use exchanges::bitget_spot_rest::BitgetSpotRest;
-use standard::utils;
-use crate::ExportConnector;
-
-pub struct BitgetSpotExport {
-    request: BitgetSpotRest,
-}
-
-impl BitgetSpotExport {
-    pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> BitgetSpotExport {
-        BitgetSpotExport {
-            request: BitgetSpotRest::new(is_colo, params.clone())
-        }
-    }
-}
-
-/// TradesSwap
-/// - `symbol`: String, 交易对名称
-/// - `trade_id`: String, 成交单ID
-/// - `side`: String, 交易方向
-/// - `price`: String, 成交价格
-/// - `size`: String, 成交数量
-/// - `ts`: String, 成交时间
-#[derive(Debug, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-struct TradesSpot {
-    symbol: String,
-    trade_id: String,
-    side: String,
-    price: String,
-    size: String,
-    ts: String,
-}
-
-#[async_trait]
-impl ExportConnector for BitgetSpotExport {
-    async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
-        let symbol_format = utils::format_symbol(symbol, "");
-        let start_at = if start_time > 0 { start_time.to_string() } else { "".to_string() };
-        let end_at = if end_time > 0 { end_time.to_string() } else { "".to_string() };
-        let limit_params = if limit > 1000 {
-            warn!("查询条数最大为1000条,已修改为1000条!");
-            1000
-        } else { limit };
-        let res_data = self.request.get_market_fills_history(symbol_format, start_at.to_string(), end_at.to_string(), limit_params.to_string()).await;
-        if res_data.code == "200" {
-            let trades_info: Vec<TradesSpot> = serde_json::from_str(&res_data.data).unwrap();
-            let header_array = vec!["交易编号", "交易币对", "买卖方向", "订单价格", "订单数量", "成交额", "创建时间"];
-            let mut data_array: Vec<Vec<String>> = Vec::new();
-            for (index, value) in trades_info.iter().enumerate() {
-                if index >= data_array.len() {
-                    data_array.push(Vec::new());
-                }
-                let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.ts.parse::<i64>().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-                let trade_value = Decimal::from_str(&value.price).unwrap() * Decimal::from_str(&value.size).unwrap();
-                data_array[index] = vec![
-                    value.trade_id.clone(),
-                    value.symbol.clone(),
-                    value.side.clone(),
-                    value.price.clone(),
-                    value.size.clone(),
-                    trade_value.to_string(),
-                    created_at,
-                ];
-            }
-            global::export_utils::export_excel(header_array, data_array, prefix_name)
-        } else {
-            res_data.to_string()
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use std::str::FromStr;
+// use async_trait::async_trait;
+// use chrono::{FixedOffset, NaiveDateTime, TimeZone};
+// use rust_decimal::Decimal;
+// use serde::{Deserialize, Serialize};
+// use tracing::warn;
+// use exchanges::bitget_spot_rest::BitgetSpotRest;
+// use standard::utils;
+// use crate::ExportConnector;
+// 
+// pub struct BitgetSpotExport {
+//     request: BitgetSpotRest,
+// }
+// 
+// impl BitgetSpotExport {
+//     pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> BitgetSpotExport {
+//         BitgetSpotExport {
+//             request: BitgetSpotRest::new(is_colo, params.clone())
+//         }
+//     }
+// }
+// 
+// /// TradesSwap
+// /// - `symbol`: String, 交易对名称
+// /// - `trade_id`: String, 成交单ID
+// /// - `side`: String, 交易方向
+// /// - `price`: String, 成交价格
+// /// - `size`: String, 成交数量
+// /// - `ts`: String, 成交时间
+// #[derive(Debug, Deserialize, Serialize)]
+// #[serde(rename_all = "camelCase")]
+// struct TradesSpot {
+//     symbol: String,
+//     trade_id: String,
+//     side: String,
+//     price: String,
+//     size: String,
+//     ts: String,
+// }
+// 
+// #[async_trait]
+// impl ExportConnector for BitgetSpotExport {
+//     async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
+//         let symbol_format = utils::format_symbol(symbol, "");
+//         let start_at = if start_time > 0 { start_time.to_string() } else { "".to_string() };
+//         let end_at = if end_time > 0 { end_time.to_string() } else { "".to_string() };
+//         let limit_params = if limit > 1000 {
+//             warn!("查询条数最大为1000条,已修改为1000条!");
+//             1000
+//         } else { limit };
+//         let res_data = self.request.get_market_fills_history(symbol_format, start_at.to_string(), end_at.to_string(), limit_params.to_string()).await;
+//         if res_data.code == "200" {
+//             let trades_info: Vec<TradesSpot> = serde_json::from_str(&res_data.data).unwrap();
+//             let header_array = vec!["交易编号", "交易币对", "买卖方向", "订单价格", "订单数量", "成交额", "创建时间"];
+//             let mut data_array: Vec<Vec<String>> = Vec::new();
+//             for (index, value) in trades_info.iter().enumerate() {
+//                 if index >= data_array.len() {
+//                     data_array.push(Vec::new());
+//                 }
+//                 let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.ts.parse::<i64>().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//                 let trade_value = Decimal::from_str(&value.price).unwrap() * Decimal::from_str(&value.size).unwrap();
+//                 data_array[index] = vec![
+//                     value.trade_id.clone(),
+//                     value.symbol.clone(),
+//                     value.side.clone(),
+//                     value.price.clone(),
+//                     value.size.clone(),
+//                     trade_value.to_string(),
+//                     created_at,
+//                 ];
+//             }
+//             global::export_utils::export_excel(header_array, data_array, prefix_name)
+//         } else {
+//             res_data.to_string()
+//         }
+//     }
+// }

+ 46 - 46
derive/src/export_excel.rs

@@ -1,46 +1,46 @@
-use std::collections::BTreeMap;
-use crate::binance_swap_export::BinanceSwapExport;
-use crate::bitget_spot_export::BitgetSpotExport;
-use crate::ExportConnector;
-use crate::gate_swap_export::GateSwapExport;
-use crate::kucoin_spot_export::KucoinSpotExport;
-use crate::kucoin_swap_export::KucoinSwapExport;
-use crate::okx_swap_export::OkxSwapExport;
-
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub enum ExportEnum {
-    BinanceSwap,
-    KucoinSwap,
-    KucoinSpot,
-    GateSwap,
-    BitgetSpot,
-    OkxSwap,
-}
-
-#[derive(Debug, Clone)]
-pub struct ExportExcel;
-
-impl ExportExcel {
-    pub async fn new(export_enum: ExportEnum, is_colo: bool, params: BTreeMap<String, String>) -> Box<dyn ExportConnector> {
-        match export_enum {
-            ExportEnum::BinanceSwap => {
-                Box::new(BinanceSwapExport::new(is_colo, params).await)
-            }
-            ExportEnum::KucoinSwap => {
-                Box::new(KucoinSwapExport::new(is_colo, params).await)
-            }
-            ExportEnum::KucoinSpot => {
-                Box::new(KucoinSpotExport::new(is_colo, params).await)
-            }
-            ExportEnum::GateSwap => {
-                Box::new(GateSwapExport::new(is_colo, params).await)
-            }
-            ExportEnum::BitgetSpot => {
-                Box::new(BitgetSpotExport::new(is_colo, params).await)
-            }
-            ExportEnum::OkxSwap => {
-                Box::new(OkxSwapExport::new(is_colo, params).await)
-            }
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use crate::binance_swap_export::BinanceSwapExport;
+// use crate::bitget_spot_export::BitgetSpotExport;
+// use crate::ExportConnector;
+// use crate::gate_swap_export::GateSwapExport;
+// use crate::kucoin_spot_export::KucoinSpotExport;
+// use crate::kucoin_swap_export::KucoinSwapExport;
+// use crate::okx_swap_export::OkxSwapExport;
+// 
+// #[derive(Debug, Clone, PartialEq, Eq)]
+// pub enum ExportEnum {
+//     BinanceSwap,
+//     KucoinSwap,
+//     KucoinSpot,
+//     GateSwap,
+//     BitgetSpot,
+//     OkxSwap,
+// }
+// 
+// #[derive(Debug, Clone)]
+// pub struct ExportExcel;
+// 
+// impl ExportExcel {
+//     pub async fn new(export_enum: ExportEnum, is_colo: bool, params: BTreeMap<String, String>) -> Box<dyn ExportConnector> {
+//         match export_enum {
+//             ExportEnum::BinanceSwap => {
+//                 Box::new(BinanceSwapExport::new(is_colo, params).await)
+//             }
+//             ExportEnum::KucoinSwap => {
+//                 Box::new(KucoinSwapExport::new(is_colo, params).await)
+//             }
+//             ExportEnum::KucoinSpot => {
+//                 Box::new(KucoinSpotExport::new(is_colo, params).await)
+//             }
+//             ExportEnum::GateSwap => {
+//                 Box::new(GateSwapExport::new(is_colo, params).await)
+//             }
+//             ExportEnum::BitgetSpot => {
+//                 Box::new(BitgetSpotExport::new(is_colo, params).await)
+//             }
+//             ExportEnum::OkxSwap => {
+//                 Box::new(OkxSwapExport::new(is_colo, params).await)
+//             }
+//         }
+//     }
+// }

+ 94 - 94
derive/src/gate_swap_export.rs

@@ -1,94 +1,94 @@
-use std::collections::BTreeMap;
-use std::str::FromStr;
-use async_trait::async_trait;
-use chrono::{FixedOffset, NaiveDateTime, TimeZone};
-use rust_decimal::Decimal;
-use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
-use rust_decimal_macros::dec;
-use serde::{Deserialize, Serialize};
-use tracing::{error, warn};
-use exchanges::gate_swap_rest::GateSwapRest;
-use standard::utils;
-use crate::ExportConnector;
-
-pub struct GateSwapExport {
-    request: GateSwapRest,
-}
-
-impl GateSwapExport {
-    pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> GateSwapExport {
-        GateSwapExport {
-            request: GateSwapRest::new(is_colo, params.clone())
-        }
-    }
-}
-
-/// TradesSwap
-/// - `id`: i64, 成交记录 ID
-/// - `create_time`: i64, 成交时间
-/// - `contract`: String, 合约标识
-/// - `order_id`: String, 成交记录关联订单 ID
-/// - `size`: i64, 成交数量
-/// - `price`: String, 成交价格
-/// - `text`: String, 成交角色, taker - 吃单, maker - 做单
-/// - `fee`: String, 订单的自定义信息
-/// - `point_fee`: String, 成交手续费
-/// - `role`: String, 成交点卡手续费
-#[derive(Debug, Deserialize, Serialize)]
-struct TradesSwap {
-    id: i64,
-    create_time: f64,
-    contract: String,
-    order_id: String,
-    size: i64,
-    price: String,
-    text: String,
-    fee: String,
-    point_fee: String,
-    role: String,
-}
-
-#[async_trait]
-impl ExportConnector for GateSwapExport {
-    async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
-        let symbol_array: Vec<&str> = symbol.split("_").collect();
-        let symbol_format = utils::format_symbol(symbol.clone(), "_");
-        let limit_params = if limit > 1000 {
-            warn!("查询条数最大为1000条,已修改为1000条!");
-            1000
-        } else { limit };
-        let res_data = self.request.my_trades(symbol_array[1].to_lowercase(), symbol_format, limit_params).await;
-        if start_time > 0 || end_time > 0 { error!("该交易所不支持根据时间查询!") };
-        if res_data.code == "200" {
-            let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
-            let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "成交角色", "成交时间"];
-            let mut data_array: Vec<Vec<String>> = Vec::new();
-
-            for (index, value) in trades_info.iter().enumerate() {
-                if index >= data_array.len() {
-                    data_array.push(Vec::new());
-                }
-                let size = Decimal::from_i64(value.size).unwrap();
-                let side = if size < Decimal::ZERO { "sell" } else { "buy" };
-                let created_time = Decimal::from_f64(value.create_time).unwrap() * dec!(1000);
-                let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(created_time.to_i64().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-                let trade_value = Decimal::from_str(&value.price).unwrap() * size.abs();
-                data_array[index] = vec![
-                    value.id.to_string(),
-                    value.order_id.clone(),
-                    value.contract.clone(),
-                    side.to_string(),
-                    value.price.clone(),
-                    size.abs().to_string(),
-                    trade_value.to_string(),
-                    value.fee.clone(),
-                    value.role.clone(),
-                    created_at,
-                ];
-            }
-            global::export_utils::export_excel(header_array, data_array, prefix_name)
-        } else {
-            res_data.to_string()
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use std::str::FromStr;
+// use async_trait::async_trait;
+// use chrono::{FixedOffset, NaiveDateTime, TimeZone};
+// use rust_decimal::Decimal;
+// use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
+// use rust_decimal_macros::dec;
+// use serde::{Deserialize, Serialize};
+// use tracing::{error, warn};
+// use exchanges::gate_swap_rest::GateSwapRest;
+// use standard::utils;
+// use crate::ExportConnector;
+// 
+// pub struct GateSwapExport {
+//     request: GateSwapRest,
+// }
+// 
+// impl GateSwapExport {
+//     pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> GateSwapExport {
+//         GateSwapExport {
+//             request: GateSwapRest::new(is_colo, params.clone())
+//         }
+//     }
+// }
+// 
+// /// TradesSwap
+// /// - `id`: i64, 成交记录 ID
+// /// - `create_time`: i64, 成交时间
+// /// - `contract`: String, 合约标识
+// /// - `order_id`: String, 成交记录关联订单 ID
+// /// - `size`: i64, 成交数量
+// /// - `price`: String, 成交价格
+// /// - `text`: String, 成交角色, taker - 吃单, maker - 做单
+// /// - `fee`: String, 订单的自定义信息
+// /// - `point_fee`: String, 成交手续费
+// /// - `role`: String, 成交点卡手续费
+// #[derive(Debug, Deserialize, Serialize)]
+// struct TradesSwap {
+//     id: i64,
+//     create_time: f64,
+//     contract: String,
+//     order_id: String,
+//     size: i64,
+//     price: String,
+//     text: String,
+//     fee: String,
+//     point_fee: String,
+//     role: String,
+// }
+// 
+// #[async_trait]
+// impl ExportConnector for GateSwapExport {
+//     async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
+//         let symbol_array: Vec<&str> = symbol.split("_").collect();
+//         let symbol_format = utils::format_symbol(symbol.clone(), "_");
+//         let limit_params = if limit > 1000 {
+//             warn!("查询条数最大为1000条,已修改为1000条!");
+//             1000
+//         } else { limit };
+//         let res_data = self.request.my_trades(symbol_array[1].to_lowercase(), symbol_format, limit_params).await;
+//         if start_time > 0 || end_time > 0 { error!("该交易所不支持根据时间查询!") };
+//         if res_data.code == "200" {
+//             let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
+//             let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "成交角色", "成交时间"];
+//             let mut data_array: Vec<Vec<String>> = Vec::new();
+// 
+//             for (index, value) in trades_info.iter().enumerate() {
+//                 if index >= data_array.len() {
+//                     data_array.push(Vec::new());
+//                 }
+//                 let size = Decimal::from_i64(value.size).unwrap();
+//                 let side = if size < Decimal::ZERO { "sell" } else { "buy" };
+//                 let created_time = Decimal::from_f64(value.create_time).unwrap() * dec!(1000);
+//                 let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(created_time.to_i64().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//                 let trade_value = Decimal::from_str(&value.price).unwrap() * size.abs();
+//                 data_array[index] = vec![
+//                     value.id.to_string(),
+//                     value.order_id.clone(),
+//                     value.contract.clone(),
+//                     side.to_string(),
+//                     value.price.clone(),
+//                     size.abs().to_string(),
+//                     trade_value.to_string(),
+//                     value.fee.clone(),
+//                     value.role.clone(),
+//                     created_at,
+//                 ];
+//             }
+//             global::export_utils::export_excel(header_array, data_array, prefix_name)
+//         } else {
+//             res_data.to_string()
+//         }
+//     }
+// }

+ 104 - 104
derive/src/kucoin_spot_export.rs

@@ -1,104 +1,104 @@
-use std::collections::BTreeMap;
-use async_trait::async_trait;
-use chrono::{FixedOffset, NaiveDateTime, TimeZone};
-use serde::{Deserialize, Serialize};
-use tracing::warn;
-use exchanges::kucoin_spot_rest::KucoinSpotRest;
-use standard::exchange::ExchangeEnum;
-use standard::utils;
-use crate::ExportConnector;
-
-pub struct KucoinSpotExport {
-    request: KucoinSpotRest,
-}
-
-impl KucoinSpotExport {
-    pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> KucoinSpotExport {
-        KucoinSpotExport {
-            request: KucoinSpotRest::new(is_colo, params.clone())
-        }
-    }
-}
-
-/// TradesSwap
-/// - `symbol`: String, 合約編號
-/// - `trade_id`: String, 交易編號
-/// - `order_id`: String, 訂單編號
-/// - `counter_order_id`: String, 對手方訂單Id
-/// - `side`: String, 買賣方向
-/// - `liquidity`: String,流動性類型 taker or maker
-/// - `force_taker`: bool, 是否強製作爲taker處理
-/// - `price`: String, 成交價格
-/// - `size`: i64, 成交數量
-/// - `funds`: String, 成交額
-/// - `fee`: String, 交易費用
-/// - `fee_currency`: String, 收費幣種
-/// - `stop`: String, 止損單類型標記
-/// - `fee_rate`: String, 費率
-/// - `order_type`: String, 訂單類型
-/// - `created_at`: i64, 創建時間
-/// - `trade_type`: String, 交易類型: trade, liquidation, ADL or settlement
-#[derive(Debug, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-struct TradesSpot {
-    symbol: String,
-    trade_id: String,
-    order_id: String,
-    counter_order_id: String,
-    side: String,
-    liquidity: String,
-    force_taker: bool,
-    price: String,
-    size: i64,
-    funds: String,
-    fee: String,
-    fee_rate: String,
-    fee_currency: String,
-    stop: String,
-    #[serde(rename = "type")]
-    order_type: String,
-    created_at: i64,
-    trade_type: String,
-}
-
-#[async_trait]
-impl ExportConnector for KucoinSpotExport {
-    async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
-        let symbol_mapper = utils::symbol_enter_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
-        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
-        let limit_params = if limit > 1000 {
-            warn!("查询条数最大为1000条,已修改为1000条!");
-            1000
-        } else { limit };
-        let res_data = self.request.get_fills(symbol_format, "".to_string(), "".to_string(), start_time, end_time, limit_params).await;
-        if res_data.code == "200" {
-            let res_data_json: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
-            let trades_info: Vec<TradesSpot> = serde_json::from_str(&res_data_json["items"].to_string()).unwrap();
-            let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "订单价格", "订单数量", "成交额", "手续费", "手续费率", "订单类型", "创建时间"];
-            let mut data_array: Vec<Vec<String>> = Vec::new();
-            for (index, value) in trades_info.iter().enumerate() {
-                if index >= data_array.len() {
-                    data_array.push(Vec::new());
-                }
-                let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.created_at.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-
-                data_array[index] = vec![
-                    value.trade_id.clone(),
-                    value.order_id.clone(),
-                    value.symbol.clone(),
-                    value.side.clone(),
-                    value.price.clone(),
-                    value.size.to_string(),
-                    value.funds.clone(),
-                    value.fee.clone(),
-                    value.fee_rate.clone(),
-                    value.order_type.clone(),
-                    created_at,
-                ];
-            }
-            global::export_utils::export_excel(header_array, data_array, prefix_name)
-        } else {
-            res_data.to_string()
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use async_trait::async_trait;
+// use chrono::{FixedOffset, NaiveDateTime, TimeZone};
+// use serde::{Deserialize, Serialize};
+// use tracing::warn;
+// use exchanges::kucoin_spot_rest::KucoinSpotRest;
+// use standard::exchange::ExchangeEnum;
+// use standard::utils;
+// use crate::ExportConnector;
+//
+// pub struct KucoinSpotExport {
+//     request: KucoinSpotRest,
+// }
+//
+// impl KucoinSpotExport {
+//     pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> KucoinSpotExport {
+//         KucoinSpotExport {
+//             request: KucoinSpotRest::new(is_colo, params.clone())
+//         }
+//     }
+// }
+//
+// /// TradesSwap
+// /// - `symbol`: String, 合約編號
+// /// - `trade_id`: String, 交易編號
+// /// - `order_id`: String, 訂單編號
+// /// - `counter_order_id`: String, 對手方訂單Id
+// /// - `side`: String, 買賣方向
+// /// - `liquidity`: String,流動性類型 taker or maker
+// /// - `force_taker`: bool, 是否強製作爲taker處理
+// /// - `price`: String, 成交價格
+// /// - `size`: i64, 成交數量
+// /// - `funds`: String, 成交額
+// /// - `fee`: String, 交易費用
+// /// - `fee_currency`: String, 收費幣種
+// /// - `stop`: String, 止損單類型標記
+// /// - `fee_rate`: String, 費率
+// /// - `order_type`: String, 訂單類型
+// /// - `created_at`: i64, 創建時間
+// /// - `trade_type`: String, 交易類型: trade, liquidation, ADL or settlement
+// #[derive(Debug, Deserialize, Serialize)]
+// #[serde(rename_all = "camelCase")]
+// struct TradesSpot {
+//     symbol: String,
+//     trade_id: String,
+//     order_id: String,
+//     counter_order_id: String,
+//     side: String,
+//     liquidity: String,
+//     force_taker: bool,
+//     price: String,
+//     size: i64,
+//     funds: String,
+//     fee: String,
+//     fee_rate: String,
+//     fee_currency: String,
+//     stop: String,
+//     #[serde(rename = "type")]
+//     order_type: String,
+//     created_at: i64,
+//     trade_type: String,
+// }
+//
+// #[async_trait]
+// impl ExportConnector for KucoinSpotExport {
+//     async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
+//         let symbol_mapper = utils::symbol_enter_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
+//         let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
+//         let limit_params = if limit > 1000 {
+//             warn!("查询条数最大为1000条,已修改为1000条!");
+//             1000
+//         } else { limit };
+//         let res_data = self.request.get_fills(symbol_format, "".to_string(), "".to_string(), start_time, end_time, limit_params).await;
+//         if res_data.code == "200" {
+//             let res_data_json: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
+//             let trades_info: Vec<TradesSpot> = serde_json::from_str(&res_data_json["items"].to_string()).unwrap();
+//             let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "订单价格", "订单数量", "成交额", "手续费", "手续费率", "订单类型", "创建时间"];
+//             let mut data_array: Vec<Vec<String>> = Vec::new();
+//             for (index, value) in trades_info.iter().enumerate() {
+//                 if index >= data_array.len() {
+//                     data_array.push(Vec::new());
+//                 }
+//                 let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.created_at.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//
+//                 data_array[index] = vec![
+//                     value.trade_id.clone(),
+//                     value.order_id.clone(),
+//                     value.symbol.clone(),
+//                     value.side.clone(),
+//                     value.price.clone(),
+//                     value.size.to_string(),
+//                     value.funds.clone(),
+//                     value.fee.clone(),
+//                     value.fee_rate.clone(),
+//                     value.order_type.clone(),
+//                     created_at,
+//                 ];
+//             }
+//             global::export_utils::export_excel(header_array, data_array, prefix_name)
+//         } else {
+//             res_data.to_string()
+//         }
+//     }
+// }

+ 110 - 110
derive/src/kucoin_swap_export.rs

@@ -1,110 +1,110 @@
-use std::collections::BTreeMap;
-use async_trait::async_trait;
-use chrono::{FixedOffset, NaiveDateTime, TimeZone, Utc};
-use serde::{Deserialize, Serialize};
-use tracing::warn;
-use exchanges::kucoin_swap_rest::KucoinSwapRest;
-use standard::exchange::ExchangeEnum;
-use standard::utils;
-use crate::ExportConnector;
-
-pub struct KucoinSwapExport {
-    request: KucoinSwapRest,
-}
-
-impl KucoinSwapExport {
-    pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> KucoinSwapExport {
-        KucoinSwapExport {
-            request: KucoinSwapRest::new(is_colo, params.clone())
-        }
-    }
-}
-
-/// TradesSwap
-/// - `symbol`: String, 合約編號
-/// - `trade_id`: String, 交易編號
-/// - `order_id`: String, 訂單編號
-/// - `side`: String, 買賣方向
-/// - `liquidity`: String,流動性類型 taker or maker
-/// - `force_taker`: bool, 是否強製作爲taker處理
-/// - `price`: String, 成交價格
-/// - `size`: i64, 成交數量
-/// - `value`: String, 成交價值
-/// - `fee_rate`: String, 費率
-/// - `fix_fee`: String, 固定費用
-/// - `fee_currency`: String, 收費幣種
-/// - `stop`: String, 止損單類型標記
-/// - `fee`: String, 交易費用
-/// - `order_type`: String, 訂單類型
-/// - `trade_type`: String, 交易類型: trade, liquidation, ADL or settlement
-/// - `created_at`: i64, 創建時間
-/// - `settle_currency`: String, 結算幣種
-/// - `trade_time`: i64, 交易時間納秒
-#[derive(Debug, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-struct TradesSwap {
-    symbol: String,
-    trade_id: String,
-    order_id: String,
-    side: String,
-    liquidity: String,
-    force_taker: bool,
-    price: String,
-    size: i64,
-    value: String,
-    fee_rate: String,
-    fix_fee: String,
-    fee_currency: String,
-    stop: String,
-    fee: String,
-    order_type: String,
-    trade_type: String,
-    created_at: i64,
-    settle_currency: String,
-    trade_time: i64,
-}
-
-#[async_trait]
-impl ExportConnector for KucoinSwapExport {
-    async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
-        let symbol_mapper = utils::symbol_enter_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
-        let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
-        let limit_params = if limit > 1000 {
-            warn!("查询条数最大为1000条,已修改为1000条!");
-            1000
-        } else { limit };
-        let res_data = self.request.get_fills(symbol_format, "".to_string(), "".to_string(), start_time, end_time, limit_params).await;
-        if res_data.code == "200" {
-            let res_data_json: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
-            let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data_json["items"].to_string()).unwrap();
-            let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "费率", "固定费用", "交易费用", "订单类型", "创建时间", "交易时间"];
-            let mut data_array: Vec<Vec<String>> = Vec::new();
-            for (index, value) in trades_info.iter().enumerate() {
-                if index >= data_array.len() {
-                    data_array.push(Vec::new());
-                }
-                let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.created_at.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-                let trade_time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&Utc.timestamp_nanos(value.trade_time.clone()).naive_utc()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-
-                data_array[index] = vec![
-                    value.trade_id.clone(),
-                    value.order_id.clone(),
-                    value.symbol.clone(),
-                    value.side.clone(),
-                    value.price.clone(),
-                    value.size.to_string(),
-                    value.value.clone(),
-                    value.fee_rate.clone(),
-                    value.fix_fee.clone(),
-                    value.fee.clone(),
-                    value.order_type.clone(),
-                    created_at,
-                    trade_time,
-                ];
-            }
-            global::export_utils::export_excel(header_array, data_array, prefix_name)
-        } else {
-            res_data.to_string()
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use async_trait::async_trait;
+// use chrono::{FixedOffset, NaiveDateTime, TimeZone, Utc};
+// use serde::{Deserialize, Serialize};
+// use tracing::warn;
+// use exchanges::kucoin_swap_rest::KucoinSwapRest;
+// use standard::exchange::ExchangeEnum;
+// use standard::utils;
+// use crate::ExportConnector;
+//
+// pub struct KucoinSwapExport {
+//     request: KucoinSwapRest,
+// }
+//
+// impl KucoinSwapExport {
+//     pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> KucoinSwapExport {
+//         KucoinSwapExport {
+//             request: KucoinSwapRest::new(is_colo, params.clone())
+//         }
+//     }
+// }
+//
+// /// TradesSwap
+// /// - `symbol`: String, 合約編號
+// /// - `trade_id`: String, 交易編號
+// /// - `order_id`: String, 訂單編號
+// /// - `side`: String, 買賣方向
+// /// - `liquidity`: String,流動性類型 taker or maker
+// /// - `force_taker`: bool, 是否強製作爲taker處理
+// /// - `price`: String, 成交價格
+// /// - `size`: i64, 成交數量
+// /// - `value`: String, 成交價值
+// /// - `fee_rate`: String, 費率
+// /// - `fix_fee`: String, 固定費用
+// /// - `fee_currency`: String, 收費幣種
+// /// - `stop`: String, 止損單類型標記
+// /// - `fee`: String, 交易費用
+// /// - `order_type`: String, 訂單類型
+// /// - `trade_type`: String, 交易類型: trade, liquidation, ADL or settlement
+// /// - `created_at`: i64, 創建時間
+// /// - `settle_currency`: String, 結算幣種
+// /// - `trade_time`: i64, 交易時間納秒
+// #[derive(Debug, Deserialize, Serialize)]
+// #[serde(rename_all = "camelCase")]
+// struct TradesSwap {
+//     symbol: String,
+//     trade_id: String,
+//     order_id: String,
+//     side: String,
+//     liquidity: String,
+//     force_taker: bool,
+//     price: String,
+//     size: i64,
+//     value: String,
+//     fee_rate: String,
+//     fix_fee: String,
+//     fee_currency: String,
+//     stop: String,
+//     fee: String,
+//     order_type: String,
+//     trade_type: String,
+//     created_at: i64,
+//     settle_currency: String,
+//     trade_time: i64,
+// }
+//
+// #[async_trait]
+// impl ExportConnector for KucoinSwapExport {
+//     async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
+//         let symbol_mapper = utils::symbol_enter_mapper(ExchangeEnum::KucoinSwap, symbol.as_str());
+//         let symbol_format = format!("{}M", utils::format_symbol(symbol_mapper.clone(), ""));
+//         let limit_params = if limit > 1000 {
+//             warn!("查询条数最大为1000条,已修改为1000条!");
+//             1000
+//         } else { limit };
+//         let res_data = self.request.get_fills(symbol_format, "".to_string(), "".to_string(), start_time, end_time, limit_params).await;
+//         if res_data.code == "200" {
+//             let res_data_json: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
+//             let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data_json["items"].to_string()).unwrap();
+//             let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "费率", "固定费用", "交易费用", "订单类型", "创建时间", "交易时间"];
+//             let mut data_array: Vec<Vec<String>> = Vec::new();
+//             for (index, value) in trades_info.iter().enumerate() {
+//                 if index >= data_array.len() {
+//                     data_array.push(Vec::new());
+//                 }
+//                 let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.created_at.clone()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//                 let trade_time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&Utc.timestamp_nanos(value.trade_time.clone()).naive_utc()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//
+//                 data_array[index] = vec![
+//                     value.trade_id.clone(),
+//                     value.order_id.clone(),
+//                     value.symbol.clone(),
+//                     value.side.clone(),
+//                     value.price.clone(),
+//                     value.size.to_string(),
+//                     value.value.clone(),
+//                     value.fee_rate.clone(),
+//                     value.fix_fee.clone(),
+//                     value.fee.clone(),
+//                     value.order_type.clone(),
+//                     created_at,
+//                     trade_time,
+//                 ];
+//             }
+//             global::export_utils::export_excel(header_array, data_array, prefix_name)
+//         } else {
+//             res_data.to_string()
+//         }
+//     }
+// }

+ 120 - 120
derive/src/okx_swap_export.rs

@@ -1,120 +1,120 @@
-use std::collections::BTreeMap;
-use std::str::FromStr;
-use async_trait::async_trait;
-use chrono::{FixedOffset, NaiveDateTime, TimeZone};
-use rust_decimal::Decimal;
-use serde::{Deserialize, Serialize};
-use tracing::warn;
-use exchanges::okx_swap_rest::OkxSwapRest;
-use standard::utils;
-use crate::ExportConnector;
-
-pub struct OkxSwapExport {
-    request: OkxSwapRest,
-}
-
-impl OkxSwapExport {
-    pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> OkxSwapExport {
-        OkxSwapExport {
-            request: OkxSwapRest::new(is_colo, params.clone())
-        }
-    }
-}
-
-/// TradesSwap
-///
-/// - `inst_type`: String,
-/// - `inst_id`: String,
-/// - `trade_id`: String,
-/// - `ord_id`: String,
-/// - `cl_ord_id`: String,
-/// - `bill_id`: String,
-/// - `tag`: String,
-/// - `fill_px`: String,
-/// - `fill_sz`: String,
-/// - `fill_idx_px`: String,
-/// - `fill_pnl`: String,
-/// - `fill_px_vol`: String,
-/// - `fill_px_usd`: String,
-/// - `fill_mark_vol`: String,
-/// - `fill_fwd_px`: String,
-/// - `fill_mark_px`: String,
-/// - `side`: String,
-/// - `pos_side`: String,
-/// - `exec_type`: String,
-/// - `fee_ccy`: String,
-/// - `fee`: String,
-/// - `ts`: String,
-/// - `fill_time`: String,
-#[derive(Debug, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-struct TradesSwap {
-    inst_type: String,
-    inst_id: String,
-    trade_id: String,
-    ord_id: String,
-    cl_ord_id: String,
-    bill_id: String,
-    tag: String,
-    fill_px: String,
-    fill_sz: String,
-    fill_idx_px: String,
-    fill_pnl: String,
-    fill_px_vol: String,
-    fill_px_usd: String,
-    fill_mark_vol: String,
-    fill_fwd_px: String,
-    fill_mark_px: String,
-    side: String,
-    pos_side: String,
-    exec_type: String,
-    fee_ccy: String,
-    fee: String,
-    ts: String,
-    fill_time: String,
-}
-
-#[async_trait]
-impl ExportConnector for OkxSwapExport {
-    async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
-        let symbol_format = utils::format_symbol(symbol.clone(), "-");
-        let limit_params = if limit > 100 {
-            warn!("查询条数最大为100条,已修改为100条!");
-            1000
-        } else { limit };
-        let start_time_str = if start_time > 0 { start_time.to_string() } else { "".to_string() };
-        let end_time_str = if end_time > 0 { end_time.to_string() } else { "".to_string() };
-        let limit_str = if limit_params > 0 { limit_params.to_string() } else { "".to_string() };
-        let res_data = self.request.get_trade_fills_history(symbol_format, start_time_str, end_time_str, limit_str).await;
-        if res_data.code == "200" {
-            let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
-            let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "创建时间", "成交时间"];
-            let mut data_array: Vec<Vec<String>> = Vec::new();
-
-            for (index, value) in trades_info.iter().enumerate() {
-                if index >= data_array.len() {
-                    data_array.push(Vec::new());
-                }
-
-                let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.ts.parse::<i64>().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-                let trade_time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.fill_time.parse::<i64>().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-                let trade_value = Decimal::from_str(&value.fill_px).unwrap() * Decimal::from_str(&value.fill_sz).unwrap();
-                data_array[index] = vec![
-                    value.trade_id.clone(),
-                    value.ord_id.clone(),
-                    value.inst_id.clone(),
-                    value.side.clone(),
-                    value.fill_px.clone(),
-                    value.fill_sz.clone(),
-                    trade_value.to_string(),
-                    value.fee.clone(),
-                    created_at,
-                    trade_time,
-                ];
-            }
-            global::export_utils::export_excel(header_array, data_array, prefix_name)
-        } else {
-            res_data.to_string()
-        }
-    }
-}
+// use std::collections::BTreeMap;
+// use std::str::FromStr;
+// use async_trait::async_trait;
+// use chrono::{FixedOffset, NaiveDateTime, TimeZone};
+// use rust_decimal::Decimal;
+// use serde::{Deserialize, Serialize};
+// use tracing::warn;
+// use exchanges::okx_swap_rest::OkxSwapRest;
+// use standard::utils;
+// use crate::ExportConnector;
+// 
+// pub struct OkxSwapExport {
+//     request: OkxSwapRest,
+// }
+// 
+// impl OkxSwapExport {
+//     pub async fn new(is_colo: bool, params: BTreeMap<String, String>) -> OkxSwapExport {
+//         OkxSwapExport {
+//             request: OkxSwapRest::new(is_colo, params.clone())
+//         }
+//     }
+// }
+// 
+// /// TradesSwap
+// ///
+// /// - `inst_type`: String,
+// /// - `inst_id`: String,
+// /// - `trade_id`: String,
+// /// - `ord_id`: String,
+// /// - `cl_ord_id`: String,
+// /// - `bill_id`: String,
+// /// - `tag`: String,
+// /// - `fill_px`: String,
+// /// - `fill_sz`: String,
+// /// - `fill_idx_px`: String,
+// /// - `fill_pnl`: String,
+// /// - `fill_px_vol`: String,
+// /// - `fill_px_usd`: String,
+// /// - `fill_mark_vol`: String,
+// /// - `fill_fwd_px`: String,
+// /// - `fill_mark_px`: String,
+// /// - `side`: String,
+// /// - `pos_side`: String,
+// /// - `exec_type`: String,
+// /// - `fee_ccy`: String,
+// /// - `fee`: String,
+// /// - `ts`: String,
+// /// - `fill_time`: String,
+// #[derive(Debug, Deserialize, Serialize)]
+// #[serde(rename_all = "camelCase")]
+// struct TradesSwap {
+//     inst_type: String,
+//     inst_id: String,
+//     trade_id: String,
+//     ord_id: String,
+//     cl_ord_id: String,
+//     bill_id: String,
+//     tag: String,
+//     fill_px: String,
+//     fill_sz: String,
+//     fill_idx_px: String,
+//     fill_pnl: String,
+//     fill_px_vol: String,
+//     fill_px_usd: String,
+//     fill_mark_vol: String,
+//     fill_fwd_px: String,
+//     fill_mark_px: String,
+//     side: String,
+//     pos_side: String,
+//     exec_type: String,
+//     fee_ccy: String,
+//     fee: String,
+//     ts: String,
+//     fill_time: String,
+// }
+// 
+// #[async_trait]
+// impl ExportConnector for OkxSwapExport {
+//     async fn export_trades(&mut self, prefix_name: &str, symbol: String, start_time: i64, end_time: i64, limit: i64) -> String {
+//         let symbol_format = utils::format_symbol(symbol.clone(), "-");
+//         let limit_params = if limit > 100 {
+//             warn!("查询条数最大为100条,已修改为100条!");
+//             1000
+//         } else { limit };
+//         let start_time_str = if start_time > 0 { start_time.to_string() } else { "".to_string() };
+//         let end_time_str = if end_time > 0 { end_time.to_string() } else { "".to_string() };
+//         let limit_str = if limit_params > 0 { limit_params.to_string() } else { "".to_string() };
+//         let res_data = self.request.get_trade_fills_history(symbol_format, start_time_str, end_time_str, limit_str).await;
+//         if res_data.code == "200" {
+//             let trades_info: Vec<TradesSwap> = serde_json::from_str(&res_data.data).unwrap();
+//             let header_array = vec!["交易编号", "订单编号", "交易币对", "买卖方向", "成交价格", "成交数量", "成交价值", "交易费用", "创建时间", "成交时间"];
+//             let mut data_array: Vec<Vec<String>> = Vec::new();
+// 
+//             for (index, value) in trades_info.iter().enumerate() {
+//                 if index >= data_array.len() {
+//                     data_array.push(Vec::new());
+//                 }
+// 
+//                 let created_at = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.ts.parse::<i64>().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//                 let trade_time = FixedOffset::east_opt(8 * 3600).unwrap().from_utc_datetime(&NaiveDateTime::from_timestamp_millis(value.fill_time.parse::<i64>().unwrap()).unwrap()).format("%Y-%m-%d %H:%M:%S%.3f").to_string();
+//                 let trade_value = Decimal::from_str(&value.fill_px).unwrap() * Decimal::from_str(&value.fill_sz).unwrap();
+//                 data_array[index] = vec![
+//                     value.trade_id.clone(),
+//                     value.ord_id.clone(),
+//                     value.inst_id.clone(),
+//                     value.side.clone(),
+//                     value.fill_px.clone(),
+//                     value.fill_sz.clone(),
+//                     trade_value.to_string(),
+//                     value.fee.clone(),
+//                     created_at,
+//                     trade_time,
+//                 ];
+//             }
+//             global::export_utils::export_excel(header_array, data_array, prefix_name)
+//         } else {
+//             res_data.to_string()
+//         }
+//     }
+// }

+ 19 - 19
derive/tests/binance_swap_export_test.rs

@@ -1,19 +1,19 @@
-mod export_excel_test;
-
-use tracing::{instrument, trace};
-use derive::export_excel::ExportEnum;
-use crate::export_excel_test::test_new_export;
-
-
-const SYMBOL: &str = "BLZ_USDT";
-
-// 测试获取Exchange实体
-#[tokio::test]
-#[instrument(level = "TRACE")]
-async fn test_get_self_exchange() {
-    global::log_utils::init_log_with_trace();
-
-    let mut export = test_new_export(ExportEnum::BinanceSwap).await;
-    let export_trades = export.export_trades("binance_swap",SYMBOL.to_string(), 0, 0, 100).await;
-    trace!(?export_trades);
-}
+// mod export_excel_test;
+// 
+// use tracing::{instrument, trace};
+// use derive::export_excel::ExportEnum;
+// use crate::export_excel_test::test_new_export;
+// 
+// 
+// const SYMBOL: &str = "BLZ_USDT";
+// 
+// // 测试获取Exchange实体
+// #[tokio::test]
+// #[instrument(level = "TRACE")]
+// async fn test_get_self_exchange() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut export = test_new_export(ExportEnum::BinanceSwap).await;
+//     let export_trades = export.export_trades("binance_swap",SYMBOL.to_string(), 0, 0, 100).await;
+//     trace!(?export_trades);
+// }

+ 18 - 18
derive/tests/bitget_spot_export_test.rs

@@ -1,18 +1,18 @@
-mod export_excel_test;
-
-use tracing::{instrument, trace};
-use derive::export_excel::ExportEnum;
-use crate::export_excel_test::test_new_export;
-
-
-const SYMBOL: &str = "LOOM_USDT";
-// 测试获取Exchange实体
-#[tokio::test]
-#[instrument(level = "TRACE")]
-async fn test_get_self_exchange() {
-    global::log_utils::init_log_with_trace();
-
-    let mut export = test_new_export(ExportEnum::BitgetSpot).await;
-    let export_trades = export.export_trades("bitget_spot",SYMBOL.to_string(), 0, 0, 100).await;
-    trace!(?export_trades);
-}
+// mod export_excel_test;
+// 
+// use tracing::{instrument, trace};
+// use derive::export_excel::ExportEnum;
+// use crate::export_excel_test::test_new_export;
+// 
+// 
+// const SYMBOL: &str = "LOOM_USDT";
+// // 测试获取Exchange实体
+// #[tokio::test]
+// #[instrument(level = "TRACE")]
+// async fn test_get_self_exchange() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut export = test_new_export(ExportEnum::BitgetSpot).await;
+//     let export_trades = export.export_trades("bitget_spot",SYMBOL.to_string(), 0, 0, 100).await;
+//     trace!(?export_trades);
+// }

+ 77 - 77
derive/tests/export_excel_test.rs

@@ -1,77 +1,77 @@
-use std::collections::{BTreeMap};
-use tracing::trace;
-use derive::export_excel::{ExportEnum, ExportExcel};
-use derive::ExportConnector;
-use exchanges::proxy;
-
-// 创建实体
-#[allow(dead_code)]
-pub async fn test_new_export(export_enum: ExportEnum) -> Box<dyn ExportConnector> {
-    // 检测是否走代理
-    pub fn proxy_handle() {
-        if proxy::ParsingDetail::http_enable_proxy() {
-            trace!("检测有代理配置,配置走代理");
-        }
-    }
-
-    let account_info = global::account_info::get_account_info("../test_account.toml");
-
-    match export_enum {
-        ExportEnum::BinanceSwap => {
-            let mut params: BTreeMap<String, String> = BTreeMap::new();
-            let access_key = account_info.binance_access_key;
-            let secret_key = account_info.binance_secret_key;
-            params.insert("access_key".to_string(), access_key);
-            params.insert("secret_key".to_string(), secret_key);
-            ExportExcel::new(ExportEnum::BinanceSwap, false, params).await
-        }
-        ExportEnum::KucoinSwap => {
-            let mut params: BTreeMap<String, String> = BTreeMap::new();
-            let access_key = account_info.kucoin_access_key;
-            let secret_key = account_info.kucoin_secret_key;
-            let pass_key = account_info.kucoin_pass;
-            params.insert("access_key".to_string(), access_key);
-            params.insert("secret_key".to_string(), secret_key);
-            params.insert("pass_key".to_string(), pass_key);
-            ExportExcel::new(ExportEnum::KucoinSwap, false, params).await
-        }
-        ExportEnum::KucoinSpot => {
-            let mut params: BTreeMap<String, String> = BTreeMap::new();
-            let access_key = account_info.kucoin_access_key;
-            let secret_key = account_info.kucoin_secret_key;
-            let pass_key = account_info.kucoin_pass;
-            params.insert("access_key".to_string(), access_key);
-            params.insert("secret_key".to_string(), secret_key);
-            params.insert("pass_key".to_string(), pass_key);
-            ExportExcel::new(ExportEnum::KucoinSpot, false, params).await
-        }
-        ExportEnum::GateSwap => {
-            let mut params: BTreeMap<String, String> = BTreeMap::new();
-            let access_key = account_info.gate_access_key;
-            let secret_key = account_info.gate_secret_key;
-            params.insert("access_key".to_string(), access_key);
-            params.insert("secret_key".to_string(), secret_key);
-            ExportExcel::new(ExportEnum::GateSwap, false, params).await
-        }
-        ExportEnum::BitgetSpot => {
-            let mut params: BTreeMap<String, String> = BTreeMap::new();
-            let access_key = account_info.bitget_access_key;
-            let secret_key = account_info.bitget_secret_key;
-            let pass_key = account_info.bitget_pass;
-            params.insert("access_key".to_string(), access_key);
-            params.insert("secret_key".to_string(), secret_key);
-            params.insert("pass_key".to_string(), pass_key);
-            ExportExcel::new(ExportEnum::BitgetSpot, false, params).await
-        }
-        ExportEnum::OkxSwap => {
-            let mut params: BTreeMap<String, String> = BTreeMap::new();
-            let access_key = account_info.okx_access_key;
-            let secret_key = account_info.okx_secret_key;
-            let pass_key = account_info.okx_pass;
-            params.insert("access_key".to_string(), access_key);
-            params.insert("secret_key".to_string(), secret_key);
-            params.insert("pass_key".to_string(), pass_key);
-            ExportExcel::new(ExportEnum::OkxSwap, false, params).await
-        }
-    }
-}
+// use std::collections::{BTreeMap};
+// use tracing::trace;
+// use derive::export_excel::{ExportEnum, ExportExcel};
+// use derive::ExportConnector;
+// use exchanges::proxy;
+// 
+// // 创建实体
+// #[allow(dead_code)]
+// pub async fn test_new_export(export_enum: ExportEnum) -> Box<dyn ExportConnector> {
+//     // 检测是否走代理
+//     pub fn proxy_handle() {
+//         if proxy::ParsingDetail::http_enable_proxy() {
+//             trace!("检测有代理配置,配置走代理");
+//         }
+//     }
+// 
+//     let account_info = global::account_info::get_account_info("../test_account.toml");
+// 
+//     match export_enum {
+//         ExportEnum::BinanceSwap => {
+//             let mut params: BTreeMap<String, String> = BTreeMap::new();
+//             let access_key = account_info.binance_access_key;
+//             let secret_key = account_info.binance_secret_key;
+//             params.insert("access_key".to_string(), access_key);
+//             params.insert("secret_key".to_string(), secret_key);
+//             ExportExcel::new(ExportEnum::BinanceSwap, false, params).await
+//         }
+//         ExportEnum::KucoinSwap => {
+//             let mut params: BTreeMap<String, String> = BTreeMap::new();
+//             let access_key = account_info.kucoin_access_key;
+//             let secret_key = account_info.kucoin_secret_key;
+//             let pass_key = account_info.kucoin_pass;
+//             params.insert("access_key".to_string(), access_key);
+//             params.insert("secret_key".to_string(), secret_key);
+//             params.insert("pass_key".to_string(), pass_key);
+//             ExportExcel::new(ExportEnum::KucoinSwap, false, params).await
+//         }
+//         ExportEnum::KucoinSpot => {
+//             let mut params: BTreeMap<String, String> = BTreeMap::new();
+//             let access_key = account_info.kucoin_access_key;
+//             let secret_key = account_info.kucoin_secret_key;
+//             let pass_key = account_info.kucoin_pass;
+//             params.insert("access_key".to_string(), access_key);
+//             params.insert("secret_key".to_string(), secret_key);
+//             params.insert("pass_key".to_string(), pass_key);
+//             ExportExcel::new(ExportEnum::KucoinSpot, false, params).await
+//         }
+//         ExportEnum::GateSwap => {
+//             let mut params: BTreeMap<String, String> = BTreeMap::new();
+//             let access_key = account_info.gate_access_key;
+//             let secret_key = account_info.gate_secret_key;
+//             params.insert("access_key".to_string(), access_key);
+//             params.insert("secret_key".to_string(), secret_key);
+//             ExportExcel::new(ExportEnum::GateSwap, false, params).await
+//         }
+//         ExportEnum::BitgetSpot => {
+//             let mut params: BTreeMap<String, String> = BTreeMap::new();
+//             let access_key = account_info.bitget_access_key;
+//             let secret_key = account_info.bitget_secret_key;
+//             let pass_key = account_info.bitget_pass;
+//             params.insert("access_key".to_string(), access_key);
+//             params.insert("secret_key".to_string(), secret_key);
+//             params.insert("pass_key".to_string(), pass_key);
+//             ExportExcel::new(ExportEnum::BitgetSpot, false, params).await
+//         }
+//         ExportEnum::OkxSwap => {
+//             let mut params: BTreeMap<String, String> = BTreeMap::new();
+//             let access_key = account_info.okx_access_key;
+//             let secret_key = account_info.okx_secret_key;
+//             let pass_key = account_info.okx_pass;
+//             params.insert("access_key".to_string(), access_key);
+//             params.insert("secret_key".to_string(), secret_key);
+//             params.insert("pass_key".to_string(), pass_key);
+//             ExportExcel::new(ExportEnum::OkxSwap, false, params).await
+//         }
+//     }
+// }

+ 19 - 19
derive/tests/gate_swap_export_test.rs

@@ -1,19 +1,19 @@
-mod export_excel_test;
-
-use tracing::{instrument, trace};
-use derive::export_excel::ExportEnum;
-use crate::export_excel_test::test_new_export;
-
-
-const SYMBOL: &str = "TIA_USDT";
-
-// 测试获取Exchange实体
-#[tokio::test]
-#[instrument(level = "TRACE")]
-async fn test_get_self_exchange() {
-    global::log_utils::init_log_with_trace();
-
-    let mut export = test_new_export(ExportEnum::GateSwap).await;
-    let export_trades = export.export_trades("gate_swap_42", SYMBOL.to_string(), 0, 0, 1000).await;
-    trace!(?export_trades);
-}
+// mod export_excel_test;
+// 
+// use tracing::{instrument, trace};
+// use derive::export_excel::ExportEnum;
+// use crate::export_excel_test::test_new_export;
+// 
+// 
+// const SYMBOL: &str = "TIA_USDT";
+// 
+// // 测试获取Exchange实体
+// #[tokio::test]
+// #[instrument(level = "TRACE")]
+// async fn test_get_self_exchange() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut export = test_new_export(ExportEnum::GateSwap).await;
+//     let export_trades = export.export_trades("gate_swap_42", SYMBOL.to_string(), 0, 0, 1000).await;
+//     trace!(?export_trades);
+// }

+ 18 - 18
derive/tests/kucoin_spot_export_test.rs

@@ -1,18 +1,18 @@
-mod export_excel_test;
-
-use tracing::{instrument, trace};
-use derive::export_excel::ExportEnum;
-use crate::export_excel_test::test_new_export;
-
-
-const SYMBOL: &str = "LOOM_USDT";
-// 测试获取Exchange实体
-#[tokio::test]
-#[instrument(level = "TRACE")]
-async fn test_get_self_exchange() {
-    global::log_utils::init_log_with_trace();
-
-    let mut export = test_new_export(ExportEnum::KucoinSpot).await;
-    let export_trades = export.export_trades("kucoin_spot",SYMBOL.to_string(), 0, 0, 100).await;
-    trace!(?export_trades);
-}
+// mod export_excel_test;
+//
+// use tracing::{instrument, trace};
+// use derive::export_excel::ExportEnum;
+// use crate::export_excel_test::test_new_export;
+//
+//
+// const SYMBOL: &str = "LOOM_USDT";
+// // 测试获取Exchange实体
+// #[tokio::test]
+// #[instrument(level = "TRACE")]
+// async fn test_get_self_exchange() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut export = test_new_export(ExportEnum::KucoinSpot).await;
+//     let export_trades = export.export_trades("kucoin_spot",SYMBOL.to_string(), 0, 0, 100).await;
+//     trace!(?export_trades);
+// }

+ 18 - 18
derive/tests/kucoin_swap_export_test.rs

@@ -1,18 +1,18 @@
-mod export_excel_test;
-
-use tracing::{instrument, trace};
-use derive::export_excel::ExportEnum;
-use crate::export_excel_test::test_new_export;
-
-
-const SYMBOL: &str = "LOOM_USDT";
-// 测试获取Exchange实体
-#[tokio::test]
-#[instrument(level = "TRACE")]
-async fn test_get_self_exchange() {
-    global::log_utils::init_log_with_trace();
-
-    let mut export = test_new_export(ExportEnum::KucoinSwap).await;
-    let export_trades = export.export_trades("kucoin_swap",SYMBOL.to_string(), 0, 0, 100).await;
-    trace!(?export_trades);
-}
+// mod export_excel_test;
+// 
+// use tracing::{instrument, trace};
+// use derive::export_excel::ExportEnum;
+// use crate::export_excel_test::test_new_export;
+// 
+// 
+// const SYMBOL: &str = "LOOM_USDT";
+// // 测试获取Exchange实体
+// #[tokio::test]
+// #[instrument(level = "TRACE")]
+// async fn test_get_self_exchange() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut export = test_new_export(ExportEnum::KucoinSwap).await;
+//     let export_trades = export.export_trades("kucoin_swap",SYMBOL.to_string(), 0, 0, 100).await;
+//     trace!(?export_trades);
+// }

+ 18 - 18
derive/tests/okx_swap_export_test.rs

@@ -1,18 +1,18 @@
-mod export_excel_test;
-
-use tracing::{instrument, trace};
-use derive::export_excel::ExportEnum;
-use crate::export_excel_test::test_new_export;
-
-
-const SYMBOL: &str = "LOOM_USDT";
-// 测试获取Exchange实体
-#[tokio::test]
-#[instrument(level = "TRACE")]
-async fn test_get_self_exchange() {
-    global::log_utils::init_log_with_trace();
-
-    let mut export = test_new_export(ExportEnum::OkxSwap).await;
-    let export_trades = export.export_trades("okx_swap",SYMBOL.to_string(), 0, 0, 100).await;
-    trace!(?export_trades);
-}
+// mod export_excel_test;
+//
+// use tracing::{instrument, trace};
+// use derive::export_excel::ExportEnum;
+// use crate::export_excel_test::test_new_export;
+//
+//
+// const SYMBOL: &str = "LOOM_USDT";
+// // 测试获取Exchange实体
+// #[tokio::test]
+// #[instrument(level = "TRACE")]
+// async fn test_get_self_exchange() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut export = test_new_export(ExportEnum::OkxSwap).await;
+//     let export_trades = export.export_trades("okx_swap",SYMBOL.to_string(), 0, 0, 100).await;
+//     trace!(?export_trades);
+// }

+ 515 - 515
exchanges/tests/bitget_spot_test.rs

@@ -1,515 +1,515 @@
-use std::collections::BTreeMap;
-use std::sync::Arc;
-use std::sync::atomic::AtomicBool;
-
-use futures_util::StreamExt;
-use tokio::sync::Mutex;
-use tracing::trace;
-
-use exchanges::bitget_spot_rest::BitgetSpotRest;
-use exchanges::bitget_spot_ws::{BitgetSpotLogin, BitgetSpotSubscribeType, BitgetSpotWs, BitgetSpotWsType};
-
-const ACCESS_KEY: &str = "";
-const SECRET_KEY: &str = "";
-const PASS_KEY: &str = "";
-
-//ws-订阅公共频道信息
-#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
-async fn ws_custom_subscribe_pu() {
-    global::log_utils::init_log_with_trace();
-
-    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-
-    let  is_shutdown_arc = Arc::new(AtomicBool::new(true));
-    let mut ws = get_ws(None, BitgetSpotWsType::Public).await;
-    ws.set_symbols(vec!["BTC_USDT".to_string()]);
-    ws.set_subscribe(vec![
-        BitgetSpotSubscribeType::PuTicker,
-        BitgetSpotSubscribeType::PuCandle1m,
-        BitgetSpotSubscribeType::PuTrade,
-        BitgetSpotSubscribeType::PuBooks5,
-    ]);
-
-    let write_tx_am = Arc::new(Mutex::new(write_tx));
-    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-
-    //读取
-    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    let _tr = tokio::spawn(async move {
-        trace!("线程-数据读取-开启");
-        loop {
-            if let Some(data) = read_rx.next().await {
-                trace!("读取数据data:{:?}",data)
-            }
-        }
-        // trace!("线程-数据读取-结束");
-    });
-
-    //写数据
-    // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    // let write_tx_clone = Arc::clone(&write_tx_am);
-    // let su = ws.get_subscription();
-    // let tw = tokio::spawn(async move {
-    //     trace!("线程-数据写入-开始");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
-    //         // let close_frame = CloseFrame {
-    //         //     code: CloseCode::Normal,
-    //         //     reason: Cow::Borrowed("Bye bye"),
-    //         // };
-    //         // let message = Message::Close(Some(close_frame));
-    //
-    //
-    //         let message = Message::Text(su.clone());
-    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
-    //         trace!("发送指令成功");
-    //     }
-    //     trace!("线程-数据写入-结束");
-    // });
-
-    let t1 = tokio::spawn(async move {
-        //链接
-        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-        trace!("test 唯一线程结束--");
-    });
-    tokio::try_join!(t1).unwrap();
-    trace!("当此结束");
-    trace!("重启!");
-    trace!("参考交易所关闭");
-    return;
-}
-
-//ws-订阅私有频道信息
-#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
-async fn ws_custom_subscribe_pr() {
-    global::log_utils::init_log_with_trace();
-
-
-    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-
-    let login_param = BitgetSpotLogin {
-        api_key: ACCESS_KEY.to_string(),
-        secret_key: SECRET_KEY.to_string(),
-        passphrase_key: PASS_KEY.to_string(),
-    };
-    let mut ws = get_ws(None, BitgetSpotWsType::Private).await;
-    ws.set_symbols(vec!["BTC_USDT".to_string()]);
-    ws.set_subscribe(vec![
-        BitgetSpotSubscribeType::PuTicker,
-        BitgetSpotSubscribeType::PuCandle1m,
-        BitgetSpotSubscribeType::PuTrade,
-        BitgetSpotSubscribeType::PuBooks5,
-    ]);
-
-    let write_tx_am = Arc::new(Mutex::new(write_tx));
-    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-
-//读取
-    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    let _tr = tokio::spawn(async move {
-        trace!("线程-数据读取-开启");
-        loop {
-            if let Some(data) = read_rx.next().await {
-                trace!("读取数据data:{:?}",data)
-            }
-        }
-        // trace!("线程-数据读取-结束");
-    });
-
-    //写数据
-    // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    // let write_tx_clone = Arc::clone(&write_tx_am);
-    // let su = ws.get_subscription();
-    // let tw = tokio::spawn(async move {
-    //     trace!("线程-数据写入-开始");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
-    //         // let close_frame = CloseFrame {
-    //         //     code: CloseCode::Normal,
-    //         //     reason: Cow::Borrowed("Bye bye"),
-    //         // };
-    //         // let message = Message::Close(Some(close_frame));
-    //
-    //
-    //         let message = Message::Text(su.clone());
-    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
-    //         trace!("发送指令成功");
-    //     }
-    //     trace!("线程-数据写入-结束");
-    // });
-
-    let t1 = tokio::spawn(async move {
-        //链接
-        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-        trace!("test 唯一线程结束--");
-    });
-    tokio::try_join!(t1).unwrap();
-    trace!("当此结束");
-    trace!("重启!");
-    trace!("参考交易所关闭");
-    return;
-}
-
-
-//rest-获取系统时间
-#[tokio::test]
-async fn rest_get_server_time_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_server_time().await;
-    trace!(?rep_data)
-}
-
-
-//rest-获取账户信息
-#[tokio::test]
-async fn rest_get_account_info_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_account_info().await;
-    trace!(?rep_data)
-}
-
-//rest-获取账户币种资产
-#[tokio::test]
-async fn rest_get_account_assets_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_account_assets().await;
-    trace!(?rep_data)
-}
-
-//rest-获取币种信息
-#[tokio::test]
-async fn rest_get_coins_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_coins("USDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取交易对信息
-#[tokio::test]
-async fn rest_get_symbols_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_symbols("BTCUSDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取现货VIP费率
-#[tokio::test]
-async fn rest_get_vip_fee_rate_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_vip_fee_rate().await;
-    trace!(?rep_data)
-}
-
-//rest-获取行情信息
-#[tokio::test]
-async fn rest_get_tickers_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_tickers("BTCUSDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取合并交易深度
-#[tokio::test]
-async fn rest_get_merge_depth_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_merge_depth("BTCUSDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取K线数据
-#[tokio::test]
-async fn rest_get_candles_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_candles("BTCUSDT".to_string(), "1min".to_string(), "1697701550192".to_string(), "1697701556192".to_string(), "100".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取历史K线数据
-#[tokio::test]
-async fn rest_get_history_candles_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_history_candles("BTCUSDT".to_string(), "1min".to_string(), "1697701556192".to_string(), "100".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取最近成交数据
-#[tokio::test]
-async fn rest_get_market_fills_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_market_fills("BTCUSDT".to_string(), "100".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取历史成交数据
-#[tokio::test]
-async fn rest_get_fills_history_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_market_fills_history("BTCUSDT".to_string(), "1697701550192".to_string(), "1697701556192".to_string(), "100".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-下单
-#[tokio::test]
-async fn rest_spot_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    //市价单
-    let mut rest = get_rest();
-    let params = serde_json::json!({
-            // "symbol":"CELRUSDT",
-            // "side":"sell",
-            // "orderType":"market",
-            // "force":"fok",
-            // "size":"887",
-            // "clientOid":"7d8zd4d_3",
-         });
-
-    //限价单
-    let params = serde_json::json!({
-            // "symbol":"CELRUSDT",
-            // "side":"buy",
-            // "orderType":"limit",
-            // "force":"gtc",
-            // "price":"0.01001",
-            // "size":"10",
-            // "clientOid":"7d8zd4d_z1",
-         });
-
-    let rep_data = rest.spot_order(params).await;
-    trace!(?rep_data)
-}
-
-
-//rest-撤单
-#[tokio::test]
-async fn rest_spot_cancel_order_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.spot_cancel_order("CELRUSDT".to_string(), "".to_string(), "1".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-批量撤单
-#[tokio::test]
-async fn rest_spot_cancel_orders_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let v = serde_json::json!({
-            "orderId":"1073370944162058240",
-            "clientOid":"1073370944162058240"
-        });
-    let rep_data = rest.spot_cancel_orders("CELRUSDT".to_string(), vec![v]).await;
-    trace!(?rep_data)
-}
-
-//rest-按币对撤单
-#[tokio::test]
-async fn rest_spot_cancel_symbol_orders_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.spot_cancel_symbol_orders("CELRUSDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取订单详情
-#[tokio::test]
-async fn rest_get_order_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.get_order("".to_string(), "1".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取当前委托列表
-#[tokio::test]
-async fn rest_get_unfilled_orders_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.get_unfilled_orders("CELRUSDT".to_string(),
-                                            "".to_string(),
-                                            "".to_string(),
-                                            "".to_string(),
-                                            "".to_string(),
-                                            "".to_string(),
-    ).await;
-    trace!(?rep_data)
-}
-
-//rest-获取历史委托列表
-#[tokio::test]
-async fn rest_get_history_orders_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.get_history_orders("CELRUSDT".to_string(),
-                                           "".to_string(),
-                                           "".to_string(),
-                                           "".to_string(),
-                                           "".to_string(),
-                                           "".to_string(),
-    ).await;
-    trace!(?rep_data)
-}
-
-//rest-获取成交明细
-#[tokio::test]
-async fn rest_get_fills_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.get_fills("CELRUSDT".to_string(),
-                                  "1".to_string(),
-                                  "".to_string(),
-                                  "".to_string(),
-                                  "".to_string(),
-                                  "".to_string(),
-    ).await;
-    trace!(?rep_data)
-}
-
-//rest-获取成交明细
-#[tokio::test]
-async fn rest_spot_place_plan_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    //限价-委托单
-    let params = serde_json::json!({
-         });
-
-    let rep_data = rest.spot_place_plan_order(params).await;
-    trace!(?rep_data)
-}
-
-//rest-修改计划委托
-#[tokio::test]
-async fn rest_update_place_plan_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    //限价-委托单
-    let params = serde_json::json!({
-         });
-
-    let rep_data = rest.update_place_plan_order(params).await;
-    trace!(?rep_data)
-}
-
-//rest-撤销计划委托
-#[tokio::test]
-async fn rest_cancel_plan_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.cancel_plan_order("32131".to_string(), "3211".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取当前计划委托
-#[tokio::test]
-async fn rest_get_current_plan_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_current_plan_order("CELRUSDT".to_string(),
-                                               "1".to_string(),
-                                               "".to_string(),
-                                               "".to_string(),
-                                               "".to_string(),
-    ).await;
-    trace!(?rep_data)
-}
-
-//rest-获取历史计划委托
-#[tokio::test]
-async fn rest_get_history_plan_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_history_plan_order("CELRUSDT".to_string(),
-                                               "1697701550192".to_string(),
-                                               "1697701580192".to_string(),
-                                               "100".to_string(),
-    ).await;
-    trace!(?rep_data)
-}
-
-//rest-批量撤销计划委托
-#[tokio::test]
-async fn rest_cancel_plan_orders_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.cancel_plan_orders(vec![]).await;
-    trace!(?rep_data)
-}
-
-//rest-划转
-#[tokio::test]
-async fn rest_wallet_transfer_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.wallet_transfer("".to_string(),
-                                        "".to_string(),
-                                        "".to_string(),
-                                        "".to_string(),
-                                        "".to_string(),
-                                        "".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-获取账单流水
-#[tokio::test]
-async fn rest_get_account_bills_test() {
-    global::log_utils::init_log_with_trace();
-    let mut rest = get_rest();
-    let rep_data = rest.get_account_bills("".to_string(),
-                                          "".to_string(),
-                                          "".to_string(),
-                                          "".to_string(), ).await;
-    trace!(?rep_data)
-}
-
-
-async fn get_ws(btree_map: Option<BitgetSpotLogin>, type_v: BitgetSpotWsType) -> BitgetSpotWs {
-    let mut ku_ws = BitgetSpotWs::new(false, btree_map.clone(), type_v);
-    ku_ws
-}
-
-fn get_rest() -> BitgetSpotRest {
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
-    // btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
-    btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
-    btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
-    btree_map.insert("pass_key".to_string(), PASS_KEY.to_string());
-
-    let mut ku_exc = BitgetSpotRest::new(false, btree_map);
-    ku_exc
-}
+// use std::collections::BTreeMap;
+// use std::sync::Arc;
+// use std::sync::atomic::AtomicBool;
+//
+// use futures_util::StreamExt;
+// use tokio::sync::Mutex;
+// use tracing::trace;
+//
+// use exchanges::bitget_spot_rest::BitgetSpotRest;
+// use exchanges::bitget_spot_ws::{BitgetSpotLogin, BitgetSpotSubscribeType, BitgetSpotWs, BitgetSpotWsType};
+//
+// const ACCESS_KEY: &str = "";
+// const SECRET_KEY: &str = "";
+// const PASS_KEY: &str = "";
+//
+// //ws-订阅公共频道信息
+// #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
+// async fn ws_custom_subscribe_pu() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
+//
+//     let  is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//     let mut ws = get_ws(None, BitgetSpotWsType::Public).await;
+//     ws.set_symbols(vec!["BTC_USDT".to_string()]);
+//     ws.set_subscribe(vec![
+//         BitgetSpotSubscribeType::PuTicker,
+//         BitgetSpotSubscribeType::PuCandle1m,
+//         BitgetSpotSubscribeType::PuTrade,
+//         BitgetSpotSubscribeType::PuBooks5,
+//     ]);
+//
+//     let write_tx_am = Arc::new(Mutex::new(write_tx));
+//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//
+//     //读取
+//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+//     let _tr = tokio::spawn(async move {
+//         trace!("线程-数据读取-开启");
+//         loop {
+//             if let Some(data) = read_rx.next().await {
+//                 trace!("读取数据data:{:?}",data)
+//             }
+//         }
+//         // trace!("线程-数据读取-结束");
+//     });
+//
+//     //写数据
+//     // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
+//     // let write_tx_clone = Arc::clone(&write_tx_am);
+//     // let su = ws.get_subscription();
+//     // let tw = tokio::spawn(async move {
+//     //     trace!("线程-数据写入-开始");
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
+//     //         // let close_frame = CloseFrame {
+//     //         //     code: CloseCode::Normal,
+//     //         //     reason: Cow::Borrowed("Bye bye"),
+//     //         // };
+//     //         // let message = Message::Close(Some(close_frame));
+//     //
+//     //
+//     //         let message = Message::Text(su.clone());
+//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
+//     //         trace!("发送指令成功");
+//     //     }
+//     //     trace!("线程-数据写入-结束");
+//     // });
+//
+//     let t1 = tokio::spawn(async move {
+//         //链接
+//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+//         trace!("test 唯一线程结束--");
+//     });
+//     tokio::try_join!(t1).unwrap();
+//     trace!("当此结束");
+//     trace!("重启!");
+//     trace!("参考交易所关闭");
+//     return;
+// }
+//
+// //ws-订阅私有频道信息
+// #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
+// async fn ws_custom_subscribe_pr() {
+//     global::log_utils::init_log_with_trace();
+//
+//
+//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
+//
+//     let login_param = BitgetSpotLogin {
+//         api_key: ACCESS_KEY.to_string(),
+//         secret_key: SECRET_KEY.to_string(),
+//         passphrase_key: PASS_KEY.to_string(),
+//     };
+//     let mut ws = get_ws(None, BitgetSpotWsType::Private).await;
+//     ws.set_symbols(vec!["BTC_USDT".to_string()]);
+//     ws.set_subscribe(vec![
+//         BitgetSpotSubscribeType::PuTicker,
+//         BitgetSpotSubscribeType::PuCandle1m,
+//         BitgetSpotSubscribeType::PuTrade,
+//         BitgetSpotSubscribeType::PuBooks5,
+//     ]);
+//
+//     let write_tx_am = Arc::new(Mutex::new(write_tx));
+//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//
+// //读取
+//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+//     let _tr = tokio::spawn(async move {
+//         trace!("线程-数据读取-开启");
+//         loop {
+//             if let Some(data) = read_rx.next().await {
+//                 trace!("读取数据data:{:?}",data)
+//             }
+//         }
+//         // trace!("线程-数据读取-结束");
+//     });
+//
+//     //写数据
+//     // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
+//     // let write_tx_clone = Arc::clone(&write_tx_am);
+//     // let su = ws.get_subscription();
+//     // let tw = tokio::spawn(async move {
+//     //     trace!("线程-数据写入-开始");
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
+//     //         // let close_frame = CloseFrame {
+//     //         //     code: CloseCode::Normal,
+//     //         //     reason: Cow::Borrowed("Bye bye"),
+//     //         // };
+//     //         // let message = Message::Close(Some(close_frame));
+//     //
+//     //
+//     //         let message = Message::Text(su.clone());
+//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
+//     //         trace!("发送指令成功");
+//     //     }
+//     //     trace!("线程-数据写入-结束");
+//     // });
+//
+//     let t1 = tokio::spawn(async move {
+//         //链接
+//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+//         trace!("test 唯一线程结束--");
+//     });
+//     tokio::try_join!(t1).unwrap();
+//     trace!("当此结束");
+//     trace!("重启!");
+//     trace!("参考交易所关闭");
+//     return;
+// }
+//
+//
+// //rest-获取系统时间
+// #[tokio::test]
+// async fn rest_get_server_time_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_server_time().await;
+//     trace!(?rep_data)
+// }
+//
+//
+// //rest-获取账户信息
+// #[tokio::test]
+// async fn rest_get_account_info_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_account_info().await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取账户币种资产
+// #[tokio::test]
+// async fn rest_get_account_assets_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_account_assets().await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取币种信息
+// #[tokio::test]
+// async fn rest_get_coins_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_coins("USDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取交易对信息
+// #[tokio::test]
+// async fn rest_get_symbols_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_symbols("BTCUSDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取现货VIP费率
+// #[tokio::test]
+// async fn rest_get_vip_fee_rate_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_vip_fee_rate().await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取行情信息
+// #[tokio::test]
+// async fn rest_get_tickers_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_tickers("BTCUSDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取合并交易深度
+// #[tokio::test]
+// async fn rest_get_merge_depth_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_merge_depth("BTCUSDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取K线数据
+// #[tokio::test]
+// async fn rest_get_candles_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_candles("BTCUSDT".to_string(), "1min".to_string(), "1697701550192".to_string(), "1697701556192".to_string(), "100".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取历史K线数据
+// #[tokio::test]
+// async fn rest_get_history_candles_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_history_candles("BTCUSDT".to_string(), "1min".to_string(), "1697701556192".to_string(), "100".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取最近成交数据
+// #[tokio::test]
+// async fn rest_get_market_fills_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_market_fills("BTCUSDT".to_string(), "100".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取历史成交数据
+// #[tokio::test]
+// async fn rest_get_fills_history_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_market_fills_history("BTCUSDT".to_string(), "1697701550192".to_string(), "1697701556192".to_string(), "100".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-下单
+// #[tokio::test]
+// async fn rest_spot_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     //市价单
+//     let mut rest = get_rest();
+//     let params = serde_json::json!({
+//             // "symbol":"CELRUSDT",
+//             // "side":"sell",
+//             // "orderType":"market",
+//             // "force":"fok",
+//             // "size":"887",
+//             // "clientOid":"7d8zd4d_3",
+//          });
+//
+//     //限价单
+//     let params = serde_json::json!({
+//             // "symbol":"CELRUSDT",
+//             // "side":"buy",
+//             // "orderType":"limit",
+//             // "force":"gtc",
+//             // "price":"0.01001",
+//             // "size":"10",
+//             // "clientOid":"7d8zd4d_z1",
+//          });
+//
+//     let rep_data = rest.spot_order(params).await;
+//     trace!(?rep_data)
+// }
+//
+//
+// //rest-撤单
+// #[tokio::test]
+// async fn rest_spot_cancel_order_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.spot_cancel_order("CELRUSDT".to_string(), "".to_string(), "1".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-批量撤单
+// #[tokio::test]
+// async fn rest_spot_cancel_orders_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let v = serde_json::json!({
+//             "orderId":"1073370944162058240",
+//             "clientOid":"1073370944162058240"
+//         });
+//     let rep_data = rest.spot_cancel_orders("CELRUSDT".to_string(), vec![v]).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-按币对撤单
+// #[tokio::test]
+// async fn rest_spot_cancel_symbol_orders_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.spot_cancel_symbol_orders("CELRUSDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取订单详情
+// #[tokio::test]
+// async fn rest_get_order_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_order("".to_string(), "1".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取当前委托列表
+// #[tokio::test]
+// async fn rest_get_unfilled_orders_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_unfilled_orders("CELRUSDT".to_string(),
+//                                             "".to_string(),
+//                                             "".to_string(),
+//                                             "".to_string(),
+//                                             "".to_string(),
+//                                             "".to_string(),
+//     ).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取历史委托列表
+// #[tokio::test]
+// async fn rest_get_history_orders_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_history_orders("CELRUSDT".to_string(),
+//                                            "".to_string(),
+//                                            "".to_string(),
+//                                            "".to_string(),
+//                                            "".to_string(),
+//                                            "".to_string(),
+//     ).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取成交明细
+// #[tokio::test]
+// async fn rest_get_fills_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_fills("CELRUSDT".to_string(),
+//                                   "1".to_string(),
+//                                   "".to_string(),
+//                                   "".to_string(),
+//                                   "".to_string(),
+//                                   "".to_string(),
+//     ).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取成交明细
+// #[tokio::test]
+// async fn rest_spot_place_plan_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     //限价-委托单
+//     let params = serde_json::json!({
+//          });
+//
+//     let rep_data = rest.spot_place_plan_order(params).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-修改计划委托
+// #[tokio::test]
+// async fn rest_update_place_plan_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     //限价-委托单
+//     let params = serde_json::json!({
+//          });
+//
+//     let rep_data = rest.update_place_plan_order(params).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-撤销计划委托
+// #[tokio::test]
+// async fn rest_cancel_plan_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.cancel_plan_order("32131".to_string(), "3211".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取当前计划委托
+// #[tokio::test]
+// async fn rest_get_current_plan_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_current_plan_order("CELRUSDT".to_string(),
+//                                                "1".to_string(),
+//                                                "".to_string(),
+//                                                "".to_string(),
+//                                                "".to_string(),
+//     ).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取历史计划委托
+// #[tokio::test]
+// async fn rest_get_history_plan_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_history_plan_order("CELRUSDT".to_string(),
+//                                                "1697701550192".to_string(),
+//                                                "1697701580192".to_string(),
+//                                                "100".to_string(),
+//     ).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-批量撤销计划委托
+// #[tokio::test]
+// async fn rest_cancel_plan_orders_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.cancel_plan_orders(vec![]).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-划转
+// #[tokio::test]
+// async fn rest_wallet_transfer_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.wallet_transfer("".to_string(),
+//                                         "".to_string(),
+//                                         "".to_string(),
+//                                         "".to_string(),
+//                                         "".to_string(),
+//                                         "".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-获取账单流水
+// #[tokio::test]
+// async fn rest_get_account_bills_test() {
+//     global::log_utils::init_log_with_trace();
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_account_bills("".to_string(),
+//                                           "".to_string(),
+//                                           "".to_string(),
+//                                           "".to_string(), ).await;
+//     trace!(?rep_data)
+// }
+//
+//
+// async fn get_ws(btree_map: Option<BitgetSpotLogin>, type_v: BitgetSpotWsType) -> BitgetSpotWs {
+//     let mut ku_ws = BitgetSpotWs::new(false, btree_map.clone(), type_v);
+//     ku_ws
+// }
+//
+// fn get_rest() -> BitgetSpotRest {
+//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
+//     // btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
+//     btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
+//     btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
+//     btree_map.insert("pass_key".to_string(), PASS_KEY.to_string());
+//
+//     let mut ku_exc = BitgetSpotRest::new(false, btree_map);
+//     ku_exc
+// }

+ 320 - 320
exchanges/tests/bybit_swap_test.rs

@@ -1,320 +1,320 @@
-use std::collections::BTreeMap;
-use std::sync::Arc;
-use std::sync::atomic::AtomicBool;
-use futures_util::StreamExt;
-use tokio::sync::Mutex;
-use tracing::trace;
-
-use exchanges::bybit_swap_rest::BybitSwapRest;
-use exchanges::bybit_swap_ws::{BybitSwapLogin, BybitSwapSubscribeType, BybitSwapWs, BybitSwapWsType};
-
-const ACCESS_KEY: &str = "";
-const SECRET_KEY: &str = "";
-
-
-//ws-订阅公共频道信息
-#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
-async fn ws_custom_subscribe_pu() {
-    global::log_utils::init_log_with_trace();
-
-
-    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-
-
-    let mut ws = get_ws(None, BybitSwapWsType::Public).await;
-    ws.set_symbols(vec!["BTC_USDT".to_string()]);
-    ws.set_subscribe(vec![
-        // BybitSwapSubscribeType::PuOrderBook1,
-        // BybitSwapSubscribeType::PuOrderBook50,
-        // BybitSwapSubscribeType::PuBlicTrade,
-        BybitSwapSubscribeType::PuTickers,
-    ]);
-
-
-    let write_tx_am = Arc::new(Mutex::new(write_tx));
-    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-
-    //读取
-    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    let _tr = tokio::spawn(async move {
-        trace!("线程-数据读取-开启");
-        loop {
-            if let Some(data) = read_rx.next().await {
-                trace!("读取数据data:{:?}",data)
-            }
-        }
-        // trace!("线程-数据读取-结束");
-    });
-
-    //写数据
-    // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    // let write_tx_clone = Arc::clone(&write_tx_am);
-    // let su = ws.get_subscription();
-    // let tw = tokio::spawn(async move {
-    //     trace!("线程-数据写入-开始");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
-    //         // let close_frame = CloseFrame {
-    //         //     code: CloseCode::Normal,
-    //         //     reason: Cow::Borrowed("Bye bye"),
-    //         // };
-    //         // let message = Message::Close(Some(close_frame));
-    //
-    //
-    //         let message = Message::Text(su.clone());
-    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
-    //         trace!("发送指令成功");
-    //     }
-    //     trace!("线程-数据写入-结束");
-    // });
-
-    let t1 = tokio::spawn(async move {
-        //链接
-        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-        trace!("test 唯一线程结束--");
-    });
-    tokio::try_join!(t1).unwrap();
-    trace!("当此结束");
-    trace!("重启!");
-    trace!("参考交易所关闭");
-    return;
-}
-
-
-//ws-订阅私有频道信息
-#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
-async fn ws_custom_subscribe_pr() {
-    global::log_utils::init_log_with_trace();
-
-
-    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-
-    let logparam = BybitSwapLogin {
-        api_key: ACCESS_KEY.to_string(),
-        secret_key: SECRET_KEY.to_string(),
-    };
-
-    let mut ws = get_ws(Option::from(logparam), BybitSwapWsType::Private).await;
-    ws.set_symbols(vec!["BTC_USDT".to_string()]);
-    ws.set_subscribe(vec![
-        BybitSwapSubscribeType::PrPosition,
-        // BybitSwapSubscribeType::PrExecution,
-        // BybitSwapSubscribeType::PrOrder,
-        // BybitSwapSubscribeType::PrWallet,
-    ]);
-
-
-    let write_tx_am = Arc::new(Mutex::new(write_tx));
-    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-
-    //读取
-    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    let _tr = tokio::spawn(async move {
-        trace!("线程-数据读取-开启");
-        loop {
-            if let Some(data) = read_rx.next().await {
-                trace!("读取数据data:{:?}",data)
-            }
-        }
-        // trace!("线程-数据读取-结束");
-    });
-
-    //写数据
-    // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    // let write_tx_clone = Arc::clone(&write_tx_am);
-    // let su = ws.get_subscription();
-    // let tw = tokio::spawn(async move {
-    //     trace!("线程-数据写入-开始");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
-    //         // let close_frame = CloseFrame {
-    //         //     code: CloseCode::Normal,
-    //         //     reason: Cow::Borrowed("Bye bye"),
-    //         // };
-    //         // let message = Message::Close(Some(close_frame));
-    //
-    //
-    //         let message = Message::Text(su.clone());
-    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
-    //         trace!("发送指令成功");
-    //     }
-    //     trace!("线程-数据写入-结束");
-    // });
-
-    let t1 = tokio::spawn(async move {
-        //链接
-        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-        trace!("test 唯一线程结束--");
-    });
-    tokio::try_join!(t1).unwrap();
-    trace!("当此结束");
-    trace!("重启!");
-    trace!("参考交易所关闭");
-    return;
-}
-
-
-//rest-服務器時間
-#[tokio::test]
-async fn rest_get_server_time_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_server_time().await;
-    println!("Bybit--服務器時間--{:?}", req_data);
-}
-
-//rest-查詢最新行情信息
-#[tokio::test]
-async fn rest_get_tickers_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_tickers("DOGEUSDT".to_string()).await;
-    println!("Bybit--查詢最新行情信息--{:?}", req_data);
-}
-
-//rest-查詢市場價格K線數據
-#[tokio::test]
-async fn rest_get_kline_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_kline("DOGEUSDT".to_string()).await;
-    println!("Bybit--查詢市場價格K線數據--{:?}", req_data);
-}
-
-
-//rest-查詢公告
-#[tokio::test]
-async fn rest_get_announcements_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_announcements().await;
-    println!("Bybit--查詢公告--{:?}", req_data);
-}
-
-//rest-查詢可交易產品的規格信息
-#[tokio::test]
-async fn rest_get_instruments_info_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_instruments_info("BTCUSDT".to_string()).await;
-    println!("Bybit--查詢可交易產品的規格信息--{:?}", req_data);
-}
-
-
-//rest-查詢錢包餘額
-#[tokio::test]
-async fn rest_get_account_balance_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_account_balance("USDT".to_string()).await;
-    println!("Bybit--查詢錢包餘額--{:?}", req_data);
-}
-
-//rest-查看持仓信息
-#[tokio::test]
-async fn rest_get_positions_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_positions("DOGEUSDT".to_string(), "".to_string()).await;
-    println!("Bybit--查看持仓信息--{:?}", req_data);
-}
-
-//rest-设置持仓模式
-#[tokio::test]
-async fn rest_set_position_mode_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.set_position_mode("DOGEUSDT".to_string(), 3).await;
-    println!("Bybit--设置持仓模式--{:?}", req_data);
-}
-
-//rest-設置槓桿
-#[tokio::test]
-async fn rest_set_leverage_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.set_leverage(
-        "DOGEUSDT".to_string(), "1".to_string()).await;
-    println!("Bybit--設置槓桿--{:?}", req_data);
-}
-
-
-//rest-創建委託單
-#[tokio::test]
-async fn rest_swap_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let params = serde_json::json!({
-            "category":"linear",
-            "symbol":"DOGEUSDT",
-            "orderType":"Limit",
-            "side":"Buy",
-            "qty":"1",
-            "price":"0.085",
-         });
-    let req_data = ret.swap_order(params).await;
-    println!("Bybit--創建委託單--{:?}", req_data);
-}
-
-
-//rest-查詢實時委託單
-#[tokio::test]
-async fn rest_get_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.get_order("LINKUSDT".to_string(),
-                                 "".to_string(), "".to_string()).await;
-    println!("Bybit--查詢實時委託單--{:?}", req_data);
-}
-
-
-//rest-撤单
-#[tokio::test]
-async fn rest_cancel_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.cancel_order("DOGEUSDT".to_string(),
-                                    "1d3ea16f-cf1c-4dab-9a79-d441a2dea549".to_string(), "".to_string()).await;
-    println!("Bybit--撤单--{:?}", req_data);
-}
-
-//rest-撤銷所有訂單
-#[tokio::test]
-async fn rest_cancel_orders_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut ret = get_rest();
-    let req_data = ret.cancel_orders("DOGEUSDT".to_string()).await;
-    println!("Bybit--撤銷所有訂單--{:?}", req_data);
-}
-
-
-async fn get_ws(btree_map: Option<BybitSwapLogin>, type_v: BybitSwapWsType) -> BybitSwapWs {
-    let ku_ws = BybitSwapWs::new(false, btree_map, type_v);
-    ku_ws
-}
-
-fn get_rest() -> BybitSwapRest {
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
-    btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
-
-    let bybit_exc = BybitSwapRest::new(false, btree_map.clone());
-    bybit_exc
-}
+// use std::collections::BTreeMap;
+// use std::sync::Arc;
+// use std::sync::atomic::AtomicBool;
+// use futures_util::StreamExt;
+// use tokio::sync::Mutex;
+// use tracing::trace;
+// 
+// use exchanges::bybit_swap_rest::BybitSwapRest;
+// use exchanges::bybit_swap_ws::{BybitSwapLogin, BybitSwapSubscribeType, BybitSwapWs, BybitSwapWsType};
+// 
+// const ACCESS_KEY: &str = "";
+// const SECRET_KEY: &str = "";
+// 
+// 
+// //ws-订阅公共频道信息
+// #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
+// async fn ws_custom_subscribe_pu() {
+//     global::log_utils::init_log_with_trace();
+// 
+// 
+//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
+// 
+// 
+//     let mut ws = get_ws(None, BybitSwapWsType::Public).await;
+//     ws.set_symbols(vec!["BTC_USDT".to_string()]);
+//     ws.set_subscribe(vec![
+//         // BybitSwapSubscribeType::PuOrderBook1,
+//         // BybitSwapSubscribeType::PuOrderBook50,
+//         // BybitSwapSubscribeType::PuBlicTrade,
+//         BybitSwapSubscribeType::PuTickers,
+//     ]);
+// 
+// 
+//     let write_tx_am = Arc::new(Mutex::new(write_tx));
+//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+// 
+//     //读取
+//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+//     let _tr = tokio::spawn(async move {
+//         trace!("线程-数据读取-开启");
+//         loop {
+//             if let Some(data) = read_rx.next().await {
+//                 trace!("读取数据data:{:?}",data)
+//             }
+//         }
+//         // trace!("线程-数据读取-结束");
+//     });
+// 
+//     //写数据
+//     // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
+//     // let write_tx_clone = Arc::clone(&write_tx_am);
+//     // let su = ws.get_subscription();
+//     // let tw = tokio::spawn(async move {
+//     //     trace!("线程-数据写入-开始");
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
+//     //         // let close_frame = CloseFrame {
+//     //         //     code: CloseCode::Normal,
+//     //         //     reason: Cow::Borrowed("Bye bye"),
+//     //         // };
+//     //         // let message = Message::Close(Some(close_frame));
+//     //
+//     //
+//     //         let message = Message::Text(su.clone());
+//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
+//     //         trace!("发送指令成功");
+//     //     }
+//     //     trace!("线程-数据写入-结束");
+//     // });
+// 
+//     let t1 = tokio::spawn(async move {
+//         //链接
+//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+//         trace!("test 唯一线程结束--");
+//     });
+//     tokio::try_join!(t1).unwrap();
+//     trace!("当此结束");
+//     trace!("重启!");
+//     trace!("参考交易所关闭");
+//     return;
+// }
+// 
+// 
+// //ws-订阅私有频道信息
+// #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
+// async fn ws_custom_subscribe_pr() {
+//     global::log_utils::init_log_with_trace();
+// 
+// 
+//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
+// 
+//     let logparam = BybitSwapLogin {
+//         api_key: ACCESS_KEY.to_string(),
+//         secret_key: SECRET_KEY.to_string(),
+//     };
+// 
+//     let mut ws = get_ws(Option::from(logparam), BybitSwapWsType::Private).await;
+//     ws.set_symbols(vec!["BTC_USDT".to_string()]);
+//     ws.set_subscribe(vec![
+//         BybitSwapSubscribeType::PrPosition,
+//         // BybitSwapSubscribeType::PrExecution,
+//         // BybitSwapSubscribeType::PrOrder,
+//         // BybitSwapSubscribeType::PrWallet,
+//     ]);
+// 
+// 
+//     let write_tx_am = Arc::new(Mutex::new(write_tx));
+//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+// 
+//     //读取
+//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+//     let _tr = tokio::spawn(async move {
+//         trace!("线程-数据读取-开启");
+//         loop {
+//             if let Some(data) = read_rx.next().await {
+//                 trace!("读取数据data:{:?}",data)
+//             }
+//         }
+//         // trace!("线程-数据读取-结束");
+//     });
+// 
+//     //写数据
+//     // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
+//     // let write_tx_clone = Arc::clone(&write_tx_am);
+//     // let su = ws.get_subscription();
+//     // let tw = tokio::spawn(async move {
+//     //     trace!("线程-数据写入-开始");
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
+//     //         // let close_frame = CloseFrame {
+//     //         //     code: CloseCode::Normal,
+//     //         //     reason: Cow::Borrowed("Bye bye"),
+//     //         // };
+//     //         // let message = Message::Close(Some(close_frame));
+//     //
+//     //
+//     //         let message = Message::Text(su.clone());
+//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
+//     //         trace!("发送指令成功");
+//     //     }
+//     //     trace!("线程-数据写入-结束");
+//     // });
+// 
+//     let t1 = tokio::spawn(async move {
+//         //链接
+//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+//         trace!("test 唯一线程结束--");
+//     });
+//     tokio::try_join!(t1).unwrap();
+//     trace!("当此结束");
+//     trace!("重启!");
+//     trace!("参考交易所关闭");
+//     return;
+// }
+// 
+// 
+// //rest-服務器時間
+// #[tokio::test]
+// async fn rest_get_server_time_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_server_time().await;
+//     println!("Bybit--服務器時間--{:?}", req_data);
+// }
+// 
+// //rest-查詢最新行情信息
+// #[tokio::test]
+// async fn rest_get_tickers_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_tickers("DOGEUSDT".to_string()).await;
+//     println!("Bybit--查詢最新行情信息--{:?}", req_data);
+// }
+// 
+// //rest-查詢市場價格K線數據
+// #[tokio::test]
+// async fn rest_get_kline_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_kline("DOGEUSDT".to_string()).await;
+//     println!("Bybit--查詢市場價格K線數據--{:?}", req_data);
+// }
+// 
+// 
+// //rest-查詢公告
+// #[tokio::test]
+// async fn rest_get_announcements_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_announcements().await;
+//     println!("Bybit--查詢公告--{:?}", req_data);
+// }
+// 
+// //rest-查詢可交易產品的規格信息
+// #[tokio::test]
+// async fn rest_get_instruments_info_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_instruments_info("BTCUSDT".to_string()).await;
+//     println!("Bybit--查詢可交易產品的規格信息--{:?}", req_data);
+// }
+// 
+// 
+// //rest-查詢錢包餘額
+// #[tokio::test]
+// async fn rest_get_account_balance_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_account_balance("USDT".to_string()).await;
+//     println!("Bybit--查詢錢包餘額--{:?}", req_data);
+// }
+// 
+// //rest-查看持仓信息
+// #[tokio::test]
+// async fn rest_get_positions_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_positions("DOGEUSDT".to_string(), "".to_string()).await;
+//     println!("Bybit--查看持仓信息--{:?}", req_data);
+// }
+// 
+// //rest-设置持仓模式
+// #[tokio::test]
+// async fn rest_set_position_mode_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.set_position_mode("DOGEUSDT".to_string(), 3).await;
+//     println!("Bybit--设置持仓模式--{:?}", req_data);
+// }
+// 
+// //rest-設置槓桿
+// #[tokio::test]
+// async fn rest_set_leverage_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.set_leverage(
+//         "DOGEUSDT".to_string(), "1".to_string()).await;
+//     println!("Bybit--設置槓桿--{:?}", req_data);
+// }
+// 
+// 
+// //rest-創建委託單
+// #[tokio::test]
+// async fn rest_swap_order_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let params = serde_json::json!({
+//             "category":"linear",
+//             "symbol":"DOGEUSDT",
+//             "orderType":"Limit",
+//             "side":"Buy",
+//             "qty":"1",
+//             "price":"0.085",
+//          });
+//     let req_data = ret.swap_order(params).await;
+//     println!("Bybit--創建委託單--{:?}", req_data);
+// }
+// 
+// 
+// //rest-查詢實時委託單
+// #[tokio::test]
+// async fn rest_get_order_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.get_order("LINKUSDT".to_string(),
+//                                  "".to_string(), "".to_string()).await;
+//     println!("Bybit--查詢實時委託單--{:?}", req_data);
+// }
+// 
+// 
+// //rest-撤单
+// #[tokio::test]
+// async fn rest_cancel_order_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.cancel_order("DOGEUSDT".to_string(),
+//                                     "1d3ea16f-cf1c-4dab-9a79-d441a2dea549".to_string(), "".to_string()).await;
+//     println!("Bybit--撤单--{:?}", req_data);
+// }
+// 
+// //rest-撤銷所有訂單
+// #[tokio::test]
+// async fn rest_cancel_orders_test() {
+//     global::log_utils::init_log_with_trace();
+// 
+//     let mut ret = get_rest();
+//     let req_data = ret.cancel_orders("DOGEUSDT".to_string()).await;
+//     println!("Bybit--撤銷所有訂單--{:?}", req_data);
+// }
+// 
+// 
+// async fn get_ws(btree_map: Option<BybitSwapLogin>, type_v: BybitSwapWsType) -> BybitSwapWs {
+//     let ku_ws = BybitSwapWs::new(false, btree_map, type_v);
+//     ku_ws
+// }
+// 
+// fn get_rest() -> BybitSwapRest {
+//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
+//     btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
+// 
+//     let bybit_exc = BybitSwapRest::new(false, btree_map.clone());
+//     bybit_exc
+// }

+ 264 - 264
exchanges/tests/kucoin_spot_test.rs

@@ -1,264 +1,264 @@
-use std::collections::BTreeMap;
-use std::sync::Arc;
-use std::sync::atomic::AtomicBool;
-
-use futures_util::StreamExt;
-use tokio::sync::Mutex;
-use tracing::trace;
-
-use exchanges::kucoin_spot_rest::KucoinSpotRest;
-use exchanges::kucoin_spot_ws::{KucoinSpotLogin, KucoinSpotSubscribeType, KucoinSpotWs, KucoinSpotWsType};
-
-const ACCESS_KEY: &str = "";
-const SECRET_KEY: &str = "";
-const PASS_KEY: &str = "";
-
-//ws-订阅公共频道信息
-#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
-async fn ws_custom_subscribe_pu() {
-    global::log_utils::init_log_with_trace();
-
-    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-
-
-    let mut ws = get_ws(None, KucoinSpotWsType::Public).await;
-    ws.set_symbols(vec!["BTC-USDT".to_string()]);
-    ws.set_subscribe(vec![
-        KucoinSpotSubscribeType::PuSpotMarketLevel2Depth50,
-        KucoinSpotSubscribeType::PuMarketTicker,
-        KucoinSpotSubscribeType::PuMarketMatch,
-    ]);
-
-    let write_tx_am = Arc::new(Mutex::new(write_tx));
-    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-
-    //读取
-    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    let _tr = tokio::spawn(async move {
-        trace!("线程-数据读取-开启");
-        loop {
-            if let Some(data) = read_rx.next().await {
-                trace!("读取数据data:{:?}",data)
-            }
-        }
-    });
-
-    //写数据
-    let _bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    let _write_tx_clone = Arc::clone(&write_tx_am);
-    // let tw = tokio::spawn(async move {
-    //     trace!("线程-数据写入-开始");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_millis(20*1000)).await;
-    //         let close_frame = CloseFrame {
-    //             code: CloseCode::Normal,
-    //             reason: Cow::Borrowed("Bye bye"),
-    //         };
-    //         let close_message = Message::Close(Some(close_frame));
-    //         // AbstractWsMode::send_subscribe(write_tx_clone.clone(), Message::Text("32313221".to_string()));
-    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), close_message);
-    //         trace!("发送指令成功");
-    //     }
-    //     trace!("线程-数据写入-结束");
-    // });
-
-    // loop {
-    let t1 = tokio::spawn(async move {
-        //链接
-        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-        trace!("test 唯一线程结束--");
-    });
-    tokio::try_join!(t1).unwrap();
-    trace!("当此结束");
-    // }
-    trace!("重启!");
-    trace!("参考交易所关闭");
-    return;
-}
-
-//ws-订阅私有频道信息
-#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
-async fn ws_custom_subscribe_pr() {
-    global::log_utils::init_log_with_trace();
-
-    let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-    let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-
-    let btree_map = KucoinSpotLogin {
-        access_key: ACCESS_KEY.to_string(),
-        secret_key: SECRET_KEY.to_string(),
-        pass_key: PASS_KEY.to_string(),
-    };
-    let mut ws = get_ws(Option::from(btree_map), KucoinSpotWsType::Public).await;
-    ws.set_symbols(vec!["BTC-USDT".to_string()]);
-    ws.set_subscribe(vec![
-        KucoinSpotSubscribeType::PrAccountBalance,
-        KucoinSpotSubscribeType::PrSpotMarketTradeOrders,
-    ]);
-
-    let write_tx_am = Arc::new(Mutex::new(write_tx));
-    let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-
-    //读取
-    let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-    let _tr = tokio::spawn(async move {
-        trace!("线程-数据读取-开启");
-        loop {
-            if let Some(data) = read_rx.next().await {
-                trace!("读取数据data:{:?}",data)
-            }
-        }
-    });
-
-    //写数据
-    let _bool_v2_clone = Arc::clone(&is_shutdown_arc);
-    let _write_tx_clone = Arc::clone(&write_tx_am);
-    // let tw = tokio::spawn(async move {
-    //     trace!("线程-数据写入-开始");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_millis(20*1000)).await;
-    //         let close_frame = CloseFrame {
-    //             code: CloseCode::Normal,
-    //             reason: Cow::Borrowed("Bye bye"),
-    //         };
-    //         let close_message = Message::Close(Some(close_frame));
-    //         // AbstractWsMode::send_subscribe(write_tx_clone.clone(), Message::Text("32313221".to_string()));
-    //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), close_message);
-    //         trace!("发送指令成功");
-    //     }
-    //     trace!("线程-数据写入-结束");
-    // });
-
-    // loop {
-    let t1 = tokio::spawn(async move {
-        //链接
-        let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-        ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-        trace!("test 唯一线程结束--");
-    });
-    tokio::try_join!(t1).unwrap();
-    trace!("当此结束");
-    // }
-    trace!("重启!");
-    trace!("参考交易所关闭");
-    return;
-}
-
-
-//rest-获取成交记录
-#[tokio::test]
-async fn rest_get_fills_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_fills("BTC-USDT".to_string(),
-                                  "".to_string(),
-                                  "".to_string(),
-                                  -1,
-                                  -1,
-                                  500,
-    ).await;
-    trace!(?rep_data)
-}
-
-
-//rest-获取订单
-#[tokio::test]
-async fn rest_get_order_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_order().await;
-    trace!(?rep_data)
-}
-
-//rest-獲取行情
-#[tokio::test]
-async fn rest_get_level1_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_level1("BTC-USDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-通過orderId获取訂單詳情
-#[tokio::test]
-async fn rest_get_order_by_order_id_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_order_by_order_id("3123123".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-通過clientOid獲取訂單詳情
-#[tokio::test]
-async fn rest_get_order_by_client_id_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_order_by_client_id("3123123".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-獲取賬戶列表 - 現貨/槓桿/現貨高頻
-#[tokio::test]
-async fn rest_get_accounts_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_accounts("USDT".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-獲取交易對列表
-#[tokio::test]
-async fn rest_get_symbols_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.get_symbols().await;
-    trace!(?rep_data)
-}
-
-//rest-通過orderId撤單- 没权限需要查看
-#[tokio::test]
-async fn rest_cancel_order_by_order_id_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.cancel_order_by_order_id("dddd123131".to_string()).await;
-    trace!(?rep_data)
-}
-
-//rest-通過clientOid撤單- 没权限需要查看
-#[tokio::test]
-async fn rest_cancel_order_by_client_id_test() {
-    global::log_utils::init_log_with_trace();
-
-    let mut rest = get_rest();
-    let rep_data = rest.cancel_order_by_client_id("dddd123131".to_string()).await;
-    trace!(?rep_data)
-}
-
-
-async fn get_ws(btree_map: Option<KucoinSpotLogin>, type_v: KucoinSpotWsType) -> KucoinSpotWs {
-    let ku_ws = KucoinSpotWs::new(false, btree_map,
-                                  type_v).await;
-    ku_ws
-}
-
-fn get_rest() -> KucoinSpotRest {
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
-    // btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
-    btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
-    btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
-    btree_map.insert("pass_key".to_string(), PASS_KEY.to_string());
-
-    let ku_exc = KucoinSpotRest::new(false, btree_map);
-    ku_exc
-}
+// use std::collections::BTreeMap;
+// use std::sync::Arc;
+// use std::sync::atomic::AtomicBool;
+//
+// use futures_util::StreamExt;
+// use tokio::sync::Mutex;
+// use tracing::trace;
+//
+// use exchanges::kucoin_spot_rest::KucoinSpotRest;
+// use exchanges::kucoin_spot_ws::{KucoinSpotLogin, KucoinSpotSubscribeType, KucoinSpotWs, KucoinSpotWsType};
+//
+// const ACCESS_KEY: &str = "";
+// const SECRET_KEY: &str = "";
+// const PASS_KEY: &str = "";
+//
+// //ws-订阅公共频道信息
+// #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
+// async fn ws_custom_subscribe_pu() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
+//
+//
+//     let mut ws = get_ws(None, KucoinSpotWsType::Public).await;
+//     ws.set_symbols(vec!["BTC-USDT".to_string()]);
+//     ws.set_subscribe(vec![
+//         KucoinSpotSubscribeType::PuSpotMarketLevel2Depth50,
+//         KucoinSpotSubscribeType::PuMarketTicker,
+//         KucoinSpotSubscribeType::PuMarketMatch,
+//     ]);
+//
+//     let write_tx_am = Arc::new(Mutex::new(write_tx));
+//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//
+//     //读取
+//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+//     let _tr = tokio::spawn(async move {
+//         trace!("线程-数据读取-开启");
+//         loop {
+//             if let Some(data) = read_rx.next().await {
+//                 trace!("读取数据data:{:?}",data)
+//             }
+//         }
+//     });
+//
+//     //写数据
+//     let _bool_v2_clone = Arc::clone(&is_shutdown_arc);
+//     let _write_tx_clone = Arc::clone(&write_tx_am);
+//     // let tw = tokio::spawn(async move {
+//     //     trace!("线程-数据写入-开始");
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_millis(20*1000)).await;
+//     //         let close_frame = CloseFrame {
+//     //             code: CloseCode::Normal,
+//     //             reason: Cow::Borrowed("Bye bye"),
+//     //         };
+//     //         let close_message = Message::Close(Some(close_frame));
+//     //         // AbstractWsMode::send_subscribe(write_tx_clone.clone(), Message::Text("32313221".to_string()));
+//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), close_message);
+//     //         trace!("发送指令成功");
+//     //     }
+//     //     trace!("线程-数据写入-结束");
+//     // });
+//
+//     // loop {
+//     let t1 = tokio::spawn(async move {
+//         //链接
+//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+//         trace!("test 唯一线程结束--");
+//     });
+//     tokio::try_join!(t1).unwrap();
+//     trace!("当此结束");
+//     // }
+//     trace!("重启!");
+//     trace!("参考交易所关闭");
+//     return;
+// }
+//
+// //ws-订阅私有频道信息
+// #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
+// async fn ws_custom_subscribe_pr() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
+//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
+//
+//     let btree_map = KucoinSpotLogin {
+//         access_key: ACCESS_KEY.to_string(),
+//         secret_key: SECRET_KEY.to_string(),
+//         pass_key: PASS_KEY.to_string(),
+//     };
+//     let mut ws = get_ws(Option::from(btree_map), KucoinSpotWsType::Public).await;
+//     ws.set_symbols(vec!["BTC-USDT".to_string()]);
+//     ws.set_subscribe(vec![
+//         KucoinSpotSubscribeType::PrAccountBalance,
+//         KucoinSpotSubscribeType::PrSpotMarketTradeOrders,
+//     ]);
+//
+//     let write_tx_am = Arc::new(Mutex::new(write_tx));
+//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//
+//     //读取
+//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
+//     let _tr = tokio::spawn(async move {
+//         trace!("线程-数据读取-开启");
+//         loop {
+//             if let Some(data) = read_rx.next().await {
+//                 trace!("读取数据data:{:?}",data)
+//             }
+//         }
+//     });
+//
+//     //写数据
+//     let _bool_v2_clone = Arc::clone(&is_shutdown_arc);
+//     let _write_tx_clone = Arc::clone(&write_tx_am);
+//     // let tw = tokio::spawn(async move {
+//     //     trace!("线程-数据写入-开始");
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_millis(20*1000)).await;
+//     //         let close_frame = CloseFrame {
+//     //             code: CloseCode::Normal,
+//     //             reason: Cow::Borrowed("Bye bye"),
+//     //         };
+//     //         let close_message = Message::Close(Some(close_frame));
+//     //         // AbstractWsMode::send_subscribe(write_tx_clone.clone(), Message::Text("32313221".to_string()));
+//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), close_message);
+//     //         trace!("发送指令成功");
+//     //     }
+//     //     trace!("线程-数据写入-结束");
+//     // });
+//
+//     // loop {
+//     let t1 = tokio::spawn(async move {
+//         //链接
+//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
+//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
+//         trace!("test 唯一线程结束--");
+//     });
+//     tokio::try_join!(t1).unwrap();
+//     trace!("当此结束");
+//     // }
+//     trace!("重启!");
+//     trace!("参考交易所关闭");
+//     return;
+// }
+//
+//
+// //rest-获取成交记录
+// #[tokio::test]
+// async fn rest_get_fills_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_fills("BTC-USDT".to_string(),
+//                                   "".to_string(),
+//                                   "".to_string(),
+//                                   -1,
+//                                   -1,
+//                                   500,
+//     ).await;
+//     trace!(?rep_data)
+// }
+//
+//
+// //rest-获取订单
+// #[tokio::test]
+// async fn rest_get_order_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_order().await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-獲取行情
+// #[tokio::test]
+// async fn rest_get_level1_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_level1("BTC-USDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-通過orderId获取訂單詳情
+// #[tokio::test]
+// async fn rest_get_order_by_order_id_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_order_by_order_id("3123123".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-通過clientOid獲取訂單詳情
+// #[tokio::test]
+// async fn rest_get_order_by_client_id_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_order_by_client_id("3123123".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-獲取賬戶列表 - 現貨/槓桿/現貨高頻
+// #[tokio::test]
+// async fn rest_get_accounts_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_accounts("USDT".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-獲取交易對列表
+// #[tokio::test]
+// async fn rest_get_symbols_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.get_symbols().await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-通過orderId撤單- 没权限需要查看
+// #[tokio::test]
+// async fn rest_cancel_order_by_order_id_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.cancel_order_by_order_id("dddd123131".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+// //rest-通過clientOid撤單- 没权限需要查看
+// #[tokio::test]
+// async fn rest_cancel_order_by_client_id_test() {
+//     global::log_utils::init_log_with_trace();
+//
+//     let mut rest = get_rest();
+//     let rep_data = rest.cancel_order_by_client_id("dddd123131".to_string()).await;
+//     trace!(?rep_data)
+// }
+//
+//
+// async fn get_ws(btree_map: Option<KucoinSpotLogin>, type_v: KucoinSpotWsType) -> KucoinSpotWs {
+//     let ku_ws = KucoinSpotWs::new(false, btree_map,
+//                                   type_v).await;
+//     ku_ws
+// }
+//
+// fn get_rest() -> KucoinSpotRest {
+//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
+//     // btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
+//     btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
+//     btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
+//     btree_map.insert("pass_key".to_string(), PASS_KEY.to_string());
+//
+//     let ku_exc = KucoinSpotRest::new(false, btree_map);
+//     ku_exc
+// }

+ 544 - 544
exchanges/tests/test.rs

@@ -1,547 +1,547 @@
-use exchanges::gate_swap_rest::GateSwapRest;
-use std::collections::BTreeMap;
-use tokio::io::{AsyncReadExt};
-use exchanges::kucoin_swap_rest::KucoinSwapRest;
-use exchanges::kucoin_swap_ws::{KucoinSwapSubscribeType, KucoinSwapWs, KucoinSwapWsType};
-use exchanges::{proxy};
-use exchanges::okx_swap_ws::{OkxSwapSubscribeType, OkxSwapWs, OkxSwapWsType};
-
-use std::io::{Read, Write};
-use std::sync::Arc;
-use std::sync::atomic::AtomicBool;
-use tokio::sync::mpsc::channel;
-use tokio::try_join;
-use tracing::{trace};
-use tracing::instrument::WithSubscriber;
-use exchanges::binance_swap_rest::BinanceSwapRest;
-use exchanges::binance_swap_ws::{BinanceSwapSubscribeType, BinanceSwapWs, BinanceSwapWsType};
-use exchanges::okx_swap_rest::OkxSwapRest;
-
-#[tokio::test]
-async fn test_import() {
-    global::log_utils::init_log_with_trace();
-
-
-    /*******走代理:根据环境变量配置来决定,如果配置了走代理,没有配置不走*******/
-    if proxy::ParsingDetail::http_enable_proxy() {
-        trace!("检测有代理配置,配置走代理");
-    }
-
-
-    //获取代理
-    // demo_get_http_proxy();
-
-    //币安---深度socket-公共频道订阅
-    // demo_pub_ws_ba().await;
-    // 币安-rest-获取账户信息
-    // demo_rest_ba().await;
-    //本次更新成功
-
-
-    //gate-rest -账户信息
-    // demo_rest_gate().await;
-    //gate-ws-public-private频道
-    // demo_ws_gate().await;
-
-
-    //kucoin_rest -账户信息
-    // demo_rest_kucoin().await;
-    //Kucoin-ws--公共频道
-    // demo_ws_kucoin_pu().await;
-    //Kucoin-ws--私有频道
-    // demo_ws_kucoin_pr().await;
-
-    //okx - Business 频道
-    // demo_ws_okx_bu().await;
-    //okx - public 频道
-    // demo_ws_okx_pu().await;
-    //okx - rest 频道
-    // demo_okx_rest().await;
-
-    // demo_so();
-
-
-    // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
-    //                                   KucoinWsType::Private, tx).await;
-    // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
-    //
-    // let t1 = tokio::spawn(async move {
-    //     ku_ws.custom_subscribe(vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
-    // });
-    //
-    // let t2 = tokio::spawn(async move {
-    //     let mut stdout = std::io::stdout();
-    //     loop {
-    //         if let Ok(received) = rx.try_recv() {
-    //             writeln!(stdout, "age: {:?}", received).unwrap();
-    //         }
-    //     }
-    // let t01 = tokio::spawn(async move {
-    //     loop {
-    //         tokio::time::sleep(Duration::from_secs(2)).await;
-    //         trace!( "发送-指令: ");
-    //     }
-    // });
-    // let t02 = tokio::spawn(async move {
-    //     loop {
-    //         tokio::time::sleep(Duration::from_secs(3)).await;
-    //         trace!( "接收 -指令: ");
-    //     }
-    // });
-    // try_join!(t01,t02).unwrap();
-
-
-    // let (mut tx_end, mut rx_end) = channel::<String>(1024);
-    // let (mut tx_read, mut rx_read) = channel::<String>(1024);
-    // let mut stream = tokio::net::TcpStream::connect("127.0.0.1:8080").await.unwrap();
-    // stream.write_all( b"Hello, server!").await.unwrap();
-    // stream.flush().await.unwrap();
-    // let mutex_stream = Arc::new(Mutex::new(stream));
-    //
-    // //捕捉用户的主动发送的订阅指令
-    // let stream_clone = Arc::clone(&mutex_stream);
-    // let t_1 = tokio::spawn(async move {
-    //     loop {
-    //         tokio::time::sleep(Duration::from_secs(1)).await;
-    //         if let Ok(received) = rx_end.try_recv() {
-    //             trace!("动态订阅内容: {:?}", received);
-    //             let mut stream_lock = stream_clone.lock().await;
-    //             // stream_lock.write_all( b"1111!").await.unwrap();
-    //             // stream_lock.flush().await.unwrap();
-    //
-    //             // stream_lock.write_all(b"Hello, server!").await.unwrap();
-    //         }
-    //     }
-    // });
-    //
-    //
-    // //socket数据获取,装入回显通道
-    // let stream_clone = Arc::clone(&mutex_stream);
-    // let t_2 = tokio::spawn(async move {
-    //     // 创建一个用于存储服务器响应的缓冲区
-    //     let mut buffer = [0; 512];
-    //     loop {
-    //         let mut stream_lock = stream_clone.lock().await;
-    //         tokio::time::sleep(Duration::from_secs(1)).await;
-    //
-    //         let _ = match stream_lock.read(&mut buffer).await {
-    //             Ok(n) => {
-    //                 tokio::time::sleep(Duration::from_secs(1)).await;
-    //                 if n == 0 {
-    //                     // 没有读取到数据
-    //                     trace!("没有数据,主动发送");
-    //                 } else {
-    //                     // 打印服务器的响应
-    //                     trace!("有数据: {}", String::from_utf8_lossy(&buffer[..n]));
-    //                     tx_read.send(format!("{}", String::from_utf8_lossy(&buffer[..n]))).await.unwrap()
-    //                 }
-    //             }
-    //             Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
-    //                 // 如果读取操作会阻塞,则等待一会儿再试
-    //                 trace!("Would block, sleeping会阻碍睡眠??");
-    //                 tokio::time::sleep(Duration::from_secs(3)).await;
-    //                 continue;
-    //             }
-    //             Err(e) => {
-    //                 trace!("Err:{:?}",e);
-    //                 break;
-    //             }
-    //         };
-    //     }
-    // });
-    //
-    //
-    // //socket 数据回显
-    // let t02 = tokio::spawn(async move {
-    //     loop {
-    //         tokio::time::sleep(Duration::from_secs(1)).await;
-    //         // tx.send("hai!!!".to_string()).await.unwrap();
-    //         if let Ok(received) = rx_read.try_recv() {
-    //             trace!("拿到 socket 的数据: {:?}", received);
-    //         }
-    //     }
-    // });
-    //
-    // //模拟用户动态发送
-    // let t03 = tokio::spawn(async move {
-    //     loop {
-    //         tokio::time::sleep(Duration::from_secs(1)).await;
-    //         tx_end.send("这里是 动态订阅".to_string()).await.unwrap();
-    //     }
-    // });
-    //
-    // try_join!(t_1,t_2,t02,t03).unwrap();
-}
-
-
-async fn demo_okx_rest() {
-    // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // btree_map.insert("access_key".to_string(), "".to_string());
-    // btree_map.insert("secret_key".to_string(), "".to_string());
-    // btree_map.insert("pass_key".to_string(), "".to_string());
-    //
-    // let mut okx_rest = OkxSwapRest::new(false, btree_map);
-    // let res_data = okx_rest.get_account("BTC".to_string()).await;
-    // trace!("okx_rest-rest - get_account- {:?}", res_data);
-}
-
-async fn demo_ws_gate() {}
-
-
-fn demo_so() {
-    // 代理服务器地址和端口
-    // let proxy_address = "127.0.0.1:7890";
-    // // 目标服务器地址和端口
-    // let target_address = "wss://ws.okx.com:8443/ws/v5/public";
-    //
-    //   // 建立与代理服务器的连接
-    //   let mut proxy_stream = TcpStream::connect(proxy_address).expect("Failed to connect to proxy");
-    //
-    //   // 发送代理请求
-    //   let request = format!("CONNECT {}\r\n\r\n", target_address);
-    //   proxy_stream.write_all(request.as_bytes()).expect("Failed to send proxy request");
-    //
-    //   // 读取代理响应
-    //   let mut response = String::new();
-    //   proxy_stream.read_to_string(&mut response).expect("Failed to read proxy response");
-    //
-    //   // 检查代理响应是否成功
-    //   if !response.contains("200 Connection established") {
-    //       trace!("Proxy connection failed: {}", response);
-    //   }
-    //
-    //   // 从代理连接中获取原始 TCP 流
-    //   let mut tcp_stream = std::mem::ManuallyDrop::new(proxy_stream);
-    //
-    //   // 现在你可以使用 `tcp_stream` 来进行与目标服务器的通信
-    //   // 例如,发送和接收数据
-    //   // tcp_stream.write_all(b"Hello, server!").expect("Failed to send data");
-    //
-    //   thread::spawn(move || {
-    //       loop {
-    //           let mut buffer = [0u8; 1024]; // 用于存储读取的数据的缓冲区
-    //           let bytes_read = tcp_stream.read(&mut buffer).expect("Failed to read data");
-    //
-    //           // 将读取的数据转换为字符串并打印
-    //           if let Ok(data) = std::str::from_utf8(&buffer[..bytes_read]) {
-    //               trace!("Received data: {}", data);
-    //           } else {
-    //               trace!("Received data contains non-UTF8 characters");
-    //           }
-    //       }
-    //
-    //   });
-    //
-    //   // 最后记得手动释放套接字
-    //   // 注意:不要调用 `drop(tcp_stream)`,因为我们使用了 `ManuallyDrop` 来避免自动释放
-    //   unsafe {
-    //       std::mem::ManuallyDrop::drop(&mut tcp_stream);
-    //   }
-}
-
-
-async fn demo_ws_okx_pu() {
-
-    // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // let (tx, mut rx) = channel(1024);
-    // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Public, tx);
-    // ku_ws.set_subscribe(vec![OkxSubscribeType::PuIndexTickers]);
-    // let t1 = tokio::spawn(async move {
-    //     ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
-    // });
-    // let t2 = tokio::spawn(async move {
-    //     let mut stdout = std::io::stdout();
-    //     loop {
-    //         if let Ok(received) = rx.try_recv() {
-    //             writeln!(stdout, "age: {:?}", received).unwrap();
-    //         }
-    //     }
-    // });
-    // try_join!(t1,t2).unwrap();
-}
-
-async fn demo_ws_okx_bu() {
-    // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // let (tx, mut rx) = channel(1024);
-    // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Business, tx);
-    // ku_ws.set_subscribe(vec![OkxSubscribeType::BuIndexCandle30m]);
-    // let t1 = tokio::spawn(async move {
-    //     ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
-    // });
-    // let t2 = tokio::spawn(async move {
-    //     let mut stdout = std::io::stdout();
-    //     loop {
-    //         if let Ok(received) = rx.try_recv() {
-    //             writeln!(stdout, "age: {:?}", received).unwrap();
-    //         }
-    //     }
-    // });
-    // try_join!(t1,t2).unwrap();
-}
-
-async fn demo_ws_kucoin_pr() {
-    // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
-    // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // btree_map.insert("access_key".to_string(), "".to_string());
-    // btree_map.insert("secret_key".to_string(), "".to_string());
-    // btree_map.insert("pass_key".to_string(), "".to_string());
-    // trace!("----------------------btree_map{:?}", btree_map.clone());
-    // let (tx, mut rx) = channel(1024);
-    // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
-    //                                   KucoinWsType::Private, tx).await;
-    // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
-    //
-    // let t1 = tokio::spawn(async move {
-    //     ku_ws.custom_subscribe(is_shutdown_arc, vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
-    // });
-    //
-    // let t2 = tokio::spawn(async move {
-    //     loop {
-    //         if let Ok(received) = rx.try_recv() {
-    //             trace!( "age: {:?}", received);
-    //         }
-    //     }
-    // });
-    //
-    // try_join!(t1,t2).unwrap();
-}
-
-async fn demo_ws_kucoin_pu() {
-    // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
-    // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // let (tx, mut rx) = channel(1024);
-    // let mut ku_ws = KucoinSwapWs::new(false, btree_map, KucoinWsType::Public, tx).await;
-    // ku_ws.set_subscribe(vec![
-    //     KucoinSubscribeType::PuContractMarketLevel2Depth50,
-    //     KucoinSubscribeType::PuContractMarkettickerV2,
-    // ]);
-    //
-    // let t1 = tokio::spawn(async move {
-    //     ku_ws.custom_subscribe(is_shutdown_arc, vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
-    // });
-    // let t2 = tokio::spawn(async move {
-    //     loop {
-    //         if let Ok(received) = rx.try_recv() {
-    //             trace!("age: {:?}", received);
-    //         }
-    //     }
-    // });
-    //
-    // try_join!(t1,t2).unwrap();
-}
-
-async fn demo_rest_kucoin() {
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    btree_map.insert("access_key".to_string(), "".to_string());
-    btree_map.insert("secret_key".to_string(), "".to_string());
-    btree_map.insert("pass_key".to_string(), "".to_string());
-
-    let mut kucoin_exc = KucoinSwapRest::new(false, btree_map);
-    // let res_data = kucoin_exc.get_server_time().await;
-    // trace!("kucoin_exc-rest - get_server_time- {:?}", res_data);
-    // trace!("kucoin_exc-rest-get_delays{:?}", kucoin_exc.get_delays() );
-    // trace!("kucoin_exc-rest -get_avg_delay{:?}", kucoin_exc.get_avg_delay());
-    // let res_data = kucoin_exc.get_account("USDT".to_string()).await;
-    // trace!("kucoin_exc-rest - get_account- {:?}", res_data);
-    // let res_data = kucoin_exc.get_position("XBT1USDM".to_string()).await;
-    // trace!("kucoin_exc-rest - get_position- {:?}", res_data);
-    // let res_data = kucoin_exc.get_market_details().await;
-    // trace!("kucoin_exc-rest - get_market_details- {:?}", res_data);
-    // let res_data = kucoin_exc.get_ticker("ROSEUSDTM".to_string()).await;
-    // trace!("kucoin_exc-rest - get_ticker- {:?}", res_data);
-    let res_data = kucoin_exc.get_orders("".to_string(),
-                                         "".to_string()).await;
-    trace!("kucoin_exc-rest - get_orders- {:?}", res_data);
-    // let res_data = kucoin_exc.get_positions("USDT".to_string()).await;
-    // trace!("kucoin_exc-rest - get_positions- {:?}", res_data);
-    // let res_data = kucoin_exc.get_orders_details("111".to_string(), "".to_string()).await;
-    // trace!("kucoin_exc-rest - get_orders_details- {:?}", res_data);
-    // let res_data = kucoin_exc.swap_bazaar_order(
-    //     "cs_202309111808".to_string(),
-    //     "ROSEUSDTM".to_string(),
-    //     "pd".to_string(),
-    //     1,
-    //     "10".to_string(),
-    //     "0.03856".to_string(),
-    //     "limit".to_string(),
-    // ).await;
-    // trace!("kucoin_exc-rest - swap_bazaar_order- {:?}
-    // let res_data = kucoin_exc.cancel_order("".to_string(), "999999".to_string()).await;
-    // trace!("kucoin_exc-rest - cancel_order- {:?}", res_data);
-    // let res_data = kucoin_exc.get_public_token().await;
-    // trace!("kucoin_exc-rest - get_public_token- {:?}", res_data);
-}
-
-async fn demo_rest_gate() {
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    btree_map.insert("access_key".to_string(), "".to_string());
-    btree_map.insert("secret_key".to_string(), "".to_string());
-
-    let mut gate_exc = GateSwapRest::new(false, btree_map);
-    let res_data = gate_exc.get_account("usdt".to_string()).await;
-    trace!("gate-rest -账户信息{:?}", res_data);
-    trace!("gate-rest -get_delays{:?}", gate_exc.get_delays() );
-    trace!("gate-rest -get_avg_delay{:?}", gate_exc.get_avg_delay());
-    // let res_data = gate_exc.get_position("usdt".to_string(), "CYBER_USDT".to_string()).await;
-    // trace!("gate-rest -持仓信息{:?}", res_data);
-    // let res_data = gate_exc.get_ticker("usdt".to_string()).await;
-    // trace!("gate-rest -ticker{:?}", res_data);
-    // let res_data = gate_exc.get_server_time().await;
-    // trace!("gate-rest -get_server_time{:?}", res_data);
-    // let res_data = gate_exc.get_user_position("usdt".to_string()).await;
-    // trace!("gate-rest -get_server_time{:?}", res_data);
-    // let res_data = gate_exc.get_order_details("usdt".to_string(), "11335522".to_string()).await;
-    // trace!("gate-rest -get_order_details{:?}", res_data);
-    // let res_data = gate_exc.get_orders("usd1t".to_string(), "open".to_string()).await;
-    // trace!("gate-rest -get_orders{:?}", res_data);
-    // let params = serde_json::json!({
-    //         "contract":"CYBER_USDT",
-    //         "size":-1,
-    //         "price":"0",
-    //         "tif":"ioc",
-    //      });
-    // let res_data = gate_exc.take_order("usdt".to_string(), params).await;
-    // trace!("gate-rest -get_orders{:?}", res_data);
-    // let res_data = gate_exc.setting_dual_mode("usdt".to_string(), true).await;
-    // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-    // let res_data = gate_exc.setting_dual_leverage("usdt".to_string(),
-    //                                               "CYBER_USDT".to_string(),
-    //                                               "20".to_string(),
-    // ).await;
-    // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-    // let res_data = gate_exc.wallet_transfers("usdt".to_string(),
-    //                                               "CYBER_USDT".to_string(),
-    //                                               "20".to_string(),
-    // ).await;
-    // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-    // let res_data = gate_exc.cancel_order("usdt".to_string(),
-    //                                      "12345".to_string(),
-    // ).await;
-    // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-    // let res_data = gate_exc.cancel_orders("usdt".to_string(),
-    //                                      "CYBER_USDT".to_string(),
-    // ).await;
-    // trace!("gate-rest -cancel_orders{:?}", res_data);
-    // let res_data = gate_exc.order(
-    //     "usdt".to_string(),
-    //     "long".to_string(),
-    //     "buy".to_string(),
-    //     "ROSE_USDT".to_string(),
-    //     1,
-    //     "0.03888".to_string(),
-    //     "t-my-custom-id-001".to_string(),
-    // ).await;
-    // trace!("gate-rest -order{:?}", res_data);
-
-
-    // let res_data = gate_exc.my_trades("usdt".to_string()).await;
-    // trace!("gate-rest -my_trades{:?}", res_data);
-    let res_data = gate_exc.account_book("usdt".to_string()).await;
-    trace!("gate-rest -account_book{:?}", res_data);
-}
-
-async fn demo_rest_ba() {
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    btree_map.insert("access_key".to_string(), "".to_string());
-    btree_map.insert("secret_key".to_string(), "".to_string());
-
-    // let ba_exc = BinanceUsdtSwapRest::new(false, btree_map);
-    // let res_data = ba_exc.get_account().await;
-    let mut ba_exc = BinanceSwapRest::new(false, btree_map);
-    // let res_data = ba_exc.get_server_time().await;
-    // trace!("币安-rest - get_server_time{:?}", res_data);
-    // let res_data = ba_exc.get_exchange_info().await;
-    // trace!("币安-restget_ get_exchange_info{:?}", res_data);
-
-
-    let res_data = ba_exc.get_account().await;
-    trace!("币安-rest-获取账户信息{:?}", res_data);
-    // trace!("币安-rest- -get_delays{:?}", ba_exc.get_delays() );
-    // trace!("币安-rest--get_avg_delay{:?}", ba_exc.get_avg_delay());
-
-    // let res_data = ba_exc.get_order("BTCUSDT".to_string(), 131, "".to_string()).await;
-    // trace!("币安-rest--get_order{:?}", res_data);
-    // let res_data = ba_exc.get_open_orders("BTCUSDT".to_string()).await;
-    // trace!("币安-rest--get_open_orders{:?}", res_data);
-    // let timestamp_start = chrono::Utc::now().timestamp_millis() - 60 * 100 * 1000;
-    // let timestamp_end = chrono::Utc::now().timestamp_millis() +  60 * 100 * 1000;
-    // let res_data = ba_exc.get_all_orders("BTCUSDT".to_string(), 1000, timestamp_start, timestamp_end).await;
-    // trace!("币安-rest--get_all_orders{:?}", res_data);
-    // let res_data = ba_exc.get_book_ticker("BTCUSDT".to_string()).await;
-    // trace!("币安-rest--get_book_ticker{:?}", res_data);
-    // let res_data = ba_exc.get_position_risk("BTCUS1DT".to_string()).await;
-    // trace!("币安-rest--get_position_risk{:?}", res_data);
-    // let res_data = ba_exc.change_pos_side(true).await;
-    // trace!("币安-rest--change_pos_side{:?}", res_data);
-    // let res_data = ba_exc.cancel_order("BTCUSDT".to_string(), 3312331, "".to_string()).await;
-    // trace!("币安-rest--cancel_order{:?}", res_data);
-}
-
-async fn demo_pub_ws_ba() {
-    // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
-    // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-    // let (tx, mut rx) = channel(1024);
-    // let mut binance_ws = BinanceSwapWs::new(false, btree_map, BinanceWsType::PublicAndPrivate, tx);
-    // binance_ws.set_subscribe(vec![
-    //     BinanceSubscribeType::PuAggTrade,
-    //     BinanceSubscribeType::PuDepth20levels100ms,
-    //     BinanceSubscribeType::PuBookTicker,
-    // ]);
-    // let t1 = tokio::spawn(async move {
-    //     binance_ws.custom_subscribe(is_shutdown_arc,vec!["BTCUSDT".to_string()]).await;
-    // });
-    // let t2 = tokio::spawn(async move {
-    //     loop {
-    //         if let Ok(received) = rx.try_recv() {
-    //             trace!( "age: {:?}", received);
-    //         }
-    //     }
-    // });
-    // try_join!(t1,t2).unwrap();
-}
-
-fn demo_get_http_proxy() {
-    //代理地址
-    let parsing_detail = proxy::ParsingDetail::parsing_environment_variables();
-    trace!("----代理信息:{:?}", parsing_detail);
-}
-
-
-// /*********************web服务*/
-// fn demo_http() {
-//     let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
-//     for stream in listener.incoming() {
-//         let stream = stream.unwrap();
-//
-//         handle_connection(TcpStream::try_from(stream).unwrap());
+// use exchanges::gate_swap_rest::GateSwapRest;
+// use std::collections::BTreeMap;
+// use tokio::io::{AsyncReadExt};
+// use exchanges::kucoin_swap_rest::KucoinSwapRest;
+// use exchanges::kucoin_swap_ws::{KucoinSwapSubscribeType, KucoinSwapWs, KucoinSwapWsType};
+// use exchanges::{proxy};
+// use exchanges::okx_swap_ws::{OkxSwapSubscribeType, OkxSwapWs, OkxSwapWsType};
+// 
+// use std::io::{Read, Write};
+// use std::sync::Arc;
+// use std::sync::atomic::AtomicBool;
+// use tokio::sync::mpsc::channel;
+// use tokio::try_join;
+// use tracing::{trace};
+// use tracing::instrument::WithSubscriber;
+// use exchanges::binance_swap_rest::BinanceSwapRest;
+// use exchanges::binance_swap_ws::{BinanceSwapSubscribeType, BinanceSwapWs, BinanceSwapWsType};
+// use exchanges::okx_swap_rest::OkxSwapRest;
+// 
+// #[tokio::test]
+// async fn test_import() {
+//     global::log_utils::init_log_with_trace();
+// 
+// 
+//     /*******走代理:根据环境变量配置来决定,如果配置了走代理,没有配置不走*******/
+//     if proxy::ParsingDetail::http_enable_proxy() {
+//         trace!("检测有代理配置,配置走代理");
 //     }
+// 
+// 
+//     //获取代理
+//     // demo_get_http_proxy();
+// 
+//     //币安---深度socket-公共频道订阅
+//     // demo_pub_ws_ba().await;
+//     // 币安-rest-获取账户信息
+//     // demo_rest_ba().await;
+//     //本次更新成功
+// 
+// 
+//     //gate-rest -账户信息
+//     // demo_rest_gate().await;
+//     //gate-ws-public-private频道
+//     // demo_ws_gate().await;
+// 
+// 
+//     //kucoin_rest -账户信息
+//     // demo_rest_kucoin().await;
+//     //Kucoin-ws--公共频道
+//     // demo_ws_kucoin_pu().await;
+//     //Kucoin-ws--私有频道
+//     // demo_ws_kucoin_pr().await;
+// 
+//     //okx - Business 频道
+//     // demo_ws_okx_bu().await;
+//     //okx - public 频道
+//     // demo_ws_okx_pu().await;
+//     //okx - rest 频道
+//     // demo_okx_rest().await;
+// 
+//     // demo_so();
+// 
+// 
+//     // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
+//     //                                   KucoinWsType::Private, tx).await;
+//     // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
+//     //
+//     // let t1 = tokio::spawn(async move {
+//     //     ku_ws.custom_subscribe(vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
+//     // });
+//     //
+//     // let t2 = tokio::spawn(async move {
+//     //     let mut stdout = std::io::stdout();
+//     //     loop {
+//     //         if let Ok(received) = rx.try_recv() {
+//     //             writeln!(stdout, "age: {:?}", received).unwrap();
+//     //         }
+//     //     }
+//     // let t01 = tokio::spawn(async move {
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_secs(2)).await;
+//     //         trace!( "发送-指令: ");
+//     //     }
+//     // });
+//     // let t02 = tokio::spawn(async move {
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_secs(3)).await;
+//     //         trace!( "接收 -指令: ");
+//     //     }
+//     // });
+//     // try_join!(t01,t02).unwrap();
+// 
+// 
+//     // let (mut tx_end, mut rx_end) = channel::<String>(1024);
+//     // let (mut tx_read, mut rx_read) = channel::<String>(1024);
+//     // let mut stream = tokio::net::TcpStream::connect("127.0.0.1:8080").await.unwrap();
+//     // stream.write_all( b"Hello, server!").await.unwrap();
+//     // stream.flush().await.unwrap();
+//     // let mutex_stream = Arc::new(Mutex::new(stream));
+//     //
+//     // //捕捉用户的主动发送的订阅指令
+//     // let stream_clone = Arc::clone(&mutex_stream);
+//     // let t_1 = tokio::spawn(async move {
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_secs(1)).await;
+//     //         if let Ok(received) = rx_end.try_recv() {
+//     //             trace!("动态订阅内容: {:?}", received);
+//     //             let mut stream_lock = stream_clone.lock().await;
+//     //             // stream_lock.write_all( b"1111!").await.unwrap();
+//     //             // stream_lock.flush().await.unwrap();
+//     //
+//     //             // stream_lock.write_all(b"Hello, server!").await.unwrap();
+//     //         }
+//     //     }
+//     // });
+//     //
+//     //
+//     // //socket数据获取,装入回显通道
+//     // let stream_clone = Arc::clone(&mutex_stream);
+//     // let t_2 = tokio::spawn(async move {
+//     //     // 创建一个用于存储服务器响应的缓冲区
+//     //     let mut buffer = [0; 512];
+//     //     loop {
+//     //         let mut stream_lock = stream_clone.lock().await;
+//     //         tokio::time::sleep(Duration::from_secs(1)).await;
+//     //
+//     //         let _ = match stream_lock.read(&mut buffer).await {
+//     //             Ok(n) => {
+//     //                 tokio::time::sleep(Duration::from_secs(1)).await;
+//     //                 if n == 0 {
+//     //                     // 没有读取到数据
+//     //                     trace!("没有数据,主动发送");
+//     //                 } else {
+//     //                     // 打印服务器的响应
+//     //                     trace!("有数据: {}", String::from_utf8_lossy(&buffer[..n]));
+//     //                     tx_read.send(format!("{}", String::from_utf8_lossy(&buffer[..n]))).await.unwrap()
+//     //                 }
+//     //             }
+//     //             Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
+//     //                 // 如果读取操作会阻塞,则等待一会儿再试
+//     //                 trace!("Would block, sleeping会阻碍睡眠??");
+//     //                 tokio::time::sleep(Duration::from_secs(3)).await;
+//     //                 continue;
+//     //             }
+//     //             Err(e) => {
+//     //                 trace!("Err:{:?}",e);
+//     //                 break;
+//     //             }
+//     //         };
+//     //     }
+//     // });
+//     //
+//     //
+//     // //socket 数据回显
+//     // let t02 = tokio::spawn(async move {
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_secs(1)).await;
+//     //         // tx.send("hai!!!".to_string()).await.unwrap();
+//     //         if let Ok(received) = rx_read.try_recv() {
+//     //             trace!("拿到 socket 的数据: {:?}", received);
+//     //         }
+//     //     }
+//     // });
+//     //
+//     // //模拟用户动态发送
+//     // let t03 = tokio::spawn(async move {
+//     //     loop {
+//     //         tokio::time::sleep(Duration::from_secs(1)).await;
+//     //         tx_end.send("这里是 动态订阅".to_string()).await.unwrap();
+//     //     }
+//     // });
+//     //
+//     // try_join!(t_1,t_2,t02,t03).unwrap();
 // }
-//
-//
-// fn handle_connection(mut stream: TcpStream) {
-//     let buf_reader = BufReader::new(&mut stream);
-//     let http_request: Vec<_> = buf_reader
-//         .lines()
-//         .map(|result| result.unwrap())
-//         .take_while(|line| !line.is_empty())
-//         .collect();
-//     trace!("Request: {:#?}", http_request);
-//     trace!("Request2: {:#?}", http_request[0]);
-//     trace!("Request3: {:#?}", http_request[1]);
-//
-//     let (status_line, filename) = if http_request[0] == "GET / HTTP/1.1" {
-//         ("HTTP/1.1 200 OK", "hello.html")
-//     } else {
-//         ("HTTP/1.1 404 NOT FOUND", "404.html")
-//     };
-//
-//     let status_line = "HTTP/1.1 200 OK";
-//     let contents = fs::read_to_string("src/404.html").unwrap();
-//     let length = contents.len();
-//
-//     let response =
-//         format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
-//     // let response = "HTTP/1.1 200 OK\r\n\r\nccccc";
-//
-//     stream.write_all(response.as_bytes()).unwrap();
+// 
+// 
+// async fn demo_okx_rest() {
+//     // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // btree_map.insert("access_key".to_string(), "".to_string());
+//     // btree_map.insert("secret_key".to_string(), "".to_string());
+//     // btree_map.insert("pass_key".to_string(), "".to_string());
+//     //
+//     // let mut okx_rest = OkxSwapRest::new(false, btree_map);
+//     // let res_data = okx_rest.get_account("BTC".to_string()).await;
+//     // trace!("okx_rest-rest - get_account- {:?}", res_data);
 // }
+// 
+// async fn demo_ws_gate() {}
+// 
+// 
+// fn demo_so() {
+//     // 代理服务器地址和端口
+//     // let proxy_address = "127.0.0.1:7890";
+//     // // 目标服务器地址和端口
+//     // let target_address = "wss://ws.okx.com:8443/ws/v5/public";
+//     //
+//     //   // 建立与代理服务器的连接
+//     //   let mut proxy_stream = TcpStream::connect(proxy_address).expect("Failed to connect to proxy");
+//     //
+//     //   // 发送代理请求
+//     //   let request = format!("CONNECT {}\r\n\r\n", target_address);
+//     //   proxy_stream.write_all(request.as_bytes()).expect("Failed to send proxy request");
+//     //
+//     //   // 读取代理响应
+//     //   let mut response = String::new();
+//     //   proxy_stream.read_to_string(&mut response).expect("Failed to read proxy response");
+//     //
+//     //   // 检查代理响应是否成功
+//     //   if !response.contains("200 Connection established") {
+//     //       trace!("Proxy connection failed: {}", response);
+//     //   }
+//     //
+//     //   // 从代理连接中获取原始 TCP 流
+//     //   let mut tcp_stream = std::mem::ManuallyDrop::new(proxy_stream);
+//     //
+//     //   // 现在你可以使用 `tcp_stream` 来进行与目标服务器的通信
+//     //   // 例如,发送和接收数据
+//     //   // tcp_stream.write_all(b"Hello, server!").expect("Failed to send data");
+//     //
+//     //   thread::spawn(move || {
+//     //       loop {
+//     //           let mut buffer = [0u8; 1024]; // 用于存储读取的数据的缓冲区
+//     //           let bytes_read = tcp_stream.read(&mut buffer).expect("Failed to read data");
+//     //
+//     //           // 将读取的数据转换为字符串并打印
+//     //           if let Ok(data) = std::str::from_utf8(&buffer[..bytes_read]) {
+//     //               trace!("Received data: {}", data);
+//     //           } else {
+//     //               trace!("Received data contains non-UTF8 characters");
+//     //           }
+//     //       }
+//     //
+//     //   });
+//     //
+//     //   // 最后记得手动释放套接字
+//     //   // 注意:不要调用 `drop(tcp_stream)`,因为我们使用了 `ManuallyDrop` 来避免自动释放
+//     //   unsafe {
+//     //       std::mem::ManuallyDrop::drop(&mut tcp_stream);
+//     //   }
+// }
+// 
+// 
+// async fn demo_ws_okx_pu() {
+// 
+//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // let (tx, mut rx) = channel(1024);
+//     // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Public, tx);
+//     // ku_ws.set_subscribe(vec![OkxSubscribeType::PuIndexTickers]);
+//     // let t1 = tokio::spawn(async move {
+//     //     ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
+//     // });
+//     // let t2 = tokio::spawn(async move {
+//     //     let mut stdout = std::io::stdout();
+//     //     loop {
+//     //         if let Ok(received) = rx.try_recv() {
+//     //             writeln!(stdout, "age: {:?}", received).unwrap();
+//     //         }
+//     //     }
+//     // });
+//     // try_join!(t1,t2).unwrap();
+// }
+// 
+// async fn demo_ws_okx_bu() {
+//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // let (tx, mut rx) = channel(1024);
+//     // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Business, tx);
+//     // ku_ws.set_subscribe(vec![OkxSubscribeType::BuIndexCandle30m]);
+//     // let t1 = tokio::spawn(async move {
+//     //     ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
+//     // });
+//     // let t2 = tokio::spawn(async move {
+//     //     let mut stdout = std::io::stdout();
+//     //     loop {
+//     //         if let Ok(received) = rx.try_recv() {
+//     //             writeln!(stdout, "age: {:?}", received).unwrap();
+//     //         }
+//     //     }
+//     // });
+//     // try_join!(t1,t2).unwrap();
+// }
+// 
+// async fn demo_ws_kucoin_pr() {
+//     // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//     // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // btree_map.insert("access_key".to_string(), "".to_string());
+//     // btree_map.insert("secret_key".to_string(), "".to_string());
+//     // btree_map.insert("pass_key".to_string(), "".to_string());
+//     // trace!("----------------------btree_map{:?}", btree_map.clone());
+//     // let (tx, mut rx) = channel(1024);
+//     // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
+//     //                                   KucoinWsType::Private, tx).await;
+//     // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
+//     //
+//     // let t1 = tokio::spawn(async move {
+//     //     ku_ws.custom_subscribe(is_shutdown_arc, vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
+//     // });
+//     //
+//     // let t2 = tokio::spawn(async move {
+//     //     loop {
+//     //         if let Ok(received) = rx.try_recv() {
+//     //             trace!( "age: {:?}", received);
+//     //         }
+//     //     }
+//     // });
+//     //
+//     // try_join!(t1,t2).unwrap();
+// }
+// 
+// async fn demo_ws_kucoin_pu() {
+//     // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // let (tx, mut rx) = channel(1024);
+//     // let mut ku_ws = KucoinSwapWs::new(false, btree_map, KucoinWsType::Public, tx).await;
+//     // ku_ws.set_subscribe(vec![
+//     //     KucoinSubscribeType::PuContractMarketLevel2Depth50,
+//     //     KucoinSubscribeType::PuContractMarkettickerV2,
+//     // ]);
+//     //
+//     // let t1 = tokio::spawn(async move {
+//     //     ku_ws.custom_subscribe(is_shutdown_arc, vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
+//     // });
+//     // let t2 = tokio::spawn(async move {
+//     //     loop {
+//     //         if let Ok(received) = rx.try_recv() {
+//     //             trace!("age: {:?}", received);
+//     //         }
+//     //     }
+//     // });
+//     //
+//     // try_join!(t1,t2).unwrap();
+// }
+// 
+// async fn demo_rest_kucoin() {
+//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     btree_map.insert("access_key".to_string(), "".to_string());
+//     btree_map.insert("secret_key".to_string(), "".to_string());
+//     btree_map.insert("pass_key".to_string(), "".to_string());
+// 
+//     let mut kucoin_exc = KucoinSwapRest::new(false, btree_map);
+//     // let res_data = kucoin_exc.get_server_time().await;
+//     // trace!("kucoin_exc-rest - get_server_time- {:?}", res_data);
+//     // trace!("kucoin_exc-rest-get_delays{:?}", kucoin_exc.get_delays() );
+//     // trace!("kucoin_exc-rest -get_avg_delay{:?}", kucoin_exc.get_avg_delay());
+//     // let res_data = kucoin_exc.get_account("USDT".to_string()).await;
+//     // trace!("kucoin_exc-rest - get_account- {:?}", res_data);
+//     // let res_data = kucoin_exc.get_position("XBT1USDM".to_string()).await;
+//     // trace!("kucoin_exc-rest - get_position- {:?}", res_data);
+//     // let res_data = kucoin_exc.get_market_details().await;
+//     // trace!("kucoin_exc-rest - get_market_details- {:?}", res_data);
+//     // let res_data = kucoin_exc.get_ticker("ROSEUSDTM".to_string()).await;
+//     // trace!("kucoin_exc-rest - get_ticker- {:?}", res_data);
+//     let res_data = kucoin_exc.get_orders("".to_string(),
+//                                          "".to_string()).await;
+//     trace!("kucoin_exc-rest - get_orders- {:?}", res_data);
+//     // let res_data = kucoin_exc.get_positions("USDT".to_string()).await;
+//     // trace!("kucoin_exc-rest - get_positions- {:?}", res_data);
+//     // let res_data = kucoin_exc.get_orders_details("111".to_string(), "".to_string()).await;
+//     // trace!("kucoin_exc-rest - get_orders_details- {:?}", res_data);
+//     // let res_data = kucoin_exc.swap_bazaar_order(
+//     //     "cs_202309111808".to_string(),
+//     //     "ROSEUSDTM".to_string(),
+//     //     "pd".to_string(),
+//     //     1,
+//     //     "10".to_string(),
+//     //     "0.03856".to_string(),
+//     //     "limit".to_string(),
+//     // ).await;
+//     // trace!("kucoin_exc-rest - swap_bazaar_order- {:?}
+//     // let res_data = kucoin_exc.cancel_order("".to_string(), "999999".to_string()).await;
+//     // trace!("kucoin_exc-rest - cancel_order- {:?}", res_data);
+//     // let res_data = kucoin_exc.get_public_token().await;
+//     // trace!("kucoin_exc-rest - get_public_token- {:?}", res_data);
+// }
+// 
+// async fn demo_rest_gate() {
+//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     btree_map.insert("access_key".to_string(), "".to_string());
+//     btree_map.insert("secret_key".to_string(), "".to_string());
+// 
+//     let mut gate_exc = GateSwapRest::new(false, btree_map);
+//     let res_data = gate_exc.get_account("usdt".to_string()).await;
+//     trace!("gate-rest -账户信息{:?}", res_data);
+//     trace!("gate-rest -get_delays{:?}", gate_exc.get_delays() );
+//     trace!("gate-rest -get_avg_delay{:?}", gate_exc.get_avg_delay());
+//     // let res_data = gate_exc.get_position("usdt".to_string(), "CYBER_USDT".to_string()).await;
+//     // trace!("gate-rest -持仓信息{:?}", res_data);
+//     // let res_data = gate_exc.get_ticker("usdt".to_string()).await;
+//     // trace!("gate-rest -ticker{:?}", res_data);
+//     // let res_data = gate_exc.get_server_time().await;
+//     // trace!("gate-rest -get_server_time{:?}", res_data);
+//     // let res_data = gate_exc.get_user_position("usdt".to_string()).await;
+//     // trace!("gate-rest -get_server_time{:?}", res_data);
+//     // let res_data = gate_exc.get_order_details("usdt".to_string(), "11335522".to_string()).await;
+//     // trace!("gate-rest -get_order_details{:?}", res_data);
+//     // let res_data = gate_exc.get_orders("usd1t".to_string(), "open".to_string()).await;
+//     // trace!("gate-rest -get_orders{:?}", res_data);
+//     // let params = serde_json::json!({
+//     //         "contract":"CYBER_USDT",
+//     //         "size":-1,
+//     //         "price":"0",
+//     //         "tif":"ioc",
+//     //      });
+//     // let res_data = gate_exc.take_order("usdt".to_string(), params).await;
+//     // trace!("gate-rest -get_orders{:?}", res_data);
+//     // let res_data = gate_exc.setting_dual_mode("usdt".to_string(), true).await;
+//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
+//     // let res_data = gate_exc.setting_dual_leverage("usdt".to_string(),
+//     //                                               "CYBER_USDT".to_string(),
+//     //                                               "20".to_string(),
+//     // ).await;
+//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
+//     // let res_data = gate_exc.wallet_transfers("usdt".to_string(),
+//     //                                               "CYBER_USDT".to_string(),
+//     //                                               "20".to_string(),
+//     // ).await;
+//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
+//     // let res_data = gate_exc.cancel_order("usdt".to_string(),
+//     //                                      "12345".to_string(),
+//     // ).await;
+//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
+//     // let res_data = gate_exc.cancel_orders("usdt".to_string(),
+//     //                                      "CYBER_USDT".to_string(),
+//     // ).await;
+//     // trace!("gate-rest -cancel_orders{:?}", res_data);
+//     // let res_data = gate_exc.order(
+//     //     "usdt".to_string(),
+//     //     "long".to_string(),
+//     //     "buy".to_string(),
+//     //     "ROSE_USDT".to_string(),
+//     //     1,
+//     //     "0.03888".to_string(),
+//     //     "t-my-custom-id-001".to_string(),
+//     // ).await;
+//     // trace!("gate-rest -order{:?}", res_data);
+// 
+// 
+//     // let res_data = gate_exc.my_trades("usdt".to_string()).await;
+//     // trace!("gate-rest -my_trades{:?}", res_data);
+//     let res_data = gate_exc.account_book("usdt".to_string()).await;
+//     trace!("gate-rest -account_book{:?}", res_data);
+// }
+// 
+// async fn demo_rest_ba() {
+//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     btree_map.insert("access_key".to_string(), "".to_string());
+//     btree_map.insert("secret_key".to_string(), "".to_string());
+// 
+//     // let ba_exc = BinanceUsdtSwapRest::new(false, btree_map);
+//     // let res_data = ba_exc.get_account().await;
+//     let mut ba_exc = BinanceSwapRest::new(false, btree_map);
+//     // let res_data = ba_exc.get_server_time().await;
+//     // trace!("币安-rest - get_server_time{:?}", res_data);
+//     // let res_data = ba_exc.get_exchange_info().await;
+//     // trace!("币安-restget_ get_exchange_info{:?}", res_data);
+// 
+// 
+//     let res_data = ba_exc.get_account().await;
+//     trace!("币安-rest-获取账户信息{:?}", res_data);
+//     // trace!("币安-rest- -get_delays{:?}", ba_exc.get_delays() );
+//     // trace!("币安-rest--get_avg_delay{:?}", ba_exc.get_avg_delay());
+// 
+//     // let res_data = ba_exc.get_order("BTCUSDT".to_string(), 131, "".to_string()).await;
+//     // trace!("币安-rest--get_order{:?}", res_data);
+//     // let res_data = ba_exc.get_open_orders("BTCUSDT".to_string()).await;
+//     // trace!("币安-rest--get_open_orders{:?}", res_data);
+//     // let timestamp_start = chrono::Utc::now().timestamp_millis() - 60 * 100 * 1000;
+//     // let timestamp_end = chrono::Utc::now().timestamp_millis() +  60 * 100 * 1000;
+//     // let res_data = ba_exc.get_all_orders("BTCUSDT".to_string(), 1000, timestamp_start, timestamp_end).await;
+//     // trace!("币安-rest--get_all_orders{:?}", res_data);
+//     // let res_data = ba_exc.get_book_ticker("BTCUSDT".to_string()).await;
+//     // trace!("币安-rest--get_book_ticker{:?}", res_data);
+//     // let res_data = ba_exc.get_position_risk("BTCUS1DT".to_string()).await;
+//     // trace!("币安-rest--get_position_risk{:?}", res_data);
+//     // let res_data = ba_exc.change_pos_side(true).await;
+//     // trace!("币安-rest--change_pos_side{:?}", res_data);
+//     // let res_data = ba_exc.cancel_order("BTCUSDT".to_string(), 3312331, "".to_string()).await;
+//     // trace!("币安-rest--cancel_order{:?}", res_data);
+// }
+// 
+// async fn demo_pub_ws_ba() {
+//     // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
+//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
+//     // let (tx, mut rx) = channel(1024);
+//     // let mut binance_ws = BinanceSwapWs::new(false, btree_map, BinanceWsType::PublicAndPrivate, tx);
+//     // binance_ws.set_subscribe(vec![
+//     //     BinanceSubscribeType::PuAggTrade,
+//     //     BinanceSubscribeType::PuDepth20levels100ms,
+//     //     BinanceSubscribeType::PuBookTicker,
+//     // ]);
+//     // let t1 = tokio::spawn(async move {
+//     //     binance_ws.custom_subscribe(is_shutdown_arc,vec!["BTCUSDT".to_string()]).await;
+//     // });
+//     // let t2 = tokio::spawn(async move {
+//     //     loop {
+//     //         if let Ok(received) = rx.try_recv() {
+//     //             trace!( "age: {:?}", received);
+//     //         }
+//     //     }
+//     // });
+//     // try_join!(t1,t2).unwrap();
+// }
+// 
+// fn demo_get_http_proxy() {
+//     //代理地址
+//     let parsing_detail = proxy::ParsingDetail::parsing_environment_variables();
+//     trace!("----代理信息:{:?}", parsing_detail);
+// }
+// 
+// 
+// // /*********************web服务*/
+// // fn demo_http() {
+// //     let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
+// //     for stream in listener.incoming() {
+// //         let stream = stream.unwrap();
+// //
+// //         handle_connection(TcpStream::try_from(stream).unwrap());
+// //     }
+// // }
+// //
+// //
+// // fn handle_connection(mut stream: TcpStream) {
+// //     let buf_reader = BufReader::new(&mut stream);
+// //     let http_request: Vec<_> = buf_reader
+// //         .lines()
+// //         .map(|result| result.unwrap())
+// //         .take_while(|line| !line.is_empty())
+// //         .collect();
+// //     trace!("Request: {:#?}", http_request);
+// //     trace!("Request2: {:#?}", http_request[0]);
+// //     trace!("Request3: {:#?}", http_request[1]);
+// //
+// //     let (status_line, filename) = if http_request[0] == "GET / HTTP/1.1" {
+// //         ("HTTP/1.1 200 OK", "hello.html")
+// //     } else {
+// //         ("HTTP/1.1 404 NOT FOUND", "404.html")
+// //     };
+// //
+// //     let status_line = "HTTP/1.1 200 OK";
+// //     let contents = fs::read_to_string("src/404.html").unwrap();
+// //     let length = contents.len();
+// //
+// //     let response =
+// //         format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
+// //     // let response = "HTTP/1.1 200 OK\r\n\r\nccccc";
+// //
+// //     stream.write_all(response.as_bytes()).unwrap();
+// // }