Skip to main content
Version: 1.0 (Current)

How to Fix Order Execution Issues

Problem​

Your algorithm is generating signals but orders are not being executed, failing, or being rejected by the broker.

Troubleshooting Checklist​

1. Check Broker Connection​

Verify: Is your broker account connected and authenticated?

// Check broker connection status
GET /api/brokers/connections

// Response
{
"connections": [
{
"broker": "angelone",
"status": "connected",
"lastSync": "2024-01-15T10:30:00Z",
"apiKeyValid": true
}
]
}

Connection Status:

  • "connected": Active and working
  • "disconnected": Not connected
  • "error": Connection failed
  • "expired": Authentication expired

Fix Disconnected:

// Reconnect broker
POST /api/brokers/connect
{
"broker": "angelone",
"apiKey": "YOUR_API_KEY",
"apiSecret": "YOUR_API_SECRET",
"clientId": "YOUR_CLIENT_ID"
}

Common Connection Issues:

  • API credentials expired → Regenerate from broker portal
  • Session timeout → Reconnect
  • IP whitelist → Add your server IP to broker whitelist
  • 2FA required → Complete 2FA authentication

2. Verify Broker Rate Limits​

Check: Are you hitting broker API rate limits?

Rate Limits by Broker:

BrokerOrder PlacementMarket DataSession
AngelOne1 req/sec1 req/sec10 req/min
Zerodha10 req/sec3 req/secNo limit
Upstox10 req/sec25 req/secNo limit
Dhan10 req/sec10 req/secNo limit

Symptoms of Rate Limiting:

  • Orders fail with "Too Many Requests" error
  • Intermittent order failures
  • Delays in order execution

Fix:

// Check rate limit status
GET /api/brokers/rate-limits

// Response
{
"broker": "angelone",
"orderPlacement": {
"limit": 1,
"remaining": 0,
"resetAt": "2024-01-15T10:30:01Z"
}
}

Solutions:

  • Reduce trading frequency
  • Increase timeframe (5m → 15m)
  • Limit number of symbols
  • Use batch order placement (if supported)

3. Check Daily Loss Limit​

Verify: Have you reached your daily loss limit?

// Check daily P&L
GET /api/trading/algorithms/:id/daily-pnl

// Response
{
"dailyPnL": -4800,
"maxDailyLoss": -5000,
"remaining": -200,
"circuitBreakerActive": false
}

Issue: If daily loss approaches or exceeds limit, new orders are blocked.

Fix:

// Option 1: Increase daily loss limit (if appropriate)
PATCH /api/trading/algorithms/:id
{
"riskParameters": {
"maxDailyLoss": 10000
}
}

// Option 2: Reset for new trading day
// (Automatically resets at market open)

// Option 3: Stop trading for the day
POST /api/trading/algorithms/:id/stop

Warning: Only increase limits if you understand the risk!

4. Verify Risk Parameters​

Check: Do risk parameters allow the order?

{
"riskParameters": {
"maxPositionSize": 5.0, // % of capital
"stopLoss": 2.0, // Required stop loss %
"maxOpenPositions": 3,
"riskRewardRatio": 2.0
}
}

Common Violations:

Position Size Too Large:

// Account balance: ₹100,000
// Max position size: 5%
// Maximum allowed: ₹5,000

// Order: ₹8,000 → REJECTED
// Fix: Reduce quantity or increase maxPositionSize

Stop Loss Missing:

// Risk parameters require 2% stop loss
// Order without stop loss → REJECTED

// Fix: Ensure exit conditions include stop loss
{
"exitConditions": {
"stopLoss": {
"enabled": true,
"type": "percentage",
"percentage": 2.0
}
}
}

Too Many Open Positions:

// Max open positions: 3
// Current open: 3
// New order → REJECTED

// Fix: Close a position or increase limit
{
"riskParameters": {
"maxOpenPositions": 5
}
}

5. Check Broker-Specific Requirements​

AngelOne​

Common Issues:

  • Product type mismatch
  • Insufficient margin
  • Symbol format incorrect
  • Auto square-off time

Fix:

