Skip to main content

ids_apis/
kdo.v1.lp.rs

1// @generated
2// This file is @generated by prost-build.
3/// ETF LP 설정
4#[allow(clippy::derive_partial_eq_without_eq)]
5#[derive(Clone, PartialEq, ::prost::Message)]
6pub struct EtfLp {
7    /// ETF 심볼
8    #[prost(string, tag="1")]
9    pub symbol: ::prost::alloc::string::String,
10    /// Fund
11    #[prost(string, tag="2")]
12    pub fund_code: ::prost::alloc::string::String,
13    #[prost(double, tag="3")]
14    pub ask_basis: f64,
15    ///
16    #[prost(double, tag="4")]
17    pub bid_basis: f64,
18    /// 호가 깊이 (양방향 레벨 수)
19    #[prost(uint32, tag="8")]
20    pub depth: u32,
21    /// ETF tick 크기 (원 단위, i64)
22    #[prost(int64, tag="9")]
23    pub tick_size: i64,
24    /// 동적 offset 조정 설정
25    #[prost(message, optional, tag="10")]
26    pub offset: ::core::option::Option<EtfLpOffset>,
27    /// 활성화 여부
28    #[prost(bool, tag="11")]
29    pub enabled: bool,
30    /// ETF 가격 산출 방식
31    #[prost(message, optional, tag="12")]
32    pub pricing_method: ::core::option::Option<super::common::EtfPricing>,
33    /// 매수 호가 조정값
34    #[prost(double, optional, tag="13")]
35    pub bid_adjustment: ::core::option::Option<f64>,
36    /// 매도 호가 조정값
37    #[prost(double, optional, tag="14")]
38    pub ask_adjustment: ::core::option::Option<f64>,
39    /// 매수 주문 수량 (i64)
40    #[prost(int64, tag="15")]
41    pub bid_quantity: i64,
42    /// 매도 주문 수량 (i64)
43    #[prost(int64, tag="16")]
44    pub ask_quantity: i64,
45    /// 모멘텀 활성화 여부
46    #[prost(bool, optional, tag="17")]
47    pub momentum_enabled: ::core::option::Option<bool>,
48    /// 모멘텀 윈도우 크기
49    #[prost(uint32, optional, tag="18")]
50    pub momentum_window: ::core::option::Option<u32>,
51    /// 모멘텀 민감도
52    #[prost(double, optional, tag="19")]
53    pub momentum_sensitivity: ::core::option::Option<f64>,
54    /// 매수/매도 수량 한도
55    #[prost(message, optional, tag="20")]
56    pub quantity_limit: ::core::option::Option<EtfLpQuantityLimit>,
57    /// precomputed quote retreat 처리 정책
58    #[prost(enumeration="PrecomputePolicy", optional, tag="21")]
59    pub precompute_policy: ::core::option::Option<i32>,
60    /// pricing source 선물 1호가 잔량 imbalance guard 활성화 여부
61    /// 선물 1호가 잔량이 반대편의 30% 이하로 imbalance 발생 시 영향받는 ETF side 주문 자동 cancel
62    #[prost(bool, tag="22")]
63    pub pricing_source_liquidity_imbalance_guard_enabled: bool,
64    /// 포트폴리오 ID (응답용 - portfolio_fund 에서 derive)
65    #[prost(int32, tag="23")]
66    pub portfolio_id: i32,
67    /// 매수 호가 활성화 여부 (enabled=true 일 때만 적용. false=매수 호가 중단)
68    #[prost(bool, tag="24")]
69    pub bid_enabled: bool,
70    /// 매도 호가 활성화 여부 (enabled=true 일 때만 적용. false=매도 호가 중단)
71    #[prost(bool, tag="25")]
72    pub ask_enabled: bool,
73}
74/// 매수/매도 수량 한도
75#[allow(clippy::derive_partial_eq_without_eq)]
76#[derive(Clone, Copy, PartialEq, ::prost::Message)]
77pub struct EtfLpQuantityLimit {
78    /// 매수 수량 상한 (gross 누적 매수 체결 기준)
79    #[prost(int64, tag="2")]
80    pub max_bid_quantity: i64,
81    /// 매도 수량 상한 (gross 누적 매도 체결 기준)
82    #[prost(int64, tag="4")]
83    pub max_ask_quantity: i64,
84    /// 순포지션 (+ = 순매수, - = 순매도): gross_bid - gross_ask
85    /// 상태 조회 시 런타임 계산값으로 노출; 한도 검증에는 max_net_quantity 참조
86    #[prost(int64, optional, tag="5")]
87    pub net_quantity: ::core::option::Option<i64>,
88    /// 순포지션 한도 설정값 (한도 검증에 사용)
89    /// net_quantity > 0 && net_quantity >= max_net_quantity → 매수 차단
90    /// net_quantity < 0 && |net_quantity| >= max_net_quantity → 매도 차단
91    /// 미설정(None) 시 순포지션 기반 차단 비활성
92    #[prost(int64, optional, tag="6")]
93    pub max_net_quantity: ::core::option::Option<i64>,
94}
95// ========== ETF LP Status Messages ==========
96
97/// ETF LP 상태
98#[allow(clippy::derive_partial_eq_without_eq)]
99#[derive(Clone, PartialEq, ::prost::Message)]
100pub struct EtfLpStatus {
101    /// ETF 심볼
102    #[prost(string, tag="1")]
103    pub etf_symbol: ::prost::alloc::string::String,
104    /// 펀드 코드
105    #[prost(string, tag="2")]
106    pub fund_code: ::prost::alloc::string::String,
107    /// Basis 스프레드 (원 단위, i64)
108    #[prost(double, optional, tag="3")]
109    pub ask_basis: ::core::option::Option<f64>,
110    #[prost(double, optional, tag="4")]
111    pub bid_basis: ::core::option::Option<f64>,
112    /// LP 상태
113    #[prost(enumeration="EtfLpState", tag="8")]
114    pub state: i32,
115    /// 가격 정보
116    #[prost(message, optional, tag="9")]
117    pub pricing: ::core::option::Option<LpPricing>,
118    /// 체결 통계
119    #[prost(message, optional, tag="10")]
120    pub fill_statistics: ::core::option::Option<FillStatistics>,
121    /// 동적 offset 조정 설정 (optional)
122    #[prost(message, optional, tag="11")]
123    pub offset: ::core::option::Option<EtfLpOffset>,
124    /// 매수 호가 조정값
125    #[prost(double, optional, tag="13")]
126    pub bid_adjustment: ::core::option::Option<f64>,
127    /// 매도 호가 조정값
128    #[prost(double, optional, tag="14")]
129    pub ask_adjustment: ::core::option::Option<f64>,
130    /// 매수 주문 수량 (i64)
131    #[prost(int64, tag="15")]
132    pub bid_quantity: i64,
133    /// 매도 주문 수량 (i64)
134    #[prost(int64, tag="16")]
135    pub ask_quantity: i64,
136    /// 모멘텀 활성화 여부
137    #[prost(bool, optional, tag="17")]
138    pub momentum_enabled: ::core::option::Option<bool>,
139    /// 모멘텀 윈도우 크기
140    #[prost(uint32, optional, tag="18")]
141    pub momentum_window: ::core::option::Option<u32>,
142    /// 모멘텀 민감도
143    #[prost(double, optional, tag="19")]
144    pub momentum_sensitivity: ::core::option::Option<f64>,
145    /// 런타임 계산된 모멘텀 매수 호가 조정값
146    #[prost(double, optional, tag="20")]
147    pub momentum_bid_adjustment: ::core::option::Option<f64>,
148    /// 런타임 계산된 모멘텀 매도 호가 조정값
149    #[prost(double, optional, tag="21")]
150    pub momentum_ask_adjustment: ::core::option::Option<f64>,
151    /// 매수/매도 수량 한도
152    #[prost(message, optional, tag="22")]
153    pub quantity_limit: ::core::option::Option<EtfLpQuantityLimit>,
154    /// precomputed quote retreat 처리 정책
155    #[prost(enumeration="PrecomputePolicy", optional, tag="23")]
156    pub precompute_policy: ::core::option::Option<i32>,
157    /// 호가 깊이 (양방향 레벨 수)
158    #[prost(uint32, tag="24")]
159    pub depth: u32,
160    /// pricing source 선물 1호가 잔량 imbalance guard 활성화 여부
161    #[prost(bool, tag="25")]
162    pub pricing_source_liquidity_imbalance_guard_enabled: bool,
163    /// 매수 호가 활성화 여부 (enabled=true 일 때만 적용. false=매수 호가 중단)
164    #[prost(bool, optional, tag="26")]
165    pub bid_enabled: ::core::option::Option<bool>,
166    /// 매도 호가 활성화 여부 (enabled=true 일 때만 적용. false=매도 호가 중단)
167    #[prost(bool, optional, tag="27")]
168    pub ask_enabled: ::core::option::Option<bool>,
169}
170/// ETF LP 상태 업데이트 메시지 (변화된 필드만 포함)
171#[allow(clippy::derive_partial_eq_without_eq)]
172#[derive(Clone, PartialEq, ::prost::Message)]
173pub struct EtfLpStatusUpdate {
174    /// ETF 심볼
175    #[prost(string, tag="1")]
176    pub etf_symbol: ::prost::alloc::string::String,
177    /// 펀드 코드
178    #[prost(string, tag="2")]
179    pub fund_code: ::prost::alloc::string::String,
180    /// Basis 스프레드
181    #[prost(double, optional, tag="3")]
182    pub ask_basis: ::core::option::Option<f64>,
183    #[prost(double, optional, tag="4")]
184    pub bid_basis: ::core::option::Option<f64>,
185    /// LP 상태
186    #[prost(enumeration="EtfLpState", optional, tag="8")]
187    pub state: ::core::option::Option<i32>,
188    /// 가격 정보
189    #[prost(message, optional, tag="9")]
190    pub pricing: ::core::option::Option<LpPricing>,
191    /// 체결 통계
192    #[prost(message, optional, tag="10")]
193    pub fill_statistics: ::core::option::Option<FillStatistics>,
194    /// 동적 offset 조정 설정 (optional)
195    #[prost(message, optional, tag="11")]
196    pub offset: ::core::option::Option<EtfLpOffset>,
197    /// 매수 호가 조정값
198    #[prost(double, optional, tag="12")]
199    pub bid_adjustment: ::core::option::Option<f64>,
200    /// 매도 호가 조정값
201    #[prost(double, optional, tag="13")]
202    pub ask_adjustment: ::core::option::Option<f64>,
203    /// 매수 주문 수량 (i64)
204    #[prost(int64, optional, tag="14")]
205    pub bid_quantity: ::core::option::Option<i64>,
206    /// 매도 주문 수량 (i64)
207    #[prost(int64, optional, tag="15")]
208    pub ask_quantity: ::core::option::Option<i64>,
209    /// 모멘텀 활성화 여부
210    #[prost(bool, optional, tag="16")]
211    pub momentum_enabled: ::core::option::Option<bool>,
212    /// 모멘텀 윈도우 크기
213    #[prost(uint32, optional, tag="17")]
214    pub momentum_window: ::core::option::Option<u32>,
215    /// 모멘텀 민감도
216    #[prost(double, optional, tag="18")]
217    pub momentum_sensitivity: ::core::option::Option<f64>,
218    /// 런타임 계산된 모멘텀 매수 호가 조정값
219    #[prost(double, optional, tag="19")]
220    pub momentum_bid_adjustment: ::core::option::Option<f64>,
221    /// 런타임 계산된 모멘텀 매도 호가 조정값
222    #[prost(double, optional, tag="20")]
223    pub momentum_ask_adjustment: ::core::option::Option<f64>,
224    /// 매수/매도 수량 한도
225    #[prost(message, optional, tag="21")]
226    pub quantity_limit: ::core::option::Option<EtfLpQuantityLimit>,
227    /// precomputed quote retreat 처리 정책
228    #[prost(enumeration="PrecomputePolicy", optional, tag="22")]
229    pub precompute_policy: ::core::option::Option<i32>,
230    /// 호가 깊이 (양방향 레벨 수, 변경 시에만 Some)
231    #[prost(uint32, optional, tag="23")]
232    pub depth: ::core::option::Option<u32>,
233    /// pricing source 선물 1호가 잔량 imbalance guard 상태 (변경 시에만 Some)
234    #[prost(enumeration="PricingSourceLiquidityImbalanceGuardState", optional, tag="24")]
235    pub pricing_source_liquidity_imbalance_guard_state: ::core::option::Option<i32>,
236    /// 매수 호가 활성화 여부 (변경 시에만 Some)
237    #[prost(bool, optional, tag="25")]
238    pub bid_enabled: ::core::option::Option<bool>,
239    /// 매도 호가 활성화 여부 (변경 시에만 Some)
240    #[prost(bool, optional, tag="26")]
241    pub ask_enabled: ::core::option::Option<bool>,
242}
243/// 자동 offset 조정 설정
244#[allow(clippy::derive_partial_eq_without_eq)]
245#[derive(Clone, Copy, PartialEq, ::prost::Message)]
246pub struct EtfLpOffset {
247    /// optional: 미설정(None) 시 해당 필드를 덮어쓰지 않음.
248    /// proto3 optional scalar → prost::Message 에서 Option<T>로 생성됨.
249    #[prost(double, optional, tag="1")]
250    pub bid_offset: ::core::option::Option<f64>,
251    #[prost(double, optional, tag="2")]
252    pub ask_offset: ::core::option::Option<f64>,
253    /// NAV 밴드 설정
254    #[prost(double, optional, tag="3")]
255    pub min_offset: ::core::option::Option<f64>,
256    #[prost(double, optional, tag="4")]
257    pub max_offset: ::core::option::Option<f64>,
258    /// 시간 기반 조정
259    #[prost(bool, optional, tag="7")]
260    pub time_adjustment_enabled: ::core::option::Option<bool>,
261    #[prost(uint64, optional, tag="8")]
262    pub adjustment_interval_secs: ::core::option::Option<u64>,
263    #[prost(double, optional, tag="9")]
264    pub adjustment_step: ::core::option::Option<f64>,
265    #[prost(bool, optional, tag="10")]
266    pub reset_on_fill: ::core::option::Option<bool>,
267    /// 순매매량 기반 조정
268    #[prost(bool, optional, tag="17")]
269    pub position_adjustment_enabled: ::core::option::Option<bool>,
270    #[prost(enumeration="PositionAdjustmentStrategy", optional, tag="18")]
271    pub position_strategy: ::core::option::Option<i32>,
272    #[prost(int64, optional, tag="19")]
273    pub position_threshold: ::core::option::Option<i64>,
274    #[prost(double, optional, tag="20")]
275    pub position_adjustment_step: ::core::option::Option<f64>,
276    /// 누적 순포지션 (+=순매수, -=순매도): 포지션 기반 자동 조정이 추적하는 런타임 값.
277    /// 트리거 발동(offset 변경) 시 0으로 리셋됩니다.
278    /// runtime 추적값이므로 optional 아님 — mapper에서 drop 처리.
279    #[prost(int64, tag="21")]
280    pub net_position: i64,
281}
282/// ETF 체결 통계 (매수/매도 체결량 및 평균 단가)
283#[allow(clippy::derive_partial_eq_without_eq)]
284#[derive(Clone, PartialEq, ::prost::Message)]
285pub struct FillStatistics {
286    /// 매수 체결량
287    #[prost(int64, tag="1")]
288    pub buy_filled_quantity: i64,
289    /// 매도 체결량
290    #[prost(int64, tag="2")]
291    pub sell_filled_quantity: i64,
292    /// 매수 총금액 (평균 단가 계산용)
293    #[prost(string, tag="3")]
294    pub buy_total_amount: ::prost::alloc::string::String,
295    /// 매도 총금액 (평균 단가 계산용)
296    #[prost(string, tag="4")]
297    pub sell_total_amount: ::prost::alloc::string::String,
298}
299/// 주문 통계
300#[allow(clippy::derive_partial_eq_without_eq)]
301#[derive(Clone, Copy, PartialEq, ::prost::Message)]
302pub struct OrderStats {
303    /// 총 전송 주문 수
304    #[prost(uint64, tag="1")]
305    pub total_orders_sent: u64,
306    /// 접수된 주문 수
307    #[prost(uint64, tag="2")]
308    pub orders_accepted: u64,
309    /// 거부된 주문 수
310    #[prost(uint64, tag="3")]
311    pub orders_rejected: u64,
312    /// 체결된 주문 수
313    #[prost(uint64, tag="4")]
314    pub orders_filled: u64,
315    /// 총 체결 수량
316    #[prost(int64, tag="5")]
317    pub total_filled_quantity: i64,
318    /// 일일 체결 수량
319    #[prost(int64, tag="6")]
320    pub daily_filled_quantity: i64,
321}
322// Order Limiter 상태
323// message OrderLimitStatus {
324//   // 일일 누적 체결 수량 (i64)
325//   int64 daily_filled_quantity = 1;
326//
327//   // 일일 누적 체결 수량 한도 (i64)
328//   int64 daily_cumulative_limit = 2;
329//
330//   // 시간 프레임별 주문 개수 현황
331//   repeated TimeFrameStatus time_frame_status = 3;
332//
333//   // 일일 사용률 (%)
334//   double daily_usage_percent = 4;
335// }
336
337/// 시간 프레임별 상태
338#[allow(clippy::derive_partial_eq_without_eq)]
339#[derive(Clone, Copy, PartialEq, ::prost::Message)]
340pub struct TimeFrameStatus {
341    /// 시간 윈도우 (초)
342    #[prost(uint64, tag="1")]
343    pub window_seconds: u64,
344    /// 현재 윈도우 내 주문 개수
345    #[prost(uint32, tag="2")]
346    pub current_count: u32,
347    /// 최대 주문 개수
348    #[prost(uint32, tag="3")]
349    pub max_orders: u32,
350    /// 사용률 (%)
351    #[prost(double, tag="4")]
352    pub usage_percent: f64,
353}
354/// LP 가격 정보
355#[allow(clippy::derive_partial_eq_without_eq)]
356#[derive(Clone, PartialEq, ::prost::Message)]
357pub struct LpPricing {
358    #[prost(string, tag="1")]
359    pub etf_ask_quote: ::prost::alloc::string::String,
360    #[prost(string, tag="2")]
361    pub etf_bid_quote: ::prost::alloc::string::String,
362    /// ETF NAV (원 단위)
363    #[prost(string, tag="3")]
364    pub etf_ask_nav: ::prost::alloc::string::String,
365    #[prost(string, tag="4")]
366    pub etf_bid_nav: ::prost::alloc::string::String,
367}
368// ========== Request/Response Messages ==========
369
370/// CreateEtfLp
371#[allow(clippy::derive_partial_eq_without_eq)]
372#[derive(Clone, PartialEq, ::prost::Message)]
373pub struct CreateEtfLpRequest {
374    /// 생성할 ETF LP 설정
375    #[prost(message, optional, tag="1")]
376    pub etf_lp: ::core::option::Option<EtfLp>,
377}
378/// GetEtfLp
379#[allow(clippy::derive_partial_eq_without_eq)]
380#[derive(Clone, PartialEq, ::prost::Message)]
381pub struct GetEtfLpRequest {
382    #[prost(string, tag="1")]
383    pub etf: ::prost::alloc::string::String,
384    #[prost(string, tag="2")]
385    pub fund: ::prost::alloc::string::String,
386}
387/// ListEtfLps
388#[allow(clippy::derive_partial_eq_without_eq)]
389#[derive(Clone, PartialEq, ::prost::Message)]
390pub struct ListEtfLpsRequest {
391    /// 페이지 크기 (optional)
392    #[prost(uint32, optional, tag="1")]
393    pub page_size: ::core::option::Option<u32>,
394    /// 페이지 토큰 (optional, for pagination)
395    #[prost(string, optional, tag="2")]
396    pub page_token: ::core::option::Option<::prost::alloc::string::String>,
397    /// Available Sequence and Operator
398    /// * etf_symbol
399    ///    * `equal`, `contains`
400    /// * fund_code
401    ///    * `equal`, `contains`
402    ///
403    /// Examples
404    /// * filter=etf_symbol:"005930"
405    /// * filter=fund_code="0159"
406    #[prost(string, tag="3")]
407    pub filter: ::prost::alloc::string::String,
408}
409#[allow(clippy::derive_partial_eq_without_eq)]
410#[derive(Clone, PartialEq, ::prost::Message)]
411pub struct ListEtfLpsResponse {
412    /// ETF 목록
413    #[prost(message, repeated, tag="1")]
414    pub etf_lps: ::prost::alloc::vec::Vec<EtfLp>,
415    /// 다음 페이지 토큰
416    #[prost(string, tag="2")]
417    pub next_page_token: ::prost::alloc::string::String,
418}
419#[allow(clippy::derive_partial_eq_without_eq)]
420#[derive(Clone, PartialEq, ::prost::Message)]
421pub struct ListEtfLpStatusesRequest {
422    /// 페이지 크기 (optional)
423    #[prost(uint32, optional, tag="1")]
424    pub page_size: ::core::option::Option<u32>,
425    /// 페이지 토큰 (optional, for pagination)
426    #[prost(string, optional, tag="2")]
427    pub page_token: ::core::option::Option<::prost::alloc::string::String>,
428    // Available Sequence and Operator
429    // * etf_symbol
430    //    * `equal`, `contains`
431    // * fund_code
432    //    * `equal`, `contains`
433    // * state
434    //    * `equal`
435    // * fill_satistics.buy_filled_quantity
436    //    * `greater_than`, `less_than`
437    //
438    // Examples
439    // * filter=etf_symbol:"005930"
440    // * filter=fund_code="0159"
441    // * filter=state=ETF_LP_STATE_RUNNING
442    // * filter=fill_statistics.buy_filled_quantity > 1000
443
444    #[prost(string, tag="3")]
445    pub filter: ::prost::alloc::string::String,
446    /// 오더링 조건. (optional, AIP-132)
447    ///
448    /// Support,ed Fields
449    /// * "fill_statistics.buy_filled_quantity", "fill_statistics.sell_filled_quantity"
450    ///
451    /// Examples
452    /// * order_by=fill_statistics.buy_filled_quantity desc
453    #[prost(string, tag="5")]
454    pub order_by: ::prost::alloc::string::String,
455}
456#[allow(clippy::derive_partial_eq_without_eq)]
457#[derive(Clone, PartialEq, ::prost::Message)]
458pub struct ListEtfLpStatusesResponse {
459    /// ETF 목록
460    #[prost(message, repeated, tag="1")]
461    pub etf_lp_statuses: ::prost::alloc::vec::Vec<EtfLpStatus>,
462    /// 다음 페이지 토큰
463    #[prost(string, tag="2")]
464    pub next_page_token: ::prost::alloc::string::String,
465}
466/// UpdateEtfLp
467#[allow(clippy::derive_partial_eq_without_eq)]
468#[derive(Clone, PartialEq, ::prost::Message)]
469pub struct UpdateEtfLpRequest {
470    /// ETF 심볼
471    #[prost(string, tag="1")]
472    pub symbol: ::prost::alloc::string::String,
473    /// 펀드 코드
474    #[prost(string, tag="2")]
475    pub fund_code: ::prost::alloc::string::String,
476    // 각 필드가 optional — 여러 필드를 동시에 설정 가능
477    // (tag 3은 예약, oneof wrapper와 충돌 방지)
478
479    /// 호가 깊이
480    #[prost(uint32, optional, tag="4")]
481    pub depth: ::core::option::Option<u32>,
482    /// 동적 offset 조정 설정
483    #[prost(message, optional, tag="5")]
484    pub offset: ::core::option::Option<EtfLpOffset>,
485    #[prost(double, optional, tag="6")]
486    pub ask_basis: ::core::option::Option<f64>,
487    #[prost(double, optional, tag="7")]
488    pub bid_basis: ::core::option::Option<f64>,
489    /// 매수 주문 수량
490    #[prost(int64, optional, tag="8")]
491    pub bid_quantity: ::core::option::Option<i64>,
492    /// 매도 주문 수량
493    #[prost(int64, optional, tag="9")]
494    pub ask_quantity: ::core::option::Option<i64>,
495    /// 매수 호가 조정값
496    #[prost(double, optional, tag="10")]
497    pub bid_adjustment: ::core::option::Option<f64>,
498    /// 매도 호가 조정값
499    #[prost(double, optional, tag="11")]
500    pub ask_adjustment: ::core::option::Option<f64>,
501    /// 모멘텀 활성화 여부
502    #[prost(bool, optional, tag="12")]
503    pub momentum_enabled: ::core::option::Option<bool>,
504    /// 모멘텀 윈도우 크기
505    #[prost(uint32, optional, tag="13")]
506    pub momentum_window: ::core::option::Option<u32>,
507    /// 모멘텀 민감도
508    #[prost(double, optional, tag="14")]
509    pub momentum_sensitivity: ::core::option::Option<f64>,
510    /// 매수/매도 수량 한도
511    #[prost(message, optional, tag="15")]
512    pub quantity_limit: ::core::option::Option<EtfLpQuantityLimit>,
513    /// precomputed quote retreat 처리 정책
514    #[prost(enumeration="PrecomputePolicy", optional, tag="16")]
515    pub precompute_policy: ::core::option::Option<i32>,
516    /// pricing source 선물 1호가 잔량 imbalance guard 활성화 여부
517    #[prost(bool, optional, tag="17")]
518    pub pricing_source_liquidity_imbalance_guard_enabled: ::core::option::Option<bool>,
519    /// ETF pricing 방식. LP가 Idle/Error 상태일 때만 변경 가능.
520    /// EtfPricing은 common.proto의 oneof method 메시지 (Pdf*, IndexTracking*, FutureBasis, LeverageFuture).
521    #[prost(message, optional, tag="18")]
522    pub pricing: ::core::option::Option<super::common::EtfPricing>,
523    /// 매수 호가 활성화 여부 (PATCH 시에만 명시)
524    #[prost(bool, optional, tag="19")]
525    pub bid_enabled: ::core::option::Option<bool>,
526    /// 매도 호가 활성화 여부 (PATCH 시에만 명시)
527    #[prost(bool, optional, tag="20")]
528    pub ask_enabled: ::core::option::Option<bool>,
529}
530/// GetEtfLpStatus
531#[allow(clippy::derive_partial_eq_without_eq)]
532#[derive(Clone, PartialEq, ::prost::Message)]
533pub struct GetEtfLpStatusRequest {
534    #[prost(string, tag="1")]
535    pub etf: ::prost::alloc::string::String,
536    #[prost(string, tag="2")]
537    pub fund: ::prost::alloc::string::String,
538}
539/// StreamEtfLpStatus
540#[allow(clippy::derive_partial_eq_without_eq)]
541#[derive(Clone, PartialEq, ::prost::Message)]
542pub struct StreamEtfLpStatusUpdateRequest {
543    #[prost(string, tag="1")]
544    pub etf: ::prost::alloc::string::String,
545    #[prost(string, tag="2")]
546    pub fund: ::prost::alloc::string::String,
547}
548/// ETF LP 시작 요청
549#[allow(clippy::derive_partial_eq_without_eq)]
550#[derive(Clone, PartialEq, ::prost::Message)]
551pub struct StartEtfLpRequest {
552    #[prost(string, tag="1")]
553    pub etf: ::prost::alloc::string::String,
554    #[prost(string, tag="2")]
555    pub fund: ::prost::alloc::string::String,
556}
557/// ETF LP 시작 응답
558#[allow(clippy::derive_partial_eq_without_eq)]
559#[derive(Clone, PartialEq, ::prost::Message)]
560pub struct StartEtfLpResponse {
561    /// LP 상태
562    #[prost(message, optional, tag="1")]
563    pub status: ::core::option::Option<EtfLpStatus>,
564    /// 메시지
565    #[prost(string, tag="2")]
566    pub message: ::prost::alloc::string::String,
567}
568/// ETF LP 중지 요청
569#[allow(clippy::derive_partial_eq_without_eq)]
570#[derive(Clone, PartialEq, ::prost::Message)]
571pub struct StopEtfLpRequest {
572    #[prost(string, tag="1")]
573    pub etf: ::prost::alloc::string::String,
574    #[prost(string, tag="2")]
575    pub fund: ::prost::alloc::string::String,
576}
577/// ETF LP 중지 응답
578#[allow(clippy::derive_partial_eq_without_eq)]
579#[derive(Clone, PartialEq, ::prost::Message)]
580pub struct StopEtfLpResponse {
581    /// LP 상태
582    #[prost(message, optional, tag="1")]
583    pub status: ::core::option::Option<EtfLpStatus>,
584    /// 메시지
585    #[prost(string, tag="2")]
586    pub message: ::prost::alloc::string::String,
587}
588/// StreamEtfErrors 요청
589#[allow(clippy::derive_partial_eq_without_eq)]
590#[derive(Clone, PartialEq, ::prost::Message)]
591pub struct StreamLpEventsRequest {
592    #[prost(string, tag="1")]
593    pub etf: ::prost::alloc::string::String,
594    #[prost(string, tag="2")]
595    pub fund: ::prost::alloc::string::String,
596}
597/// 주문 업데이트 스트리밍 요청
598#[allow(clippy::derive_partial_eq_without_eq)]
599#[derive(Clone, PartialEq, ::prost::Message)]
600pub struct GetUserOrderBookRequest {
601    #[prost(string, tag="1")]
602    pub etf: ::prost::alloc::string::String,
603    #[prost(string, tag="2")]
604    pub fund: ::prost::alloc::string::String,
605}
606/// 주문 업데이트 정보
607#[allow(clippy::derive_partial_eq_without_eq)]
608#[derive(Clone, PartialEq, ::prost::Message)]
609pub struct UserOrderbookData {
610    /// 매수 호가 (10단계, AIP-144)
611    #[prost(string, repeated, tag="1")]
612    pub bid_prices: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
613    /// 매도 호가 (10단계)
614    #[prost(string, repeated, tag="2")]
615    pub ask_prices: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
616    /// 매수 수량 (10단계)
617    #[prost(int64, repeated, tag="3")]
618    pub bid_quantities: ::prost::alloc::vec::Vec<i64>,
619    /// 매도 수량 (10단계)
620    #[prost(int64, repeated, tag="4")]
621    pub ask_quantities: ::prost::alloc::vec::Vec<i64>,
622}
623/// 사용자 주문 오더북 강제 비우기 요청
624#[allow(clippy::derive_partial_eq_without_eq)]
625#[derive(Clone, PartialEq, ::prost::Message)]
626pub struct ClearUserOrderBookRequest {
627    /// ETF resource: "etfs/{symbol}"
628    #[prost(string, tag="1")]
629    pub etf: ::prost::alloc::string::String,
630    /// Fund resource: "funds/{fund_code}"
631    #[prost(string, tag="2")]
632    pub fund: ::prost::alloc::string::String,
633}
634/// 사용자 주문 오더북 강제 비우기 응답
635#[allow(clippy::derive_partial_eq_without_eq)]
636#[derive(Clone, PartialEq, ::prost::Message)]
637pub struct ClearUserOrderBookResponse {
638    /// LP 상태
639    #[prost(message, optional, tag="1")]
640    pub status: ::core::option::Option<EtfLpStatus>,
641    /// 메시지
642    #[prost(string, tag="2")]
643    pub message: ::prost::alloc::string::String,
644    /// 비워진 주문 갯수 (bids + asks)
645    #[prost(int32, tag="3")]
646    pub cleared_count: i32,
647}
648/// pricing source 선물 1호가 잔량 imbalance guard 상태
649/// NORMAL: 매수/매도 1호가 잔량 균형 상태
650/// BID_THIN: source 선물 매수 1호가 잔량이 매도 1호가 잔량의 30% 이하 (매수 side 얇음)
651/// ASK_THIN: source 선물 매도 1호가 잔량이 매수 1호가 잔량의 30% 이하 (매도 side 얇음)
652#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
653#[repr(i32)]
654pub enum PricingSourceLiquidityImbalanceGuardState {
655    Unspecified = 0,
656    Normal = 1,
657    BidThin = 2,
658    AskThin = 3,
659}
660impl PricingSourceLiquidityImbalanceGuardState {
661    /// String value of the enum field names used in the ProtoBuf definition.
662    ///
663    /// The values are not transformed in any way and thus are considered stable
664    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
665    pub fn as_str_name(&self) -> &'static str {
666        match self {
667            PricingSourceLiquidityImbalanceGuardState::Unspecified => "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_UNSPECIFIED",
668            PricingSourceLiquidityImbalanceGuardState::Normal => "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_NORMAL",
669            PricingSourceLiquidityImbalanceGuardState::BidThin => "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_BID_THIN",
670            PricingSourceLiquidityImbalanceGuardState::AskThin => "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_ASK_THIN",
671        }
672    }
673    /// Creates an enum from field names used in the ProtoBuf definition.
674    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
675        match value {
676            "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_UNSPECIFIED" => Some(Self::Unspecified),
677            "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_NORMAL" => Some(Self::Normal),
678            "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_BID_THIN" => Some(Self::BidThin),
679            "PRICING_SOURCE_LIQUIDITY_IMBALANCE_GUARD_STATE_ASK_THIN" => Some(Self::AskThin),
680            _ => None,
681        }
682    }
683}
684/// precomputed quote retreat 처리 정책
685#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
686#[repr(i32)]
687pub enum PrecomputePolicy {
688    Unspecified = 0,
689    /// 선물 1틱 ↔ ETF 1틱 (1:1 대응). 빠른 추격 LP.
690    /// precompute 시나리오 경우의 수 축소를 위한 최적화 적용:
691    ///    - depth 초과 / 역방향 시 cancel-all + slowpath refill
692    ///    - 체결로 슬롯 빈 상태에서 tick=0이면 refill 안 함
693    OneToOne = 1,
694    /// 선물 N틱 ↔ ETF 1틱 (N:1 대응, N≥3). 정석 LP. 항상 정확한 호가 유지:
695    ///    - 같은 방향 후퇴 / 역방향은 amend로 정정 (cancel 없음)
696    ///    - depth 초과(드문 케이스)는 cancel-all만
697    ///    - 체결로 슬롯 빈 상태에서 tick=0이면 즉시 fill-gap refill
698    ManyToOne = 2,
699    /// 선물 1틱 ↔ ETF N틱 (1:N 대응). 고가 레버리지 ETF용.
700    ///    - 단일측 ±2/±3틱 8개 시나리오를 하드코딩 precompute
701    ///    - 그 외 케이스는 slow refill
702    OneToMany = 3,
703}
704impl PrecomputePolicy {
705    /// String value of the enum field names used in the ProtoBuf definition.
706    ///
707    /// The values are not transformed in any way and thus are considered stable
708    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
709    pub fn as_str_name(&self) -> &'static str {
710        match self {
711            PrecomputePolicy::Unspecified => "PRECOMPUTE_POLICY_UNSPECIFIED",
712            PrecomputePolicy::OneToOne => "PRECOMPUTE_POLICY_ONE_TO_ONE",
713            PrecomputePolicy::ManyToOne => "PRECOMPUTE_POLICY_MANY_TO_ONE",
714            PrecomputePolicy::OneToMany => "PRECOMPUTE_POLICY_ONE_TO_MANY",
715        }
716    }
717    /// Creates an enum from field names used in the ProtoBuf definition.
718    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
719        match value {
720            "PRECOMPUTE_POLICY_UNSPECIFIED" => Some(Self::Unspecified),
721            "PRECOMPUTE_POLICY_ONE_TO_ONE" => Some(Self::OneToOne),
722            "PRECOMPUTE_POLICY_MANY_TO_ONE" => Some(Self::ManyToOne),
723            "PRECOMPUTE_POLICY_ONE_TO_MANY" => Some(Self::OneToMany),
724            _ => None,
725        }
726    }
727}
728/// 순매매량 기반 조정 전략
729#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
730#[repr(i32)]
731pub enum PositionAdjustmentStrategy {
732    Unspecified = 0,
733    /// 회피: 순매수 과다 시 매수offset 증가 (덜 공격적으로 매수)
734    Avoidance = 1,
735    /// 매매회전: 순매수 과다 시 매도offset 감소 (더 공격적으로 매도)
736    Turnover = 2,
737    /// 모두 적용: 순매수 과다 시 매수offset 증가 및 매도offset 감소
738    All = 10,
739}
740impl PositionAdjustmentStrategy {
741    /// String value of the enum field names used in the ProtoBuf definition.
742    ///
743    /// The values are not transformed in any way and thus are considered stable
744    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
745    pub fn as_str_name(&self) -> &'static str {
746        match self {
747            PositionAdjustmentStrategy::Unspecified => "POSITION_ADJUSTMENT_STRATEGY_UNSPECIFIED",
748            PositionAdjustmentStrategy::Avoidance => "POSITION_ADJUSTMENT_STRATEGY_AVOIDANCE",
749            PositionAdjustmentStrategy::Turnover => "POSITION_ADJUSTMENT_STRATEGY_TURNOVER",
750            PositionAdjustmentStrategy::All => "POSITION_ADJUSTMENT_STRATEGY_ALL",
751        }
752    }
753    /// Creates an enum from field names used in the ProtoBuf definition.
754    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
755        match value {
756            "POSITION_ADJUSTMENT_STRATEGY_UNSPECIFIED" => Some(Self::Unspecified),
757            "POSITION_ADJUSTMENT_STRATEGY_AVOIDANCE" => Some(Self::Avoidance),
758            "POSITION_ADJUSTMENT_STRATEGY_TURNOVER" => Some(Self::Turnover),
759            "POSITION_ADJUSTMENT_STRATEGY_ALL" => Some(Self::All),
760            _ => None,
761        }
762    }
763}
764/// ETF LP 상태 enum
765#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
766#[repr(i32)]
767pub enum EtfLpState {
768    Unspecified = 0,
769    Idle = 1,
770    Running = 2,
771    Stopping = 3,
772    Error = 4,
773}
774impl EtfLpState {
775    /// String value of the enum field names used in the ProtoBuf definition.
776    ///
777    /// The values are not transformed in any way and thus are considered stable
778    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
779    pub fn as_str_name(&self) -> &'static str {
780        match self {
781            EtfLpState::Unspecified => "ETF_LP_STATE_UNSPECIFIED",
782            EtfLpState::Idle => "ETF_LP_STATE_IDLE",
783            EtfLpState::Running => "ETF_LP_STATE_RUNNING",
784            EtfLpState::Stopping => "ETF_LP_STATE_STOPPING",
785            EtfLpState::Error => "ETF_LP_STATE_ERROR",
786        }
787    }
788    /// Creates an enum from field names used in the ProtoBuf definition.
789    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
790        match value {
791            "ETF_LP_STATE_UNSPECIFIED" => Some(Self::Unspecified),
792            "ETF_LP_STATE_IDLE" => Some(Self::Idle),
793            "ETF_LP_STATE_RUNNING" => Some(Self::Running),
794            "ETF_LP_STATE_STOPPING" => Some(Self::Stopping),
795            "ETF_LP_STATE_ERROR" => Some(Self::Error),
796            _ => None,
797        }
798    }
799}
800include!("kdo.v1.lp.tonic.rs");
801include!("kdo.v1.lp.serde.rs");
802// @@protoc_insertion_point(module)