use crate::constant::{Direction, Exchange, Offset, OrderType};
use crate::order::OrderData;
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OrderRequest {
pub symbol: String,
pub exchange: Exchange,
pub direction: Direction,
#[cfg_attr(feature = "serde", serde(rename = "type"))]
pub order_type: OrderType,
pub volume: f64,
pub price: f64,
pub offset: Offset,
pub reference: String,
pub old_order_id: String,
}
impl OrderRequest {
pub fn en_symbol(&self) -> String {
crate::symbol::vt_symbol(&self.symbol, self.exchange)
}
pub fn create_order_data(&self, orderid: &str, gateway_name: &str) -> OrderData {
OrderData {
gateway_name: gateway_name.to_string(),
symbol: self.symbol.clone(),
exchange: self.exchange,
orderid: orderid.to_string(),
order_type: self.order_type,
direction: Some(self.direction),
offset: self.offset,
price: self.price,
volume: self.volume,
reference: self.reference.clone(),
..OrderData::default()
}
}
pub fn is_min_volume_ok(&self, min_volume: f64) -> bool {
self.volume >= min_volume
}
pub fn is_max_volume_ok(&self, max_volume: f64) -> bool {
self.volume <= max_volume
}
pub fn is_volume_range_ok(&self, min_volume: f64, max_volume: f64) -> bool {
self.volume >= min_volume && self.volume <= max_volume
}
pub fn is_volume_beishu_ok(&self, sub_beishu: f64) -> bool {
if sub_beishu == 0.0 {
return false;
}
let r = self.volume - (self.volume / sub_beishu).trunc() * sub_beishu;
r == 0.0
}
}