#[allow(unused_imports)]
use crate::Timestamp;
#[allow(unused_imports)]
use crate::ids::*;
#[allow(unused_imports)]
use crate::models::*;
#[allow(unused_imports)]
use crate::{Client, Result};
#[allow(unused_imports)]
use reqwest::Method;
#[allow(unused_imports)]
use rust_decimal::Decimal;
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListPositionsResponse {
#[serde(rename = "positions", default, skip_serializing_if = "Option::is_none")]
pub positions: Option<Vec<Position>>,
#[serde(
rename = "lastTransactionID",
default,
skip_serializing_if = "Option::is_none"
)]
pub last_transaction_id: Option<TransactionID>,
}
impl Client {
pub async fn list_positions(
&self,
account_id: &AccountID,
) -> std::result::Result<
crate::ApiResponse<ListPositionsResponse>,
crate::OperationError<crate::GenericRejection>,
> {
let account_id_encoded = crate::client::segment(account_id.as_str());
let path = format!("/v3/accounts/{account_id_encoded}/positions");
self.execute(Method::GET, &path, None::<&()>, None::<&()>, None, None)
.await
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListOpenPositionsResponse {
#[serde(rename = "positions", default, skip_serializing_if = "Option::is_none")]
pub positions: Option<Vec<Position>>,
#[serde(
rename = "lastTransactionID",
default,
skip_serializing_if = "Option::is_none"
)]
pub last_transaction_id: Option<TransactionID>,
}
impl Client {
pub async fn list_open_positions(
&self,
account_id: &AccountID,
) -> std::result::Result<
crate::ApiResponse<ListOpenPositionsResponse>,
crate::OperationError<crate::GenericRejection>,
> {
let account_id_encoded = crate::client::segment(account_id.as_str());
let path = format!("/v3/accounts/{account_id_encoded}/openPositions");
self.execute(Method::GET, &path, None::<&()>, None::<&()>, None, None)
.await
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PositionDetailsResponse {
#[serde(rename = "position", default, skip_serializing_if = "Option::is_none")]
pub position: Option<Position>,
#[serde(
rename = "lastTransactionID",
default,
skip_serializing_if = "Option::is_none"
)]
pub last_transaction_id: Option<TransactionID>,
}
impl Client {
pub async fn position_details(
&self,
account_id: &AccountID,
instrument: &InstrumentName,
) -> std::result::Result<
crate::ApiResponse<PositionDetailsResponse>,
crate::OperationError<crate::GenericRejection>,
> {
let account_id_encoded = crate::client::segment(account_id.as_str());
let instrument_encoded = crate::client::segment(instrument.as_str());
let path = format!("/v3/accounts/{account_id_encoded}/positions/{instrument_encoded}");
self.execute(Method::GET, &path, None::<&()>, None::<&()>, None, None)
.await
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClosePositionBody {
#[serde(rename = "longUnits", default, skip_serializing_if = "Option::is_none")]
pub long_units: Option<String>,
#[serde(
rename = "longClientExtensions",
default,
skip_serializing_if = "Option::is_none"
)]
pub long_client_extensions: Option<ClientExtensions>,
#[serde(
rename = "shortUnits",
default,
skip_serializing_if = "Option::is_none"
)]
pub short_units: Option<String>,
#[serde(
rename = "shortClientExtensions",
default,
skip_serializing_if = "Option::is_none"
)]
pub short_client_extensions: Option<ClientExtensions>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClosePositionResponse {
#[serde(
rename = "longOrderCreateTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub long_order_create_transaction: Option<MarketOrderTransaction>,
#[serde(
rename = "longOrderFillTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub long_order_fill_transaction: Option<OrderFillTransaction>,
#[serde(
rename = "longOrderCancelTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub long_order_cancel_transaction: Option<OrderCancelTransaction>,
#[serde(
rename = "shortOrderCreateTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub short_order_create_transaction: Option<MarketOrderTransaction>,
#[serde(
rename = "shortOrderFillTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub short_order_fill_transaction: Option<OrderFillTransaction>,
#[serde(
rename = "shortOrderCancelTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub short_order_cancel_transaction: Option<OrderCancelTransaction>,
#[serde(
rename = "relatedTransactionIDs",
default,
skip_serializing_if = "Option::is_none"
)]
pub related_transaction_ids: Option<Vec<TransactionID>>,
#[serde(
rename = "lastTransactionID",
default,
skip_serializing_if = "Option::is_none"
)]
pub last_transaction_id: Option<TransactionID>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ClosePositionRejection {
#[serde(
rename = "longOrderRejectTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub long_order_reject_transaction: Option<MarketOrderRejectTransaction>,
#[serde(
rename = "shortOrderRejectTransaction",
default,
skip_serializing_if = "Option::is_none"
)]
pub short_order_reject_transaction: Option<MarketOrderRejectTransaction>,
#[serde(
rename = "relatedTransactionIDs",
default,
skip_serializing_if = "Option::is_none"
)]
pub related_transaction_ids: Option<Vec<TransactionID>>,
#[serde(
rename = "lastTransactionID",
default,
skip_serializing_if = "Option::is_none"
)]
pub last_transaction_id: Option<TransactionID>,
#[serde(rename = "errorCode", default, skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
#[serde(
rename = "errorMessage",
default,
skip_serializing_if = "Option::is_none"
)]
pub error_message: Option<String>,
}
impl Client {
pub async fn close_position(
&self,
account_id: &AccountID,
instrument: &InstrumentName,
body: &ClosePositionBody,
) -> std::result::Result<
crate::ApiResponse<ClosePositionResponse>,
crate::OperationError<ClosePositionRejection>,
> {
let account_id_encoded = crate::client::segment(account_id.as_str());
let instrument_encoded = crate::client::segment(instrument.as_str());
let path =
format!("/v3/accounts/{account_id_encoded}/positions/{instrument_encoded}/close");
self.execute(
Method::PUT,
&path,
None::<&()>,
Some(body),
Some(crate::client::MutationAdmission::Exit(account_id)),
None,
)
.await
}
}