nautilus_coinbase_intx/http/
query.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use chrono::{DateTime, Utc};
17use derive_builder::Builder;
18use serde::{self, Deserialize, Serialize};
19
20use crate::common::enums::{
21    CoinbaseIntxAlgoStrategy, CoinbaseIntxInstrumentType, CoinbaseIntxOrderEventType,
22    CoinbaseIntxOrderType, CoinbaseIntxSTPMode, CoinbaseIntxSide, CoinbaseIntxTimeInForce,
23};
24
25/// Parameters for creating a new order.
26#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
27#[builder(setter(into, strip_option))]
28pub struct CreateOrderParams {
29    /// Portfolio identifier.
30    pub portfolio: String,
31    /// Unique client-assigned order identifier.
32    #[builder(default)]
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub client_order_id: Option<String>,
35    /// Side of the transaction (BUY/SELL).
36    pub side: CoinbaseIntxSide,
37    /// Amount in base asset units.
38    pub size: String,
39    /// Instrument identifier (name, ID, or UUID).
40    pub instrument: String,
41    /// Type of order.
42    #[serde(rename = "type")]
43    pub order_type: CoinbaseIntxOrderType,
44    /// Time in force for the order.
45    #[builder(default)]
46    pub tif: CoinbaseIntxTimeInForce,
47    /// Price limit in quote asset units.
48    #[builder(default)]
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub price: Option<String>,
51    /// Market price that activates a stop order.
52    #[builder(default)]
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub stop_price: Option<String>,
55    /// Limit price for TP/SL stop leg orders.
56    #[builder(default)]
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub stop_limit_price: Option<String>,
59    /// Expiration time for GTT orders.
60    #[builder(default)]
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub expire_time: Option<DateTime<Utc>>,
63    /// Self-trade prevention mode.
64    #[builder(default)]
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub stp_mode: Option<CoinbaseIntxSTPMode>,
67    /// Whether order must rest on the book.
68    #[builder(default)]
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub post_only: Option<bool>,
71    /// Whether order must close existing position.
72    #[builder(default)]
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub close_only: Option<bool>,
75    /// Algorithmic trading strategy.
76    #[builder(default)]
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub algo_strategy: Option<CoinbaseIntxAlgoStrategy>,
79}
80
81/// Parameters for retrieving a single order.
82#[derive(Clone, Debug, Deserialize, Serialize)]
83pub struct GetOrderParams {
84    /// Portfolio UUID or ID.
85    pub portfolio: String,
86}
87
88/// Parameters for querying orders.
89#[derive(Clone, Debug, Serialize, Deserialize, Builder)]
90#[builder(setter(into, strip_option))]
91pub struct GetOrdersParams {
92    /// Portfolio UUID or ID.
93    pub portfolio: String,
94    /// Instrument identifier (name, UUID, or ID).
95    #[builder(default)]
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub instrument: Option<String>,
98    /// Type of instrument ("SPOT" or "PERPETUAL_FUTURE").
99    #[builder(default)]
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub instrument_type: Option<String>,
102    /// Client-provided order identifier.
103    #[builder(default)]
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub client_order_id: Option<String>,
106    /// Type of the most recent order event.
107    #[builder(default)]
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub event_type: Option<CoinbaseIntxOrderEventType>,
110    /// Type of order.
111    #[builder(default)]
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub order_type: Option<CoinbaseIntxOrderType>,
114    /// Order side (BUY/SELL).
115    #[builder(default)]
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub side: Option<CoinbaseIntxSide>,
118    /// Maximum event time for results (ISO-8601).
119    #[builder(default)]
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub ref_datetime: Option<DateTime<Utc>>,
122    /// Number of results to return (default: 25, max: 100).
123    #[builder(default)]
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub result_limit: Option<u32>,
126    /// Number of results to skip.
127    #[builder(default)]
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub result_offset: Option<u32>,
130}
131
132/// Parameters for retrieving a single order.
133#[derive(Clone, Debug, Deserialize, Serialize)]
134pub struct CancelOrderParams {
135    /// Portfolio UUID or ID.
136    pub portfolio: String,
137}
138
139/// Parameters for canceling orders.
140#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
141#[builder(setter(into, strip_option))]
142pub struct CancelOrdersParams {
143    /// Portfolio UUID or ID.
144    pub portfolio: String,
145    /// Instrument identifier (name, UUID, or ID).
146    #[builder(default)]
147    #[serde(skip_serializing_if = "Option::is_none")]
148    pub instrument: Option<String>,
149    /// Order side.
150    #[builder(default)]
151    #[serde(skip_serializing_if = "Option::is_none")]
152    pub side: Option<CoinbaseIntxSide>,
153    /// Type of instrument.
154    #[builder(default)]
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub instrument_type: Option<CoinbaseIntxInstrumentType>,
157}
158
159/// Parameters for modifying an existing order.
160#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
161#[builder(setter(into, strip_option))]
162pub struct ModifyOrderParams {
163    /// Portfolio UUID or ID (must match original order).
164    pub portfolio: String,
165    /// Client-assigned unique identifier for the modified order.
166    pub client_order_id: String,
167    /// New price limit in quote asset units (for limit and stop limit orders).
168    #[builder(default)]
169    #[serde(skip_serializing_if = "Option::is_none")]
170    pub price: Option<String>,
171    /// New market price that activates a stop order.
172    #[builder(default)]
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub stop_price: Option<String>,
175    /// New amount in base asset units.
176    #[builder(default)]
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub size: Option<String>,
179}
180
181/// Parameters for querying portfolio fills.
182#[derive(Clone, Debug, Serialize, Deserialize, Builder)]
183#[builder(setter(into, strip_option))]
184pub struct GetPortfolioFillsParams {
185    /// A specific order for which to fetch fills identified by order ID.
186    #[builder(default)]
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub order_id: Option<String>,
189    /// Fetch fills for all orders with the given client order ID.
190    #[builder(default)]
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub client_order_id: Option<String>,
193    /// The maximum `event_time` for results. Can be used in pagination to keep result set static.
194    /// Uses ISO-8601 format (e.g., 2023-03-16T23:59:53Z).
195    #[builder(default)]
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub ref_datetime: Option<DateTime<Utc>>,
198    /// The number of results to return (defaults to 25 with a max supported value of 100).
199    #[builder(default)]
200    #[serde(skip_serializing_if = "Option::is_none")]
201    pub result_limit: Option<u32>,
202    /// The number of results from the beginning to skip past.
203    #[builder(default)]
204    #[serde(skip_serializing_if = "Option::is_none")]
205    pub result_offset: Option<u32>,
206    /// The minimum `event_time` for results. Uses ISO-8601 format (e.g., 2023-03-16T23:59:53Z).
207    #[builder(default)]
208    #[serde(skip_serializing_if = "Option::is_none")]
209    pub time_from: Option<DateTime<Utc>>,
210}