Преглед изворни кода

Merge branch 'dev' into test

skyffire пре 1 година
родитељ
комит
4d5f5484de
3 измењених фајлова са 38 додато и 4 уклоњено
  1. 2 0
      src/main.rs
  2. 35 3
      src/server.rs
  3. 1 1
      standard/src/bybit_swap.rs

+ 2 - 0
src/main.rs

@@ -91,6 +91,8 @@ async fn main() {
     let mut quant = quant_arc.lock().await;
     quant.exit().await;
     info!("程序已退出!为以防万一,请再次检查仓位和订单!");
+    // 等两秒,等中控反应过来
+    tokio::time::sleep(Duration::from_secs(2)).await;
     // 强制退出
     std::process::exit(0);
 }

+ 35 - 3
src/server.rs

@@ -1,5 +1,6 @@
 use std::sync::Arc;
 use std::sync::atomic::{AtomicBool, Ordering};
+use std::time::Duration;
 use actix_web::{web, App, HttpResponse, HttpServer, Responder, post, get};
 use tokio::sync::Mutex;
 use tracing::{info};
@@ -8,14 +9,14 @@ use global::cci::CentralControlInfo;
 #[derive(Clone)]
 struct Arcs {
     running: Arc<AtomicBool>,
-    cci_arc: Arc<Mutex<CentralControlInfo>>
+    cci_cache_arc: Arc<Mutex<CentralControlInfo>>
 }
 
 // 句柄 GET 请求
 #[get("/account")]
 async fn get_account(arcs: web::Data<Arcs>) -> impl Responder {
     // --------------------------------数据解锁处理--------------------------------
-    let cci = arcs.cci_arc.lock().await;
+    let cci = arcs.cci_cache_arc.lock().await;
 
     // --------------------------------回报--------------------------------
     let json_string = serde_json::to_string(&(cci.clone())).unwrap();
@@ -29,13 +30,44 @@ async fn on_change(arcs: web::Data<Arcs>) -> impl Responder {
     HttpResponse::Ok().body("程序已收到退出信号,将在清退仓位后退出。".to_string())
 }
 
+pub fn run_cci_cache(cci_arc: Arc<Mutex<CentralControlInfo>>) -> Arc<Mutex<CentralControlInfo>> {
+    // cci缓存,防止中控因等待时间过长杀死rust
+    let cci_cache = CentralControlInfo {
+        now_balance: Default::default(),
+        unrealized_pn_l: Default::default(),
+        pos: Default::default(),
+        entry_price: Default::default(),
+        now_price: Default::default(),
+    };
+    let cci_cache_arc = Arc::new(Mutex::new(cci_cache));
+    let cci_cache_arc_clone = cci_cache_arc.clone();
+    tokio::spawn(async move {
+        loop {
+            tokio::time::sleep(Duration::from_secs(1)).await;
+
+            let cci = cci_arc.lock().await;
+            {
+                let mut cci_cache = cci_cache_arc_clone.lock().await;
+                cci_cache.now_price = cci.now_price;
+                cci_cache.pos = cci.pos;
+                cci_cache.unrealized_pn_l = cci.unrealized_pn_l;
+                cci_cache.now_balance = cci.now_balance;
+                cci_cache.entry_price = cci.entry_price;
+            }
+        }
+    });
+
+    return cci_cache_arc;
+}
+
 pub fn run_server(port: u32, running: Arc<AtomicBool>, cci_arc: Arc<Mutex<CentralControlInfo>>) {
     let addr = format!("0.0.0.0:{}", port);
     info!("中控绑定地址:{}", addr);
 
+    // 启动server
     let arcs = Arcs {
         running: running.clone(),
-        cci_arc: cci_arc.clone(),
+        cci_cache_arc: run_cci_cache(cci_arc),
     };
 
     let server_fut = HttpServer::new(move || {

+ 1 - 1
standard/src/bybit_swap.rs

@@ -362,7 +362,7 @@ impl Platform for BybitSwap {
     async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
         let symbol = self.symbol_uppercase.clone();
         let ct_val = self.market.ct_val;
-        let size = (amount / ct_val).floor();
+        let size = amount / ct_val;
         let mut params = json!({
             "orderLinkId": format!("t-{}", custom_id),
             "symbol": symbol.to_string(),