Skip to main content
Skip to main content
Version: Next 🚧

How to Fix No Signals

Problem

Your algorithm is running but not generating any entry signals or executing trades.

Troubleshooting Checklist

Work through these checks systematically:

1. Verify Algorithm Status

Check: Is your algorithm actually running?

// Check algorithm status
GET /api/trading/algorithms/:id

// Response
{
"id": "algo_123",
"status": "active", // Must be "active"
"active": true // Must be true
}

Required Status:

  • status must be "active" (not "stopped", "paused", or "draft")
  • active flag must be true

Fix:

// Start the algorithm
POST /api/trading/algorithms/:id/start

// Verify it started
GET /api/trading/algorithms/:id

Common Issues:

  • Algorithm in "draft" status → Complete all 5 configuration steps
  • Algorithm "stopped" → Click "Start" button
  • Algorithm "paused" → Resume the algorithm
  • Algorithm "error" → Check error logs and fix issues

2. Check Trading Hours

Check: Are you within configured trading hours?

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

Verify:

  • Current time is within tradingHours.start and tradingHours.end
  • Current day is in tradingDays array
  • Timezone is correct (IST for Indian markets)

Fix:

// Disable time filters temporarily for testing
{
"timeFilters": {
"enabled": false
}
}

// Or adjust trading hours
{
"timeFilters": {
"enabled": true,
"tradingHours": {
"start": "00:00", // All day
"end": "23:59"
},
"tradingDays": ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]
}
}

3. Review Entry Conditions

Check: Are your entry conditions too strict?

{
"entryConditions": {
"positionType": "long",
"logicalOperator": "AND", // All conditions must be true
"conditions": [
{
"type": "indicator_value",
"indicator": { "type": "RSI", "period": 14 },
"comparison": "below",
"value": 30 // Very strict (rarely happens)
},
{
"type": "indicator_indicator",
"indicator1": { "type": "EMA", "period": 9 },
"indicator2": { "type": "EMA", "period": 21 },
"comparison": "crosses_above" // Specific event
},
{
"type": "price_indicator",
"priceType": "close",
"indicator": { "type": "SMA", "period": 200 },
"comparison": "above"
}
]
}
}

Common Issues:

  • Too many conditions with AND operator
  • Thresholds too extreme (RSI < 20, RSI > 80)
  • Conflicting conditions
  • Cross detection requires specific timing

Fix - Simplify Conditions:

{
"entryConditions": {
"logicalOperator": "OR", // At least one condition
"conditions": [
{
"type": "indicator_value",
"indicator": { "type": "RSI", "period": 14 },
"comparison": "below",
"value": 40 // More lenient
}
]
}
}

Testing Strategy:

  1. Start with ONE simple condition
  2. Verify it generates signals
  3. Add conditions one at a time
  4. Test after each addition

4. Check Confirmation Candles

Check: Do you have too many confirmation candles?

{
"entryConditions": {
"confirmationCandles": 5 // Requires 5 consecutive candles
}
}

Issue: More confirmation candles = fewer signals

Fix:

{
"entryConditions": {
"confirmationCandles": 0 // No confirmation (for testing)
}
}

Recommended Values:

  • Testing: 0-1 candles
  • Scalping: 0-2 candles
  • Day trading: 1-3 candles
  • Swing trading: 2-5 candles

5. Verify Symbol Data

Check: Does the symbol have available data?

// Check if symbol exists and has data
GET /api/market-data/symbols/NSE:RELIANCE

// Check recent candles
GET /api/market-data/candles?symbol=NSE:RELIANCE&timeframe=15m&limit=10

Common Issues:

  • Symbol format incorrect (NSE:RELIANCE not RELIANCE)
  • Symbol not supported by exchange
  • No data for selected timeframe
  • Market closed (no new data)

Fix:

// Verify symbol format
const validFormats = [
'NSE:RELIANCE', // ✓ Correct
'BSE:SENSEX', // ✓ Correct
'MCX:CRUDEOIL25JANFUT', // ✓ Correct
'RELIANCE', // ✗ Wrong (missing exchange)
'NSE-RELIANCE' // ✗ Wrong (use colon, not dash)
]

// Test with known liquid symbol
{
"symbols": ["NSE:RELIANCE"] // Highly liquid, always has data
}

6. Check Circuit Breaker Status

Check: Is the circuit breaker active?

// Check circuit breaker status
GET /api/trading/algorithms/:id/circuit-breaker

// Response
{
"active": true,
"reason": "daily_loss_limit_reached",
"triggeredAt": "2024-01-15T14:30:00Z",
"dailyLoss": -5200,
"maxDailyLoss": -5000
}

Circuit Breaker Triggers:

  • Daily loss limit reached
  • Maximum open positions reached
  • Consecutive losses threshold
  • Risk parameter violations

Fix:

// Reset circuit breaker (if appropriate)
POST /api/trading/algorithms/:id/circuit-breaker/reset

// Or adjust risk parameters
PATCH /api/trading/algorithms/:id
{
"riskParameters": {
"maxDailyLoss": 10000 // Increase limit
}
}

Warning: Only reset circuit breaker if you understand why it triggered!

7. Check Maximum Open Positions

Check: Have you reached the position limit?

{
"riskParameters": {
"maxOpenPositions": 3
}
}
// Check current open positions
GET /api/trading/positions?algorithmId=algo_123&status=open

// Response
{
"positions": [
{ "id": "pos_1", "symbol": "NSE:RELIANCE", "status": "open" },
{ "id": "pos_2", "symbol": "NSE:TCS", "status": "open" },
{ "id": "pos_3", "symbol": "NSE:INFY", "status": "open" }
],
"total": 3
}

