Bladeren bron

修復bybit持倉識別。

skyfffire 1 jaar geleden
bovenliggende
commit
d6fa327b6c
3 gewijzigde bestanden met toevoegingen van 20 en 56 verwijderingen
  1. 4 45
      standard/src/bybit_swap.rs
  2. 14 10
      standard/src/bybit_swap_handle.rs
  3. 2 1
      strategy/src/bybit_usdt_swap.rs

+ 4 - 45
standard/src/bybit_swap.rs

@@ -12,8 +12,9 @@ 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, PositionModeEnum};
+use crate::{Platform, ExchangeEnum, Account, Position, Ticker, Market, Order, OrderCommand};
 use global::trace_stack::TraceStack;
+use crate::bybit_swap_handle::format_position_item;
 
 #[derive(Debug, Clone, Deserialize, Serialize)]
 #[serde(rename_all = "camelCase")]
@@ -161,7 +162,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()))
@@ -174,7 +175,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()))
@@ -650,48 +651,6 @@ 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 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 amount {
-                amount if amount > Decimal::ZERO => PositionModeEnum::Long,
-                amount if amount < Decimal::ZERO => 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()),

+ 14 - 10
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: String = position["positionIdx"].to_string();
+    let position_idx = position["positionIdx"].to_string();
     let mut position_mode = match position_idx.as_str() {
         "0" => PositionModeEnum::Both,
         "1" => PositionModeEnum::Long,
@@ -63,29 +63,33 @@ 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;
+    let side = position["side"].as_str().unwrap().to_string();
+    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 amount {
-                amount if amount > Decimal::ZERO => PositionModeEnum::Long,
-                amount if amount < Decimal::ZERO => PositionModeEnum::Short,
+            position_mode = match side.as_str() {
+                "Buy" => PositionModeEnum::Long,
+                "Sell" => PositionModeEnum::Short,
                 _ => { PositionModeEnum::Both }
             }
         }
         _ => {}
     }
     Position {
-        symbol: format!{"{}_{}", coin, currency},
+        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["entryPrice"].as_str().unwrap()).unwrap(),
-        profit: Decimal::from_str(position["unrealisedPnl"].as_str().unwrap()).unwrap(),
+        price: Decimal::from_str(position["avgPrice"].as_str().unwrap()).unwrap(),
+        profit,
         position_mode,
         margin: Decimal::from_str(position["positionBalance"].as_str().unwrap()).unwrap(),
     }

+ 2 - 1
strategy/src/bybit_usdt_swap.rs

@@ -16,7 +16,7 @@ use crate::core::Core;
 use crate::exchange_disguise::{on_depth, on_trade};
 use crate::model::OrderInfo;
 
-// 参考 币安 合约 启动
+// 参考 Bybit 合约 启动
 pub(crate) async fn reference_bybit_swap_run(is_shutdown_arc: Arc<AtomicBool>,
                                              core_arc: Arc<Mutex<Core>>,
                                              name: String,
@@ -199,6 +199,7 @@ 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;