1use crate::constant::{Direction, Exchange, Offset, OrderType, Status};
4use crate::order::OrderData;
5
6#[derive(Debug, Clone, PartialEq, Default)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct OrderRequest {
10 pub symbol: String,
12 pub exchange: Exchange,
14 pub direction: Direction,
16 #[cfg_attr(feature = "serde", serde(rename = "type"))]
18 pub order_type: OrderType,
19 pub volume: f64,
21 pub price: f64,
23 pub offset: Offset,
25 pub reference: String,
27 pub old_order_id: String,
29}
30
31impl OrderRequest {
32 pub fn en_symbol(&self) -> String {
34 crate::symbol::vt_symbol(&self.symbol, self.exchange)
35 }
36
37 pub fn create_order_data(&self, orderid: &str, gateway_name: &str) -> OrderData {
40 OrderData {
41 gateway_name: gateway_name.to_string(),
42 symbol: self.symbol.clone(),
43 exchange: self.exchange,
44 orderid: orderid.to_string(),
45 order_type: self.order_type,
46 direction: Some(self.direction),
47 offset: self.offset,
48 price: self.price,
49 volume: self.volume,
50 reference: self.reference.clone(),
51 status: Status::SUBMITTING,
55 traded: 0.0,
57 traded_price: 0.0,
58 datetime: None,
60 name: String::new(),
62 status_msg: String::new(),
64 }
65 }
66
67 pub fn is_min_volume_ok(&self, min_volume: f64) -> bool {
69 self.volume >= min_volume
70 }
71
72 pub fn is_max_volume_ok(&self, max_volume: f64) -> bool {
74 self.volume <= max_volume
75 }
76
77 pub fn is_volume_range_ok(&self, min_volume: f64, max_volume: f64) -> bool {
79 self.volume >= min_volume && self.volume <= max_volume
80 }
81
82 pub fn is_volume_beishu_ok(&self, sub_beishu: f64) -> bool {
85 if sub_beishu == 0.0 {
86 return false;
87 }
88 let r = self.volume - (self.volume / sub_beishu).trunc() * sub_beishu;
89 r == 0.0
90 }
91}