Issue: If you have 3 open positions and maxOpenPositions is 3, no new signals will be generated.

Fix:

{
"riskParameters": {
"maxOpenPositions": 10 // Increase limit
}
}

8. Review Re-Entry Settings

Check: Are you in a cooldown period?

{
"entryConditions": {
"reEntry": {
"enabled": true,
"cooldownMinutes": 60, // Must wait 60 minutes after exit
"maxReEntries": 3
}
}
}

Issue: If you recently exited a position, you may be in cooldown.

Fix:

{
"entryConditions": {
"reEntry": {
"enabled": true,
"cooldownMinutes": 0, // No cooldown
"maxReEntries": 10
}
}
}

9. Check Multi-Timeframe Confirmation

Check: Is higher timeframe blocking entries?

{
"entryConditions": {
"multiTimeframe": {
"enabled": true,
"higherTimeframe": "1h",
"confirmationRequired": true,
"onMisalignment": "skip_entry" // Blocks entry if not aligned
}
}
}

Issue: Lower timeframe signals but higher timeframe doesn't confirm.

Fix:

{
"entryConditions": {
"multiTimeframe": {
"enabled": false // Disable for testing
}
}
}

// Or change behavior
{
"entryConditions": {
"multiTimeframe": {
"enabled": true,
"onMisalignment": "enter_anyway" // Enter even if not aligned
}
}
}

10. Verify Execution Mode

Check: Is algorithm in correct execution mode?

{
"executionSettings": {
"mode": "backtest" // Won't generate live signals!
}
}

Modes:

  • "backtest": Historical testing only
  • "paper": Simulated trading with live data
  • "live": Real trading with real money

Fix:

{
"executionSettings": {
"mode": "paper" // For testing
// or
"mode": "live" // For real trading
}
}

Diagnostic Script

Run this script to check all common issues:

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

// 1. Check status
const algo = await fetch(`/api/trading/algorithms/${algorithmId}`)
.then(r => r.json())

if (algo.status !== 'active') {
issues.push({
issue: 'Algorithm not active',
status: algo.status,
fix: 'Start the algorithm'
})
}

// 2. Check trading hours
const now = new Date()
const currentHour = now.getHours()
const currentMinute = now.getMinutes()
const currentTime = currentHour * 60 + currentMinute

if (algo.executionSettings.timeFilters?.enabled) {
const [startH, startM] = algo.executionSettings.timeFilters.tradingHours.start.split(':')
const [endH, endM] = algo.executionSettings.timeFilters.tradingHours.end.split(':')
const startTime = parseInt(startH) * 60 + parseInt(startM)
const endTime = parseInt(endH) * 60 + parseInt(endM)

if (currentTime < startTime || currentTime > endTime) {
issues.push({
issue: 'Outside trading hours',
currentTime: `${currentHour}:${currentMinute}`,
tradingHours: algo.executionSettings.timeFilters.tradingHours,
fix: 'Wait for trading hours or adjust time filters'
})
}
}

// 3. Check entry conditions
const conditionCount = algo.entryConditions.conditions.length
if (conditionCount > 5) {
issues.push({
issue: 'Too many entry conditions',
count: conditionCount,
fix: 'Simplify conditions or use OR operator'
})
}

// 4. Check circuit breaker
const circuitBreaker = await fetch(
`/api/trading/algorithms/${algorithmId}/circuit-breaker`
).then(r => r.json())

if (circuitBreaker.active) {
issues.push({
issue: 'Circuit breaker active',
reason: circuitBreaker.reason,
fix: 'Review reason and reset if appropriate'
})
}

// 5. Check open positions
const positions = await fetch(
`/api/trading/positions?algorithmId=${algorithmId}&status=open`
).then(r => r.json())

if (positions.total >= algo.riskParameters.maxOpenPositions) {
issues.push({
issue: 'Maximum open positions reached',
current: positions.total,
max: algo.riskParameters.maxOpenPositions,
fix: 'Close positions or increase limit'
})
}

// 6. Check execution mode
if (algo.executionSettings.mode === 'backtest') {
issues.push({
issue: 'Algorithm in backtest mode',
mode: algo.executionSettings.mode,
fix: 'Change to paper or live mode'
})
}

// Report
if (issues.length === 0) {
console.log('✓ No obvious issues found')
console.log('Try simplifying entry conditions or checking logs')
} else {
console.log(`Found ${issues.length} potential issues:`)
issues.forEach((issue, i) => {
console.log(`\n${i + 1}. ${issue.issue}`)
console.log(' Fix:', issue.fix)
if (issue.details) console.log(' Details:', issue.details)
})
}

return issues
}

// Run diagnostic
diagnoseNoSignals('algo_123')

Quick Fixes for Testing

Minimal Configuration for Signal Generation

{
"entryConditions": {
"positionType": "both",
"logicalOperator": "OR",
"confirmationCandles": 0,
"conditions": [
{
"type": "indicator_value",
"indicator": { "type": "RSI", "period": 14 },
"comparison": "below",
"value": 50
}
],
"timeFilters": {
"enabled": false
},
"multiTimeframe": {
"enabled": false
},
"reEntry": {
"enabled": false
}
},
"riskParameters": {
"maxOpenPositions": 10,
"maxDailyLoss": 100000
},
"executionSettings": {
"mode": "paper"
}
}

This configuration should generate signals if:

  • Algorithm is active
  • Symbol has data
  • Circuit breaker is not active