// @generated
// This file is @generated by prost-build.
// ========== Resource Messages ==========

/// Hedge: 펀드 단위 즉시 헷지 설정
/// 소스 종목의 체결에 대해 즉시 헷지 주문을 실행
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Hedge {
    /// 리소스 이름 (예: hedges/1)
    #[prost(string, tag="1")]
    pub name: ::prost::alloc::string::String,
    /// Hedge ID
    #[prost(int32, tag="2")]
    pub id: i32,
    /// 펀드 코드
    #[prost(string, tag="3")]
    pub fund_code: ::prost::alloc::string::String,
    /// 소스 종목 심볼 (체결 감시 대상)
    #[prost(string, tag="4")]
    pub source_symbol: ::prost::alloc::string::String,
    /// 헷지 방식
    #[prost(message, optional, tag="5")]
    pub hedge_method: ::core::option::Option<HedgeMethod>,
    /// 활성화 여부
    #[prost(bool, tag="6")]
    pub is_active: bool,
    /// 생성 시간
    #[prost(message, optional, tag="7")]
    pub create_time: ::core::option::Option<super::super::super::google::protobuf::Timestamp>,
    /// 수정 시간
    #[prost(message, optional, tag="8")]
    pub update_time: ::core::option::Option<super::super::super::google::protobuf::Timestamp>,
    /// 헷지 주문 체결 가격 유형
    #[prost(enumeration="ExecPriceType", tag="9")]
    pub exec_price_type: i32,
    /// 자동정정 활성화 여부
    #[prost(bool, tag="10")]
    pub auto_amend: bool,
    /// 자동정정 전략 유형 (auto_amend=true 일 때 유효)
    /// 미지정(UNSPECIFIED) 시 TIMED_MARKET으로 처리됨
    #[prost(enumeration="super::common::AmendMethodType", tag="11")]
    pub amend_method: i32,
    /// 헷지 1주 주문당 소스 종목 체결수량 기준
    /// key: 헷지 대상 심볼, value: 소스 종목 체결수량
    #[prost(map="string, int64", tag="12")]
    pub filled_quantity_per_hedge: ::std::collections::HashMap<::prost::alloc::string::String, i64>,
}
/// 헷지 방식
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct HedgeMethod {
    #[prost(oneof="hedge_method::Method", tags="1, 2")]
    pub method: ::core::option::Option<hedge_method::Method>,
}
/// Nested message and enum types in `HedgeMethod`.
pub mod hedge_method {
    #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Oneof)]
    pub enum Method {
        /// 선물 헷지 (비율 기반)
        #[prost(message, tag="1")]
        Future(super::FutureHedge),
        /// ETF 분해 헷지 (CU 기반)
        #[prost(message, tag="2")]
        EtfDecomposition(super::EtfDecompositionHedge),
    }
}
/// 선물 헷지: 소스 종목 체결 시 헷지 종목을 ratio 비율로 반대 매매
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct FutureHedge {
    /// 헷지 대상 종목 심볼
    #[prost(string, tag="1")]
    pub hedge_symbol: ::prost::alloc::string::String,
    /// 헷지 비율 (소스 수량 대비)
    #[prost(double, tag="2")]
    pub ratio: f64,
}
/// ETF 분해 헷지: ETF를 구성 종목으로 분해하여 CU 단위로 헷지
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct EtfDecompositionHedge {
    /// 1CU(설정단위) 당 ETF 주수
    #[prost(int32, tag="1")]
    pub cu: i32,
    /// 1CU 당 구성 종목별 헷지 주문 수량
    /// key: 종목 심볼, value: 1CU 당 주문 수량
    #[prost(map="string, int32", tag="2")]
    pub hedge_orders_per_1cu: ::std::collections::HashMap<::prost::alloc::string::String, i32>,
}
/// HedgeGroup: 포트폴리오 단위 주기적 헷지
/// 트리거 조건에 따라 주기적으로 헷지 실행
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct HedgeGroup {
    /// 리소스 이름 (예: hedge_groups/1)
    #[prost(string, tag="1")]
    pub name: ::prost::alloc::string::String,
    /// HedgeGroup ID
    #[prost(int32, tag="2")]
    pub id: i32,
    /// 포트폴리오 리소스 이름
    /// format: portfolios/{portfolio}
    #[prost(string, tag="3")]
    pub portfolio: ::prost::alloc::string::String,
    /// 그룹 이름
    #[prost(string, tag="4")]
    pub display_name: ::prost::alloc::string::String,
    /// 헷지 펀드 코드 (헷지 주문 실행 펀드)
    #[prost(string, tag="5")]
    pub hedge_fund_code: ::prost::alloc::string::String,
    /// 트리거 조건
    #[prost(message, optional, tag="6")]
    pub trigger_condition: ::core::option::Option<TriggerCondition>,
    /// 그룹 소속 항목들
    #[prost(message, repeated, tag="7")]
    pub items: ::prost::alloc::vec::Vec<HedgeGroupItem>,
    /// 활성화 여부
    #[prost(bool, tag="8")]
    pub is_active: bool,
    /// 생성 시간
    #[prost(message, optional, tag="9")]
    pub create_time: ::core::option::Option<super::super::super::google::protobuf::Timestamp>,
    /// 수정 시간
    #[prost(message, optional, tag="10")]
    pub update_time: ::core::option::Option<super::super::super::google::protobuf::Timestamp>,
}
/// HedgeGroup 소속 항목
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct HedgeGroupItem {
    /// 항목 ID
    #[prost(int32, tag="1")]
    pub id: i32,
    /// 소속 HedgeGroup ID
    #[prost(int32, tag="2")]
    pub hedge_group_id: i32,
    /// 소스 종목 심볼
    #[prost(string, tag="3")]
    pub source_symbol: ::prost::alloc::string::String,
}
/// 트리거 조건: 헷지 실행 기준
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct TriggerCondition {
    #[prost(oneof="trigger_condition::Condition", tags="1, 2")]
    pub condition: ::core::option::Option<trigger_condition::Condition>,
}
/// Nested message and enum types in `TriggerCondition`.
pub mod trigger_condition {
    #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Oneof)]
    pub enum Condition {
        /// 수량 기반 트리거
        #[prost(message, tag="1")]
        Quantity(super::QuantityTrigger),
        /// 금액 기반 트리거
        #[prost(message, tag="2")]
        Amount(super::AmountTrigger),
    }
}
/// 수량 기반 트리거: 순수량 변동이 threshold 이상이면 헷지 실행
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct QuantityTrigger {
    /// 트리거 수량 임계값
    #[prost(int64, tag="1")]
    pub threshold: i64,
    /// 헷지 종목 심볼
    #[prost(string, tag="2")]
    pub hedge_instrument: ::prost::alloc::string::String,
    /// 헷지 비율
    #[prost(double, tag="3")]
    pub ratio: f64,
}
/// 금액 기반 트리거: 순금액 변동이 threshold 이상이면 헷지 실행
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct AmountTrigger {
    /// 트리거 금액 임계값 (원)
    #[prost(int64, tag="1")]
    pub threshold: i64,
    /// 헷지 종목 심볼
    #[prost(string, tag="2")]
    pub hedge_instrument: ::prost::alloc::string::String,
    /// 헷지 비율
    #[prost(double, tag="3")]
    pub ratio: f64,
}
// ========== Request/Response Messages ==========

