Bladeren bron

倉位識別修復2.

skyfffire 1 jaar geleden
bovenliggende
commit
3953fa37c4
3 gewijzigde bestanden met toevoegingen van 52 en 8 verwijderingen
  1. 46 4
      standard/src/bybit_swap.rs
  2. 6 3
      standard/src/bybit_swap_handle.rs
  3. 0 1
      strategy/src/bybit_usdt_swap.rs

+ 46 - 4
standard/src/bybit_swap.rs

@@ -12,9 +12,8 @@ use serde::{Deserialize, Serialize};
 use tokio::time::Instant;
 use tracing::{error, info, trace};
 use exchanges::bybit_swap_rest::BybitSwapRest;
-use crate::{Platform, ExchangeEnum, Account, Position, Ticker, Market, Order, OrderCommand};
+use crate::{Platform, ExchangeEnum, Account, Position, Ticker, Market, Order, OrderCommand, PositionModeEnum};
 use global::trace_stack::TraceStack;
-use crate::bybit_swap_handle::format_position_item;
 
 #[derive(Debug, Clone, Deserialize, Serialize)]
 #[serde(rename_all = "camelCase")]
@@ -162,7 +161,7 @@ impl Platform for BybitSwap {
         let ct_val = self.market.multiplier;
         let res_data = self.request.get_positions(symbol, "".to_string()).await;
         if res_data.code == 200 {
-            let result = res_data.data["list"].as_array().unwrap().iter().map(|item| { format_position_item(item, &ct_val) }).collect();
+            let result = res_data.data["list"].as_array().unwrap().iter().map(|item| { format_position_item(item, ct_val) }).collect();
             Ok(result)
         } else {
             Err(Error::new(ErrorKind::Other, res_data.to_string()))
@@ -175,7 +174,7 @@ impl Platform for BybitSwap {
         let res_data = self.request.get_positions("".to_string(), symbol_array[1].to_string().to_uppercase()).await;
         if res_data.code == 200 {
             info!("{}", res_data.data.to_string());
-            let result = res_data.data["list"].as_array().unwrap().iter().map(|item| { format_position_item(item, &ct_val) }).collect();
+            let result = res_data.data["list"].as_array().unwrap().iter().map(|item| { format_position_item(item, ct_val) }).collect();
             Ok(result)
         } else {
             Err(Error::new(ErrorKind::Other, res_data.to_string()))
@@ -651,6 +650,49 @@ impl Platform for BybitSwap {
     }
 }
 
+pub fn format_position_item(position: &Value, ct_val: Decimal) -> Position {
+    let position_idx = position["positionIdx"].to_string();
+    let mut position_mode = match position_idx.as_str() {
+        "0" => PositionModeEnum::Both,
+        "1" => PositionModeEnum::Long,
+        "2" => PositionModeEnum::Short,
+        _ => {
+            error!("bybit_swap:格式化持仓模式错误!\nformat_position_item:position={:?}", position);
+            panic!("bybit_swap:格式化持仓模式错误!\nformat_position_item:position={:?}", position)
+        }
+    };
+    let size_str: String = from_value(position["size"].clone()).unwrap();
+    let size = Decimal::from_str(size_str.as_str()).unwrap();
+    let side = position["side"].as_str().unwrap().to_string();
+    let amount = size * ct_val;
+    let mut profit = Decimal::ZERO;
+    let profit_str = position["unrealisedPnl"].as_str().unwrap_or("0");
+    if profit_str != "" {
+        profit = Decimal::from_str(profit_str).unwrap();
+    }
+
+    match position_mode {
+        PositionModeEnum::Both => {
+            position_mode = match side.as_str() {
+                "Buy" => PositionModeEnum::Long,
+                "Sell" => PositionModeEnum::Short,
+                _ => { PositionModeEnum::Both }
+            }
+        }
+        _ => {}
+    }
+    Position {
+        symbol: position["symbol"].as_str().unwrap_or("").parse().unwrap(),
+        margin_level: Decimal::from_str(position["leverage"].as_str().unwrap()).unwrap(),
+        amount,
+        frozen_amount: Decimal::ZERO,
+        price: Decimal::from_str(position["avgPrice"].as_str().unwrap()).unwrap(),
+        profit,
+        position_mode,
+        margin: Decimal::from_str(position["positionBalance"].as_str().unwrap()).unwrap(),
+    }
+}
+
 fn format_cancel_order_item(order: Value) -> Order {
      Order {
         id: format!("{}", order["orderId"].as_str().unwrap()),

+ 6 - 3
standard/src/bybit_swap_handle.rs

@@ -53,7 +53,7 @@ pub fn handle_position(res_data: &ResponseData, ct_val: &Decimal) -> Vec<Positio
 }
 
 pub fn format_position_item(position: &Value, ct_val: &Decimal) -> Position {
-    let position_idx = position["positionIdx"].to_string();
+    let position_idx: String = position["positionIdx"].to_string();
     let mut position_mode = match position_idx.as_str() {
         "0" => PositionModeEnum::Both,
         "1" => PositionModeEnum::Long,
@@ -63,6 +63,9 @@ pub fn format_position_item(position: &Value, ct_val: &Decimal) -> Position {
             panic!("bybit_swap:格式化持仓模式错误!\nformat_position_item:position={:?}", position)
         }
     };
+    let symbol_mapper =  position["symbol"].as_str().unwrap().to_string();
+    let currency = "USDT";
+    let coin = &symbol_mapper[..symbol_mapper.find(currency).unwrap_or(0)];
     let size_str: String = from_value(position["size"].clone()).unwrap();
     let size = Decimal::from_str(size_str.as_str()).unwrap();
     let amount = size * ct_val;
@@ -84,11 +87,11 @@ pub fn format_position_item(position: &Value, ct_val: &Decimal) -> Position {
         _ => {}
     }
     Position {
-        symbol: position["symbol"].as_str().unwrap_or("").parse().unwrap(),
+        symbol: format!{"{}_{}", coin, currency},
         margin_level: Decimal::from_str(position["leverage"].as_str().unwrap()).unwrap(),
         amount,
         frozen_amount: Decimal::ZERO,
-        price: Decimal::from_str(position["avgPrice"].as_str().unwrap()).unwrap(),
+        price: Decimal::from_str(position["entryPrice"].as_str().unwrap()).unwrap(),
         profit,
         position_mode,
         margin: Decimal::from_str(position["positionBalance"].as_str().unwrap()).unwrap(),

+ 0 - 1
strategy/src/bybit_usdt_swap.rs

@@ -199,7 +199,6 @@ async fn on_private_data(core_arc_clone: Arc<Mutex<Core>>, ct_val: &Decimal, run
             core.update_order(order_infos, trace_stack).await;
         }
         "position" => {
-            info!("bybit position 消息原文:{:?}", response.data.to_string());
             let positions = ExchangeStructHandler::position_handle(BybitSwap, response, ct_val);
             let mut core = core_arc_clone.lock().await;
             core.update_position(positions).await;