from abc import ABC, abstractmethod

from internal_types.types import Position, Quote


# todo:
#   handle strategy that trades multiple instruments
#   fractional position/volume for crypto
#   callback for async order
class Strategy(ABC):

  @abstractmethod
  def curr_position(self) -> int:
    pass

  @abstractmethod
  def desired_position(self) -> int:
    pass

  @abstractmethod
  def order_filled(self, new_pos: Position):
    pass

  @abstractmethod
  def process_quote(self, quote: Quote):
    pass

  @abstractmethod
  def net_liquid_value(self, closing_price: float) -> float:
    pass
