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.1-py3-none-any.whl (211.3 kB view details)

Uploaded Python 3

pytrader_sdk-1.0.1-cp312-cp312-win_amd64.whl (10.2 MB view details)

Uploaded CPython 3.12Windows x86-64

pytrader_sdk-1.0.1-cp311-cp311-win_amd64.whl (10.2 MB view details)

Uploaded CPython 3.11Windows x86-64

pytrader_sdk-1.0.1-cp310-cp310-win_amd64.whl (10.2 MB view details)

Uploaded CPython 3.10Windows x86-64

File details

Details for the file pytrader_sdk-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: pytrader_sdk-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 211.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pytrader_sdk-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 64a0033ea6929b622c52ccd8ba76acd36f51f66f760f228fc1f056d2bff19bc5
MD5 eaf40a80772a5822b8dbc0e8017a5d5a
BLAKE2b-256 310d043eb4eaf5293e373e98f38992e612200f979eb886947da1a5a4928d3a78

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.1-py3-none-any.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.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pytrader_sdk-1.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 881533edf7aeab768af4d538929bab8cab7f85ad516449b25ff3f78ebae49bf5
MD5 10dda6d3644299727c7d976caf80dc9e
BLAKE2b-256 9080383ad9702bdf0dc0727ee4b9f132716c87af3688f25c426ba0bf21b5753a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.1-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.1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pytrader_sdk-1.0.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a82d4d8f122e8e0143e203a61fe35fa99ecb87f2f06033ab614985ee51820701
MD5 cd6a443dfcdd44aeee45ed79f056437d
BLAKE2b-256 64e26bd61a50fc2a22eaf7ffe534196ba1519693a0481857beadcb756765f4e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.1-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.1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pytrader_sdk-1.0.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 cced435ac1ba2f33718193a590bcc0c00c2be407b21e65acc5dbcbeddb2e49b2
MD5 8872cea2c196836d9f7c8d474213137a
BLAKE2b-256 2f9ece5e409e400ae0ab82792fdfc5f8425a64a59b4a64c3387074ee04ee19f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytrader_sdk-1.0.1-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