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

import collections.abc
import datetime
import enum
import typing

from nautilus_trader import common
from nautilus_trader import model
from nautilus_trader import portfolio

__all__ = [
    "BookImbalanceActorConfig",
    "CompositeMarketMakerConfig",
    "Controller",
    "DeltaNeutralVolConfig",
    "EmaCrossConfig",
    "ExecutionAlgorithm",
    "ExecutionAlgorithmConfig",
    "ForexSession",
    "GridMarketMakerConfig",
    "HurstVpinDirectionalConfig",
    "ImportableControllerConfig",
    "ImportableExecutionAlgorithmConfig",
    "ImportableStrategyConfig",
    "Strategy",
    "StrategyConfig",
    "fx_local_from_utc",
    "fx_next_end",
    "fx_next_start",
    "fx_prev_end",
    "fx_prev_start",
]

@typing.final
class BookImbalanceActorConfig:
    def __init__(
        self,
        instrument_ids: typing.Sequence[model.InstrumentId],
        log_interval: int = 100,
        actor_id: model.ActorId | None = None,
    ) -> None: ...
    @property
    def instrument_ids(self) -> list[model.InstrumentId]: ...
    @property
    def log_interval(self) -> int: ...
    @property
    def actor_id(self) -> model.ActorId | None: ...

@typing.final
class CompositeMarketMakerConfig:
    @property
    def strategy_id(self) -> model.StrategyId | None: ...
    @property
    def order_id_tag(self) -> str | None: ...
    def __init__(
        self,
        instrument_id: model.InstrumentId,
        signal_instrument_id: model.InstrumentId,
        max_position: model.Quantity,
        strategy_id: model.StrategyId | None = None,
        order_id_tag: str | None = None,
        trade_size: model.Quantity | None = None,
        half_spread_bps: int = 5,
        inventory_skew_factor: float = 0.0,
        signal_skew_factor: float = 0.0,
        signal_baseline: float | None = None,
        requote_threshold_bps: int = 5,
        expire_time_secs: int | None = None,
        on_cancel_resubmit: bool = False,
    ) -> None: ...
    @property
    def instrument_id(self) -> model.InstrumentId: ...
    @property
    def signal_instrument_id(self) -> model.InstrumentId: ...
    @property
    def max_position(self) -> model.Quantity: ...
    @property
    def trade_size(self) -> model.Quantity | None: ...
    @property
    def half_spread_bps(self) -> int: ...
    @property
    def inventory_skew_factor(self) -> float: ...
    @property
    def signal_skew_factor(self) -> float: ...
    @property
    def signal_baseline(self) -> float | None: ...
    @property
    def requote_threshold_bps(self) -> int: ...
    @property
    def expire_time_secs(self) -> int | None: ...
    @property
    def on_cancel_resubmit(self) -> bool: ...

class Controller(common.DataActor):
    def __new__(cls, config: typing.Any | None = None) -> typing.Self: ...
    def create_actor_from_config(
        self, actor_config: common.ImportableActorConfig, start: bool = True
    ) -> model.ActorId: ...
    def create_strategy_from_config(
        self, strategy_config: ImportableStrategyConfig, start: bool = True
    ) -> model.StrategyId: ...
    def start_actor(self, actor_id: model.ActorId) -> None: ...
    def start_actor_from_id(self, actor_id: model.ActorId) -> None: ...
    def stop_actor(self, actor_id: model.ActorId) -> None: ...
    def stop_actor_from_id(self, actor_id: model.ActorId) -> None: ...
    def remove_actor(self, actor_id: model.ActorId) -> None: ...
    def remove_actor_from_id(self, actor_id: model.ActorId) -> None: ...
    def start_strategy(self, strategy_id: model.StrategyId) -> None: ...
    def start_strategy_from_id(self, strategy_id: model.StrategyId) -> None: ...
    def stop_strategy(self, strategy_id: model.StrategyId) -> None: ...
    def stop_strategy_from_id(self, strategy_id: model.StrategyId) -> None: ...
    def market_exit_strategy(self, strategy_id: model.StrategyId) -> None: ...
    def market_exit_strategy_from_id(self, strategy_id: model.StrategyId) -> None: ...
    def remove_strategy(self, strategy_id: model.StrategyId) -> None: ...
    def remove_strategy_from_id(self, strategy_id: model.StrategyId) -> None: ...

