1use crate::constant::{Direction, Exchange, Offset, OrderType};
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 ..OrderData::default()
52 }
53 }
54
55 pub fn is_min_volume_ok(&self, min_volume: f64) -> bool {
57 self.volume >= min_volume
58 }
59
60 pub fn is_max_volume_ok(&self, max_volume: f64) -> bool {
62 self.volume <= max_volume
63 }
64
65 pub fn is_volume_range_ok(&self, min_volume: f64, max_volume: f64) -> bool {
67 self.volume >= min_volume && self.volume <= max_volume
68 }
69
70 pub fn is_volume_beishu_ok(&self, sub_beishu: f64) -> bool {
73 if sub_beishu == 0.0 {
74 return false;
75 }
76 let r = self.volume - (self.volume / sub_beishu).trunc() * sub_beishu;
77 r == 0.0
78 }
79}