use crate::{
journal::JournalLog,
order::{get_order_time_in_force, OrderId, Price, Quantity},
OrderStatus, OrderType, Side, TimeInForce,
};
#[derive(Debug)]
pub struct FillReport {
pub order_id: OrderId,
pub price: Price,
pub quantity: Quantity,
pub status: OrderStatus,
}
#[derive(Debug)]
pub(crate) struct ExecutionReportParams {
pub id: OrderId,
pub order_type: OrderType,
pub side: Side,
pub quantity: Quantity,
pub status: OrderStatus,
pub time_in_force: Option<TimeInForce>,
pub price: Option<Price>,
pub post_only: bool,
}
#[derive(Debug)]
pub struct ExecutionReport {
pub order_id: OrderId,
pub orig_qty: Quantity,
pub executed_qty: Quantity,
pub remaining_qty: Quantity,
pub taker_qty: Quantity,
pub maker_qty: Quantity,
pub order_type: OrderType,
pub side: Side,
pub price: Price,
pub status: OrderStatus,
pub time_in_force: TimeInForce,
pub post_only: bool,
pub fills: Vec<FillReport>,
pub log: Option<JournalLog>,
}
impl ExecutionReport {
pub(crate) fn new(params: ExecutionReportParams) -> Self {
Self {
order_id: params.id,
orig_qty: params.quantity,
executed_qty: Quantity(0),
remaining_qty: params.quantity,
status: params.status,
taker_qty: Quantity(0),
maker_qty: Quantity(0),
order_type: params.order_type,
side: params.side,
price: params.price.unwrap_or(Price(0)),
time_in_force: if params.order_type == OrderType::Market {
TimeInForce::IOC
} else {
get_order_time_in_force(params.time_in_force)
},
post_only: params.post_only,
fills: Vec::new(),
log: None,
}
}
}