@typing.final
class DeltaNeutralVolConfig:
    @property
    def strategy_id(self) -> model.StrategyId | None: ...
    @property
    def order_id_tag(self) -> str | None: ...
    def __init__(
        self,
        option_family: str,
        hedge_instrument_id: model.InstrumentId,
        client_id: model.ClientId,
        strategy_id: model.StrategyId | None = None,
        order_id_tag: str | None = None,
        target_call_delta: float = 0.20,
        target_put_delta: float = -0.20,
        contracts: int = 1,
        rehedge_delta_threshold: float = 0.5,
        rehedge_interval_secs: int = 30,
        expiry_filter: str | None = None,
        enter_strangle: bool = True,
        entry_iv_offset: float = 0.0,
        entry_time_in_force: model.TimeInForce = model.TimeInForce.GTC,
        entry_premium_offset_ticks: int | None = None,
        iv_param_key: str = "px_vol",
    ) -> None: ...
    @property
    def option_family(self) -> str: ...
    @property
    def hedge_instrument_id(self) -> model.InstrumentId: ...
    @property
    def client_id(self) -> model.ClientId: ...
    @property
    def target_call_delta(self) -> float: ...
    @property
    def target_put_delta(self) -> float: ...
    @property
    def contracts(self) -> int: ...
    @property
    def rehedge_delta_threshold(self) -> float: ...
    @property
    def rehedge_interval_secs(self) -> int: ...
    @property
    def expiry_filter(self) -> str | None: ...
    @property
    def enter_strangle(self) -> bool: ...
    @property
    def entry_iv_offset(self) -> float: ...
    @property
    def entry_time_in_force(self) -> model.TimeInForce: ...
    @property
    def entry_premium_offset_ticks(self) -> int | None: ...
    @property
    def iv_param_key(self) -> str: ...

@typing.final
class EmaCrossConfig:
    @property
    def strategy_id(self) -> model.StrategyId | None: ...
    @property
    def order_id_tag(self) -> str | None: ...
    def __init__(
        self,
        instrument_id: model.InstrumentId,
        trade_size: model.Quantity,
        fast_period: int = 10,
        slow_period: int = 50,
        strategy_id: model.StrategyId | None = None,
        order_id_tag: str | None = None,
    ) -> None: ...
    @property
    def instrument_id(self) -> model.InstrumentId: ...
    @property
    def trade_size(self) -> model.Quantity: ...
    @property
    def fast_period(self) -> int: ...
    @property
    def slow_period(self) -> int: ...

class ExecutionAlgorithmConfig:
    def __init__(
        self,
        exec_algorithm_id: model.ExecAlgorithmId | str | None = None,
        log_events: bool = True,
        log_commands: bool = True,
        _kwargs: dict | None = ...,
    ) -> None: ...
    @property
    def exec_algorithm_id(self) -> model.ExecAlgorithmId | None: ...
    @property
    def log_events(self) -> bool: ...
    @property
    def log_commands(self) -> bool: ...

@typing.final
class GridMarketMakerConfig:
    @property
    def strategy_id(self) -> model.StrategyId | None: ...
    @property
    def order_id_tag(self) -> str | None: ...
    def __init__(
        self,
        instrument_id: model.InstrumentId,
        max_position: model.Quantity,
        strategy_id: model.StrategyId | None = None,
        order_id_tag: str | None = None,
        trade_size: model.Quantity | None = None,
        num_levels: int = 3,
        grid_step_bps: int = 10,
        skew_factor: float = 0.0,
        requote_threshold_bps: int = 5,
        expire_time_secs: int | None = None,
        on_cancel_resubmit: bool = False,
        use_uuid_client_order_ids: bool = False,
        use_hyphens_in_client_order_ids: bool = True,
    ) -> None: ...
    @property
    def instrument_id(self) -> model.InstrumentId: ...
    @property
    def max_position(self) -> model.Quantity: ...
    @property
    def trade_size(self) -> model.Quantity | None: ...
    @property
    def num_levels(self) -> int: ...
    @property
    def grid_step_bps(self) -> int: ...
    @property
    def skew_factor(self) -> float: ...
    @property
    def requote_threshold_bps(self) -> int: ...
    @property
    def expire_time_secs(self) -> int | None: ...
    @property
    def on_cancel_resubmit(self) -> bool: ...
    @property
    def use_uuid_client_order_ids(self) -> bool: ...
    @property
    def use_hyphens_in_client_order_ids(self) -> bool: ...

