|
|
@@ -13,7 +13,7 @@ use tracing::info;
|
|
|
use tracing_subscriber::fmt::format;
|
|
|
use global::trace_stack::TraceStack;
|
|
|
use crate::exchange::ExchangeEnum;
|
|
|
-use crate::{Account, Market, Order, OrderCommand, Platform, Position, Ticker, utils};
|
|
|
+use crate::{Account, Market, Order, OrderCommand, Platform, Position, PositionModeEnum, Ticker, utils};
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
#[derive(Clone)]
|
|
|
@@ -120,7 +120,68 @@ impl Platform for BitgetSwap {
|
|
|
async fn get_position(&mut self) -> Result<Vec<Position>, Error> { Err(Error::new(ErrorKind::NotFound, "bitget_swap:该交易所方法未实现".to_string())) }
|
|
|
|
|
|
async fn get_positions(&mut self) -> Result<Vec<Position>, Error> {
|
|
|
- Err(Error::new(ErrorKind::NotFound, "bitget_swap get_positions:该交易所方法未实现".to_string()))
|
|
|
+ let params = json!({
|
|
|
+ "productType": "USDT-FUTURES",
|
|
|
+ "marginCoin": "USDT"
|
|
|
+ });
|
|
|
+ let response = self.request.get_all_position(params).await;
|
|
|
+ info!(?response);
|
|
|
+
|
|
|
+ if response.code != "200" {
|
|
|
+ return Err(Error::new(ErrorKind::NotFound, format!("bitget_swap 获取仓位异常{:?}", response).to_string()))
|
|
|
+ }
|
|
|
+
|
|
|
+ // 正常处理持仓信息
|
|
|
+ let mut positions: Vec<Position> = vec![];
|
|
|
+ if response.data.is_null() {
|
|
|
+ return Ok(positions)
|
|
|
+ }
|
|
|
+
|
|
|
+ let positions_json = response.data.as_array().unwrap();
|
|
|
+ for position_json in positions_json {
|
|
|
+ let symbol = position_json["symbol"].as_str().unwrap().to_string();
|
|
|
+ let margin_level = Decimal::from_str(position_json["leverage"].as_str().unwrap()).unwrap();
|
|
|
+ let amount = Decimal::from_str(position_json["total"].as_str().unwrap()).unwrap();
|
|
|
+ let frozen_amount = Decimal::from_str(position_json["locked"].as_str().unwrap()).unwrap();
|
|
|
+ let price = Decimal::from_str(position_json["openPriceAvg"].as_str().unwrap()).unwrap();
|
|
|
+ let profit = Decimal::from_str(position_json["unrealizedPL"].as_str().unwrap()).unwrap();
|
|
|
+ let position_mode = match position_json["posMode"].as_str().unwrap() {
|
|
|
+ "hedge_mode" => {
|
|
|
+ PositionModeEnum::Both
|
|
|
+ },
|
|
|
+ "one_way_mode" => {
|
|
|
+ match position_json["holdSide"].as_str().unwrap() {
|
|
|
+ "short" => {
|
|
|
+ PositionModeEnum::Short
|
|
|
+ }
|
|
|
+ "long" => {
|
|
|
+ PositionModeEnum::Long
|
|
|
+ },
|
|
|
+ _ => {
|
|
|
+ panic!("bitget_usdt_swap: 未知的持仓模式与持仓方向: {}, {}",
|
|
|
+ position_json["posMode"].as_str().unwrap(), position_json["holdSide"].as_str().unwrap())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _ => {
|
|
|
+ panic!("bitget_usdt_swap: 未知的持仓模式: {}", position_json["posMode"].as_str().unwrap())
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let margin = Decimal::from_str(position_json["marginSize"].as_str().unwrap()).unwrap();
|
|
|
+
|
|
|
+ positions.push(Position {
|
|
|
+ symbol,
|
|
|
+ margin_level,
|
|
|
+ amount,
|
|
|
+ frozen_amount,
|
|
|
+ price,
|
|
|
+ profit,
|
|
|
+ position_mode,
|
|
|
+ margin,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Ok(positions)
|
|
|
}
|
|
|
|
|
|
async fn get_ticker(&mut self) -> Result<Ticker, Error> {
|