Skip to main content

Algorithmic trading SDK for PSX — paper trading, live trading, backtesting, cloud bots

Project description

PyPSX SDK

API-first trading infrastructure for the Pakistan Stock Exchange.

Installation

pip install pytrader

Quick Start

Start with paper trading. It is the safety-first way to test your strategy, validate your order flow, and watch your dashboard update in real time before risking real capital.

import os
from dotenv import load_dotenv
from pytrader import TradingClient

load_dotenv()

client = TradingClient(
    api_key=os.getenv("PYPSX_API_KEY_ID"),
    secret_key=os.getenv("PYPSX_API_SECRET_KEY"),
    paper=True,
)

account = client.get_account()
print(f"Connected! Current Balance: PKR {account.cash}")

order = client.place_manual_order(
    symbol="OGDC",
    side="BUY",
    quantity=10,
    order_type="MARKET",
)

print("Submitted:", order["order_id"], order["status"])

You can also load keys directly from environment variables:

from pytrader import TradingClient

client = TradingClient.from_env(paper=True)

Your First Trade

Step 1: Generate a paper key in the PyPSX dashboard.
Step 2: Copy the script above into my_bot.py.
Step 3: Set your own PYPSX_API_KEY_ID and PYPSX_API_SECRET_KEY in .env.
Step 4: Run python my_bot.py while the market is open.
Step 5: Watch orders, fills, and positions appear in the dashboard automatically.

The Power of PyPSX

PyPSX gives algorithmic traders a clean Python interface for the Pakistan Stock Exchange without exposing them to exchange plumbing.

Paper And Live Modes

The SDK automatically routes traffic based on one flag:

  • paper=True sends requests to the paper trading environment at https://paper-api.pypsx.pk
  • paper=False sends requests to the live trading environment at https://api.pypsx.pk

This keeps your code identical across testing and production. Change the credentials, switch the flag, and keep your trading logic the same.

Real-Time Trading Experience

With PyPSX you can:

  • Read positions, orders, and account state from Python
  • Submit orders with a simple REST interface
  • See fills reflected in the web dashboard without manual refresh
  • Build bots around trading logic instead of exchange protocol handling

Developer's Promise

PyPSX handles the operational complexity of PSX integration, including request authentication, endpoint routing, and exchange connectivity. You focus on signal generation, risk rules, and execution logic. We handle the FIX-side complexity behind the API.

Authentication

How To Get Your Keys

  1. Sign in to the PyPSX dashboard.
  2. Open Settings.
  3. Select the account you want to trade.
  4. Click Generate Paper Key or Generate Live Key.
  5. Copy the Public Key ID and Secret Key.

How The SDK Uses Them

Use the credentials directly in TradingClient(...):

from pytrader import TradingClient

client = TradingClient(
    api_key=os.getenv("PYPSX_API_KEY_ID"),
    secret_key=os.getenv("PYPSX_API_SECRET_KEY"),
    paper=True,
)

Under the hood, the SDK automatically sends:

PYPSX-API-KEY-ID: <your-public-key-id>
PYPSX-API-SECRET-KEY: <your-secret-key>

If you are building against the API without the Python SDK, send those same headers yourself.

API Reference

Method What it does Returns
get_account_config() Fetches trading permissions and account-level configuration dict
get_portfolio_valuation() Returns the latest equity, cash, positions value, and pricing snapshot dict
get_positions() Returns open positions for the selected paper or live account list[dict]
get_orders(limit=...) Returns recent orders and their current state list[dict]
place_manual_order(...) Submits a market or priced order through the selected environment dict
get_symbols() Fetches available market symbols list[dict]
get_intraday(symbol, days=...) Retrieves recent intraday market data for a symbol list[dict]
get_historical(symbol, start=..., end=...) Retrieves historical bars for strategy research and analysis list[dict]
close() Closes the underlying HTTP client cleanly None

Examples

Paper Trading

from pytrader import TradingClient