@typing.final
class HurstVpinDirectionalConfig:
    @property
    def strategy_id(self) -> model.StrategyId | None: ...
    @property
    def order_id_tag(self) -> str | None: ...
    def __init__(
        self,
        instrument_id: model.InstrumentId,
        bar_type: model.BarType,
        trade_size: model.Quantity,
        strategy_id: model.StrategyId | None = None,
        order_id_tag: str | None = None,
        hurst_window: int = 128,
        hurst_lags: typing.Sequence[int] | None = None,
        hurst_enter: float = 0.55,
        hurst_exit: float = 0.50,
        vpin_window: int = 50,
        vpin_threshold: float = 0.30,
        max_holding_secs: int = 3600,
    ) -> None: ...
    @property
    def instrument_id(self) -> model.InstrumentId: ...
    @property
    def bar_type(self) -> model.BarType: ...
    @property
    def trade_size(self) -> model.Quantity: ...
    @property
    def hurst_window(self) -> int: ...
    @property
    def hurst_lags(self) -> list[int]: ...
    @property
    def hurst_enter(self) -> float: ...
    @property
    def hurst_exit(self) -> float: ...
    @property
    def vpin_window(self) -> int: ...
    @property
    def vpin_threshold(self) -> float: ...
    @property
    def max_holding_secs(self) -> int: ...

@typing.final
class ImportableControllerConfig:
    def __init__(self, controller_path: str, config_path: str, config: dict) -> None: ...
    @property
    def controller_path(self) -> str: ...
    @property
    def config_path(self) -> str: ...
    @property
    def config(self) -> dict: ...

@typing.final
class ImportableExecutionAlgorithmConfig:
    def __init__(self, exec_algorithm_path: str, config_path: str, config: dict) -> None: ...
    @property
    def exec_algorithm_path(self) -> str: ...
    @property
    def config_path(self) -> str: ...
    @property
    def config(self) -> dict: ...

@typing.final
class ImportableStrategyConfig:
    def __init__(self, strategy_path: str, config_path: str, config: dict) -> None: ...
    @property
    def strategy_path(self) -> str: ...
    @property
    def config_path(self) -> str: ...
    @property
    def config(self) -> dict: ...

