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

※※※修改okx仓位订阅处理

gepangpang пре 1 година
родитељ
комит
8285dd3d79
3 измењених фајлова са 54 додато и 11 уклоњено
  1. 2 2
      derive/tests/gate_swap_export_test.rs
  2. 31 6
      standard/src/okx_handle.rs
  3. 21 3
      standard/src/okx_swap.rs

+ 2 - 2
derive/tests/gate_swap_export_test.rs

@@ -5,7 +5,7 @@ use derive::export_excel::ExportEnum;
 use crate::export_excel_test::test_new_export;
 
 
-const SYMBOL: &str = "LOOM_USDT";
+const SYMBOL: &str = "TIA_USDT";
 
 // 测试获取Exchange实体
 #[tokio::test]
@@ -14,6 +14,6 @@ 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", SYMBOL.to_string(), 0, 0, 100).await;
+    let export_trades = export.export_trades("gate_swap_42", SYMBOL.to_string(), 0, 0, 1000).await;
     trace!(?export_trades);
 }

+ 31 - 6
standard/src/okx_handle.rs

@@ -10,6 +10,29 @@ use crate::exchange::ExchangeEnum;
 use crate::handle_info::HandleSwapInfo;
 use crate::okx_swap::SwapPosition;
 
+
+#[derive(Debug, Deserialize, Serialize)]
+#[serde(rename_all = "camelCase")]
+struct SwapBalanceAndPositionSubscribe {
+    pos_data: Vec<SwapBalanceAndPositionPosDataSubscribe>,
+}
+
+#[derive(Debug, Deserialize, Serialize)]
+#[serde(rename_all = "camelCase")]
+struct SwapBalanceAndPositionPosDataSubscribe {
+    pos_id: String,
+    trade_id: String,
+    inst_id: String,
+    inst_type: String,
+    mgn_mode: String,
+    pos_side: String,
+    pos: Decimal,
+    ccy: String,
+    pos_ccy: String,
+    avg_px: Decimal,
+    u_time: String,
+}
+
 #[derive(Debug, Deserialize, Serialize)]
 #[serde(rename_all = "camelCase")]
 struct SwapPositionSubscribe {
@@ -141,15 +164,17 @@ pub fn format_special_ticker(data: serde_json::Value, label: String) -> SpecialD
     }
 }
 
+
 // 处理position信息
 pub fn handle_position(res_data: ResponseData, ct_val: Decimal) -> Vec<Position> {
     let res_data_str = res_data.data;
-    let data_list: SwapPositionSubscribe = serde_json::from_str(&res_data_str).unwrap();
-    let position_data = data_list.data;
+    let data_list: SwapBalanceAndPositionSubscribe = serde_json::from_str(&res_data_str).unwrap();
+
+    let position_data = data_list.pos_data;
     position_data.iter().map(|item| format_position_item(item, ct_val)).collect()
 }
 
-pub fn format_position_item(value: &SwapPosition, ct_val: Decimal) -> Position {
+pub fn format_position_item(value: &SwapBalanceAndPositionPosDataSubscribe, ct_val: Decimal) -> Position {
     let position_mode = match value.pos_side.as_str() {
         "long" => { PositionModeEnum::Long }
         "short" => { PositionModeEnum::Short }
@@ -157,12 +182,12 @@ pub fn format_position_item(value: &SwapPosition, ct_val: Decimal) -> Position {
     };
     Position {
         symbol: value.inst_id.replace("-SWAP", ""),
-        margin_level: value.lever,
+        margin_level: Decimal::ZERO,
         amount: value.pos * ct_val,
         frozen_amount: Decimal::ZERO,
         price: value.avg_px,
-        profit: value.upl,
+        profit: Decimal::ZERO,
         position_mode,
-        margin: if value.margin != "" { Decimal::from_str(&value.margin).unwrap() } else { Decimal::ZERO },
+        margin: Decimal::ZERO,
     }
 }

+ 21 - 3
standard/src/okx_swap.rs

@@ -13,7 +13,7 @@ use tracing::{debug, error};
 use exchanges::okx_swap_rest::OkxSwapRest;
 use global::trace_stack::TraceStack;
 use crate::exchange::ExchangeEnum;
-use crate::{Account, Market, okx_handle, Order, OrderCommand, Platform, Position, Ticker, utils};
+use crate::{Account, Market, okx_handle, Order, OrderCommand, Platform, Position, PositionModeEnum, Ticker, utils};
 
 /// Okx交易所账户信息请求数据结构
 /// - 接口`"/api/v5/account/balance"`
@@ -567,7 +567,7 @@ impl Platform for OkxSwap {
             let res_data_str = &res_data.data;
             let data_list: Vec<SwapPosition> = serde_json::from_str(&res_data_str).unwrap();
             let position_info: Vec<&SwapPosition> = data_list.iter().filter(|item| item.inst_id == symbol_format).collect();
-            let result = position_info.iter().map(|item| okx_handle::format_position_item(item, ct_val)).collect();
+            let result = position_info.iter().map(|item| format_position_item(item, ct_val)).collect();
             Ok(result)
         } else {
             Err(Error::new(ErrorKind::Other, res_data.to_string()))
@@ -579,7 +579,7 @@ impl Platform for OkxSwap {
         if res_data.code == "200" {
             let res_data_str = &res_data.data;
             let data_list: Vec<SwapPosition> = serde_json::from_str(&res_data_str).unwrap();
-            let result = data_list.iter().map(|item| okx_handle::format_position_item(item, Decimal::ONE)).collect();
+            let result = data_list.iter().map(|item| format_position_item(item, Decimal::ONE)).collect();
             Ok(result)
         } else {
             Err(Error::new(ErrorKind::Other, res_data.to_string()))
@@ -1051,3 +1051,21 @@ pub fn format_order_item(data: SwapOrder, ct_val: Decimal) -> Order {
     debug!("format-order-end, okx_swap");
     result
 }
+
+pub fn format_position_item(value: &SwapPosition, ct_val: Decimal) -> Position {
+    let position_mode = match value.pos_side.as_str() {
+        "long" => { PositionModeEnum::Long }
+        "short" => { PositionModeEnum::Short }
+        _ => { PositionModeEnum::Both }
+    };
+    Position {
+        symbol: value.inst_id.replace("-SWAP", ""),
+        margin_level: value.lever,
+        amount: value.pos * ct_val,
+        frozen_amount: Decimal::ZERO,
+        price: value.avg_px,
+        profit: value.upl,
+        position_mode,
+        margin: if value.margin != "" { Decimal::from_str(&value.margin).unwrap() } else { Decimal::ZERO },
+    }
+}