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// -------------------------------------------------------------------------------------------------
1516use chrono::{DateTime, Utc};
17use derive_builder::Builder;
18use serde::{self, Deserialize, Serialize};
1920use crate::common::enums::{
21 CoinbaseIntxAlgoStrategy, CoinbaseIntxInstrumentType, CoinbaseIntxOrderEventType,
22 CoinbaseIntxOrderType, CoinbaseIntxSTPMode, CoinbaseIntxSide, CoinbaseIntxTimeInForce,
23};
2425/// 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.
30pub portfolio: String,
31/// Unique client-assigned order identifier.
32#[builder(default)]
33 #[serde(skip_serializing_if = "Option::is_none")]
34pub client_order_id: Option<String>,
35/// Side of the transaction (BUY/SELL).
36pub side: CoinbaseIntxSide,
37/// Amount in base asset units.
38pub size: String,
39/// Instrument identifier (name, ID, or UUID).
40pub instrument: String,
41/// Type of order.
42#[serde(rename = "type")]
43pub order_type: CoinbaseIntxOrderType,
44/// Time in force for the order.
45#[builder(default)]
46pub tif: CoinbaseIntxTimeInForce,
47/// Price limit in quote asset units.
48#[builder(default)]
49 #[serde(skip_serializing_if = "Option::is_none")]
50pub price: Option<String>,
51/// Market price that activates a stop order.
52#[builder(default)]
53 #[serde(skip_serializing_if = "Option::is_none")]
54pub stop_price: Option<String>,
55/// Limit price for TP/SL stop leg orders.
56#[builder(default)]
57 #[serde(skip_serializing_if = "Option::is_none")]
58pub stop_limit_price: Option<String>,
59/// Expiration time for GTT orders.
60#[builder(default)]
61 #[serde(skip_serializing_if = "Option::is_none")]
62pub expire_time: Option<DateTime<Utc>>,
63/// Self-trade prevention mode.
64#[builder(default)]
65 #[serde(skip_serializing_if = "Option::is_none")]
66pub stp_mode: Option<CoinbaseIntxSTPMode>,
67/// Whether order must rest on the book.
68#[builder(default)]
69 #[serde(skip_serializing_if = "Option::is_none")]
70pub post_only: Option<bool>,
71/// Whether order must close existing position.
72#[builder(default)]
73 #[serde(skip_serializing_if = "Option::is_none")]
74pub close_only: Option<bool>,
75/// Algorithmic trading strategy.
76#[builder(default)]
77 #[serde(skip_serializing_if = "Option::is_none")]
78pub algo_strategy: Option<CoinbaseIntxAlgoStrategy>,
79}
8081/// Parameters for retrieving a single order.
82#[derive(Clone, Debug, Deserialize, Serialize)]
83pub struct GetOrderParams {
84/// Portfolio UUID or ID.
85pub portfolio: String,
86}
8788/// 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.
93pub portfolio: String,
94/// Instrument identifier (name, UUID, or ID).
95#[builder(default)]
96 #[serde(skip_serializing_if = "Option::is_none")]
97pub instrument: Option<String>,
98/// Type of instrument ("SPOT" or "PERPETUAL_FUTURE").
99#[builder(default)]
100 #[serde(skip_serializing_if = "Option::is_none")]
101pub instrument_type: Option<String>,
102/// Client-provided order identifier.
103#[builder(default)]
104 #[serde(skip_serializing_if = "Option::is_none")]
105pub client_order_id: Option<String>,
106/// Type of the most recent order event.
107#[builder(default)]
108 #[serde(skip_serializing_if = "Option::is_none")]
109pub event_type: Option<CoinbaseIntxOrderEventType>,
110/// Type of order.
111#[builder(default)]
112 #[serde(skip_serializing_if = "Option::is_none")]
113pub order_type: Option<CoinbaseIntxOrderType>,
114/// Order side (BUY/SELL).
115#[builder(default)]
116 #[serde(skip_serializing_if = "Option::is_none")]
117pub side: Option<CoinbaseIntxSide>,
118/// Maximum event time for results (ISO-8601).
119#[builder(default)]
120 #[serde(skip_serializing_if = "Option::is_none")]
121pub 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")]
125pub result_limit: Option<u32>,
126/// Number of results to skip.
127#[builder(default)]
128 #[serde(skip_serializing_if = "Option::is_none")]
129pub result_offset: Option<u32>,
130}
131132/// Parameters for retrieving a single order.
133#[derive(Clone, Debug, Deserialize, Serialize)]
134pub struct CancelOrderParams {
135/// Portfolio UUID or ID.
136pub portfolio: String,
137}
138139/// 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.
144pub portfolio: String,
145/// Instrument identifier (name, UUID, or ID).
146#[builder(default)]
147 #[serde(skip_serializing_if = "Option::is_none")]
148pub instrument: Option<String>,
149/// Order side.
150#[builder(default)]
151 #[serde(skip_serializing_if = "Option::is_none")]
152pub side: Option<CoinbaseIntxSide>,
153/// Type of instrument.
154#[builder(default)]
155 #[serde(skip_serializing_if = "Option::is_none")]
156pub instrument_type: Option<CoinbaseIntxInstrumentType>,
157}
158159/// 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).
164pub portfolio: String,
165/// Client-assigned unique identifier for the modified order.
166pub 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")]
170pub price: Option<String>,
171/// New market price that activates a stop order.
172#[builder(default)]
173 #[serde(skip_serializing_if = "Option::is_none")]
174pub stop_price: Option<String>,
175/// New amount in base asset units.
176#[builder(default)]
177 #[serde(skip_serializing_if = "Option::is_none")]
178pub size: Option<String>,
179}
180181/// 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")]
188pub 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")]
192pub 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")]
197pub 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")]
201pub 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")]
205pub 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")]
209pub time_from: Option<DateTime<Utc>>,
210}