Skip to content

v13.0.0

Choose a tag to compare

@Graeme22 Graeme22 released this 03 Jul 18:46

What's Changed

  • Better typing for order placement and response classes by @Graeme22 in #342, fixes #337
    Introduces dedicated order classes per order type and uses them to overload place_order, place_complex_order, and replace_order for more precise return types. Previously every response came back as PlacedOrder/PlacedComplexOrder with many fields optional, forcing users to null-check fields that were always present for their order type.

    New order helpers:

    • Simple orders: LimitOrder, MarketOrder, StopOrder, StopLimitOrder, NotionalOrder
    • Complex orders: OCOOrder, OTOOrder, OTOCOOrder

    New response models:

    • PlacedOrderResponse and PlacedComplexOrderResponse are now generic over order type (so placing a LimitOrder returns PlacedOrderResponse[PlacedLimitOrder] where price is of type Decimal instead of Decimal | None as before).
    • Dry runs now return UnplacedOrder/UnplacedComplexOrder, which have no id field, replacing the old sentinel id = -1.
    • PlacedOCOOrder/PlacedOTOCOOrder expose take_profit/stop_loss properties to ease distinguishing orders in the response model.

    Breaking changes:

    • Order price_effect/value_effect fields replaced with a single wrap serializer that parses the sign out of price/value at serialization time.
    • MarketData.mark is now optional (see #337)
    • Dry runs return UnplacedOrder (which has no id field) instead of id = -1.
    • PlacedComplexOrder.type is now ComplexOrderType instead of a simple string.

    Code that previously looked like this:

    order = NewOrder(order_type=OrderType.LIMIT, legs=[leg], price=Decimal('-10'))
    response = await account.place_order(session, order, dry_run=False)
    reveal_type(response.order.price)  # Decimal | None

    Becomes:

    order = LimitOrder(legs=[leg], price=Decimal('-10'))
    response = await account.place_order(session, order, dry_run=False)
    reveal_type(response.order.price)  # Decimal

    This allows for inferring all sorts of useful fields, eg stop_trigger for a PlacedStopOrder, trigger_order for a PlacedOTOCO, no id for an UnplacedOrder (dry run).

  • Remove deprecated ssl_context parameter from DXLinkStreamer (can pass verify=True to Session.client_kwargs instead)

Full Changelog: v12.4.3...v13.0.0