Skip to main content

ids_apis/
kdo.v1.mm.rs

1// @generated
2// This file is @generated by prost-build.
3// ============================================================================
4// Messages
5// ============================================================================
6
7/// MM 심볼 정보
8#[allow(clippy::derive_partial_eq_without_eq)]
9#[derive(Clone, PartialEq, ::prost::Message)]
10pub struct MarketMaking {
11    /// ISIN 심볼
12    #[prost(string, tag="1")]
13    pub symbol: ::prost::alloc::string::String,
14    /// 현재 상태
15    #[prost(enumeration="MarketMakingState", tag="2")]
16    pub state: i32,
17    /// MM 설정
18    #[prost(message, optional, tag="3")]
19    pub config: ::core::option::Option<MarketMakingConfiguration>,
20    /// 펀드 코드
21    #[prost(string, tag="4")]
22    pub fund_code: ::prost::alloc::string::String,
23    /// ETF tick size (Price internal representation)
24    #[prost(int64, tag="5")]
25    pub tick_size: i64,
26}
27/// MM 엔진 설정 (MmConfig 대응)
28#[allow(clippy::derive_partial_eq_without_eq)]
29#[derive(Clone, PartialEq, ::prost::Message)]
30pub struct MarketMakingConfiguration {
31    /// MM 활성화 여부
32    #[prost(bool, tag="1")]
33    pub enabled: bool,
34    /// NAV pricing 상세 설정 (pricing = "nav" 일 때 사용)
35    #[prost(message, optional, tag="2")]
36    pub pricing: ::core::option::Option<MarketMakingPricing>,
37    /// Trade Analyzer 설정
38    #[prost(message, optional, tag="3")]
39    pub trade_analyzer: ::core::option::Option<MarketMakingTradeAnalyzer>,
40    /// MarketBias 설정 (장기 시장 체결 누적 → 영구 skew)
41    #[prost(message, optional, tag="4")]
42    pub market_bias: ::core::option::Option<MarketMakingMarketBias>,
43    /// Momentum 설정 (단기 시장 체결 비율/강도 → 즉각 bid/ask 동일 shift)
44    #[prost(message, optional, tag="5")]
45    pub momentum: ::core::option::Option<MarketMakingMomentum>,
46    /// 통합 포지션 관리 설정
47    #[prost(message, optional, tag="6")]
48    pub exposure_balancer: ::core::option::Option<MarketMakingExposureBalancer>,
49    /// 레벨당 매수 수량
50    #[prost(int64, tag="9")]
51    pub bid_quantity: i64,
52    /// 레벨당 매도 수량
53    #[prost(int64, tag="10")]
54    pub ask_quantity: i64,
55    /// NAV+adj 기준가 대비 bid 추가 gap (Price internal representation)
56    #[prost(int64, tag="13")]
57    pub bid_offset: i64,
58    /// NAV+adj 기준가 대비 ask 추가 gap (Price internal representation)
59    #[prost(int64, tag="14")]
60    pub ask_offset: i64,
61    /// 단일 basis (bid_basis/ask_basis 통합 후속, Price internal representation)
62    #[prost(int64, optional, tag="15")]
63    pub basis: ::core::option::Option<i64>,
64    /// 호가 반폭 (틱 수). bid = mid - half, ask = mid + half
65    #[prost(int32, tag="16")]
66    pub base_half_ticks: i32,
67    /// 순포지션 수량 한도 (방향별 호가 차단)
68    #[prost(message, optional, tag="17")]
69    pub quantity_limit: ::core::option::Option<MarketMakingQuantityLimit>,
70    /// MA 크로스 skew 설정 (골든/데드 크로스 기반 호가 평행이동)
71    #[prost(message, optional, tag="18")]
72    pub ma_cross: ::core::option::Option<MarketMakingMaCross>,
73}
74/// NAV pricing 상세 설정
75#[allow(clippy::derive_partial_eq_without_eq)]
76#[derive(Clone, PartialEq, ::prost::Message)]
77pub struct MarketMakingPricing {
78    /// EtfPricing 전략 (oneof)
79    #[prost(oneof="market_making_pricing::Pricing", tags="1, 2, 3, 4")]
80    pub pricing: ::core::option::Option<market_making_pricing::Pricing>,
81}
82/// Nested message and enum types in `MarketMakingPricing`.
83pub mod market_making_pricing {
84    /// EtfPricing 전략 (oneof)
85    #[allow(clippy::derive_partial_eq_without_eq)]
86#[derive(Clone, PartialEq, ::prost::Oneof)]
87    pub enum Pricing {
88        /// PDF 기반 nav 계산 및 헷지 프라이싱
89        #[prost(message, tag="1")]
90        PlainFollow(super::PlainFollow),
91        /// 지수 추종 헷지 프라이싱
92        #[prost(message, tag="2")]
93        MeanBidAsk(super::MeanBidAsk),
94        /// 선물 베이시스 기반 프라이싱
95        #[prost(message, tag="3")]
96        Nav(super::Nav),
97        /// 레버리지 선물 기반 프라이싱
98        #[prost(message, tag="4")]
99        KrxNav(super::KrxNav),
100    }
101}
102/// EtfPricing::PdfNavHedge
103#[allow(clippy::derive_partial_eq_without_eq)]
104#[derive(Clone, Copy, PartialEq, ::prost::Message)]
105pub struct PlainFollow {
106}
107/// EtfPricing::IndexTrackingHedge
108#[allow(clippy::derive_partial_eq_without_eq)]
109#[derive(Clone, Copy, PartialEq, ::prost::Message)]
110pub struct MeanBidAsk {
111}
112/// EtfPricing::FutureBasis { prev_index }
113#[allow(clippy::derive_partial_eq_without_eq)]
114#[derive(Clone, PartialEq, ::prost::Message)]
115pub struct Nav {
116    /// 이전 지수 (Price internal representation)
117    #[prost(message, optional, tag="1")]
118    pub etf_pricing: ::core::option::Option<super::common::EtfPricing>,
119}
120/// EtfPricing::LeverageFuture { prev_index, prev_future }
121#[allow(clippy::derive_partial_eq_without_eq)]
122#[derive(Clone, Copy, PartialEq, ::prost::Message)]
123pub struct KrxNav {
124    /// 이전 지수 (Price internal representation)
125    #[prost(int64, tag="1")]
126    pub prev_index: i64,
127    /// 이전 선물 (Price internal representation)
128    #[prost(int64, tag="2")]
129    pub prev_future: i64,
130}
131/// Trade Analyzer 설정 (갤럭티코 SingleTradeAnalyzer 포팅 — 시장 체결 추종)
132#[allow(clippy::derive_partial_eq_without_eq)]
133#[derive(Clone, Copy, PartialEq, ::prost::Message)]
134pub struct MarketMakingTradeAnalyzer {
135    /// 활성화 여부
136    #[prost(bool, tag="1")]
137    pub enabled: bool,
138    /// 매 체결마다 net/total 에 곱하는 감쇠 비율 (갤럭티코 기본 0.98)
139    #[prost(double, tag="2")]
140    pub count_decay_ratio: f64,
141    /// 시간 감쇠 주기 (초). 0 = 비활성 (갤럭티코 기본 10)
142    #[prost(uint64, tag="3")]
143    pub decay_interval_secs: u64,
144    /// 시간 주기마다 total 에 곱하는 비율 (갤럭티코 기본 0.95)
145    #[prost(double, tag="4")]
146    pub total_decay_ratio: f64,
147    /// 시간 주기마다 net 에 곱하는 비율 (갤럭티코 기본 0.9). total_decay_ratio 보다 작아야 방향성이 먼저 사라짐.
148    #[prost(double, tag="5")]
149    pub net_decay_ratio: f64,
150    /// strength 분모 최소치 (기본 100)
151    #[prost(int64, tag="6")]
152    pub min_book_qty: i64,
153}
154/// Momentum 설정 (갤럭티코 DecoByTrade 포팅 — ratio/strength 기반 양쪽 동일 shift)
155#[allow(clippy::derive_partial_eq_without_eq)]
156#[derive(Clone, Copy, PartialEq, ::prost::Message)]
157pub struct MarketMakingMomentum {
158    /// 활성화 여부
159    #[prost(bool, tag="1")]
160    pub enabled: bool,
161    /// 인버스 ETF: ratio 부호 반전
162    #[prost(bool, tag="2")]
163    pub is_opposite: bool,
164    /// 최대 shift (tick 단위, 갤럭티코 pInfo.p1/100 등가)
165    #[prost(double, tag="3")]
166    pub max_tick: f64,
167    /// ratio 발동 임계 ∈ [0, 1) (갤럭티코 pInfo.p2/100)
168    #[prost(double, tag="4")]
169    pub ratio_threshold: f64,
170    /// strength 발동 임계 ∈ [0, 1) (갤럭티코 pInfo.p3/100)
171    #[prost(double, tag="5")]
172    pub strength_threshold: f64,
173}
174/// MarketBias 설정 (갤럭티코 DecoByTradeAcc 포팅 — 장기 누적 영구 skew)
175#[allow(clippy::derive_partial_eq_without_eq)]
176#[derive(Clone, Copy, PartialEq, ::prost::Message)]
177pub struct MarketMakingMarketBias {
178    /// 활성화 여부
179    #[prost(bool, tag="1")]
180    pub enabled: bool,
181    /// 주기 평가 간격 (초, 갤럭티코 accNextUpdateSec 기본 60)
182    #[prost(uint64, tag="2")]
183    pub eval_interval_secs: u64,
184    /// ratio 발동 임계 (기본 0.6)
185    #[prost(double, tag="3")]
186    pub ratio_threshold: f64,
187    /// strength 발동 임계 (기본 0.5)
188    #[prost(double, tag="4")]
189    pub strength_threshold: f64,
190    /// 점수 임계 0~100 (기본 5). 이 위를 통과해야 한 단계 가산.
191    #[prost(int32, tag="5")]
192    pub bias_huddle: i32,
193    /// 1 단계 가산량 (가격 단위, Price internal representation)
194    #[prost(int64, tag="6")]
195    pub bias_unit: i64,
196    /// 누적 상한 절댓값 (가격 단위, Price internal representation)
197    #[prost(int64, tag="7")]
198    pub max_bias: i64,
199}
200/// MA 크로스 skew — 단기/장기 이동평균(mid 기반, 1초 샘플)의 골든/데드 크로스 상태에 따라
201/// 호가 중심을 평행이동. 골든(단기>장기) = +skew_unit, 데드 = −skew_unit, 중립/워밍업 = 0.
202#[allow(clippy::derive_partial_eq_without_eq)]
203#[derive(Clone, Copy, PartialEq, ::prost::Message)]
204pub struct MarketMakingMaCross {
205    #[prost(bool, tag="1")]
206    pub enabled: bool,
207    /// 단기 MA 윈도우 (초, 기본 180 = 3분)
208    #[prost(uint64, tag="2")]
209    pub short_window_secs: u64,
210    /// 장기 MA 윈도우 (초, 기본 600 = 10분)
211    #[prost(uint64, tag="3")]
212    pub long_window_secs: u64,
213    /// 골든/데드 시 호가 평행이동량 (원)
214    #[prost(int64, tag="4")]
215    pub skew_unit: i64,
216}
217/// 통합 포지션 관리 설정 (soft rebalance + hard limit)
218#[allow(clippy::derive_partial_eq_without_eq)]
219#[derive(Clone, Copy, PartialEq, ::prost::Message)]
220pub struct MarketMakingExposureBalancer {
221    /// 활성화 여부
222    #[prost(bool, tag="1")]
223    pub enabled: bool,
224    /// opportunistic close 기능 활성화 여부
225    #[prost(bool, tag="5")]
226    pub opportunistic_enabled: bool,
227    /// soft zone 기준 수량 (절대 수량). 가격 shift 기울기의 분모 + 수량 축소 발동 임계 (mm_dan skewTriggerAmt 대응)
228    #[prost(int64, tag="6")]
229    pub trigger_quantity: i64,
230    /// trigger_quantity 당 가격 이동 기울기 (원, 소수 허용). shift = -(net/trigger_quantity) × 이 값 — 연속 비례, 틱 배수 아니어도 됨. 엔진 마지막 normalize 가 정렬 (mm_dan skewUnit 대응)
231    #[prost(double, tag="7")]
232    pub price_skew_unit: f64,
233    /// hard zone (절대 수량). 이 수량에서 같은 방향 수량 0 + shift 상한 ((limit_quantity/trigger_quantity) × price_skew_unit)
234    #[prost(int64, tag="8")]
235    pub limit_quantity: i64,
236}
237/// 순포지션 수량 한도 설정 (방향별 호가 차단)
238#[allow(clippy::derive_partial_eq_without_eq)]
239#[derive(Clone, Copy, PartialEq, ::prost::Message)]
240pub struct MarketMakingQuantityLimit {
241    /// 순매수(롱) 상한. net(매수체결-매도체결) >= 이 값이면 매수 호가 차단. 0=비활성
242    #[prost(int64, tag="1")]
243    pub max_bid_quantity: i64,
244    /// 순매도(숏) 상한. net <= -이 값이면 매도 호가 차단. 0=비활성
245    #[prost(int64, tag="2")]
246    pub max_ask_quantity: i64,
247}
248// ============================================================================
249// Request/Response Messages
250// ============================================================================
251
252/// ListMarketMaking
253#[allow(clippy::derive_partial_eq_without_eq)]
254#[derive(Clone, PartialEq, ::prost::Message)]
255pub struct ListMarketMakingRequest {
256    /// 페이지 크기 (optional)
257    #[prost(uint32, optional, tag="1")]
258    pub page_size: ::core::option::Option<u32>,
259    /// 페이지 토큰 (optional)
260    #[prost(string, optional, tag="2")]
261    pub page_token: ::core::option::Option<::prost::alloc::string::String>,
262}
263#[allow(clippy::derive_partial_eq_without_eq)]
264#[derive(Clone, PartialEq, ::prost::Message)]
265pub struct ListMarketMakingResponse {
266    /// 등록된 MM 목록
267    #[prost(message, repeated, tag="1")]
268    pub entries: ::prost::alloc::vec::Vec<MarketMaking>,
269    /// 다음 페이지 토큰
270    #[prost(string, tag="2")]
271    pub next_page_token: ::prost::alloc::string::String,
272}
273/// GetMarketMaking
274#[allow(clippy::derive_partial_eq_without_eq)]
275#[derive(Clone, PartialEq, ::prost::Message)]
276pub struct GetMarketMakingRequest {
277    /// ISIN 심볼
278    #[prost(string, tag="1")]
279    pub symbol: ::prost::alloc::string::String,
280}
281/// GetMarketMakingStatus
282#[allow(clippy::derive_partial_eq_without_eq)]
283#[derive(Clone, PartialEq, ::prost::Message)]
284pub struct GetMarketMakingStatusRequest {
285    /// ISIN 심볼
286    #[prost(string, tag="1")]
287    pub symbol: ::prost::alloc::string::String,
288}
289/// StartMarketMaking
290#[allow(clippy::derive_partial_eq_without_eq)]
291#[derive(Clone, PartialEq, ::prost::Message)]
292pub struct StartMarketMakingRequest {
293    /// ISIN 심볼
294    #[prost(string, tag="1")]
295    pub symbol: ::prost::alloc::string::String,
296    /// MM 설정 오버라이드 (optional, 없으면 기본 설정 사용)
297    #[prost(message, optional, tag="2")]
298    pub config: ::core::option::Option<MarketMakingConfiguration>,
299}
300#[allow(clippy::derive_partial_eq_without_eq)]
301#[derive(Clone, PartialEq, ::prost::Message)]
302pub struct StartMarketMakingResponse {
303    /// 시작된 MM 상태
304    #[prost(enumeration="MarketMakingState", tag="1")]
305    pub state: i32,
306    /// 메시지
307    #[prost(string, tag="2")]
308    pub message: ::prost::alloc::string::String,
309}
310/// StopMarketMaking
311#[allow(clippy::derive_partial_eq_without_eq)]
312#[derive(Clone, PartialEq, ::prost::Message)]
313pub struct StopMarketMakingRequest {
314    /// ISIN 심볼
315    #[prost(string, tag="1")]
316    pub symbol: ::prost::alloc::string::String,
317}
318#[allow(clippy::derive_partial_eq_without_eq)]
319#[derive(Clone, PartialEq, ::prost::Message)]
320pub struct StopMarketMakingResponse {
321    /// 메시지
322    #[prost(string, tag="1")]
323    pub message: ::prost::alloc::string::String,
324}
325/// ResetMarketMaking
326#[allow(clippy::derive_partial_eq_without_eq)]
327#[derive(Clone, PartialEq, ::prost::Message)]
328pub struct ResetMarketMakingRequest {
329    /// ISIN 심볼 (빈 문자열이면 전체 리셋)
330    #[prost(string, tag="1")]
331    pub symbol: ::prost::alloc::string::String,
332}
333#[allow(clippy::derive_partial_eq_without_eq)]
334#[derive(Clone, PartialEq, ::prost::Message)]
335pub struct ResetMarketMakingResponse {
336    /// 리셋된 심볼 수
337    #[prost(int32, tag="1")]
338    pub reset_count: i32,
339    /// 메시지
340    #[prost(string, tag="2")]
341    pub message: ::prost::alloc::string::String,
342}
343/// UpdateMarketMakingConfig
344/// NOTE: config 내 pricing, fund_code, tick_size, depth 필드는 이 요청으로 변경할 수 없습니다.
345/// 해당 필드들은 서버에서 무시됩니다.
346#[allow(clippy::derive_partial_eq_without_eq)]
347#[derive(Clone, PartialEq, ::prost::Message)]
348pub struct UpdateMarketMakingConfigRequest {
349    /// ISIN 심볼
350    #[prost(string, tag="1")]
351    pub symbol: ::prost::alloc::string::String,
352    /// 업데이트할 설정 (전체 교체)
353    /// pricing, fund_code, tick_size, depth 필드는 read-only이며 무시됩니다.
354    #[prost(message, optional, tag="2")]
355    pub config: ::core::option::Option<MarketMakingConfiguration>,
356}
357/// StreamMarketMakingStatus
358#[allow(clippy::derive_partial_eq_without_eq)]
359#[derive(Clone, PartialEq, ::prost::Message)]
360pub struct StreamMarketMakingStatusRequest {
361    /// ISIN 심볼 (빈 문자열이면 전체 스트리밍)
362    #[prost(string, tag="1")]
363    pub symbol: ::prost::alloc::string::String,
364}
365/// UpdateMarketMaking
366#[allow(clippy::derive_partial_eq_without_eq)]
367#[derive(Clone, PartialEq, ::prost::Message)]
368pub struct UpdateMarketMakingRequest {
369    /// ISIN 심볼
370    #[prost(string, tag="1")]
371    pub symbol: ::prost::alloc::string::String,
372    /// 업데이트할 MM 설정
373    #[prost(message, optional, tag="2")]
374    pub config: ::core::option::Option<MarketMakingConfiguration>,
375}
376/// GetMarketMakingOrderbook / StreamMarketMakingOrderbook
377#[allow(clippy::derive_partial_eq_without_eq)]
378#[derive(Clone, PartialEq, ::prost::Message)]
379pub struct GetMarketMakingOrderbookRequest {
380    /// ISIN 심볼
381    #[prost(string, tag="1")]
382    pub symbol: ::prost::alloc::string::String,
383}
384/// MM 전용 주문장 데이터
385#[allow(clippy::derive_partial_eq_without_eq)]
386#[derive(Clone, PartialEq, ::prost::Message)]
387pub struct MarketMakingOrderbookData {
388    /// 매수 호가 목록 (string 표현)
389    #[prost(string, repeated, tag="1")]
390    pub bid_prices: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
391    /// 매도 호가 목록 (string 표현)
392    #[prost(string, repeated, tag="2")]
393    pub ask_prices: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
394    /// 매수 수량 목록
395    #[prost(int64, repeated, tag="3")]
396    pub bid_quantities: ::prost::alloc::vec::Vec<i64>,
397    /// 매도 수량 목록
398    #[prost(int64, repeated, tag="4")]
399    pub ask_quantities: ::prost::alloc::vec::Vec<i64>,
400}
401// ============================================================================
402// MM 엔진 런타임 상태
403// ============================================================================
404
405/// Momentum 런타임 상태
406#[allow(clippy::derive_partial_eq_without_eq)]
407#[derive(Clone, PartialEq, ::prost::Message)]
408pub struct MomentumState {
409    /// 현재 모멘텀 방향 ("none" / "up" / "down")
410    #[prost(string, tag="1")]
411    pub direction: ::prost::alloc::string::String,
412    /// 현재 bid 가격 조정값 (Price internal representation)
413    #[prost(int64, tag="2")]
414    pub bid_adjustment: i64,
415    /// 현재 ask 가격 조정값 (Price internal representation)
416    #[prost(int64, tag="3")]
417    pub ask_adjustment: i64,
418    /// 원시 틱 변화량 (부호 포함, 모니터링용)
419    #[prost(double, tag="4")]
420    pub raw_ticks: f64,
421}
422/// Trade Analyzer 런타임 상태 (갤럭티코 SingleTradeAnalyzer 포팅)
423#[allow(clippy::derive_partial_eq_without_eq)]
424#[derive(Clone, Copy, PartialEq, ::prost::Message)]
425pub struct TradeAnalyzerState {
426    /// 매수/매도 누적 비율 ∈ \[-1, +1\]. 매수 우세 +.
427    #[prost(double, tag="1")]
428    pub ratio: f64,
429    /// 체결 강도 ∈ \[0, 1\]. ratio 방향 가중 호가창 잔량 대비 누적 체결량.
430    #[prost(double, tag="2")]
431    pub strength: f64,
432    /// 부호 있는 누적 체결량 (매수 우세 +)
433    #[prost(int64, tag="3")]
434    pub net_amount: i64,
435    /// 절댓값 누적 체결량
436    #[prost(int64, tag="4")]
437    pub total_amount: i64,
438    /// 5단 호가 평균 매수 잔량
439    #[prost(double, tag="5")]
440    pub avg_bid_qty: f64,
441    /// 5단 호가 평균 매도 잔량
442    #[prost(double, tag="6")]
443    pub avg_ask_qty: f64,
444    /// 마지막 시장 체결 시각 (일중 마이크로초). 체결 없으면 absent.
445    #[prost(int64, optional, tag="7")]
446    pub last_trade_at_us: ::core::option::Option<i64>,
447    /// 누적 시장 체결 건수
448    #[prost(int64, tag="8")]
449    pub trade_count: i64,
450}
451/// MarketBias 런타임 상태 (갤럭티코 DecoByTradeAcc 포팅)
452#[allow(clippy::derive_partial_eq_without_eq)]
453#[derive(Clone, Copy, PartialEq, ::prost::Message)]
454pub struct MarketBiasState {
455    /// 누적 영구 편향 (가격 단위, Price internal representation)
456    #[prost(int64, tag="1")]
457    pub accumulated_bias: i64,
458    /// 마지막 평가 점수 (0~100)
459    #[prost(int32, tag="2")]
460    pub last_score: i32,
461    /// 누적 평가 횟수
462    #[prost(int64, tag="3")]
463    pub eval_count: i64,
464}
465/// MA 크로스 런타임 상태
466#[allow(clippy::derive_partial_eq_without_eq)]
467#[derive(Clone, PartialEq, ::prost::Message)]
468pub struct MaCrossState {
469    /// 단기/장기 이동평균 (원)
470    #[prost(double, tag="1")]
471    pub short_ma: f64,
472    #[prost(double, tag="2")]
473    pub long_ma: f64,
474    /// "golden" | "dead" | "neutral"
475    #[prost(string, tag="3")]
476    pub trend: ::prost::alloc::string::String,
477    /// 현재 적용 중인 skew (원, 부호 포함)
478    #[prost(int64, tag="4")]
479    pub skew: i64,
480    /// 수집된 샘플 수 (워밍업 판단용, long_window 도달 시 활성)
481    #[prost(uint64, tag="5")]
482    pub samples: u64,
483    /// 상태 전환 누적 횟수
484    #[prost(uint64, tag="6")]
485    pub transitions: u64,
486}
487/// 순노출 및 재고 균형 런타임 상태 (ExposureGuard + InventoryBalancer 통합)
488#[allow(clippy::derive_partial_eq_without_eq)]
489#[derive(Clone, Copy, PartialEq, ::prost::Message)]
490pub struct ExposureBalancerState {
491    /// 현재 순노출 수량
492    #[prost(int64, tag="1")]
493    pub net_exposure: i64,
494    /// 현재 bid 수량 스케일 (0.0 ~ 1.0)
495    #[prost(double, tag="3")]
496    pub bid_scale: f64,
497    /// 현재 ask 수량 스케일 (0.0 ~ 1.0)
498    #[prost(double, tag="4")]
499    pub ask_scale: f64,
500    /// 현재 가격 중심 이동량 (원, 소수 가능). -(net/trigger_quantity) × price_skew_unit — limit 에서 saturate
501    #[prost(double, tag="5")]
502    pub price_shift: f64,
503}
504/// MM 엔진 런타임 상태 델타 메시지.
505/// 스트리밍 시 set된 필드만 변경분을 의미하며, 변경이 없는 필드는 생략된다.
506/// symbol은 항상 포함된다.
507#[allow(clippy::derive_partial_eq_without_eq)]
508#[derive(Clone, PartialEq, ::prost::Message)]
509pub struct MmStateUpdate {
510    /// ISIN 심볼 (항상 포함)
511    #[prost(string, tag="1")]
512    pub symbol: ::prost::alloc::string::String,
513    /// MM 상태 (변경 시에만 포함)
514    #[prost(enumeration="MarketMakingState", optional, tag="2")]
515    pub state: ::core::option::Option<i32>,
516    /// Momentum 상태 (변경 시에만 포함)
517    #[prost(message, optional, tag="3")]
518    pub momentum: ::core::option::Option<MomentumState>,
519    /// Trade Analyzer 상태 (변경 시에만 포함)
520    #[prost(message, optional, tag="4")]
521    pub trade_analyzer: ::core::option::Option<TradeAnalyzerState>,
522    /// 순노출 및 재고 균형 상태 (변경 시에만 포함)
523    #[prost(message, optional, tag="5")]
524    pub exposure_balancer: ::core::option::Option<ExposureBalancerState>,
525    /// MarketBias 상태 (변경 시에만 포함)
526    #[prost(message, optional, tag="6")]
527    pub market_bias: ::core::option::Option<MarketBiasState>,
528    /// 현재 MM 매도 호가 (변경 시에만 포함, None이면 생략)
529    #[prost(string, optional, tag="7")]
530    pub ask_quote: ::core::option::Option<::prost::alloc::string::String>,
531    /// 현재 MM 매수 호가 (변경 시에만 포함, None이면 생략)
532    #[prost(string, optional, tag="8")]
533    pub bid_quote: ::core::option::Option<::prost::alloc::string::String>,
534    /// 현재 적용 중인 bid offset (변경 시에만 포함, None이면 생략)
535    #[prost(string, optional, tag="9")]
536    pub bid_offset: ::core::option::Option<::prost::alloc::string::String>,
537    /// 현재 적용 중인 ask offset (변경 시에만 포함, None이면 생략)
538    #[prost(string, optional, tag="10")]
539    pub ask_offset: ::core::option::Option<::prost::alloc::string::String>,
540    /// 호가 산출 단계별 분해 (변경 시에만 포함, 디버깅/튜닝용)
541    #[prost(message, optional, tag="11")]
542    pub decomposition: ::core::option::Option<SpreadDecomposition>,
543    /// 현재 적용 중인 F2M(Fit to Market) 평행 skew, Price 내부표현값(string). 변경 시에만 포함, None이면 생략. 0 = 미적용/해제
544    #[prost(string, optional, tag="12")]
545    pub f2m_shift: ::core::option::Option<::prost::alloc::string::String>,
546    /// MA 크로스 상태 (변경 시에만 포함)
547    #[prost(message, optional, tag="13")]
548    pub ma_cross: ::core::option::Option<MaCrossState>,
549}
550/// StreamMmFills
551#[allow(clippy::derive_partial_eq_without_eq)]
552#[derive(Clone, PartialEq, ::prost::Message)]
553pub struct StreamMmFillsRequest {
554    /// ISIN 심볼
555    #[prost(string, tag="1")]
556    pub symbol: ::prost::alloc::string::String,
557    /// 펀드 코드 — 같은 심볼을 여러 펀드로 운용할 때 구분용.
558    /// 지정 시 해당 (symbol, fund) MM 컨텍스트와 불일치하면 NOT_FOUND.
559    #[prost(string, tag="2")]
560    pub fund_code: ::prost::alloc::string::String,
561}
562/// MM 체결 요약 (MM 전략 자기 체결 당일 누적 — 같은 심볼의 타 전략(선물LP 헷지·페어 등) 체결 제외)
563#[allow(clippy::derive_partial_eq_without_eq)]
564#[derive(Clone, Copy, PartialEq, ::prost::Message)]
565pub struct MmFillSummary {
566    /// 매수 (당일 누적)
567    #[prost(int64, tag="1")]
568    pub buy_quantity: i64,
569    #[prost(double, tag="2")]
570    pub buy_avg_price: f64,
571    /// 매도 (당일 누적)
572    #[prost(int64, tag="3")]
573    pub sell_quantity: i64,
574    #[prost(double, tag="4")]
575    pub sell_avg_price: f64,
576    /// 당일 실현손익 (원 단위, 평균단가법)
577    #[prost(int64, tag="7")]
578    pub realized_pnl: i64,
579    /// 미실현손익 (원 단위, 순포지션 × (평가가 − 평단))
580    #[prost(int64, tag="8")]
581    pub unrealized_pnl: i64,
582}
583/// ListMmPnlHistory
584#[allow(clippy::derive_partial_eq_without_eq)]
585#[derive(Clone, PartialEq, ::prost::Message)]
586pub struct ListMmPnlHistoryRequest {
587    /// ISIN 심볼
588    #[prost(string, tag="1")]
589    pub symbol: ::prost::alloc::string::String,
590    /// 펀드 코드 — 미지정 시 전 펀드
591    #[prost(string, optional, tag="2")]
592    pub fund_code: ::core::option::Option<::prost::alloc::string::String>,
593    /// 조회 구간 시작 (unix epoch seconds, inclusive)
594    #[prost(int64, tag="3")]
595    pub start_time: i64,
596    /// 조회 구간 끝 (unix epoch seconds, exclusive)
597    #[prost(int64, tag="4")]
598    pub end_time: i64,
599    /// 버킷 간격 (초). 0/미지정 = 1초
600    #[prost(uint32, tag="5")]
601    pub bucket_seconds: u32,
602}
603/// 손익 시계열 포인트 (버킷 마지막 값)
604#[allow(clippy::derive_partial_eq_without_eq)]
605#[derive(Clone, Copy, PartialEq, ::prost::Message)]
606pub struct MmPnlPoint {
607    /// 버킷 시작 시각 (unix epoch seconds)
608    #[prost(int64, tag="1")]
609    pub time: i64,
610    /// 당일 실현손익 (원, 평균단가법)
611    #[prost(int64, tag="2")]
612    pub realized_pnl: i64,
613    /// 미실현손익 (원)
614    #[prost(int64, tag="3")]
615    pub unrealized_pnl: i64,
616    /// 전체 손익 = 실현 + 미실현 (원)
617    #[prost(int64, tag="4")]
618    pub total_pnl: i64,
619}
620#[allow(clippy::derive_partial_eq_without_eq)]
621#[derive(Clone, PartialEq, ::prost::Message)]
622pub struct ListMmPnlHistoryResponse {
623    /// 손익 시계열 포인트 목록
624    #[prost(message, repeated, tag="1")]
625    pub points: ::prost::alloc::vec::Vec<MmPnlPoint>,
626}
627/// 호가 산출 단계별 contribution. 최종 호가 = base + momentum + exposure_shift + market_bias + ma_cross_shift.
628#[allow(clippy::derive_partial_eq_without_eq)]
629#[derive(Clone, Copy, PartialEq, ::prost::Message)]
630pub struct SpreadDecomposition {
631    /// Pricing 직후 bid (NAV + bid_adjustment, Price internal representation)
632    #[prost(int64, tag="1")]
633    pub base_bid: i64,
634    /// Pricing 직후 ask (NAV + ask_adjustment, Price internal representation)
635    #[prost(int64, tag="2")]
636    pub base_ask: i64,
637    /// Momentum 가산량 (부호 포함, bid·ask 동일, Price internal representation)
638    #[prost(int64, tag="3")]
639    pub momentum_shift: i64,
640    /// ExposureSkew 가산량 (부호 포함, bid·ask 동일, Price internal representation)
641    #[prost(int64, tag="4")]
642    pub exposure_shift: i64,
643    /// MarketBias 영구 편향 (부호 포함, bid·ask 동일, Price internal representation)
644    #[prost(int64, tag="5")]
645    pub market_bias_shift: i64,
646    /// 정렬 후 최종 bid (Price internal representation)
647    #[prost(int64, tag="6")]
648    pub final_bid: i64,
649    /// 정렬 후 최종 ask (Price internal representation)
650    #[prost(int64, tag="7")]
651    pub final_ask: i64,
652    /// MA 크로스 skew 가산량 (부호 포함, bid·ask 동일, Price internal representation)
653    #[prost(int64, tag="8")]
654    pub ma_cross_shift: i64,
655}
656// ============================================================================
657// MM 엔진 상태 Request Messages
658// ============================================================================
659
660/// StreamMmStateUpdate
661#[allow(clippy::derive_partial_eq_without_eq)]
662#[derive(Clone, PartialEq, ::prost::Message)]
663pub struct StreamMmStateUpdateRequest {
664    /// ISIN 심볼 (빈 문자열이면 전체 스트리밍)
665    #[prost(string, tag="1")]
666    pub symbol: ::prost::alloc::string::String,
667}
668/// FitToMarket
669#[allow(clippy::derive_partial_eq_without_eq)]
670#[derive(Clone, PartialEq, ::prost::Message)]
671pub struct FitToMarketRequest {
672    /// ISIN 심볼
673    #[prost(string, tag="1")]
674    pub symbol: ::prost::alloc::string::String,
675}
676#[allow(clippy::derive_partial_eq_without_eq)]
677#[derive(Clone, PartialEq, ::prost::Message)]
678pub struct FitToMarketResponse {
679    /// 메시지
680    #[prost(string, tag="1")]
681    pub message: ::prost::alloc::string::String,
682}
683/// ClearFitToMarket
684#[allow(clippy::derive_partial_eq_without_eq)]
685#[derive(Clone, PartialEq, ::prost::Message)]
686pub struct ClearFitToMarketRequest {
687    /// ISIN 심볼
688    #[prost(string, tag="1")]
689    pub symbol: ::prost::alloc::string::String,
690}
691#[allow(clippy::derive_partial_eq_without_eq)]
692#[derive(Clone, PartialEq, ::prost::Message)]
693pub struct ClearFitToMarketResponse {
694    /// 메시지
695    #[prost(string, tag="1")]
696    pub message: ::prost::alloc::string::String,
697}
698// ============================================================================
699// Enums
700// ============================================================================
701
702/// MM 상태
703#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
704#[repr(i32)]
705pub enum MarketMakingState {
706    Unspecified = 0,
707    /// 대기
708    Idle = 1,
709    /// 활성
710    Running = 2,
711}
712impl MarketMakingState {
713    /// String value of the enum field names used in the ProtoBuf definition.
714    ///
715    /// The values are not transformed in any way and thus are considered stable
716    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
717    pub fn as_str_name(&self) -> &'static str {
718        match self {
719            MarketMakingState::Unspecified => "MARKET_MAKING_STATE_UNSPECIFIED",
720            MarketMakingState::Idle => "MARKET_MAKING_STATE_IDLE",
721            MarketMakingState::Running => "MARKET_MAKING_STATE_RUNNING",
722        }
723    }
724    /// Creates an enum from field names used in the ProtoBuf definition.
725    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
726        match value {
727            "MARKET_MAKING_STATE_UNSPECIFIED" => Some(Self::Unspecified),
728            "MARKET_MAKING_STATE_IDLE" => Some(Self::Idle),
729            "MARKET_MAKING_STATE_RUNNING" => Some(Self::Running),
730            _ => None,
731        }
732    }
733}
734include!("kdo.v1.mm.tonic.rs");
735include!("kdo.v1.mm.serde.rs");
736// @@protoc_insertion_point(module)