Tastytrade

Latest version: v9.4

Safety actively analyzes 688944 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 7

9.4

What's Changed
* fix datetime bug by Graeme22 in https://github.com/tastyware/tastytrade/pull/184

The datetime-related utilities in `tastytrade.utils` suffered from a hard-to-detect bug related to variable Python default arguments. These utilities will work correctly now, whereas previously something like this:
python
from tastytrade.utils import is_market_open_on
print(is_market_open_on())
5 hours later...
print(is_market_open_on())

could potentially yield incorrect results in long-running programs. This now behaves as expected, and no code changes are required.

* candles default to 0, add event flags by Graeme22 in https://github.com/tastyware/tastytrade/pull/185

This partially reverts the changes in v9.3 which excluded all `Candle` events without OHLC fields. JBlohm brought to attention that these "empty" candles can still contain important information in the `event_flags` field. This was solved by re-allowing the empty candles (while still ensuring `None` values provided will be set to 0, which allows for filtering them out without messing with the types), and as a bonus a new class, `tastytrade.dxfeed.IndexedEvent`, was added which allows for easily parsing the `event_flags` field, which otherwise required some bitwise math. So upgrading will look something like this:
python
candles = []
async for candle in streamer.listen(Candle):
if not Decimal.is_zero(candle.open): filter out invalid candles
candles.append(candle)
else:
print(candle.snapshot_end) handle event flags


* update websockets, add autoreconnect by Graeme22 in https://github.com/tastyware/tastytrade/pull/180