class ExecutionAlgorithm:
    def __init__(self, config: typing.Any | None = None) -> None: ...
    @property
    def trader_id(self) -> model.TraderId | None: ...
    @property
    def exec_algorithm_id(self) -> model.ExecAlgorithmId: ...
    @property
    def config(self) -> typing.Any | None: ...
    def to_importable_config(self) -> ImportableExecutionAlgorithmConfig: ...
    @property
    def clock(self) -> common.Clock | None: ...
    @property
    def cache(self) -> common.Cache | None: ...
    @property
    def portfolio(self) -> portfolio.Portfolio: ...
    @property
    def log(self) -> common.Logger: ...
    @property
    def state(self) -> common.ComponentState: ...
    def is_registered(self) -> bool: ...
    def is_ready(self) -> bool: ...
    def is_running(self) -> bool: ...
    def is_stopped(self) -> bool: ...
    def is_disposed(self) -> bool: ...
    def is_degraded(self) -> bool: ...
    def is_faulted(self) -> bool: ...
    def start(self) -> None: ...
    def stop(self) -> None: ...
    def resume(self) -> None: ...
    def reset(self) -> None: ...
    def dispose(self) -> None: ...
    def degrade(self) -> None: ...
    def fault(self) -> None: ...
    def publish_data(self, data_type: model.DataType, data: model.CustomData) -> None: ...
    def publish_signal(self, name: str, value: typing.Any, ts_event: int = 0) -> None: ...
    def subscribe_signal(self, name: str = "", priority: int | None = None) -> None: ...
    def subscribe_queue_state(
        self, channel: common.SystemChannel | None = None, priority: int | None = None
    ) -> None: ...
    def subscribe_socket_state(
        self,
        client_id: model.ClientId | None = None,
        endpoint: str | None = None,
        priority: int | None = None,
    ) -> None: ...
    def unsubscribe_signal(self, name: str = "") -> None: ...
    def unsubscribe_queue_state(self, channel: common.SystemChannel | None = None) -> None: ...
    def unsubscribe_socket_state(
        self, client_id: model.ClientId | None = None, endpoint: str | None = None
    ) -> None: ...
    def on_start(self) -> None: ...
    def on_stop(self) -> None: ...
    def on_resume(self) -> None: ...
    def on_reset(self) -> None: ...
    def on_dispose(self) -> None: ...
    def on_degrade(self) -> None: ...
    def on_fault(self) -> None: ...
    def on_time_event(self, event: common.TimeEvent) -> None: ...
    def on_signal(self, signal: common.Signal) -> None: ...
    def on_queue_state(self, event: common.QueueStateChanged) -> None: ...
    def on_socket_state(self, event: common.SocketStateChanged) -> None: ...
    def execute(self, command: typing.Any) -> None: ...
    def on_order(self, order: typing.Any) -> None: ...
    def on_order_list(self, order_list: typing.Any, orders: typing.Any) -> None: ...
    def spawn_market(
        self,
        primary: typing.Any,
        quantity: model.Quantity,
        time_in_force: model.TimeInForce = model.TimeInForce.GTC,
        reduce_only: bool = False,
        tags: typing.Sequence[str] | None = None,
        reduce_primary: bool = True,
    ) -> model.MarketOrder: ...
    def spawn_limit(
        self,
        primary: typing.Any,
        quantity: model.Quantity,
        price: model.Price,
        time_in_force: model.TimeInForce = model.TimeInForce.GTC,
        expire_time: datetime.datetime | None = None,
        post_only: bool = False,
        reduce_only: bool = False,
        display_qty: model.Quantity | None = None,
        emulation_trigger: model.TriggerType | None = None,
        tags: typing.Sequence[str] | None = None,
        reduce_primary: bool = True,
    ) -> model.LimitOrder: ...
    def spawn_market_to_limit(
        self,
        primary: typing.Any,
        quantity: model.Quantity,
        time_in_force: model.TimeInForce = model.TimeInForce.GTC,
        expire_time: datetime.datetime | None = None,
        reduce_only: bool = False,
        display_qty: model.Quantity | None = None,
        emulation_trigger: model.TriggerType | None = None,
        tags: typing.Sequence[str] | None = None,
        reduce_primary: bool = True,
    ) -> model.MarketToLimitOrder: ...
    def deny_order(self, order: typing.Any, reason: str) -> None: ...
    def submit_order(
        self,
        order: typing.Any,
        position_id: model.PositionId | None = None,
        client_id: model.ClientId | None = None,
    ) -> None: ...
    def modify_order(
        self,
        order: typing.Any,
        quantity: model.Quantity | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
        client_id: model.ClientId | None = None,
    ) -> None: ...
    def modify_order_in_place(
        self,
        order: typing.Any,
        quantity: model.Quantity | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
    ) -> None: ...
    def cancel_order(self, order: typing.Any, client_id: model.ClientId | None = None) -> None: ...
    def on_order_initialized(self, event: model.OrderInitialized) -> None: ...
    def on_order_event(self, event: typing.Any) -> None: ...
    def on_order_denied(self, event: model.OrderDenied) -> None: ...
    def on_order_emulated(self, event: model.OrderEmulated) -> None: ...
    def on_order_released(self, event: model.OrderReleased) -> None: ...
    def on_order_submitted(self, event: model.OrderSubmitted) -> None: ...
    def on_order_rejected(self, event: model.OrderRejected) -> None: ...
    def on_order_accepted(self, event: model.OrderAccepted) -> None: ...
    def on_order_canceled(self, event: model.OrderCanceled) -> None: ...
    def on_order_expired(self, event: model.OrderExpired) -> None: ...
    def on_order_triggered(self, event: model.OrderTriggered) -> None: ...
    def on_order_pending_update(self, event: model.OrderPendingUpdate) -> None: ...
    def on_order_pending_cancel(self, event: model.OrderPendingCancel) -> None: ...
    def on_order_modify_rejected(self, event: model.OrderModifyRejected) -> None: ...
    def on_order_cancel_rejected(self, event: model.OrderCancelRejected) -> None: ...
    def on_order_updated(self, event: model.OrderUpdated) -> None: ...
    def on_order_filled(self, event: model.OrderFilled) -> None: ...
    def on_order_fill_voided(self, event: model.OrderFillVoided) -> None: ...
    def on_position_opened(self, event: model.PositionOpened) -> None: ...
    def on_position_event(self, event: typing.Any) -> None: ...
    def on_position_changed(self, event: model.PositionChanged) -> None: ...
    def on_position_closed(self, event: model.PositionClosed) -> None: ...
    def publish_message(self, topic: str, message: object) -> None: ...
    def subscribe_topic(
        self, topic: str, handler: collections.abc.Callable[[object], None], priority: int = 0
    ) -> None: ...
    def unsubscribe_topic(
        self, topic: str, handler: collections.abc.Callable[[object], None]
    ) -> None: ...