/// GetHedge 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetHedgeRequest {
    /// 헷지 리소스 이름 (예: hedges/1)
    #[prost(string, tag="1")]
    pub name: ::prost::alloc::string::String,
}
/// LookupHedge 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct LookupHedgeRequest {
    /// 펀드 코드
    #[prost(string, tag="1")]
    pub fund_code: ::prost::alloc::string::String,
    /// 소스 종목 심볼
    #[prost(string, tag="2")]
    pub source_symbol: ::prost::alloc::string::String,
}
/// ListHedges 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListHedgesRequest {
    /// 페이지 크기
    #[prost(int32, optional, tag="1")]
    pub page_size: ::core::option::Option<i32>,
    /// 페이지 토큰
    #[prost(string, optional, tag="2")]
    pub page_token: ::core::option::Option<::prost::alloc::string::String>,
    /// 필터
    /// Available filters:
    /// * fund_code
    ///    * `equal`
    /// * source_symbol
    ///    * `equal`
    /// * is_active
    ///    * `equal`
    ///
    /// Examples:
    /// * filter=fund_code="0159"
    /// * filter=is_active=true
    #[prost(string, tag="3")]
    pub filter: ::prost::alloc::string::String,
}
/// ListHedges 응답
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListHedgesResponse {
    /// 헷지 목록
    #[prost(message, repeated, tag="1")]
    pub hedges: ::prost::alloc::vec::Vec<Hedge>,
    /// 다음 페이지 토큰
    #[prost(string, tag="2")]
    pub next_page_token: ::prost::alloc::string::String,
}
/// CreateHedge 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CreateHedgeRequest {
    /// 생성할 헷지 정보
    #[prost(message, optional, tag="1")]
    pub hedge: ::core::option::Option<Hedge>,
}
/// UpdateHedge 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct UpdateHedgeRequest {
    /// 수정할 헷지 정보
    #[prost(message, optional, tag="1")]
    pub hedge: ::core::option::Option<Hedge>,
}
/// DeleteHedge 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct DeleteHedgeRequest {
    /// 삭제할 헷지 리소스 이름
    #[prost(string, tag="1")]
    pub name: ::prost::alloc::string::String,
}
/// GetHedgeGroup 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetHedgeGroupRequest {
    /// 헷지그룹 리소스 이름 (예: hedge_groups/1)
    #[prost(string, tag="1")]
    pub name: ::prost::alloc::string::String,
}
/// ListHedgeGroups 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListHedgeGroupsRequest {
    /// 페이지 크기
    #[prost(int32, optional, tag="1")]
    pub page_size: ::core::option::Option<i32>,
    /// 페이지 토큰
    #[prost(string, optional, tag="2")]
    pub page_token: ::core::option::Option<::prost::alloc::string::String>,
    /// 필터
    /// Available filters:
    /// * portfolio
    ///    * `equal`
    /// * hedge_fund_code
    ///    * `equal`
    /// * is_active
    ///    * `equal`
    ///
    /// Examples:
    /// * filter=portfolio="portfolios/1"
    /// * filter=is_active=true
    #[prost(string, tag="3")]
    pub filter: ::prost::alloc::string::String,
}
/// ListHedgeGroups 응답
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListHedgeGroupsResponse {
    /// 헷지그룹 목록
    #[prost(message, repeated, tag="1")]
    pub hedge_groups: ::prost::alloc::vec::Vec<HedgeGroup>,
    /// 다음 페이지 토큰
    #[prost(string, tag="2")]
    pub next_page_token: ::prost::alloc::string::String,
}
/// CreateHedgeGroup 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CreateHedgeGroupRequest {
    /// 생성할 헷지그룹 정보
    #[prost(message, optional, tag="1")]
    pub hedge_group: ::core::option::Option<HedgeGroup>,
}
/// UpdateHedgeGroup 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct UpdateHedgeGroupRequest {
    /// 수정할 헷지그룹 정보
    #[prost(message, optional, tag="1")]
    pub hedge_group: ::core::option::Option<HedgeGroup>,
}
/// DeleteHedgeGroup 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct DeleteHedgeGroupRequest {
    /// 삭제할 헷지그룹 리소스 이름
    #[prost(string, tag="1")]
    pub name: ::prost::alloc::string::String,
}
/// HedgeAccumulatorState: 즉시 헷지 per-side 누적기의 현재 상태
/// bid_accumulator: 매수 방향 ETF 체결의 선물 환산 누적값
/// ask_accumulator: 매도 방향 ETF 체결의 선물 환산 누적값
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct HedgeAccumulatorState {
    /// 포트폴리오 ID
    #[prost(int32, tag="1")]
    pub portfolio_id: i32,
    /// 소스 ETF 펀드 코드
    #[prost(string, tag="2")]
    pub fund_code: ::prost::alloc::string::String,
    /// 소스 ETF 종목 심볼
    #[prost(string, tag="3")]
    pub source_symbol: ::prost::alloc::string::String,
    /// 헷지 종목 심볼 (선물 등)
    #[prost(string, tag="4")]
    pub hedge_symbol: ::prost::alloc::string::String,
    /// 매수 방향 누적값 (선물 환산 단위)
    #[prost(double, tag="5")]
    pub bid_accumulator: f64,
    /// 매도 방향 누적값 (선물 환산 단위)
    #[prost(double, tag="6")]
    pub ask_accumulator: f64,
    /// 소스 ETF 매수 총 체결수량
    #[prost(int64, tag="7")]
    pub source_bid_filled_quantity: i64,
    /// 소스 ETF 매도 총 체결수량
    #[prost(int64, tag="8")]
    pub source_ask_filled_quantity: i64,
    /// 매수 체결에 대한 desired 헷지 수량 (선물 환산, 누적)
    #[prost(double, tag="9")]
    pub desired_bid_hedge_quantity: f64,
    /// 매도 체결에 대한 desired 헷지 수량 (선물 환산, 누적)
    #[prost(double, tag="10")]
    pub desired_ask_hedge_quantity: f64,
}
/// ListHedgeAccumulators 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListHedgeAccumulatorsRequest {
    /// 필터
    /// Available filters:
    /// * portfolio_id
    ///    * `equal`
    /// * fund_code
    ///    * `equal`
    /// * source_symbol
    ///    * `equal`
    ///
    /// Examples:
    /// * filter=fund_code="0159"
    /// * filter=portfolio_id=1
    #[prost(string, tag="1")]
    pub filter: ::prost::alloc::string::String,
}
/// ListHedgeAccumulators 응답
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListHedgeAccumulatorsResponse {
    /// HedgeAccumulator 상태 목록
    #[prost(message, repeated, tag="1")]
    pub hedge_accumulators: ::prost::alloc::vec::Vec<HedgeAccumulatorState>,
}
/// StreamHedgeAccumulators 요청
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct StreamHedgeAccumulatorsRequest {
    /// 필터
    /// Available filters:
    /// * portfolio_id
    ///    * `equal`
    /// * fund_code
    ///    * `equal`
    /// * source_symbol
    ///    * `equal`
    ///
    /// Examples:
    /// * filter=fund_code="0159"
    /// * filter=portfolio_id=1
    /// 빈 문자열 = 전체 accumulator 상태 스트리밍
    #[prost(string, tag="1")]
    pub filter: ::prost::alloc::string::String,
}
// ========== Enums ==========