This updates the `websockets` dependency to `>=14.1` and uses the new async websockets features to implement auto-reconnect functionality upon certain connection errors. This takes effect automatically and doesn't require any code changes. However, the reconnection algorithm's behavior can be modified through environment variables, documented [here](https://websockets.readthedocs.io/en/14.1/reference/variables.html).

* add streamer reconnection callbacks by Graeme22 in https://github.com/tastyware/tastytrade/pull/186

Building on the auto-reconnection functionality, this PR introduces callback functions that can be ran upon reconnection to handle common tasks, for example, re-subscribing to alerts or events. Here's how this looks:
python
async def callback(streamer: DXLinkStreamer, arg1, arg2):
await streamer.subscribe(Trade, ["SPX"])
print(arg1 + arg2)

async with DXLinkStreamer(session, reconnect_args=(arg1, arg2), reconnect_fn=callback) as streamer:
pass

The first argument for the callback will always be the streamer itself; after that, the number and type of arguments is determined by your use case.
Additionally, a small change was made to the existing `AlertStreamer.create` and `DXLinkStreamer.create` functions. They have been switched to a simpler syntax that allows you to `await` the constructor directly. So this code:
python
streamer = await AlertStreamer.create(session)

becomes:
python
streamer = await AlertStreamer(session)


**Full Changelog**: https://github.com/tastyware/tastytrade/compare/v9.3...v9.4

9.3

What's Changed
- All event fields from `tastytrade.dxfeed` changed to Pythonic snake_case instead of their previous names, which came directly from the Java documentation and therefore used camelCase.
So this code:
python
print(quote.eventSymbol)

Becomes:
python
print(quote.event_symbol)

- `Candle`, `Quote`, and `Trade` events from `tastytrade.dxfeed` have less `Optional` fields.
Previously, the streamer would return a lot of "garbage" events that would have to be handled in some way. For example, listening to `Quote` events might have looked like this:
python
from tastytrade.dxfeed import Quote
...
async for quote in streamer.listen(Quote):
if quote.bidPrice is not None and quote.askPrice is not None:
quotes.append(quote)

To make things even worse, using the `Quote` objects returned down the road led to lots of ` type: ignore`s littering the code as type checkers are unable to determine that quotes without crucial properties have already been filtered out:
python
type checker will complain as these may be `None`!
mid = quote.bidPrice + quote.askPrice type: ignore

This mini-release solves these problems by making these fields non-optional, and not returning the events at all if they're missing crucial fields. (For example, `Quote`s are pretty much useless without the bid/ask, or `Candle`s without OHLC.)
So the above code can be changed to:
python
from tastytrade.dxfeed import Quote
...
async for quote in streamer.listen(Quote):
quotes.append(quote)

and
python
mid = quote.bid_price + quote.ask_price


**Full Changelog**: https://github.com/tastyware/tastytrade/compare/v9.2...v9.3

9.2

What's Changed
- Removes support for Python 3.8, which has now reached [end of life](https://devguide.python.org/versions/)
- Uses Python 3.9's simpler typing, removing the need to import `typing.List` and `typing.Dict`
- Slightly improves streamer typing using bounded generic `TypeVar`s
- Switches to the standard library's `ZoneInfo` instead of using `pytz`
- Fixes a bug in `Equity.get_active_equities` where some results may not contain the `listed_market` field

**Full Changelog**: https://github.com/tastyware/tastytrade/compare/v9.1...v9.2

9.1

What's Changed
Small release fixing a pretty important bug which prevents placing test (`dry_run=True`) orders.

* fix dry run bug by Graeme22 in https://github.com/tastyware/tastytrade/pull/176


**Full Changelog**: https://github.com/tastyware/tastytrade/compare/v9.0...v9.1

9.0

New major release! _Warning: BREAKING CHANGES!_ See below.
This is a large release with many changes, so please report any issues you run across!

What's Changed
* Add sync/async functionality for all requests by Graeme22 in https://github.com/tastyware/tastytrade/pull/168
Simply add the `a_` prefix to the sync method name and boom, async!
Here's how it looks:
python
acc = await Account.a_get_account(session, account_number)


* Move from price effect to +/- for numbers by Graeme22 in https://github.com/tastyware/tastytrade/pull/169
Previously, most number fields in the API were represented with two separate fields: one for the value, another for the sign (which in the SDK is called `PriceEffect`). This led to less readability and a lot of lines of code that looked like this:
python
value *= -1 if price_effect == PriceEffect.DEBIT else 1

However, as of this release, we can just use positive numbers for credits and negative ones for debits... Much easier! So this example from the old docs of building an order:
python
order = NewOrder(
time_in_force=OrderTimeInForce.DAY,
order_type=OrderType.LIMIT,
legs=[leg], you can have multiple legs in an order
price=Decimal('10'), limit price, $10/share for a total value of $50
price_effect=PriceEffect.DEBIT
)

Became this:
python
order = NewOrder(
time_in_force=OrderTimeInForce.DAY,
order_type=OrderType.LIMIT,
legs=[leg], you can have multiple legs in an order
price=Decimal('-10') limit price, $10/share debit for a total value of $50
)

Under the hood interactions with the API remain unchanged, but for SDK users this should make life much more pleasant.

* better typing for streamer, orders by Graeme22 in https://github.com/tastyware/tastytrade/pull/170
Certain functions for the streamer ended up not working very cleanly with type checkers. So, with a few typing tricks, the streamer functions have changed their parameters, but in exchange we get type hints and a smoother workflow. Here's how the streamer worked before:
python
from tastytrade.dxfeed import EventType
async with DXLinkStreamer(session) as streamer:
await streamer.subscribe(EventType.QUOTE, ['SPY'])
quote = await streamer.get_event(EventType.QUOTE)

And here's how it looks now:
python
from tastytrade.dxfeed import Quote
async with DXLinkStreamer(session) as streamer:
await streamer.subscribe(Quote, ['SPY'])
quote = await streamer.get_event(Quote)

This makes life a lot easier for anyone doing type checking or even using an IDE, so pretty much everyone! The type you pass in will not only control the type of event you receive, but also the inferred return type.

* add order chains, add is_market_open_on util by Graeme22 in https://github.com/tastyware/tastytrade/pull/171
This adds a new function to the `Account` class allowing for fetching order chains (groups of trades in the same symbol used to track open, rolls, and close). Previously these were only available through the `AlertStreamer` for existing postions, but now you can query over a time range for a given underlying:
python
chains = account.get_order_chains(session, 'SPX', start_time, end_time)

Also, adds a utility function to check if the market is open on a specific date (defaults to today).

* test coverage is now better and added for all async tests as well. Using `pytest-aio` to easily run all tests in the same event loop.
* update docs with new functionality
* switch to pyright over mypy for type checking
* switch to Python 3.8 for building
* replace several deprecated functions from pydantic v1
* use `typing_extensions.Self` for classmethods
* add `Customer` and `User` dataclasses for data returned by `Session`
* add tests for `dxfeed` module
* unclutter `tastytrade` package-level exports, which are now restricted to just `Account`, `AlertStreamer`, `DXLinkStreamer`, `Session`, and `Watchlist`
* no longer using `Optional` types for some common, important fields, such as `PlacedOrder.id` and `Option.streamer_symbol`.
* add `unsubscribe_all` function to streamer to unsubscribe from all events of a certain type
* return type of `Account.place_order` and `Account.place_complex_order` now return `tastytrade.order.PlacedOrderResponse` and `tastytrade.order.PlacedComplexOrderResponse` respectively, which are guaranteed to contain the `order` or `complex_order` properties.

**Full Changelog**: https://github.com/tastyware/tastytrade/compare/v8.5...v9.0

8.5

Re-release of v8.4 with packaging fixed. Features:

- Adds backtesting features! Currently in beta, so please report any issues.
- Switches to `httpx` over `requests`
- Fixes 165, adding new parameters to `Account.get_balance_snapshots`

**Full Changelog**: https://github.com/tastyware/tastytrade/compare/v8.3...v8.5

Page 1 of 7

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.