client = TradingClient(
    api_key=os.getenv("PYPSX_API_KEY_ID"),
    secret_key=os.getenv("PYPSX_API_SECRET_KEY"),
    paper=True,
)

valuation = client.get_portfolio_valuation()
positions = client.get_positions()
orders = client.get_orders(limit=25)

print("Equity:", valuation["equity"])
print("Positions:", len(positions))
print("Orders:", len(orders))

Live Trading

from pytrader import TradingClient

client = TradingClient(
    api_key="PK-LIVE-ABC123456789",
    secret_key="pypsx-secret-live-replace-me",
    paper=False,
)

order = client.place_manual_order(
    symbol="OGDC",
    side="BUY",
    quantity=100,
    order_type="MARKET",
)

print(order)

Simple Bot Pattern

from pytrader import TradingClient

SYMBOL = "OGDC"

client = TradingClient(
    api_key="PK-PAPER-123456",
    secret_key="pypsx-secret-paper-replace-me",
    paper=True,
)

positions = client.get_positions()
already_holding = any(
    position["symbol"] == SYMBOL and float(position["qty"]) > 0
    for position in positions
)

if not already_holding:
    client.place_manual_order(
        symbol=SYMBOL,
        side="BUY",
        quantity=10,
        order_type="MARKET",
    )

Best Practices

  • Use .env files or a secrets manager for credentials. Do not hardcode production keys into source control.
  • Start every new strategy with paper=True.
  • Treat paper trading as your pre-flight checklist before switching to live.
  • Run execution scripts when the market is open so fills, liquidity, and dashboard feedback reflect real conditions.
  • Add explicit guards in your code for position sizing, duplicate orders, and risk limits.
  • Close clients cleanly with client.close() in longer-running scripts or services.

Raw HTTP Example

If you are not using the SDK, this is the equivalent request format:

curl -X POST "https://paper-api.pypsx.pk/orders" \
  -H "Content-Type: application/json" \
  -H "PYPSX-API-KEY-ID: $PYPSX_API_KEY_ID" \
  -H "PYPSX-API-SECRET-KEY: $PYPSX_API_SECRET_KEY" \
  -d "{\"symbol\":\"OGDC\",\"side\":\"BUY\",\"quantity\":10,\"order_type\":\"MARKET\",\"mode\":\"PAPER\",\"commission_rate\":0.02}"

Set commission_rate only when you want to override the default fee behavior for a specific order. The value is a percentage, so 0.02 means 0.02%.

Additional Examples

  • examples/pytrader_client_example.py
  • examples/example_bot.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pytrader_sdk-1.0.2-cp312-cp312-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.12Windows x86-64

pytrader_sdk-1.0.2-cp311-cp311-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.11Windows x86-64

pytrader_sdk-1.0.2-cp310-cp310-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.10Windows x86-64

File details

Details for the file pytrader_sdk-1.0.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pytrader_sdk-1.0.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 125a0986b0e367cc0fc0af2c4d2192e3f365f209c5bccd60ea634844f57ff3ac
MD5 b2166e4f89321628638fd6681e6d3f73
BLAKE2b-256 408ad4683494e56320f2ce5b9e5856ad5b1e2dfff968756a5a4d3640332f7526

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.2-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on ahmerhkhan/libraries

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pytrader_sdk-1.0.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pytrader_sdk-1.0.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 22e1469bbe708c8910c6fdc99329b3ca8d4cd637e299615438e628917096f0d3
MD5 4e7f321cb391181eceb78a4f33893cef
BLAKE2b-256 a8dd79ddeb55f527be347daa5c7d041eb303b3022f983f560a803fdfcc283a08

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.2-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on ahmerhkhan/libraries

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pytrader_sdk-1.0.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pytrader_sdk-1.0.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 37c74b711b00a45a57eda5d1f52169cdcabe25713536165d5d1ee88a02d011ce
MD5 718f5aa8f4a2a4634244724cb0178d49
BLAKE2b-256 96a948ef218445c8846e9deee03820eea7c0e7f18f3f7c7c41259787bffd9432

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.2-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on ahmerhkhan/libraries

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page