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:
statusmust be"active"(not "stopped", "paused", or "draft")activeflag must betrue
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.startandtradingHours.end - Current day is in
tradingDaysarray - 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:
- Start with ONE simple condition
- Verify it generates signals
- Add conditions one at a time
- 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:RELIANCEnotRELIANCE) - 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