use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use tracing::debug;
use crate::client::BitgetClient;
use crate::consts;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AccountInfoResp {
#[serde(rename = "marginCoin")]
pub margin_coin: Option<String>,
pub available: Option<String>,
pub frozen: Option<String>,
pub total: Option<String>,
pub equity: Option<String>,
#[serde(rename = "accountType")]
pub account_type: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PositionInfoResp {
pub symbol: Option<String>,
#[serde(rename = "marginCoin")]
pub margin_coin: Option<String>,
pub total: Option<String>,
pub available: Option<String>,
pub frozen: Option<String>,
pub hold_side: Option<String>,
#[serde(rename = "holdMode")]
pub hold_mode: Option<String>,
#[serde(rename = "averageOpenPrice")]
pub average_open_price: Option<String>,
pub leverage: Option<String>,
}
impl BitgetClient {
pub fn get_account_info(&self, symbol: &str, margin_coin: &str) -> Result<String> {
let mut params = BTreeMap::new();
params.insert("symbol".to_string(), symbol.to_string());
params.insert("marginCoin".to_string(), margin_coin.to_string());
debug!(
"查询账户信息 - 交易对: {}, 保证金币种: {}",
symbol, margin_coin
);
self.request(consts::GET, "/api/mix/v1/account/account", ¶ms, false)
}
pub async fn get_account_info_async(&self, symbol: &str, margin_coin: &str) -> Result<String> {
let mut params = BTreeMap::new();
params.insert("symbol".to_string(), symbol.to_string());
params.insert("marginCoin".to_string(), margin_coin.to_string());
debug!(
"查询账户信息 - 交易对: {}, 保证金币种: {}",
symbol, margin_coin
);
self.request(consts::GET, "/api/mix/v1/account/account", ¶ms, false)
}
pub fn get_positions(&self, symbol: &str, margin_coin: &str) -> Result<String> {
let mut params = BTreeMap::new();
params.insert("symbol".to_string(), symbol.to_string());
params.insert("marginCoin".to_string(), margin_coin.to_string());
debug!(
"查询持仓信息 - 交易对: {}, 保证金币种: {}",
symbol, margin_coin
);
self.request(
consts::GET,
"/api/mix/v1/position/allPosition",
¶ms,
false,
)
}
pub async fn get_positions_async(&self, symbol: &str, margin_coin: &str) -> Result<String> {
let mut params = BTreeMap::new();
params.insert("symbol".to_string(), symbol.to_string());
params.insert("marginCoin".to_string(), margin_coin.to_string());
debug!(
"查询持仓信息 - 交易对: {}, 保证金币种: {}",
symbol, margin_coin
);
self.request(
consts::GET,
"/api/mix/v1/position/allPosition",
¶ms,
false,
)
}
pub fn set_leverage(
&self,
symbol: &str,
margin_coin: &str,
leverage: &str,
hold_side: &str,
) -> Result<String> {
let mut params = BTreeMap::new();
params.insert("symbol".to_string(), symbol.to_string());
params.insert("marginCoin".to_string(), margin_coin.to_string());
params.insert("leverage".to_string(), leverage.to_string());
params.insert("holdSide".to_string(), hold_side.to_string());
debug!(
"设置杠杆 - 交易对: {}, 保证金币种: {}, 杠杆: {}, 方向: {}",
symbol, margin_coin, leverage, hold_side
);
self.request(
consts::POST,
"/api/mix/v1/account/setLeverage",
¶ms,
false,
)
}
pub async fn set_leverage_async(
&self,
symbol: &str,
margin_coin: &str,
leverage: &str,
hold_side: &str,
) -> Result<String> {
let mut params = BTreeMap::new();
params.insert("symbol".to_string(), symbol.to_string());
params.insert("marginCoin".to_string(), margin_coin.to_string());
params.insert("leverage".to_string(), leverage.to_string());
params.insert("holdSide".to_string(), hold_side.to_string());
debug!(
"设置杠杆 - 交易对: {}, 保证金币种: {}, 杠杆: {}, 方向: {}",
symbol, margin_coin, leverage, hold_side
);
self.request(
consts::POST,
"/api/mix/v1/account/setLeverage",
¶ms,
false,
)
}
}