Skip to main content

polyester/models/
triggers.rs

1//! Trigger SDK models (Go `models` parity).
2
3use super::{CreateOrderType, CreateSide, CreateTimeInForce, FeeAsset};
4use crate::types::{Price, Quantity};
5use buffa_types::google::protobuf::Timestamp;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum CreateTriggerType {
9    StopLoss,
10    TakeProfit,
11    TrailingStop,
12    Twap,
13    Ladder,
14}
15
16/// Typed create-trigger params.
17#[derive(Debug, Clone)]
18pub struct CreateTriggerParams {
19    pub symbol: String,
20    pub trigger_type: CreateTriggerType,
21    pub side: CreateSide,
22    pub order_type: CreateOrderType,
23    pub qty: Quantity,
24    pub trigger_price: Option<Price>,
25    pub limit_price: Option<Price>,
26    pub trigger_price_source: Option<String>,
27    pub time_in_force: Option<CreateTimeInForce>,
28    pub subaccount_id: Option<u64>,
29    /// Stable identity for this logical trigger. Persist and reuse it on retries.
30    pub client_trigger_id: String,
31    pub post_only: bool,
32    pub activation_price: Option<Price>,
33    pub trailing_distance_ticks: Option<i64>,
34    pub trailing_distance_bps: Option<i32>,
35    pub max_slippage_ticks: Option<i32>,
36    pub max_slippage_bps: Option<i32>,
37    pub twap_duration_ms: Option<i64>,
38    pub twap_slice_interval_ms: Option<i64>,
39    pub ladder_price_min: Option<Price>,
40    pub ladder_price_max: Option<Price>,
41    pub ladder_levels: Option<i32>,
42    pub ladder_distribution: Option<String>,
43    /// Fee asset. `base` is valid only for BUY child orders.
44    pub fee_asset: Option<FeeAsset>,
45    pub self_trade_prevention_mode: Option<String>,
46}
47
48/// Typed modify-trigger params.
49#[derive(Debug, Clone)]
50pub struct ModifyTriggerParams {
51    pub trigger_id: String,
52    pub subaccount_id: Option<u64>,
53    pub trigger_price: Option<Price>,
54    pub limit_price: Option<Price>,
55    pub activation_price: Option<Price>,
56    pub trailing_distance_ticks: Option<i64>,
57    pub trailing_distance_bps: Option<i32>,
58    pub max_slippage_ticks: Option<i32>,
59    pub max_slippage_bps: Option<i32>,
60}
61
62/// Valid trigger status filter / response labels (British "cancelled").
63pub const TRIGGER_STATUS_VALUES: &[&str] = &[
64    "created",
65    "armed",
66    "running",
67    "completed",
68    "cancelled",
69    "failed",
70    "paused",
71];
72
73/// Typed list-triggers options.
74#[derive(Debug, Clone, Default)]
75pub struct ListTriggersOpts {
76    pub symbol: Option<String>,
77    /// Status filter labels (`created`, `armed`, …). Unknown values are rejected.
78    pub status: Vec<String>,
79    pub limit: u32,
80    pub page_token: Option<String>,
81    pub subaccount_id: Option<u64>,
82}
83
84#[derive(Debug, Clone, PartialEq, Eq)]
85pub struct TriggerStopDetails {
86    pub trigger_price: Option<Price>,
87    pub trigger_price_source: String,
88    pub trigger_direction: String,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq)]
92pub struct TriggerTrailingDetails {
93    pub trailing_distance: Option<Price>,
94    pub trailing_distance_bps: i32,
95    pub activation_price: Option<Price>,
96    pub peak_price: Option<Price>,
97    pub trough_price: Option<Price>,
98    pub max_slippage: Option<Price>,
99    pub max_slippage_bps: i32,
100    pub trigger_price_source: String,
101    pub trigger_direction: String,
102}
103
104#[derive(Debug, Clone, PartialEq, Eq)]
105pub struct TriggerTwapDetails {
106    pub twap_duration_ms: i64,
107    pub twap_slice_interval_ms: i64,
108    pub slice_idx: i32,
109    pub slice_count: i32,
110    pub executed_qty: Option<Quantity>,
111}
112
113#[derive(Debug, Clone, PartialEq, Eq)]
114pub struct TriggerLadderDetails {
115    pub ladder_price_min: Option<Price>,
116    pub ladder_price_max: Option<Price>,
117    pub ladder_levels: i32,
118    pub ladder_distribution: String,
119}
120
121#[derive(Debug, Clone, PartialEq, Eq)]
122pub enum TriggerDetails {
123    Stop(TriggerStopDetails),
124    Trailing(TriggerTrailingDetails),
125    Twap(TriggerTwapDetails),
126    Ladder(TriggerLadderDetails),
127}
128
129#[derive(Debug, Clone, PartialEq)]
130pub struct Trigger {
131    pub trigger_id: String,
132    pub subaccount_id: String,
133    pub symbol_id: u32,
134    pub symbol: String,
135    pub trigger_type: String,
136    pub status: String,
137    pub parent_order_id: Option<String>,
138    pub side: String,
139    pub order_type: String,
140    pub time_in_force: String,
141    pub qty: Option<Quantity>,
142    pub limit_price: Option<Price>,
143    pub fee_asset: String,
144    pub self_trade_prevention_mode: String,
145    pub post_only: bool,
146    /// Convenience: stop-trigger price when details are `Stop`.
147    pub trigger_price: Option<Price>,
148    pub client_trigger_id: String,
149    pub created_at: Option<Timestamp>,
150    pub updated_at: Option<Timestamp>,
151    pub armed_at: Option<Timestamp>,
152    pub completed_at: Option<Timestamp>,
153    pub details: Option<TriggerDetails>,
154}
155
156#[derive(Debug, Clone, PartialEq)]
157pub struct TriggersList {
158    pub triggers: Vec<Trigger>,
159    pub total: usize,
160    pub next_page_token: String,
161}
162
163#[derive(Debug, Clone, PartialEq, Eq)]
164pub struct TriggerMutationResult {
165    pub trigger_id: String,
166    pub client_trigger_id: String,
167    pub status: String,
168}
169
170#[derive(Debug, Clone, PartialEq, Eq)]
171pub struct TriggerEvent {
172    pub trigger_id: String,
173    pub subaccount_id: String,
174    pub symbol_id: u32,
175    pub trigger_type: String,
176    pub event_type: String,
177    pub ts_ns: String,
178    pub child_seq: i32,
179    pub child_order_id: String,
180    pub fire_price: Option<Price>,
181    pub reason: String,
182}
183
184#[derive(Debug, Clone, PartialEq, Eq)]
185pub struct TriggerEventsList {
186    pub events: Vec<TriggerEvent>,
187    pub next_page_token: String,
188}