{
"executionSettings": {
"broker": "angelone",
"productType": "INTRADAY", // or "DELIVERY"
"orderType": "MARKET",
"exchange": "NSE"
},
"indianMarketSettings": {
"enabled": true,
"autoSquareOff": {
"enabled": true,
"minutesBeforeClose": 15 // Square off at 15:15
}
}
}

Zerodha​

Common Issues:

  • Order margin shortfall
  • Freeze quantity exceeded
  • Invalid order type for instrument

Fix:

{
"executionSettings": {
"broker": "zerodha",
"productType": "MIS", // Intraday
"orderType": "LIMIT", // Use LIMIT for better fills
"exchange": "NSE"
}
}

Upstox​

Common Issues:

  • API version mismatch
  • Invalid instrument token
  • Order placement outside market hours

Fix:

{
"executionSettings": {
"broker": "upstox",
"productType": "I", // Intraday
"orderType": "MARKET",
"exchange": "NSE"
}
}

Dhan​

Common Issues:

  • Segment not activated
  • Insufficient funds
  • Invalid security ID

Fix:

{
"executionSettings": {
"broker": "dhan",
"productType": "INTRADAY",
"orderType": "MARKET",
"exchange": "NSE"
}
}

6. Verify Symbol Format​

Check: Is the symbol format correct for your broker?

// Correct formats by exchange
const symbolFormats = {
NSE: 'NSE:RELIANCE',
BSE: 'BSE:SENSEX',
MCX: 'MCX:CRUDEOIL25JANFUT',
NCDEX: 'NCDEX:SOYBEAN25JANFUT'
}

// Common mistakes
const wrongFormats = [
'RELIANCE', // Missing exchange
'NSE-RELIANCE', // Wrong separator
'nse:reliance', // Wrong case
'NSE:RELIANCE.EQ' // Extra suffix
]

Fix:

// Validate symbol format
function validateSymbol(symbol) {
const pattern = /^(NSE|BSE|MCX|NCDEX):[A-Z0-9]+$/
return pattern.test(symbol)
}

// Example
validateSymbol('NSE:RELIANCE') // ✓ true
validateSymbol('RELIANCE') // ✗ false

7. Check Market Hours​

Verify: Are you trading during market hours?

Indian Market Hours:

ExchangeRegular SessionPre-OpenPost-Close
NSE/BSE09:15 - 15:3009:00 - 09:1515:40 - 16:00
MCX09:00 - 23:30--
NCDEX10:00 - 17:00--

Fix:

{
"executionSettings": {
"timeFilters": {
"enabled": true,
"tradingHours": {
"start": "09:15",
"end": "15:30"
},
"tradingDays": ["monday", "tuesday", "wednesday", "thursday", "friday"]
}
}
}

8. Review Order Type Settings​

Check: Is the order type appropriate?

{
"executionSettings": {
"orderType": "MARKET" // or "LIMIT", "STOP", "STOP_LIMIT"
}
}

Order Type Issues:

MARKET Orders:

  • ✓ Fast execution
  • ✗ Slippage risk
  • ✗ May not work for illiquid stocks

LIMIT Orders:

  • ✓ Price control
  • ✗ May not fill
  • ✗ Requires price specification

Fix:

// For liquid stocks - use MARKET
{
"executionSettings": {
"orderType": "MARKET"
}
}

// For illiquid stocks - use LIMIT
{
"executionSettings": {
"orderType": "LIMIT",
"limitPriceOffset": 0.1 // 0.1% from current price
}
}

9. Check Insufficient Funds​

Verify: Do you have sufficient balance?

// Check account balance
GET /api/brokers/balance

// Response
{
"availableBalance": 45000,
"usedMargin": 55000,
"totalBalance": 100000
}

Calculate Required Margin:

function calculateRequiredMargin(order, productType) {
const { symbol, quantity, price } = order

// Intraday: ~20% margin
// Delivery: 100% margin
const marginMultiplier = productType === 'INTRADAY' ? 0.2 : 1.0

const orderValue = quantity * price
const requiredMargin = orderValue * marginMultiplier

return requiredMargin
}

// Example
const order = { symbol: 'NSE:RELIANCE', quantity: 100, price: 2500 }
const margin = calculateRequiredMargin(order, 'INTRADAY')
// Required: ₹50,000 (₹2,50,000 × 20%)

