Skip to main content

schwab_api/models/
order.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4pub type Order = Value;
5pub type OrderRequest = Value;
6pub type PreviewOrder = Value;
7
8#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
9#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
10pub enum OrderInstruction {
11    Buy,
12    Sell,
13    BuyToOpen,
14    SellToClose,
15    SellToOpen,
16    BuyToClose,
17    SellShort,
18    BuyToCover,
19}
20
21#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
22#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
23pub enum OrderType {
24    Market,
25    Limit,
26    Stop,
27    StopLimit,
28    TrailingStop,
29}
30
31/// Order types accepted on POST/PUT (no UNKNOWN).
32#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
33#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
34pub enum OrderTypeRequest {
35    Market,
36    Limit,
37    Stop,
38    StopLimit,
39    TrailingStop,
40    Cabinet,
41    NonMarketable,
42    MarketOnClose,
43    Exercise,
44    TrailingStopLimit,
45    NetDebit,
46    NetCredit,
47    NetZero,
48    LimitOnClose,
49}
50
51#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
52#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
53pub enum OrderDuration {
54    Day,
55    GoodTillCancel,
56    FillOrKill,
57}
58
59#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
60#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
61pub enum OrderSession {
62    Normal,
63    Am,
64    Pm,
65    Seamless,
66}
67
68#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
69#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
70pub enum OrderStrategyType {
71    Single,
72    Cancel,
73    Recall,
74    Pair,
75    Flatten,
76    TwoDaySwap,
77    BlastAll,
78    Oco,
79    Trigger,
80}
81
82#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
83#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
84pub enum ComplexOrderStrategyType {
85    None,
86    Covered,
87    Vertical,
88    BackRatio,
89    Calendar,
90    Diagonal,
91    Straddle,
92    Strangle,
93    CollarSynthetic,
94    Butterfly,
95    Condor,
96    IronCondor,
97    VerticalRoll,
98    CollarWithStock,
99    DoubleDiagonal,
100    UnbalancedButterfly,
101    UnbalancedCondor,
102    UnbalancedIronCondor,
103    UnbalancedVerticalRoll,
104    MutualFundSwap,
105    Custom,
106}
107
108#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
109#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
110pub enum OrderLegType {
111    Equity,
112    Option,
113    Index,
114    MutualFund,
115    CashEquivalent,
116    FixedIncome,
117    Currency,
118    CollectiveInvestment,
119}
120
121#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
122#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
123pub enum AssetType {
124    Equity,
125    Option,
126    Index,
127    MutualFund,
128    CashEquivalent,
129    FixedIncome,
130    Currency,
131    CollectiveInvestment,
132}
133
134#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
135#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
136pub enum TaxLotMethod {
137    Fifo,
138    Lifo,
139    HighCost,
140    LowCost,
141    AverageCost,
142    SpecificLot,
143    LossHarvester,
144}
145
146#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
147#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
148pub enum SpecialInstruction {
149    AllOrNone,
150    DoNotReduce,
151    AllOrNoneDoNotReduce,
152}
153
154impl ComplexOrderStrategyType {
155    pub fn as_str(self) -> &'static str {
156        match self {
157            Self::None => "NONE",
158            Self::Covered => "COVERED",
159            Self::Vertical => "VERTICAL",
160            Self::BackRatio => "BACK_RATIO",
161            Self::Calendar => "CALENDAR",
162            Self::Diagonal => "DIAGONAL",
163            Self::Straddle => "STRADDLE",
164            Self::Strangle => "STRANGLE",
165            Self::CollarSynthetic => "COLLAR_SYNTHETIC",
166            Self::Butterfly => "BUTTERFLY",
167            Self::Condor => "CONDOR",
168            Self::IronCondor => "IRON_CONDOR",
169            Self::VerticalRoll => "VERTICAL_ROLL",
170            Self::CollarWithStock => "COLLAR_WITH_STOCK",
171            Self::DoubleDiagonal => "DOUBLE_DIAGONAL",
172            Self::UnbalancedButterfly => "UNBALANCED_BUTTERFLY",
173            Self::UnbalancedCondor => "UNBALANCED_CONDOR",
174            Self::UnbalancedIronCondor => "UNBALANCED_IRON_CONDOR",
175            Self::UnbalancedVerticalRoll => "UNBALANCED_VERTICAL_ROLL",
176            Self::MutualFundSwap => "MUTUAL_FUND_SWAP",
177            Self::Custom => "CUSTOM",
178        }
179    }
180
181    pub fn all_values() -> &'static [Self] {
182        &[
183            Self::None,
184            Self::Covered,
185            Self::Vertical,
186            Self::BackRatio,
187            Self::Calendar,
188            Self::Diagonal,
189            Self::Straddle,
190            Self::Strangle,
191            Self::CollarSynthetic,
192            Self::Butterfly,
193            Self::Condor,
194            Self::IronCondor,
195            Self::VerticalRoll,
196            Self::CollarWithStock,
197            Self::DoubleDiagonal,
198            Self::UnbalancedButterfly,
199            Self::UnbalancedCondor,
200            Self::UnbalancedIronCondor,
201            Self::UnbalancedVerticalRoll,
202            Self::MutualFundSwap,
203            Self::Custom,
204        ]
205    }
206}
207
208impl OrderTypeRequest {
209    pub fn as_str(self) -> &'static str {
210        match self {
211            Self::Market => "MARKET",
212            Self::Limit => "LIMIT",
213            Self::Stop => "STOP",
214            Self::StopLimit => "STOP_LIMIT",
215            Self::TrailingStop => "TRAILING_STOP",
216            Self::Cabinet => "CABINET",
217            Self::NonMarketable => "NON_MARKETABLE",
218            Self::MarketOnClose => "MARKET_ON_CLOSE",
219            Self::Exercise => "EXERCISE",
220            Self::TrailingStopLimit => "TRAILING_STOP_LIMIT",
221            Self::NetDebit => "NET_DEBIT",
222            Self::NetCredit => "NET_CREDIT",
223            Self::NetZero => "NET_ZERO",
224            Self::LimitOnClose => "LIMIT_ON_CLOSE",
225        }
226    }
227}