瀏覽代碼

解决钩子借用问题

gepangpang 2 年之前
父節點
當前提交
2c3cd0df68
共有 3 個文件被更改,包括 46 次插入42 次删除
  1. 5 5
      src/exchange_libs.rs
  2. 36 34
      src/exchange_middle_ware.rs
  3. 5 3
      src/main.rs

+ 5 - 5
src/exchange_libs.rs

@@ -539,7 +539,7 @@ impl SocketTool {
             subscription: subscription,
         }
     }
-    pub(crate) fn run(&self, parse_fn: impl Fn(ReqData)) {
+    pub(crate) fn run<F: FnMut(ReqData)>(&self, mut parse_fn: F) {
         while true {//一个粗糙的 断开重连操作
             /*****消息溜***/
             let mut stdout = io::stdout();
@@ -780,13 +780,13 @@ impl SocketTool {
     }
 
     //币安--深度信息
-    pub fn binance_run_depth(b_array: Vec<&str>, levels: String, parse_fn: impl Fn(ReqData)) {
+    pub fn binance_run_depth<F: FnMut(ReqData)>(b_array: Vec<&str>, levels: String, parse_fn: F) {
         let str = format!("depth{}@100ms", levels);
         SocketTool::binance_run(b_array, str.to_string(), parse_fn);
     }
 
     //币安--订阅
-    pub fn binance_run(b_array: Vec<&str>, subscription_name: String, parse_fn: impl Fn(ReqData)) {
+    pub fn binance_run<F: FnMut(ReqData)>(b_array: Vec<&str>, subscription_name: String, parse_fn: F) {
         let mut params = vec![];
 
         for item in &b_array {
@@ -817,7 +817,7 @@ impl SocketTool {
 
 
     //OKX-私有频道-订单信息
-    pub fn okx_pr_run_orders(b_array: Vec<&str>, btree_map: BTreeMap<String, String>, parse_fn: impl Fn(ReqData)) {
+    pub fn okx_pr_run_orders<F: FnMut(ReqData)>(b_array: Vec<&str>, btree_map: BTreeMap<String, String>, parse_fn: F) {
         //组装推送信息
         let mut args = vec![];
         for item in &b_array {
@@ -833,7 +833,7 @@ impl SocketTool {
     }
 
     //OKX-私有频道-订阅
-    pub fn okx_pr_run(b_array: Vec<&str>, args: Vec<HashMap<String, String>>, btree_map: BTreeMap<String, String>, parse_fn: impl Fn(ReqData)) {
+    pub fn okx_pr_run<F: FnMut(ReqData)>(b_array: Vec<&str>, args: Vec<HashMap<String, String>>, btree_map: BTreeMap<String, String>, parse_fn: F) {
         let url = "wss://ws.okx.com:8443/ws/v5/private";
 
         let pu = "wss://ws.okx.com:8443/ws/v5/public";

+ 36 - 34
src/exchange_middle_ware.rs

@@ -1,4 +1,4 @@
-use std::io::{ Error, ErrorKind};
+use std::io::{BufRead, Error, ErrorKind};
 use std::collections::{BTreeMap};
 use serde_json::json;
 use crate::exchange_libs::{BinanceExc, OkxExc, ReqData, SocketTool};
@@ -119,7 +119,7 @@ impl Exchange {
     // 获取币安深度信息
     // symbol: 交易币对, "BTC_USDT"
     // limit: 返回条数, 最大 5000. 可选值:[5, 10, 20, 50, 100, 500, 1000, 5000]
-    pub async fn get_binance_depth(&self, symbol: &String, limit: i32, callback: fn(Depth)) {
+    pub async fn get_binance_depth<F: FnMut(Depth)>(&self, symbol: &String, limit: i32, mut callback: F) {
         let real_symbol = self.get_real_symbol(symbol, "".to_string());
         let get_res_data =|res_data:ReqData|{
             if res_data.code == "0" {
@@ -257,38 +257,40 @@ impl Exchange {
     // symbol: 交易币对, "BTC_USDT"
     // order_id: 订单ID, "590910403358593111"
     pub async fn get_okx_instruments(&self, symbol: &String) {
-        let real_symbol = self.get_real_symbol(symbol, "-".to_string());
-        let mut btree_map: BTreeMap<&str, &str> = BTreeMap::new();
-        btree_map.insert("instType", "SPOT");
-        let result = self.okx_exc.get_v("/api/v5/public/instruments".to_string(), btree_map).await;
-        match result {
-            Ok(res_data) => {
-                let symbol_array: Vec<&str> = symbol.split("_").collect();
-                let res_data_str = res_data.data;
-                let res_data_json: serde_json::Value = serde_json::from_str(&*res_data_str).unwrap();
-                let order_info = res_data_json["data"].as_array().unwrap();
-                let info = order_info.iter().find(|item| item["baseCcy"].as_str().unwrap() == symbol_array[0] && item["quoteCcy"].as_str().unwrap() == symbol_array[1]).unwrap();
-                println!("\n\n{:?}", info);
-
-                let result = Market {
-                    symbol: info["instId"].as_str().unwrap().parse().unwrap(),
-                    base_asset: info["baseCcy"].as_str().unwrap().parse().unwrap(),
-                    quote_asset: info["quoteCcy"].as_str().unwrap().parse().unwrap(),
-                    tick_size: 0.01,
-                    amount_size: 0.01,
-                    price_precision: 0.01,
-                    amount_precision: 0.01,
-                    min_qty: 0.01,
-                    max_qty: 0.01,
-                    min_notional: 0.01,
-                    max_notional: 0.01,
-                    ct_val: 0.01,
-                };
-                println!("\n\n{:?}", result);
-                // let order_info = res_data_json;
-            }
-            Err(err) => {}
-        }
+        // let real_symbol = self.get_real_symbol(symbol, "-".to_string());
+        // let mut btree_map: BTreeMap<&str, &str> = BTreeMap::new();
+        // btree_map.insert("instType", "SPOT");
+        // let result = self.okx_exc.get_v("/api/v5/public/instruments".to_string(), btree_map).await;
+        // match result {
+        //     Ok(res_data) => {
+        //         let symbol_array: Vec<&str> = symbol.split("_").collect();
+        //         let res_data_str = res_data.data;
+        //         let res_data_json: serde_json::Value = serde_json::from_str(&*res_data_str).unwrap();
+        //         let order_info = res_data_json["data"].as_array().unwrap();
+        //         let info = order_info.iter().find(|item| item["baseCcy"].as_str().unwrap() == symbol_array[0] && item["quoteCcy"].as_str().unwrap() == symbol_array[1]).unwrap();
+        //         println!("\n\n{:?}", info);
+        //
+        //         let min_qty = info["minSz"].as_str().unwrap_or("0").parse().unwrap_or(0.0);
+        //         let amount_size = info["lotSz"].as_str().unwrap_or("0").parse().unwrap_or(0.0);
+        //         let result = Market {
+        //             symbol: info["instId"].as_str().unwrap().parse().unwrap(),
+        //             base_asset: info["baseCcy"].as_str().unwrap().parse().unwrap(),
+        //             quote_asset: info["quoteCcy"].as_str().unwrap().parse().unwrap(),
+        //             tick_size: info["tickSz"].as_str().unwrap_or("0").parse().unwrap_or(0.0),
+        //             amount_size,
+        //             price_precision: info["tickSz"].as_str().unwrap().parse().to_string().split(".").collect()[1],
+        //             amount_precision:info["lotSz"].as_str().unwrap().parse().to_string().split(".").collect()[1],
+        //             min_qty,
+        //             max_qty: info["minSz"].as_str().unwrap_or("0").parse().unwrap_or(0.0),
+        //             min_notional: amount_size * min_qty,
+        //             max_notional: 0.01,
+        //             ct_val: info["ctVal"].as_str().unwrap_or("0").parse().unwrap_or(0.0),
+        //         };
+        //         println!("\n\n{:?}", result);
+        //         // let order_info = res_data_json;
+        //     }
+        //     Err(err) => {}
+        // }
         // let real_symbol = self.get_real_symbol(symbol, "-".to_string());
         // let res_data = self.okx_exc.get_v("/api/v5/public/instruments", order_id).await;
         // if res_data.code == "0" {

+ 5 - 3
src/main.rs

@@ -96,10 +96,11 @@ impl Bot {
             self.spread_list.remove(0);
         }
         self.spread_list.push(spread);
+
+        println!("depth handler {:?}", depth);
     }
 
     async fn start(&mut self){
-        is_proxy();
         // 使用std::env::var函数获取环境变量的值
         let okx_access_key= env::var("okx_access_key").unwrap();
         let okx_secret_key= env::var("okx_secret_key").unwrap();
@@ -107,8 +108,9 @@ impl Bot {
 
         let exchange:Exchange = Exchange::new(okx_access_key, okx_secret_key, okx_passphrase);
         let bot = self;
-        let get_depth_fn = |depth:&Depth| Self::depth_handler(&mut *bot, depth);
-        exchange.get_binance_depth(&bot.symbol, 10, get_depth_fn).await;
+        let symbol_clone = bot.symbol.clone();
+        let get_depth_fn = |depth:Depth| Self::depth_handler(&mut *bot, &depth);
+        exchange.get_binance_depth(&symbol_clone, 10, get_depth_fn).await;
 
         loop {
             let f = match bot.do_logic(&exchange).await {