1use nautilus_model::identifiers::Venue;
17use serde::{Deserialize, Serialize};
18use strum::{AsRefStr, Display, EnumIter, EnumString, FromRepr};
19use ustr::Ustr;
20
21#[derive(
22 Debug,
23 Clone,
24 PartialEq,
25 Eq,
26 Hash,
27 Serialize,
28 Deserialize,
29 Display,
30 AsRefStr,
31 EnumIter,
32 EnumString,
33 FromRepr,
34)]
35#[strum(ascii_case_insensitive)]
36#[strum(serialize_all = "lowercase")]
37#[serde(rename_all = "lowercase")]
38pub enum InstrumentType {
40 Spot,
41 Perpetual,
42 Future,
43 Option,
44 Combo,
45}
46
47#[derive(
48 Debug,
49 Clone,
50 PartialEq,
51 Eq,
52 Hash,
53 Serialize,
54 Deserialize,
55 Display,
56 AsRefStr,
57 EnumIter,
58 EnumString,
59 FromRepr,
60)]
61#[serde(rename_all = "lowercase")]
62pub enum OptionType {
64 Call,
65 Put,
66}
67
68#[derive(
70 Debug,
71 Clone,
72 PartialEq,
73 Eq,
74 Hash,
75 Serialize,
76 Deserialize,
77 Display,
78 AsRefStr,
79 EnumIter,
80 EnumString,
81 FromRepr,
82)]
83#[serde(rename_all = "lowercase")]
84pub enum TradeSide {
85 Buy,
86 Sell,
87 Unknown,
88}
89
90#[allow(missing_docs)]
92#[derive(
93 Debug,
94 Clone,
95 PartialEq,
96 Eq,
97 Hash,
98 Serialize,
99 Deserialize,
100 Display,
101 AsRefStr,
102 EnumIter,
103 EnumString,
104 FromRepr,
105)]
106#[serde(rename_all = "lowercase")]
107pub enum BarKind {
108 Time,
109 Volume,
110 Tick,
111}
112
113#[derive(
114 Debug,
115 Clone,
116 PartialEq,
117 Eq,
118 Hash,
119 Serialize,
120 Deserialize,
121 Display,
122 AsRefStr,
123 EnumIter,
124 EnumString,
125 FromRepr,
126)]
127#[strum(ascii_case_insensitive)]
128#[strum(serialize_all = "kebab-case")]
129#[serde(rename_all = "kebab-case")]
130pub enum Exchange {
133 Ascendex,
134 Binance,
135 BinanceDelivery,
136 BinanceDex,
137 BinanceFutures,
138 BinanceJersey,
139 BinanceOptions,
140 BinanceUs,
141 Bitfinex,
142 BitfinexDerivatives,
143 Bitflyer,
144 Bitmex,
145 Bitnomial,
146 Bitstamp,
147 BlockchainCom,
148 Bybit,
149 BybitOptions,
150 BybitSpot,
151 Coinbase,
152 Coinflex,
153 CryptoCom,
154 CryptoComDerivatives,
155 Cryptofacilities,
156 Delta,
157 Deribit,
158 Dydx,
159 Ftx,
160 FtxUs,
161 GateIo,
162 GateIoFutures,
163 Gemini,
164 Hitbtc,
165 Huobi,
166 HuobiDm,
167 HuobiDmLinearSwap,
168 HuobiDmOptions,
169 HuobiDmSwap,
170 Kraken,
171 Kucoin,
172 Mango,
173 Okcoin,
174 Okex,
175 OkexFutures,
176 OkexOptions,
177 OkexSwap,
178 Phemex,
179 Poloniex,
180 Serum,
181 StarAtlas,
182 Upbit,
183 WooX,
184}
185
186impl Exchange {
187 #[must_use]
188 pub fn from_venue_str(s: &str) -> Vec<Self> {
189 let s = s.to_ascii_uppercase();
190 match s.as_str() {
191 "ASCENDEX" => vec![Self::Ascendex],
192 "BINANCE" => vec![
193 Self::Binance,
194 Self::BinanceDex,
195 Self::BinanceFutures,
196 Self::BinanceJersey,
197 Self::BinanceOptions,
198 ],
199 "BINANCE_DELIVERY" => vec![Self::BinanceDelivery],
200 "BINANCE_US" => vec![Self::BinanceUs],
201 "BITFINEX" => vec![Self::Bitfinex, Self::BitfinexDerivatives],
202 "BITFLYER" => vec![Self::Bitflyer],
203 "BITMEX" => vec![Self::Bitmex],
204 "BITNOMIAL" => vec![Self::Bitnomial],
205 "BITSTAMP" => vec![Self::Bitstamp],
206 "BLOCKCHAIN_COM" => vec![Self::BlockchainCom],
207 "BYBIT" => vec![Self::Bybit, Self::BybitOptions, Self::BybitSpot],
208 "COINBASE" => vec![Self::Coinbase],
209 "COINFLEX" => vec![Self::Coinflex],
210 "CRYPTO_COM" => vec![Self::CryptoCom, Self::CryptoComDerivatives],
211 "CRYPTOFACILITIES" => vec![Self::Cryptofacilities],
212 "DELTA" => vec![Self::Delta],
213 "DERIBIT" => vec![Self::Deribit],
214 "DYDX" => vec![Self::Dydx],
215 "FTX" => vec![Self::Ftx, Self::FtxUs],
216 "GATE_IO" => vec![Self::GateIo, Self::GateIoFutures],
217 "GEMINI" => vec![Self::Gemini],
218 "HITBTC" => vec![Self::Hitbtc],
219 "HUOBI" => vec![
220 Self::Huobi,
221 Self::HuobiDm,
222 Self::HuobiDmLinearSwap,
223 Self::HuobiDmOptions,
224 ],
225 "HUOBI_DELIVERY" => vec![Self::HuobiDmSwap],
226 "KRAKEN" => vec![Self::Kraken],
227 "KUCOIN" => vec![Self::Kucoin],
228 "MANGO" => vec![Self::Mango],
229 "OKCOIN" => vec![Self::Okcoin],
230 "OKEX" => vec![
231 Self::Okex,
232 Self::OkexFutures,
233 Self::OkexOptions,
234 Self::OkexSwap,
235 ],
236 "PHEMEX" => vec![Self::Phemex],
237 "POLONIEX" => vec![Self::Poloniex],
238 "SERUM" => vec![Self::Serum],
239 "STARATLAS" => vec![Self::StarAtlas],
240 "UPBIT" => vec![Self::Upbit],
241 "WOO_X" => vec![Self::WooX],
242 _ => Vec::new(),
243 }
244 }
245
246 #[must_use]
247 pub const fn as_venue_str(&self) -> &str {
248 match self {
249 Self::Ascendex => "ASCENDEX",
250 Self::Binance => "BINANCE",
251 Self::BinanceDelivery => "BINANCE_DELIVERY",
252 Self::BinanceDex => "BINANCE",
253 Self::BinanceFutures => "BINANCE",
254 Self::BinanceJersey => "BINANCE",
255 Self::BinanceOptions => "BINANCE",
256 Self::BinanceUs => "BINANCE_US",
257 Self::Bitfinex => "BITFINEX",
258 Self::BitfinexDerivatives => "BITFINEX",
259 Self::Bitflyer => "BITFLYER",
260 Self::Bitmex => "BITMEX",
261 Self::Bitnomial => "BITNOMIAL",
262 Self::Bitstamp => "BITSTAMP",
263 Self::BlockchainCom => "BLOCKCHAIN_COM",
264 Self::Bybit => "BYBIT",
265 Self::BybitOptions => "BYBIT",
266 Self::BybitSpot => "BYBIT",
267 Self::Coinbase => "COINBASE",
268 Self::Coinflex => "COINFLEX",
269 Self::CryptoCom => "CRYPTO_COM",
270 Self::CryptoComDerivatives => "CRYPTO_COM",
271 Self::Cryptofacilities => "CRYPTOFACILITIES",
272 Self::Delta => "DELTA",
273 Self::Deribit => "DERIBIT",
274 Self::Dydx => "DYDX",
275 Self::Ftx => "FTX",
276 Self::FtxUs => "FTX",
277 Self::GateIo => "GATE_IO",
278 Self::GateIoFutures => "GATE_IO",
279 Self::Gemini => "GEMINI",
280 Self::Hitbtc => "HITBTC",
281 Self::Huobi => "HUOBI",
282 Self::HuobiDm => "HUOBI",
283 Self::HuobiDmLinearSwap => "HUOBI",
284 Self::HuobiDmOptions => "HUOBI",
285 Self::HuobiDmSwap => "HUOBI_DELIVERY",
286 Self::Kraken => "KRAKEN",
287 Self::Kucoin => "KUCOIN",
288 Self::Mango => "MANGO",
289 Self::Okcoin => "OKCOIN",
290 Self::Okex => "OKEX",
291 Self::OkexFutures => "OKEX",
292 Self::OkexOptions => "OKEX",
293 Self::OkexSwap => "OKEX",
294 Self::Phemex => "PHEMEX",
295 Self::Poloniex => "POLONIEX",
296 Self::Serum => "SERUM",
297 Self::StarAtlas => "STARATLAS",
298 Self::Upbit => "UPBIT",
299 Self::WooX => "WOO_X",
300 }
301 }
302
303 #[must_use]
304 pub fn as_venue(&self) -> Venue {
305 Venue::from_ustr_unchecked(Ustr::from(self.as_venue_str()))
306 }
307}