use crate::ids::{AccountId, MarketId, OrderId, TradableId};
use crate::models::shared::Currency;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
pub use crate::models::shared::AmountWithCurrency as OrderAmount;
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct OrderTradable {
pub identifier: TradableId,
pub market_id: MarketId,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct ActivationCondition {
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "rust_decimal::serde::arbitrary_precision_option"
)]
pub trailing_value: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "rust_decimal::serde::arbitrary_precision_option"
)]
pub trigger_value: Option<Decimal>,
#[serde(rename = "type")]
pub r#type: ActivationConditionType,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ActivationConditionType {
None,
Manual,
StopActpricePerc,
StopActprice,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct Validity {
#[serde(rename = "type")]
pub r#type: ValidityType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub valid_until: Option<i64>,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ValidityType {
Day,
UntilDate,
ExtendedHours,
Immediate,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ActionState {
DelFail,
DelPend,
DelConf,
DelPush,
InsFail,
InsPend,
InsConf,
InsStop,
ModFail,
ModPend,
ModPush,
InsWait,
ModWait,
DelWait,
ModConf,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderState {
Deleted,
Local,
OnMarket,
Locked,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderSide {
Buy,
Sell,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum PriceCondition {
Limit,
AtMarket,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum VolumeCondition {
Normal,
AllOrNothing,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Order {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accid: Option<AccountId>,
pub accno: i64,
pub action_state: ActionState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub activation_condition: Option<ActivationCondition>,
pub modified: i64,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "rust_decimal::serde::arbitrary_precision_option"
)]
pub open_volume: Option<Decimal>,
pub order_id: OrderId,
pub order_state: OrderState,
pub order_type: String,
pub price: OrderAmount,
pub price_condition: PriceCondition,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference: Option<String>,
pub side: OrderSide,
pub tradable: OrderTradable,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub traded_volume: Decimal,
pub validity: Validity,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub volume: Decimal,
pub volume_condition: VolumeCondition,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct OrderReply {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub action_state: Option<ActionState>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
pub order_id: OrderId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub order_state: Option<OrderState>,
pub result_code: String,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderType {
Fak,
Fok,
Normal,
Limit,
StopLimit,
StopTrailing,
Oco,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderActivationCondition {
StopActpricePerc,
StopActprice,
Manual,
OcoStopActprice,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PlaceOrderRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub activation_condition: Option<OrderActivationCondition>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<Currency>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extended_hours: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identifier: Option<TradableId>,
pub market_id: MarketId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub open_volume: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub order_type: Option<OrderType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference: Option<String>,
pub side: OrderSide,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target_value: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trigger_condition: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trigger_value: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub valid_until: Option<String>,
pub volume: i64,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ModifyOrderRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<Currency>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub open_volume: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub volume: Option<i64>,
}