Fix:

  • Reduce position size
  • Close existing positions
  • Add funds to account
  • Use intraday product type (lower margin)

10. Review Order Logs​

Check: What do the order logs say?

// Get order history
GET /api/trading/orders?algorithmId=algo_123&status=rejected

// Response
{
"orders": [
{
"id": "order_123",
"symbol": "NSE:RELIANCE",
"status": "rejected",
"rejectionReason": "RMS: Margin Exceeds, Required: 50000, Available: 45000",
"timestamp": "2024-01-15T10:30:00Z"
}
]
}

Common Rejection Reasons:

ReasonCauseFix
Margin ExceedsInsufficient fundsAdd funds or reduce size
Invalid SymbolSymbol not foundCheck symbol format
Market ClosedOutside trading hoursWait for market open
Rate LimitToo many requestsSlow down requests
Freeze QuantityQuantity too largeReduce quantity
Invalid ProductWrong product typeCheck product type

Diagnostic Script​

async function diagnoseOrderIssues(algorithmId) {
const issues = []

// 1. Check broker connection
const connections = await fetch('/api/brokers/connections')
.then(r => r.json())

const connection = connections.connections[0]
if (connection.status !== 'connected') {
issues.push({
issue: 'Broker not connected',
status: connection.status,
fix: 'Reconnect broker account'
})
}

// 2. Check rate limits
const rateLimits = await fetch('/api/brokers/rate-limits')
.then(r => r.json())

if (rateLimits.orderPlacement.remaining === 0) {
issues.push({
issue: 'Rate limit reached',
resetAt: rateLimits.orderPlacement.resetAt,
fix: 'Wait for rate limit reset or reduce trading frequency'
})
}

// 3. Check daily loss
const dailyPnL = await fetch(`/api/trading/algorithms/${algorithmId}/daily-pnl`)
.then(r => r.json())

if (dailyPnL.circuitBreakerActive) {
issues.push({
issue: 'Daily loss limit reached',
dailyPnL: dailyPnL.dailyPnL,
maxDailyLoss: dailyPnL.maxDailyLoss,
fix: 'Stop trading for today or increase limit'
})
}

// 4. Check balance
const balance = await fetch('/api/brokers/balance')
.then(r => r.json())

if (balance.availableBalance < 10000) {
issues.push({
issue: 'Low account balance',
available: balance.availableBalance,
fix: 'Add funds to account'
})
}

// 5. Check recent rejections
const orders = await fetch(
`/api/trading/orders?algorithmId=${algorithmId}&status=rejected&limit=10`
).then(r => r.json())

if (orders.orders.length > 0) {
const rejectionReasons = orders.orders.map(o => o.rejectionReason)
issues.push({
issue: 'Recent order rejections',
count: orders.orders.length,
reasons: [...new Set(rejectionReasons)],
fix: 'Review rejection reasons and fix underlying issues'
})
}

// Report
if (issues.length === 0) {
logger.info('✓ No obvious issues found')
logger.info('Check broker portal for additional details')
} else {
logger.info(`Found ${issues.length} potential issues:`)
issues.forEach((issue, i) => {
logger.info(`\n${i + 1}. ${issue.issue}`)
logger.info(' Fix:', issue.fix)
})
}

return issues
}

// Run diagnostic
diagnoseOrderIssues('algo_123')

Testing Order Execution​

Test with Paper Trading​

{
"executionSettings": {
"mode": "paper" // Test without real money
}
}

Benefits:

  • No real money risk
  • Same order flow as live
  • Identifies configuration issues
  • Tests broker integration

Test with Small Quantities​

{
"positionSizing": {
"method": "fixed_quantity",
"quantity": 1 // Minimum quantity
}
}

Benefits:

  • Minimal risk
  • Validates order flow
  • Tests broker connection
  • Confirms symbol format

Prevention Checklist​

Before going live:

  • Broker connection tested and working
  • Rate limits understood and configured
  • Risk parameters set appropriately
  • Daily loss limit configured
  • Sufficient account balance
  • Symbol formats validated
  • Order types tested
  • Market hours configured
  • Paper trading successful
  • Small quantity test passed