/// 헷지 주문 체결 가격 유형
/// 거래소의 구체적인 호가 유형(QuoteType)과 달리,
/// 헷지 주문의 전략적 의도를 표현합니다.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum ExecPriceType {
    /// 미지정
    Unspecified = 0,
    /// 즉시 체결: 조건부지정가(PriceLimitBestTake)로 즉시 체결 시도
    ImmediateFill = 1,
    /// 상대호가: 상대방 최우선호가 가격으로 지정가 주문
    CounterBest = 2,
    /// 상대호가 +1틱 (공격적: 매수→더 비싸게, 매도→더 싸게)
    CounterBestPlus1 = 3,
    /// 호가 가격: 지정된 호가 가격으로 주문
    QuotedPrice = 4,
    /// QuotedPrice에서 1틱 더 방어적 (매수: -1틱, 매도: +1틱)
    QuotedPriceMinus1 = 5,
    /// QuotedPrice에서 2틱 더 방어적 (매수: -2틱, 매도: +2틱)
    QuotedPriceMinus2 = 6,
    /// QuotedPrice에서 3틱 더 방어적 (매수: -3틱, 매도: +3틱)
    QuotedPriceMinus3 = 7,
    /// 상대호가 +2틱
    CounterBestPlus2 = 8,
    /// 상대호가 +3틱
    CounterBestPlus3 = 9,
    /// 상대호가 +4틱
    CounterBestPlus4 = 10,
    /// 상대호가 +5틱
    CounterBestPlus5 = 11,
}
impl ExecPriceType {
    /// String value of the enum field names used in the ProtoBuf definition.
    ///
    /// The values are not transformed in any way and thus are considered stable
    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
    pub fn as_str_name(&self) -> &'static str {
        match self {
            ExecPriceType::Unspecified => "EXEC_PRICE_TYPE_UNSPECIFIED",
            ExecPriceType::ImmediateFill => "EXEC_PRICE_TYPE_IMMEDIATE_FILL",
            ExecPriceType::CounterBest => "EXEC_PRICE_TYPE_COUNTER_BEST",
            ExecPriceType::CounterBestPlus1 => "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_1",
            ExecPriceType::QuotedPrice => "EXEC_PRICE_TYPE_QUOTED_PRICE",
            ExecPriceType::QuotedPriceMinus1 => "EXEC_PRICE_TYPE_QUOTED_PRICE_MINUS_1",
            ExecPriceType::QuotedPriceMinus2 => "EXEC_PRICE_TYPE_QUOTED_PRICE_MINUS_2",
            ExecPriceType::QuotedPriceMinus3 => "EXEC_PRICE_TYPE_QUOTED_PRICE_MINUS_3",
            ExecPriceType::CounterBestPlus2 => "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_2",
            ExecPriceType::CounterBestPlus3 => "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_3",
            ExecPriceType::CounterBestPlus4 => "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_4",
            ExecPriceType::CounterBestPlus5 => "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_5",
        }
    }
    /// Creates an enum from field names used in the ProtoBuf definition.
    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
        match value {
            "EXEC_PRICE_TYPE_UNSPECIFIED" => Some(Self::Unspecified),
            "EXEC_PRICE_TYPE_IMMEDIATE_FILL" => Some(Self::ImmediateFill),
            "EXEC_PRICE_TYPE_COUNTER_BEST" => Some(Self::CounterBest),
            "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_1" => Some(Self::CounterBestPlus1),
            "EXEC_PRICE_TYPE_QUOTED_PRICE" => Some(Self::QuotedPrice),
            "EXEC_PRICE_TYPE_QUOTED_PRICE_MINUS_1" => Some(Self::QuotedPriceMinus1),
            "EXEC_PRICE_TYPE_QUOTED_PRICE_MINUS_2" => Some(Self::QuotedPriceMinus2),
            "EXEC_PRICE_TYPE_QUOTED_PRICE_MINUS_3" => Some(Self::QuotedPriceMinus3),
            "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_2" => Some(Self::CounterBestPlus2),
            "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_3" => Some(Self::CounterBestPlus3),
            "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_4" => Some(Self::CounterBestPlus4),
            "EXEC_PRICE_TYPE_COUNTER_BEST_PLUS_5" => Some(Self::CounterBestPlus5),
            _ => None,
        }
    }
}
include!("kdo.v1.hedge.tonic.rs");
include!("kdo.v1.hedge.serde.rs");
// @@protoc_insertion_point(module)