Skip to content

Portfolio

Access and manage your portfolio including positions, holdings, order book, and trade book through the PyArrow SDK.

Positions

Get your current trading positions across all segments.

from pyarrow import ArrowClient

client = ArrowClient(app_id="your_app_id")
# ... authenticate ...

# Get all positions
positions = client.get_positions()

for position in positions:
    print(f"Symbol: {position['symbol']}")
    print(f"Exchange: {position['exchange']}")
    print(f"Quantity: {position['quantity']}")
    print(f"Average Price: ₹{position['averagePrice']}")
    print(f"P&L: ₹{position['pnl']}")
    print("-" * 40)

Position Fields

Field Type Description
symbol string Trading symbol
exchange string Exchange code (NSE/BSE/NFO/BFO)
quantity string Net position quantity
averagePrice string Average entry price
ltp string Last traded price
pnl string Profit/Loss
product string Product type (I/C/M)
buyQuantity string Buy quantity
sellQuantity string Sell quantity
buyValue string Buy value
sellValue string Sell value

Example: Position Analysis

def analyze_positions(client):
    """Analyze current positions and calculate total P&L."""

    positions = client.get_positions()

    if not positions:
        print("No open positions")
        return

    total_pnl = 0

    print("=" * 60)
    print(f"{'Symbol':<20} {'Qty':>10} {'P&L':>15}")
    print("=" * 60)

    for pos in positions:
        symbol = pos.get('symbol', 'N/A')
        qty = pos.get('quantity', '0')
        pnl = float(pos.get('pnl', 0))
        total_pnl += pnl

        pnl_str = f"₹{pnl:,.2f}"
        print(f"{symbol:<20} {qty:>10} {pnl_str:>15}")

    print("=" * 60)
    print(f"{'Total P&L':<31}{total_pnl:>14,.2f}")

    return total_pnl

# Usage
total = analyze_positions(client)

Holdings

Get your delivery holdings (stocks held in demat account).

# Get all holdings
holdings = client.get_holdings()

print(f"Holdings: {holdings}")

Holdings Structure

# Iterate through holdings
for holding in holdings.get('data', []):
    print(f"Symbol: {holding['symbol']}")
    print(f"Quantity: {holding['quantity']}")
    print(f"Average Price: ₹{holding['averagePrice']}")
    print(f"Current Value: ₹{holding['currentValue']}")
    print(f"P&L: ₹{holding['pnl']}")
    print("-" * 40)

Holdings Fields

Field Type Description
symbol string Stock symbol
isin string ISIN code
quantity string Number of shares held
averagePrice string Average purchase price
ltp string Last traded price
currentValue string Current market value
pnl string Unrealized profit/loss
pnlPercent string P&L percentage

Example: Holdings Summary

def holdings_summary(client):
    """Generate holdings portfolio summary."""

    holdings = client.get_holdings()

    total_invested = 0
    total_current = 0

    print("\n📊 PORTFOLIO HOLDINGS")
    print("=" * 70)
    print(f"{'Symbol':<15} {'Qty':>8} {'Avg':>10} {'LTP':>10} {'P&L':>12} {'%':>8}")
    print("-" * 70)

    for holding in holdings.get('data', []):
        symbol = holding.get('symbol', 'N/A')
        qty = int(holding.get('quantity', 0))
        avg = float(holding.get('averagePrice', 0))
        ltp = float(holding.get('ltp', 0))
        pnl = float(holding.get('pnl', 0))
        pnl_pct = float(holding.get('pnlPercent', 0))

        invested = qty * avg
        current = qty * ltp
        total_invested += invested
        total_current += current

        print(f"{symbol:<15} {qty:>8} {avg:>10.2f} {ltp:>10.2f} {pnl:>12.2f} {pnl_pct:>7.2f}%")

    print("=" * 70)
    total_pnl = total_current - total_invested
    total_pnl_pct = (total_pnl / total_invested * 100) if total_invested > 0 else 0

    print(f"{'Invested:':<35}{total_invested:>12,.2f}")
    print(f"{'Current Value:':<35}{total_current:>12,.2f}")
    print(f"{'Total P&L:':<35}{total_pnl:>12,.2f} ({total_pnl_pct:.2f}%)")

    return {
        'invested': total_invested,
        'current': total_current,
        'pnl': total_pnl,
        'pnl_percent': total_pnl_pct
    }

# Usage
summary = holdings_summary(client)

Order Book

Access your complete order book for the trading day.

# Get all orders
orders = client.get_order_book()

for order in orders:
    print(f"Order ID: {order['id']}")
    print(f"Symbol: {order['symbol']} ({order['exchange']})")
    print(f"Type: {order['transactionType']} {order['order']}")
    print(f"Qty: {order['quantity']} @ ₹{order['price']}")
    print(f"Status: {order['orderStatus']}")
    print(f"Filled: {order['cumulativeFillQty']}")
    print("-" * 40)

Order Book Fields

Field Type Description
id string Order ID
exchange string Exchange code
symbol string Trading symbol
price string Order price
quantity string Order quantity
product string Product type
orderStatus string PENDING/OPEN/COMPLETE/CANCELLED/REJECTED
transactionType string B (Buy) / S (Sell)
order string Order type (LMT/MKT/SL-LMT/SL-MKT)
cumulativeFillQty string Quantity filled so far
averagePrice string Average execution price
exchangeOrderID string Exchange order number
orderTime string Order timestamp
rejectReason string Rejection reason (if rejected)

Example: Order Analysis

