Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TimeAndSale event #47

Merged
merged 4 commits into from
May 29, 2023
Merged

Conversation

michaelcooke
Copy link
Contributor

This PR adds support for the TimeAndSale market event. DxFeed documentation on this event may be found in their Javadocs and knowledge base

tastytrade/dxfeed/timeandsale.py Outdated Show resolved Hide resolved
Copy link
Contributor

@Graeme22 Graeme22 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! I'll give it a test run when I get the chance and merge then. Thanks for the contribution!

@Graeme22
Copy link
Contributor

Were you able to use this to sucessfully stream TimeAndSale events? I'm trying but it's just hanging:

res = await streamer.oneshot(EventType.TIME_AND_SALE, ['SPY'])  # hangs
print(res)

@michaelcooke
Copy link
Contributor Author

michaelcooke commented May 29, 2023

I used it last week for equities and futures. The reason you're not getting any events for SPY is that it's not trading currently; no trades to report means no events. Try /ESM23:XCME between now and 1:00 PM ET tomorrow or during regular trading hours on Tuesday.

@michaelcooke
Copy link
Contributor Author

Here's a pared down version of the script I'm using to pull ES time and sales events currently:

import asyncio
from tastytrade.session import Session
from tastytrade.streamer import DataStreamer, EventType
from threading import Thread

async def stream_quotes(symbols, username, password):
  session = Session(username, password)
  streamer = await DataStreamer.create(session)
  time_and_sales = await streamer.subscribe(EventType.TIME_AND_SALE, symbols)
  async for item in streamer.listen():
    print(item)

if __name__ == '__main__':
  symbols = [
    '/ESM23:XCME'
  ]

  tastytrade_username = os.getenv('TASTYTRADE_USERNAME')
  tastytrade_password = os.getenv('TASTYTRADE_PASSWORD')
  
  stream_thread = threading.Thread(target=asyncio.run, args=(stream_quotes(symbols, tastytrade_username, tastytrade_password),))
  stream_thread.daemon = True
  stream_thread.start()
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429860215967628, time=1685328283407, timeNanoPart=0, sequence=53132, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429860329213838, time=1685328283434, timeNanoPart=0, sequence=53134, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429863248449424, time=1685328284106, timeNanoPart=0, sequence=53136, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429863248449425, time=1685328284106, timeNanoPart=0, sequence=53137, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429863248449426, time=1685328284106, timeNanoPart=0, sequence=53138, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429863248449427, time=1685328284106, timeNanoPart=0, sequence=53139, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429863248449428, time=1685328284106, timeNanoPart=0, sequence=53140, exchangeCode='G', price=4223.5, size=5.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429863248449429, time=1685328284106, timeNanoPart=0, sequence=53141, exchangeCode='G', price=4223.5, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429889802588055, time=1685328290293, timeNanoPart=0, sequence=53143, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429889802588056, time=1685328290293, timeNanoPart=0, sequence=53144, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429889802588057, time=1685328290293, timeNanoPart=0, sequence=53145, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864155, time=1685328300152, timeNanoPart=0, sequence=53147, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864156, time=1685328300152, timeNanoPart=0, sequence=53148, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864157, time=1685328300152, timeNanoPart=0, sequence=53149, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864158, time=1685328300152, timeNanoPart=0, sequence=53150, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864159, time=1685328300152, timeNanoPart=0, sequence=53151, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864160, time=1685328300152, timeNanoPart=0, sequence=53152, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864161, time=1685328300152, timeNanoPart=0, sequence=53153, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864162, time=1685328300152, timeNanoPart=0, sequence=53154, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429932160864163, time=1685328300152, timeNanoPart=0, sequence=53155, exchangeCode='G', price=4223.75, size=4.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429982840639397, time=1685328311971, timeNanoPart=0, sequence=53157, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.75, askPrice=4224.0, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429982840639398, time=1685328311971, timeNanoPart=0, sequence=53158, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.75, askPrice=4224.0, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429982840639399, time=1685328311971, timeNanoPart=0, sequence=53159, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.75, askPrice=4224.0, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429982844833705, time=1685328311972, timeNanoPart=0, sequence=53161, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.75, askPrice=4224.0, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429982844833706, time=1685328311972, timeNanoPart=0, sequence=53162, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.75, askPrice=4224.0, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429982844833708, time=1685328311972, timeNanoPart=0, sequence=53164, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.75, askPrice=4224.0, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='SELL', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)
TimeAndSale(eventSymbol='/ESM23:XCME', eventTime=0, eventFlags=0, index=7238429996434378670, time=1685328315116, timeNanoPart=0, sequence=53166, exchangeCode='G', price=4223.75, size=1.0, bidPrice=4223.5, askPrice=4223.75, exchangeSaleConditions=None, tradeThroughExempt='\x00', aggressorSide='BUY', spreadLeg=False, extendedTradingHours=False, validTick=True, type='NEW', buyer=None, seller=None)

@Graeme22
Copy link
Contributor

I used it last week for equities and futures. The reason you're not getting any events for SPY is that it's not trading currently; no trades to report means no events. Try /ESM23:XCME between now and 1:00 PM ET tomorrow or during regular trading hours on Tuesday.

Interesting, most of the events work fine when the market is closed but it appears that this one doesn't. I got it to work just now.

@Graeme22 Graeme22 merged commit 74fd024 into tastyware:master May 29, 2023
@Graeme22
Copy link
Contributor

Thanks again!

@michaelcooke michaelcooke deleted the time-and-sale branch May 29, 2023 03:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants