ITCH User Guide

The nasdaq_protocols.itch module provides an API to interact with ITCH servers. Refer ITCH API Reference. for more information on the API.

This package only provides the core implementation of the ITCH protocols, like message serialization deserialization, session handling, etc. It does not define any actual ITCH messages. The actual ITCH messages has to be defined by the user of this package. The first step is to create a new python package which contains the messages definitions for all the protocols that the user wants to use.

This package provides a command line utility nasdaq-protocols-create-new-project to create a new python package and all the necessary files.

Follow the steps in Create New Project Guide to create a new python package for application specific messages.

Note

This rest of the guide assumes that you have built a new python project using the steps mentioned in Create New Project Guide.

The generated project will contain a file itch_<app_name>.py which will contain the following
  • ITCH message definitions

  • ITCH Client Session for this application

Using the generated code, you can connect to a ITCH server and start receiving messages.

The nasdaq_protocols.itch module provides an API to interact with ITCH servers. Refer ITCH API Reference. for more information on the API.

Connecting to a ITCH Server

Use the example below to implement a program that will tail itch messages from the server.

#!/usr/bin/env python
import asyncio
# from the generated package we import the application we want to use
from nasdaq_protocols_messages import itch_feed


stopped = asyncio.Event()
port = 1234  # give the proper itch server port


async def itch_output(itch_message):
    """
    This function will be called whenever a new ITCH message is received
    """
    print('')
    print(f'received: {itch_message}')
    print('')


async def itch_close():
    """
    This function will be called when the ITCH session is closed
    """
    stopped.set()
    print('')
    print('itch session closed, Bye Bye')
    print('')


async def main():
    # Step1: connect
    itch_session = await itch_feed.connect_async(
        ('hostname', port),
        'itch username',  # itch username, max 6 characters
        'pwdchange', # itch password, max 10 characters
        '', # session id
        on_msg_coro=itch_output,  # function to call when a new message is received
        on_close_coro=itch_close, # function to call when the session is closed
        sequence=1  # 0 to listen from HEAD, 1 to listen from start, n to listen from n
    )

    print("wait for server to close the session")
    await stopped.wait()


if __name__ == '__main__':
    asyncio.run(main())

A simple itch tail program

Slightly modified version where we do not use dispatchers instead explicitly call receive_message() method.

#!/usr/bin/env python
import asyncio
from nasdaq_protocols_messages import itch_feed


port = 1234  # give the proper itch server port


async def main():
    # Step1: connect
    itch_session = await itch_feed.connect_async(
        ('hostname', port),
        'itch username',  # itch username, max 6 characters
        'pwdchange', # itch password, max 10 characters
        '', # session id
        sequence=1  # 0 to listen from HEAD, 1 to listen from start, n to listen from n
    )

    # receive the first message from the server.
    itch_message = await itch_session.receive_message()
    print(itch_message)

    print("Closing the itch session...")
    await itch_session.close()


if __name__ == '__main__':
    asyncio.run(main())