# This file is automatically generated by pyo3_stub_gen
# ruff: noqa: E501

import datetime
import enum
import typing

from nautilus_trader import model
from nautilus_trader import network

__all__ = [
    "BITMEX",
    "BITMEX_CLIENT_ID",
    "BITMEX_VENUE",
    "BitmexDataClientConfig",
    "BitmexDataClientFactory",
    "BitmexEnvironment",
    "BitmexExecutionClientConfig",
    "BitmexExecutionClientFactory",
]

BITMEX: str
BITMEX_CLIENT_ID: model.ClientId
BITMEX_VENUE: model.Venue

@typing.final
class BitmexDataClientConfig:
    @property
    def base_url_http(self) -> str | None: ...
    @property
    def base_url_ws(self) -> str | None: ...
    @property
    def http_timeout_secs(self) -> int: ...
    @property
    def max_retries(self) -> int: ...
    @property
    def retry_delay_initial_ms(self) -> int: ...
    @property
    def retry_delay_max_ms(self) -> int: ...
    @property
    def heartbeat_interval_secs(self) -> int | None: ...
    @property
    def auth_timeout_secs(self) -> int | None: ...
    @property
    def recv_window_ms(self) -> int: ...
    @property
    def active_only(self) -> bool: ...
    @property
    def update_instruments_interval_mins(self) -> int | None: ...
    @property
    def environment(self) -> BitmexEnvironment: ...
    @property
    def max_requests_per_second(self) -> int: ...
    @property
    def max_requests_per_minute(self) -> int: ...
    @property
    def transport_backend(self) -> network.TransportBackend: ...
    def __init__(
        self,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url_http: str | None = None,
        base_url_ws: str | None = None,
        proxy_url: str | None = None,
        http_timeout_secs: int | None = None,
        max_retries: int | None = None,
        retry_delay_initial_ms: int | None = None,
        retry_delay_max_ms: int | None = None,
        heartbeat_interval_secs: int | None = None,
        auth_timeout_secs: int | None = None,
        recv_window_ms: int | None = None,
        active_only: bool | None = None,
        update_instruments_interval_mins: int | None = None,
        environment: BitmexEnvironment | None = None,
        max_requests_per_second: int | None = None,
        max_requests_per_minute: int | None = None,
        transport_backend: network.TransportBackend | None = None,
    ) -> None: ...
    @property
    def has_proxy_url(self) -> bool: ...

@typing.final
class BitmexDataClientFactory:
    def __init__(self) -> None: ...
    def name(self) -> str: ...

@typing.final
class BitmexExecutionClientConfig:
    @property
    def base_url_http(self) -> str | None: ...
    @property
    def base_url_ws(self) -> str | None: ...
    @property
    def http_timeout_secs(self) -> int: ...
    @property
    def max_retries(self) -> int: ...
    @property
    def retry_delay_initial_ms(self) -> int: ...
    @property
    def retry_delay_max_ms(self) -> int: ...
    @property
    def heartbeat_interval_secs(self) -> int: ...
    @property
    def auth_timeout_secs(self) -> int | None: ...
    @property
    def recv_window_ms(self) -> int: ...
    @property
    def active_only(self) -> bool: ...
    @property
    def environment(self) -> BitmexEnvironment: ...
    @property
    def account_id(self) -> model.AccountId | None: ...
    @property
    def max_requests_per_second(self) -> int: ...
    @property
    def max_requests_per_minute(self) -> int: ...
    @property
    def submitter_pool_size(self) -> int | None: ...
    @property
    def canceller_pool_size(self) -> int | None: ...
    @property
    def deadmans_switch_timeout_secs(self) -> int | None: ...
    @property
    def transport_backend(self) -> network.TransportBackend: ...
    def __init__(
        self,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url_http: str | None = None,
        base_url_ws: str | None = None,
        proxy_url: str | None = None,
        http_timeout_secs: int | None = None,
        max_retries: int | None = None,
        retry_delay_initial_ms: int | None = None,
        retry_delay_max_ms: int | None = None,
        heartbeat_interval_secs: int | None = None,
        auth_timeout_secs: int | None = None,
        recv_window_ms: int | None = None,
        active_only: bool | None = None,
        environment: BitmexEnvironment | None = None,
        account_id: model.AccountId | None = None,
        max_requests_per_second: int | None = None,
        max_requests_per_minute: int | None = None,
        submitter_pool_size: int | None = None,
        canceller_pool_size: int | None = None,
        submitter_proxy_urls: typing.Sequence[str] | None = None,
        canceller_proxy_urls: typing.Sequence[str] | None = None,
        deadmans_switch_timeout_secs: int | None = None,
        transport_backend: network.TransportBackend | None = None,
    ) -> None: ...
    @property
    def has_proxy_url(self) -> bool: ...
    @property
    def has_submitter_proxy_urls(self) -> bool: ...
    @property
    def has_canceller_proxy_urls(self) -> bool: ...

@typing.final
class BitmexExecutionClientFactory:
    def __init__(self) -> None: ...
    def name(self) -> str: ...

@typing.final
class BitmexHttpClient:
    def __init__(
        self,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url: str | None = None,
        environment: BitmexEnvironment = ...,
        timeout_secs: int = 60,
        max_retries: int = 3,
        retry_delay_ms: int = 1000,
        retry_delay_max_ms: int = 10000,
        recv_window_ms: int = 10000,
        max_requests_per_second: int = 10,
        max_requests_per_minute: int = 120,
        proxy_url: str | None = None,
    ) -> None: ...
    @staticmethod
    def from_env() -> BitmexHttpClient: ...
    @property
    def base_url(self) -> str: ...
    @property
    def api_key(self) -> str | None: ...
    @property
    def api_key_masked(self) -> str | None: ...
    def update_position_leverage(self, _symbol: str, _leverage: float) -> typing.Any: ...
    def request_instrument(self, instrument_id: model.InstrumentId) -> typing.Any: ...
    def request_instruments(self, active_only: bool) -> typing.Any: ...
    def request_trades(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
    ) -> typing.Any: ...
    def request_bars(
        self,
        bar_type: model.BarType,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        partial: bool = False,
    ) -> typing.Any: ...
    def request_book_snapshot(
        self, instrument_id: model.InstrumentId, depth: int | None = None
    ) -> typing.Any: ...
    def request_funding_rates(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
    ) -> typing.Any: ...
    def query_order(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
    ) -> typing.Any: ...
    def request_order_status_reports(
        self,
        instrument_id: model.InstrumentId | None = None,
        open_only: bool = False,
        limit: int | None = None,
    ) -> typing.Any: ...
    def request_fill_reports(
        self, instrument_id: model.InstrumentId | None = None, limit: int | None = None
    ) -> typing.Any: ...
    def request_position_status_reports(self) -> typing.Any: ...
    def submit_order(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId,
        order_side: model.OrderSide,
        order_type: model.OrderType,
        quantity: model.Quantity,
        time_in_force: model.TimeInForce,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
        trigger_type: model.TriggerType | None = None,
        trailing_offset: float | None = None,
        trailing_offset_type: model.TrailingOffsetType | None = None,
        display_qty: model.Quantity | None = None,
        post_only: bool = False,
        reduce_only: bool = False,
        order_list_id: model.OrderListId | None = None,
        contingency_type: model.ContingencyType | None = None,
        peg_price_type: str | None = None,
        peg_offset_value: float | None = None,
    ) -> typing.Any: ...
    def cancel_order(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
    ) -> typing.Any: ...
    def cancel_orders(
        self,
        instrument_id: model.InstrumentId,
        client_order_ids: typing.Sequence[model.ClientOrderId] | None = None,
        venue_order_ids: typing.Sequence[model.VenueOrderId] | None = None,
    ) -> typing.Any: ...
    def cancel_all_orders(
        self, instrument_id: model.InstrumentId, order_side: model.OrderSide | None = ...
    ) -> typing.Any: ...
    def modify_order(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
        quantity: model.Quantity | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
    ) -> typing.Any: ...
    def cache_instrument(self, instrument: typing.Any) -> None: ...
    def cancel_all_requests(self) -> None: ...
    def get_margin(self, currency: str) -> typing.Any: ...
    def get_account_number(self) -> typing.Any: ...
    def request_account_state(self, account_id: model.AccountId) -> typing.Any: ...
    def submit_orders_bulk(self, orders: typing.Sequence[typing.Any]) -> typing.Any: ...
    def modify_orders_bulk(self, orders: typing.Sequence[typing.Any]) -> typing.Any: ...
    def cancel_all_after(self, timeout_ms: int) -> typing.Any: ...
    def get_server_time(self) -> typing.Any: ...

