investfly.models.strategy.TradeOrderBuilder

MAX_UNDERLYING_UNIVERSE_SIZE = 20
@dataclass
class TradeOrderBuilder:

Base class for the polymorphic OpenPositionConfig.tradeOrderBuilder field.

Subtypes correspond one-to-one with their Java counterparts:

  • IdentityOrderBuilder : signal security == traded security (default)
  • FutureContractOrderBuilder : FutureProduct signal -> front-month Future contract
  • OptionStrategyOrderBuilder : STOCK underlying signal -> option-leg orders

Selection is implicit from TradingStrategyModel.securityType; the runtime checks the actual instance type to dispatch.

def validate(self) -> None:
def toDict(self) -> Dict[str, Any]:
@staticmethod
def fromDict( jsonDict: Dict[str, Any]) -> TradeOrderBuilder:
@dataclass
class IdentityOrderBuilder(TradeOrderBuilder):

No-op builder: signal security IS the traded security (STOCK/CRYPTO/FOREX).

def validate(self) -> None:
def toDict(self) -> Dict[str, Any]:
@staticmethod
def fromDict( jsonDict: Dict[str, Any]) -> IdentityOrderBuilder:
@dataclass
class FutureContractOrderBuilder(TradeOrderBuilder):

Future strategies: signal universe is a FutureProduct, traded security is the front-month contract resolved at order-emit time. No user-facing config knobs in MVP — the runtime always picks the front-month contract for the product.

def validate(self) -> None:
def toDict(self) -> Dict[str, Any]:
@staticmethod
def fromDict( jsonDict: Dict[str, Any]) -> FutureContractOrderBuilder:
@dataclass
class OptionStrategyOrderBuilder(TradeOrderBuilder):

Option strategies: signal universe is the STOCK underlying, traded securities are option contracts assembled per (template, legs, contractSelector, positionSizing).

def isMultiLeg(self) -> bool:
def validate(self) -> None:
def toDict(self) -> Dict[str, Any]:
@staticmethod
def fromDict( jsonDict: Dict[str, Any]) -> OptionStrategyOrderBuilder: