Hey there, Trader! 👋 Ready to connect your Python apps to the TradeStation universe? This library makes it easy-peasy.
Think of it as your friendly Pythonic remote control for TradeStation's API. Build trading bots, analyze data, manage your account – all with clean, asynchronous Python code.
- Log In Easily: Handles the tricky OAuth 2.0 stuff (including token refreshes) so you don't have to.
- Market Pulse: Grab real-time quotes, historical price bars, symbol details, and more.
- Account Access: Check your balances, see your positions, and review order history.
- Trade Time: Place, change, or cancel orders programmatically.
- Live Streams: Get data beamed straight to you with WebSocket support.
- Plays Nicely: Built-in rate limiting helps you avoid getting timed out by the API.
- Python 3.11 or newer (Gotta have that async power!)
- A TradeStation Account (Real or Simulated)
- Your TradeStation API Credentials (Client ID & Refresh Token - get these from the Developer Portal)
Open your terminal and let's get this library installed.
# Option 1: Install directly from PyPI (Easiest 🌟)
pip install tradestation-api-python
# Option 2: Clone the project (for developers)
git clone https://github.com/mxcoppell/tradestation-api-python.git
cd tradestation-api-python
# Then install using Poetry (Recommended for development ✨)
poetry install
# OR: Use pip if you prefer
# pip install -e .Let's fetch a stock quote right now!
- Set up your secrets: Copy
.env.sampleto.envand fill in yourCLIENT_ID,REFRESH_TOKEN, andENVIRONMENT(LiveorSimulation).cp .env.sample .env # Now edit .env with your details! - Run this Python code:
import asyncio
import os
from dotenv import load_dotenv
from src.client.tradestation_client import TradeStationClient
async def get_a_quote():
# Load secrets from .env file
load_dotenv()
print(f"Using Environment: {os.getenv('ENVIRONMENT')}")
# Create the client (it reads your .env automatically!)
client = TradeStationClient()
try:
print("Asking TradeStation for an AAPL quote...")
# Use the market data service to get a quote snapshot
quote_response = await client.market_data.get_quote_snapshots("AAPL")
if quote_response and quote_response.Quotes:
aapl_price = quote_response.Quotes[0].Last
print(f"----> Got it! AAPL last price: ${aapl_price}")
else:
print("Hmm, couldn't get the quote. Error:", getattr(quote_response, 'Errors', 'Unknown error'))
except Exception as e:
print(f"Whoops! Something went wrong: {e}")
finally:
print("Closing the connection.")
# Always close the client when you're finished!
await client.close()
if __name__ == "__main__":
asyncio.run(get_a_quote())Want more? Check out the examples/QuickStart directory for scripts you can run immediately!
Curious how it's organized?
.
├── docs/ # You are here! (Hopefully useful docs)
├── examples/ # Ready-to-run example scripts!
│ ├── QuickStart/ # Start here!
│ ├── Brokerage/ # Account & order history examples
│ ├── MarketData/ # Price, quote, & symbol examples
│ └── OrderExecution/ # Placing & managing orders examples
└── src/ # The heart of the library
├── client/ # The main TradeStationClient
├── services/ # API sections (MarketData, Brokerage, etc.)
├── streaming/ # WebSocket streaming code
├── ts_types/ # Data models (Pydantic types)
└── utils/ # Helpers (Auth, Rate Limiting, etc.)
The library needs your API keys to talk to TradeStation. The easiest way is the .env file (shown in Quick Start).
Other ways:
- Environment Variables: Set
CLIENT_ID,REFRESH_TOKEN,ENVIRONMENTdirectly in your system. - Python Dictionary:
client = TradeStationClient({ "client_id": "your_id", "refresh_token": "your_token", "environment": "Simulation" })
- Direct Parameters:
client = TradeStationClient( refresh_token="your_token", environment="Live" # CLIENT_ID still needs to be in env or config )
See Authentication Guide for the full scoop.
Ready for more details?
- 🚀 Quick Start Guide
- 🔑 Authentication
- 📊 Market Data
- 💼 Brokerage
- 📈 Order Execution
- ⚡ Streaming Data
- 🚦 Rate Limiting
Got ideas or found a bug? Feel free to open an issue or submit a pull request!
This project is licensed under the MIT License - see the LICENSE file for details.
Happy Trading! 🎉