@typing.final
class CancelBroadcaster:
    def __init__(
        self,
        pool_size: int,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url: str | None = None,
        environment: BitmexEnvironment = ...,
        timeout_secs: int = 60,
        max_retries: int = 3,
        retry_delay_ms: int = 1000,
        retry_delay_max_ms: int = 5000,
        recv_window_ms: int = 10000,
        max_requests_per_second: int = 10,
        max_requests_per_minute: int = 120,
        health_check_interval_secs: int = 30,
        health_check_timeout_secs: int = 5,
        expected_reject_patterns: typing.Sequence[str] | None = None,
        idempotent_success_patterns: typing.Sequence[str] | None = None,
        proxy_urls: typing.Sequence[str | None] | None = None,
    ) -> None: ...
    def cache_instrument(self, instrument: typing.Any) -> None: ...
    def start(self) -> typing.Any: ...
    def stop(self) -> typing.Any: ...
    def broadcast_cancel(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = ...,
        venue_order_id: model.VenueOrderId | None = ...,
    ) -> typing.Any: ...
    def broadcast_batch_cancel(
        self,
        instrument_id: model.InstrumentId,
        client_order_ids: typing.Sequence[model.ClientOrderId] | None = ...,
        venue_order_ids: typing.Sequence[model.VenueOrderId] | None = ...,
    ) -> typing.Any: ...
    def broadcast_cancel_all(
        self, instrument_id: model.InstrumentId, order_side: model.OrderSide | None = ...
    ) -> typing.Any: ...
    def get_metrics(self) -> typing.Any: ...
    def get_client_stats(self) -> typing.Any: ...

@typing.final
class SubmitBroadcaster:
    def __init__(
        self,
        pool_size: int,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url: str | None = None,
        environment: BitmexEnvironment = ...,
        timeout_secs: int = 60,
        max_retries: int = 3,
        retry_delay_ms: int = 1000,
        retry_delay_max_ms: int = 5000,
        recv_window_ms: int = 10000,
        max_requests_per_second: int = 10,
        max_requests_per_minute: int = 120,
        health_check_interval_secs: int = 30,
        health_check_timeout_secs: int = 5,
        expected_reject_patterns: typing.Sequence[str] | None = None,
        proxy_urls: typing.Sequence[str | None] | None = None,
    ) -> None: ...
    def start(self) -> typing.Any: ...
    def stop(self) -> typing.Any: ...
    def broadcast_submit(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId,
        order_side: model.OrderSide,
        order_type: model.OrderType,
        quantity: model.Quantity,
        time_in_force: model.TimeInForce,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
        trigger_type: model.TriggerType | None = None,
        trailing_offset: float | None = None,
        trailing_offset_type: model.TrailingOffsetType | None = None,
        display_qty: model.Quantity | None = None,
        post_only: bool = False,
        reduce_only: bool = False,
        order_list_id: model.OrderListId | None = None,
        contingency_type: model.ContingencyType | None = None,
        submit_tries: int | None = None,
        peg_price_type: str | None = None,
        peg_offset_value: float | None = None,
    ) -> typing.Any: ...
    def get_metrics(self) -> typing.Any: ...
    def get_client_stats(self) -> typing.Any: ...
    def cache_instrument(self, instrument: typing.Any) -> None: ...

@typing.final
class BitmexEnvironment(enum.Enum):
    MAINNET = ...
    TESTNET = ...

    def __init__(self, value: typing.Any) -> None: ...
    def __hash__(self) -> int: ...
    @property
    def name(self) -> str: ...
    @property
    def value(self) -> int: ...
    @classmethod
    def variants(cls) -> list[str]: ...
    @classmethod
    def from_str(cls, data: typing.Any) -> BitmexEnvironment: ...