def order_analysis(client):
    """Analyze today's orders by status."""

    orders = client.get_order_book()

    status_count = {
        'PENDING': 0,
        'OPEN': 0,
        'COMPLETE': 0,
        'CANCELLED': 0,
        'REJECTED': 0
    }

    for order in orders:
        status = order.get('orderStatus', 'UNKNOWN')
        if status in status_count:
            status_count[status] += 1

    print("\n📋 ORDER SUMMARY")
    print("=" * 30)
    for status, count in status_count.items():
        emoji = {
            'PENDING': '⏳',
            'OPEN': '📖',
            'COMPLETE': '✅',
            'CANCELLED': '❌',
            'REJECTED': '🚫'
        }.get(status, '•')
        print(f"{emoji} {status}: {count}")
    print("=" * 30)
    print(f"Total Orders: {len(orders)}")

    return status_count

# Usage
order_stats = order_analysis(client)

Trade Book

Review all executed trades for the day.

# Get all trades
trades = client.get_trade_book()

for trade in trades:
    print(f"Order ID: {trade['id']}")
    print(f"Symbol: {trade['symbol']} ({trade['exchange']})")
    print(f"Type: {trade['transactionType']}")
    print(f"Fill Price: ₹{trade['fillPrice']}")
    print(f"Fill Qty: {trade['fillQuantity']}")
    print(f"Time: {trade['exchangeUpdateTime']}")
    print("-" * 40)

Trade Book Fields

Field Type Description
id string Order ID
exchange string Exchange code
symbol string Trading symbol
quantity string Order quantity
product string Product type
transactionType string B (Buy) / S (Sell)
order string Order type
fillPrice string Execution price
fillQuantity string Executed quantity
fillTime string Execution timestamp
fillID string Trade/Fill ID
exchangeOrderID string Exchange order number
averagePrice string Average price

Example: Trade Summary

def trade_summary(client):
    """Generate trade summary with buy/sell breakdown."""

    trades = client.get_trade_book()

    buy_value = 0
    sell_value = 0
    buy_count = 0
    sell_count = 0

    print("\n📈 TRADE BOOK")
    print("=" * 80)
    print(f"{'Time':<20} {'Symbol':<15} {'Type':<6} {'Qty':>8} {'Price':>12} {'Value':>15}")
    print("-" * 80)

    for trade in trades:
        time = trade.get('exchangeUpdateTime', '')[:19]
        symbol = trade.get('symbol', 'N/A')
        txn_type = 'BUY' if trade.get('transactionType') == 'B' else 'SELL'
        qty = int(trade.get('fillQuantity', 0))
        price = float(trade.get('fillPrice', 0))
        value = qty * price

        if trade.get('transactionType') == 'B':
            buy_value += value
            buy_count += 1
        else:
            sell_value += value
            sell_count += 1

        print(f"{time:<20} {symbol:<15} {txn_type:<6} {qty:>8}{price:>11.2f}{value:>14,.2f}")

    print("=" * 80)
    print(f"\n💰 Buy Trades: {buy_count} | Value: ₹{buy_value:,.2f}")
    print(f"💰 Sell Trades: {sell_count} | Value: ₹{sell_value:,.2f}")
    print(f"📊 Net Turnover: ₹{buy_value + sell_value:,.2f}")

    return {
        'buy_value': buy_value,
        'sell_value': sell_value,
        'total_trades': len(trades)
    }

# Usage
summary = trade_summary(client)

User Limits & Funds

Get available margins and trading limits.

# Get user limits
limits = client.get_user_limits()

for limit in limits:
    print(f"Segment: {limit.get('segment')}")
    print(f"Available Margin: ₹{limit.get('availableMargin')}")
    print(f"Used Margin: ₹{limit.get('usedMargin')}")
    print(f"Total Margin: ₹{limit.get('totalMargin')}")
    print("-" * 40)

User Limits Fields

Field Type Description
segment string Trading segment
availableMargin string Available funds for trading
usedMargin string Margin currently in use
totalMargin string Total margin value
openingBalance string Opening balance
payIn string Funds added today
payOut string Funds withdrawn today

User Details

Get authenticated user's profile information.

# Get user details
user = client.get_user_details()

print(f"User ID: {user.get('userID')}")
print(f"Name: {user.get('name')}")
print(f"Email: {user.get('email')}")
print(f"Phone: {user.get('phone')}")
print(f"PAN: {user.get('pan')}")

Complete Example

from pyarrow import ArrowClient

def portfolio_dashboard(client):
    """Complete portfolio dashboard."""

    print("\n" + "=" * 60)
    print("📊 PORTFOLIO DASHBOARD")
    print("=" * 60)

    # User Info
    user = client.get_user_details()
    print(f"\n👤 Welcome, {user.get('name', 'Trader')}!")

    # Funds Summary
    limits = client.get_user_limits()
    if limits:
        total_available = sum(float(l.get('availableMargin', 0)) for l in limits)
        print(f"\n💰 Available Margin: ₹{total_available:,.2f}")

    # Holdings
    holdings = client.get_holdings()
    if holdings.get('data'):
        print(f"\n📦 Holdings: {len(holdings['data'])} stocks")

    # Positions
    positions = client.get_positions()
    if positions:
        total_pnl = sum(float(p.get('pnl', 0)) for p in positions)
        print(f"\n📈 Open Positions: {len(positions)}")
        print(f"   Day P&L: ₹{total_pnl:,.2f}")
    else:
        print("\n📈 No open positions")

    # Orders
    orders = client.get_order_book()
    open_orders = [o for o in orders if o.get('orderStatus') in ['PENDING', 'OPEN']]
    print(f"\n📋 Today's Orders: {len(orders)}")
    print(f"   Open Orders: {len(open_orders)}")

    # Trades
    trades = client.get_trade_book()
    print(f"\n✅ Trades Executed: {len(trades)}")

    print("\n" + "=" * 60)

# Usage
client = ArrowClient(app_id="your_app_id")
# ... authenticate ...
portfolio_dashboard(client)