class Strategy:
    def __init__(self, config: typing.Any | None = None) -> None: ...
    @property
    def trader_id(self) -> model.TraderId | None: ...
    @property
    def strategy_id(self) -> model.StrategyId: ...
    @property
    def config(self) -> typing.Any | None: ...
    @property
    def clock(self) -> common.Clock: ...
    @property
    def cache(self) -> common.Cache: ...
    def set_external_order_instrument_ids(
        self, instrument_ids: typing.Sequence[model.InstrumentId]
    ) -> None: ...
    @property
    def portfolio(self) -> portfolio.Portfolio: ...
    @property
    def order_factory(self) -> common.OrderFactory: ...
    @property
    def log(self) -> common.Logger: ...
    def state(self) -> common.ComponentState: ...
    def is_ready(self) -> bool: ...
    def is_running(self) -> bool: ...
    def is_stopped(self) -> bool: ...
    def is_disposed(self) -> bool: ...
    def is_degraded(self) -> bool: ...
    def is_faulted(self) -> bool: ...
    def start(self) -> None: ...
    def stop(self) -> None: ...
    def market_exit(self) -> None: ...
    def is_exiting(self) -> bool: ...
    def save(self) -> dict: ...
    def load(self, state: dict) -> None: ...
    def publish_data(self, data_type: model.DataType, data: model.CustomData) -> None: ...
    def publish_signal(self, name: str, value: typing.Any, ts_event: int = 0) -> None: ...
    def add_synthetic(self, synthetic: model.SyntheticInstrument) -> None: ...
    def update_synthetic(self, synthetic: model.SyntheticInstrument) -> None: ...
    def resume(self) -> None: ...
    def reset(self) -> None: ...
    def dispose(self) -> None: ...
    def degrade(self) -> None: ...
    def fault(self) -> None: ...
    def shutdown_system(self, reason: str | None = None) -> None: ...
    @property
    def registered_indicators(self) -> list: ...
    def indicators_initialized(self) -> bool: ...
    def register_indicator_for_quote_ticks(
        self, instrument_id: model.InstrumentId, indicator: typing.Any
    ) -> None: ...
    def register_indicator_for_trade_ticks(
        self, instrument_id: model.InstrumentId, indicator: typing.Any
    ) -> None: ...
    def register_indicator_for_bars(
        self, bar_type: model.BarType, indicator: typing.Any
    ) -> None: ...
    def submit_order(
        self,
        order: typing.Any,
        position_id: model.PositionId | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def submit_order_list(
        self,
        order_list: typing.Any,
        position_id: model.PositionId | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def modify_order(
        self,
        client_order_id: model.ClientOrderId,
        quantity: model.Quantity | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def modify_orders(
        self,
        updates: typing.Sequence[
            tuple[
                model.ClientOrderId, model.Quantity | None, model.Price | None, model.Price | None
            ]
        ] = ...,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def cancel_order(
        self,
        client_order_id: model.ClientOrderId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def cancel_gtd_expiry(self, order: typing.Any) -> None: ...
    def cancel_orders(
        self,
        client_order_ids: typing.Sequence[model.ClientOrderId],
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def cancel_all_orders(
        self,
        instrument_id: model.InstrumentId,
        order_side: model.OrderSide | None = None,
        client_id: model.ClientId | None = None,
        strategy_only: bool = True,
        params: dict | None = None,
    ) -> None: ...
    def close_position(
        self,
        position: model.Position,
        client_id: model.ClientId | None = None,
        tags: typing.Sequence[str] | None = None,
        time_in_force: model.TimeInForce | None = None,
        reduce_only: bool | None = None,
        quote_quantity: bool | None = None,
        params: dict | None = None,
    ) -> None: ...
    def close_all_positions(
        self,
        instrument_id: model.InstrumentId,
        position_side: model.PositionSide | None = None,
        client_id: model.ClientId | None = None,
        tags: typing.Sequence[str] | None = None,
        time_in_force: model.TimeInForce | None = None,
        reduce_only: bool | None = None,
        quote_quantity: bool | None = None,
        params: dict | None = None,
    ) -> None: ...
    def query_account(
        self,
        account_id: model.AccountId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def query_order(
        self, order: typing.Any, client_id: model.ClientId | None = None, params: dict | None = None
    ) -> None: ...
    def on_start(self) -> None: ...
    def on_stop(self) -> None: ...
    def on_resume(self) -> None: ...
    def on_reset(self) -> None: ...
    def on_dispose(self) -> None: ...
    def on_degrade(self) -> None: ...
    def on_fault(self) -> None: ...
    def on_save(self) -> dict: ...
    def on_load(self, state: dict) -> None: ...
    def on_time_event(self, event: common.TimeEvent) -> None: ...
    def on_data(self, data: typing.Any) -> None: ...
    def on_signal(self, signal: common.Signal) -> None: ...
    def on_queue_state(self, event: common.QueueStateChanged) -> None: ...
    def on_socket_state(self, event: common.SocketStateChanged) -> None: ...
    def on_instrument(self, instrument: typing.Any) -> None: ...
    def on_quote(self, quote: model.QuoteTick) -> None: ...
    def on_trade(self, trade: model.TradeTick) -> None: ...
    def on_bar(self, bar: model.Bar) -> None: ...
    def on_book_deltas(self, deltas: model.OrderBookDeltas) -> None: ...
    def on_book_depth(self, depth: model.OrderBookDepth10) -> None: ...
    def on_book(self, book: model.OrderBook) -> None: ...
    def on_mark_price(self, mark_price: model.MarkPriceUpdate) -> None: ...
    def on_index_price(self, index_price: model.IndexPriceUpdate) -> None: ...
    def on_funding_rate(self, funding_rate: model.FundingRateUpdate) -> None: ...
    def on_instrument_status(self, status: model.InstrumentStatus) -> None: ...
    def on_instrument_close(self, close: model.InstrumentClose) -> None: ...
    def on_option_greeks(self, greeks: model.OptionGreeks) -> None: ...
    def on_option_chain(self, slice: model.OptionChainSlice) -> None: ...
    def on_market_exit(self) -> None: ...
    def post_market_exit(self) -> None: ...
    def on_order_initialized(self, event: model.OrderInitialized) -> None: ...
    def on_order_event(self, event: typing.Any) -> None: ...
    def on_order_denied(self, event: model.OrderDenied) -> None: ...
    def on_order_emulated(self, event: model.OrderEmulated) -> None: ...
    def on_order_released(self, event: model.OrderReleased) -> None: ...
    def on_order_submitted(self, event: model.OrderSubmitted) -> None: ...
    def on_order_rejected(self, event: model.OrderRejected) -> None: ...
    def on_order_accepted(self, event: model.OrderAccepted) -> None: ...
    def on_order_expired(self, event: model.OrderExpired) -> None: ...
    def on_order_triggered(self, event: model.OrderTriggered) -> None: ...
    def on_order_pending_update(self, event: model.OrderPendingUpdate) -> None: ...
    def on_order_pending_cancel(self, event: model.OrderPendingCancel) -> None: ...
    def on_order_modify_rejected(self, event: model.OrderModifyRejected) -> None: ...
    def on_order_cancel_rejected(self, event: model.OrderCancelRejected) -> None: ...
    def on_order_updated(self, event: model.OrderUpdated) -> None: ...
    def on_order_canceled(self, event: model.OrderCanceled) -> None: ...
    def on_order_filled(self, event: model.OrderFilled) -> None: ...
    def on_order_fill_voided(self, event: model.OrderFillVoided) -> None: ...
    def on_position_opened(self, event: model.PositionOpened) -> None: ...
    def on_position_event(self, event: typing.Any) -> None: ...
    def on_position_changed(self, event: model.PositionChanged) -> None: ...
    def on_position_closed(self, event: model.PositionClosed) -> None: ...
    def on_historical_data(self, data: typing.Any) -> None: ...
    def on_historical_book_deltas(self, deltas: typing.Sequence[model.OrderBookDelta]) -> None: ...
    def on_historical_book_depth(self, depths: typing.Sequence[model.OrderBookDepth10]) -> None: ...
    def on_historical_quotes(self, quotes: typing.Sequence[model.QuoteTick]) -> None: ...
    def on_historical_trades(self, trades: typing.Sequence[model.TradeTick]) -> None: ...
    def on_historical_funding_rates(
        self, funding_rates: typing.Sequence[model.FundingRateUpdate]
    ) -> None: ...
    def on_historical_bars(self, bars: typing.Sequence[model.Bar]) -> None: ...
    def on_historical_mark_prices(
        self, mark_prices: typing.Sequence[model.MarkPriceUpdate]
    ) -> None: ...
    def on_historical_index_prices(
        self, index_prices: typing.Sequence[model.IndexPriceUpdate]
    ) -> None: ...
    def subscribe_data(
        self,
        data_type: model.DataType,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_signal(self, name: str = "", priority: int | None = None) -> None: ...
    def subscribe_queue_state(
        self, channel: common.SystemChannel | None = None, priority: int | None = None
    ) -> None: ...
    def subscribe_socket_state(
        self,
        client_id: model.ClientId | None = None,
        endpoint: str | None = None,
        priority: int | None = None,
    ) -> None: ...
    def subscribe_instruments(
        self,
        venue: model.Venue,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_instrument(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_book_deltas(
        self,
        instrument_id: model.InstrumentId,
        book_type: model.BookType,
        depth: int | None = None,
        client_id: model.ClientId | None = None,
        managed: bool = False,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_book_depth10(
        self,
        instrument_id: model.InstrumentId,
        book_type: model.BookType,
        client_id: model.ClientId | None = None,
        managed: bool = False,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_book_at_interval(
        self,
        instrument_id: model.InstrumentId,
        book_type: model.BookType,
        interval_ms: int,
        depth: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_quotes(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_trades(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_bars(
        self,
        bar_type: model.BarType,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_mark_prices(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_index_prices(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_funding_rates(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_option_greeks(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_instrument_status(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_instrument_close(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def subscribe_option_chain(
        self,
        series_id: model.OptionSeriesId,
        strike_range: model.StrikeRange,
        snapshot_interval_ms: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_data(
        self,
        data_type: model.DataType,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_signal(self, name: str) -> None: ...
    def unsubscribe_queue_state(self, channel: common.SystemChannel | None = None) -> None: ...
    def unsubscribe_socket_state(
        self, client_id: model.ClientId | None = None, endpoint: str | None = None
    ) -> None: ...
    def unsubscribe_instruments(
        self,
        venue: model.Venue,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_instrument(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_book_deltas(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_book_depth10(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_book_at_interval(
        self,
        instrument_id: model.InstrumentId,
        interval_ms: int,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_quotes(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_trades(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_bars(
        self,
        bar_type: model.BarType,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_mark_prices(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_index_prices(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_funding_rates(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_option_greeks(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_instrument_status(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_instrument_close(
        self,
        instrument_id: model.InstrumentId,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> None: ...
    def unsubscribe_option_chain(
        self, series_id: model.OptionSeriesId, client_id: model.ClientId | None = None
    ) -> None: ...
    def request_data(
        self,
        data_type: model.DataType,
        client_id: model.ClientId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_instrument(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_instruments(
        self,
        venue: model.Venue | None = None,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_book_snapshot(
        self,
        instrument_id: model.InstrumentId,
        depth: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_book_deltas(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_book_depth(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        depth: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_quotes(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_trades(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_funding_rates(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def request_bars(
        self,
        bar_type: model.BarType,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
        client_id: model.ClientId | None = None,
        params: dict | None = None,
    ) -> str: ...
    def reconnect_socket(self, client_id: model.ClientId, endpoint: str) -> None: ...
    def publish_message(self, topic: str, message: object) -> None: ...
    def subscribe_topic(
        self, topic: str, handler: collections.abc.Callable[[object], None], priority: int = 0
    ) -> None: ...
    def unsubscribe_topic(
        self, topic: str, handler: collections.abc.Callable[[object], None]
    ) -> None: ...

class StrategyConfig:
    def __init__(
        self,
        strategy_id: model.StrategyId | None = None,
        order_id_tag: str | None = None,
        oms_type: model.OmsType | None = None,
        external_order_instrument_ids: typing.Sequence[model.InstrumentId] | None = None,
        manage_contingent_orders: bool = False,
        manage_gtd_expiry: bool = False,
        manage_stop: bool = False,
        market_exit_interval_ms: int = 100,
        market_exit_max_attempts: int = 100,
        market_exit_time_in_force: model.TimeInForce = model.TimeInForce.GTC,
        market_exit_reduce_only: bool = True,
        use_uuid_client_order_ids: bool = False,
        use_hyphens_in_client_order_ids: bool = True,
        log_events: bool = True,
        log_commands: bool = True,
        log_rejected_due_post_only_as_warning: bool = True,
        _kwargs: dict | None = ...,
    ) -> None: ...
    @property
    def strategy_id(self) -> model.StrategyId | None: ...
    @property
    def order_id_tag(self) -> str | None: ...
    @property
    def oms_type(self) -> model.OmsType | None: ...
    @property
    def external_order_instrument_ids(self) -> list[model.InstrumentId] | None: ...
    @property
    def manage_contingent_orders(self) -> bool: ...
    @property
    def manage_gtd_expiry(self) -> bool: ...
    @property
    def manage_stop(self) -> bool: ...
    @property
    def market_exit_interval_ms(self) -> int: ...
    @property
    def market_exit_max_attempts(self) -> int: ...
    @property
    def market_exit_time_in_force(self) -> model.TimeInForce: ...
    @property
    def market_exit_reduce_only(self) -> bool: ...
    @property
    def use_uuid_client_order_ids(self) -> bool: ...
    @property
    def use_hyphens_in_client_order_ids(self) -> bool: ...
    @property
    def log_events(self) -> bool: ...
    @property
    def log_commands(self) -> bool: ...
    @property
    def log_rejected_due_post_only_as_warning(self) -> bool: ...

@typing.final
class ForexSession(enum.Enum):
    SYDNEY = ...
    TOKYO = ...
    LONDON = ...
    NEW_YORK = ...

    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) -> model.EnumIterator: ...
    @classmethod
    def from_str(cls, data: typing.Any) -> ForexSession: ...

def fx_local_from_utc(session: ForexSession, time_now: datetime.datetime) -> str: ...
def fx_next_end(session: ForexSession, time_now: datetime.datetime) -> datetime.datetime: ...
def fx_next_start(session: ForexSession, time_now: datetime.datetime) -> datetime.datetime: ...
def fx_prev_end(session: ForexSession, time_now: datetime.datetime) -> datetime.datetime: ...
def fx_prev_start(session: ForexSession, time_now: datetime.datetime) -> datetime.datetime: ...
