How trading agents generate signals from multi-dimensional data, assess risk before every trade, execute with human-in-the-loop approval gates, and learn from systematic retrospectives. Real examples from the DailyTickers scanner pipeline.
A trading agent does not look at a single indicator and decide to buy. It synthesizes signals across three dimensions — technical, fundamental, and sentiment — and only generates a trade idea when multiple dimensions confirm the same thesis. This is confluence-based trading, and agents excel at it because they can process dozens of signals simultaneously.
// Stage 1: Technical Signals (binary flags) tech_signals = { rsi_oversold: RSI(14) < 35, // Oversold bounce macd_bullish: MACD > Signal, // Momentum shift above_ema50: Price > EMA(50), // Trend intact volume_confirm: Volume > 1.2 * Avg(20), // Participation near_support: Price within 3% of S1, // Risk defined breakout: Price > 52W_High * 0.97 // Near breakout } // Stage 2: Fundamental Filters (pass/fail) fund_filters = { pe_reasonable: PE < Sector_Avg * 1.5, earnings_beat: Last_3Q_Surprise > 0, revenue_growth: Rev_YoY > 5%, margin_stable: Gross_Margin_Change > -2% } // Stage 3: Sentiment Confirmation sent_signals = { analyst_buy: Buy_Rating% > 60, insider_neutral: No_Large_Selling_90d, short_low: Short_Interest < 5%, news_positive: News_Tone_Score > 0.5 } // Stage 4: Confluence Score confluence = count(tech_signals == true) + count(fund_filters == true) + count(sent_signals == true) // Minimum 7/14 for consideration, 10/14 for A+ setup if confluence >= 10: grade = "A+" elif confluence >= 8: grade = "A" elif confluence >= 7: grade = "B+" else: REJECT
Any single indicator can give false signals. RSI oversold can stay oversold for weeks in a downtrend. MACD crossovers lag in choppy markets. Analyst upgrades can be stale. But when RSI is oversold AND price is at support AND volume is picking up AND fundamentals are solid AND analysts are bullish — the probability of a successful trade increases dramatically. The trading agent's job is to find these confluence points where multiple independent signals align.
Once signals are generated, the trading agent applies a structured decision framework to convert signals into actionable trade ideas. This framework encodes the trading strategy's rules in a way that is consistent, auditable, and improvable.
The DailyTickers scanner agent runs multiple strategies simultaneously, each optimized for a different market regime:
| Strategy | Regime | Entry Signal | Historical Hit Rate | Avg R/R |
|---|---|---|---|---|
| Momentum Breakout | Risk-On, Trending | Price > 52W high, volume surge, RS > 80 | 68% | 2.1:1 |
| Oversold Bounce | Risk-On, Mean-Revert | RSI < 30, at support, volume drying up | 54% | 1.8:1 |
| Earnings Drift | Any | Beat > 10%, gap up, held gains 3 days | 62% | 1.5:1 |
| Insider Buy | Any | Cluster buy > $1M, non-routine, near lows | 71% | 2.5:1 |
| Risk-Off Hedge | Risk-Off, Early Risk-Off | VIX > 25, GLD/TLT breakout, inverse ETFs | 58% | 1.4:1 |
The key innovation is the retrospective adjustment factor. After each weekly retrospective, strategy weights are updated based on actual performance. If momentum breakouts have underperformed for 3 consecutive weeks, their weight decreases. If insider buys have overperformed, their weight increases. This creates a learning loop that continuously improves the trading agent's selection quality.
No trade idea reaches publication without passing a comprehensive risk assessment. The trading agent evaluates risk at three levels: individual trade risk, portfolio risk, and systemic risk.
Stop loss distance, position size, max loss $, R/R ratio. Every trade must have R/R > 1.5:1 and max loss < 2% of portfolio.
Sector concentration, correlation with existing positions, total exposure, beta-weighted delta. No more than 30% in any single sector.
Market regime (risk-on/off), VIX level, upcoming macro events (FOMC, CPI), earnings blackout periods. Reduce size in high-VIX environments.
function preTradeRiskCheck(trade, portfolio, market) { const checks = []; // 1. R/R minimum if (trade.rr < 1.5) checks.push("FAIL: R/R below 1.5"); // 2. Stop loss defined if (!trade.stopLoss) checks.push("FAIL: No stop loss"); // 3. Position size limit const maxLoss = (trade.entry - trade.stopLoss) * trade.shares; if (maxLoss > portfolio.value * 0.02) checks.push("FAIL: Max loss > 2% portfolio"); // 4. Sector concentration const sectorExposure = portfolio.sectorWeight(trade.sector); if (sectorExposure + trade.weight > 0.30) checks.push("WARN: Sector > 30%"); // 5. Correlation check const maxCorr = portfolio.maxCorrelation(trade.ticker); if (maxCorr > 0.8) checks.push("WARN: High correlation with existing position"); // 6. Spot price validation (P0 check) const spot = mcp.queryData("quote", trade.ticker).price; if (Math.abs(trade.entry - spot) / spot > 0.10) checks.push("FAIL: Entry > 10% from spot"); // 7. Event risk if (trade.daysToEarnings < 5) checks.push("WARN: Earnings in < 5 days"); // 8. Regime check if (market.regime === "Risk-Off" && trade.direction === "long" && trade.sector !== "defensive") checks.push("WARN: Long growth in Risk-Off regime"); return { passed: checks.filter(c => c.startsWith("FAIL")).length === 0, warnings: checks.filter(c => c.startsWith("WARN")), failures: checks.filter(c => c.startsWith("FAIL")) }; }
In the current DailyTickers system, the trading agent generates trade ideas, not live orders. This is the most common and safest approach for agent-assisted trading: the agent does the analysis and presents recommendations, while the human makes the final execution decision.
| Tier | Agent Role | Human Role | Risk Level | Status (2026) |
|---|---|---|---|---|
| Tier 1: Advisory | Generate ideas, publish reports | Review, decide, execute manually | Lowest | Production (DailyTickers) |
| Tier 2: Assisted | Generate ideas + pre-fill order tickets | Review and approve with one click | Low | Early adoption |
| Tier 3: Semi-Auto | Execute trades, human approves exceptions | Monitor, override on alerts | Medium | Institutional pilots |
| Tier 4: Autonomous | Full execution with risk limits | Set parameters, review P&L | Highest | Experimental (quant funds) |
There is a strong temptation to move directly to Tier 4. Resist it. Even the most sophisticated hedge funds run Tier 3 at most, with human override for anything above predefined thresholds. The reason is simple: tail risks. An agent optimized for normal market conditions can catastrophically fail during a flash crash, a liquidity crisis, or a Black Swan event. Humans bring judgment about unprecedented situations that agents cannot learn from historical data.
Once a trade idea is published, the trading agent's job is not done. In a production system, the agent continuously monitors:
Is the stock moving toward TP1/TP2 or toward the stop? Are new support/resistance levels forming?
Has a material event occurred since the trade idea was published? Earnings surprise? Analyst action? M&A rumor?
Has the market regime changed? A shift from Risk-On to Risk-Off invalidates most long setups immediately.
When conditions change materially, escalate to the human: "NVDA approaching stop loss, consider reducing position."
The most important architectural decision in any trading agent is where to place the human approval gates. Too many gates and the agent becomes a glorified calculator. Too few and you risk the Terraform scenario — autonomous action with catastrophic consequences.
The approval gate decision should be based on reversibility. Can the action be undone? Writing a file is reversible (git revert). Publishing a report is mostly reversible (delete and redeploy). Executing a trade is not reversible — once filled, you own the position and any associated losses. The less reversible the action, the more human oversight it requires.
Before any trading strategy goes live, it must be backtested. Agent-based backtesting goes beyond traditional backtesters because the agent can replay its own decision process against historical data, testing not just the signals but the full reasoning chain.
The DailyTickers scanner uses a production-grade learning loop that is conceptually identical to backtesting but runs on live data:
Produces 10 A+ setups with entry, stop, TP1, TP2 levels. Published to the website. This is the "forward test."
Fetches current prices for all tickers from past 10 days. Calculates TP1 hit rate, TP2 hit rate, stop rate, P&L.
Breaks down results by strategy type. Momentum: 68% HR. Oversold: 54% HR. Identifies top/flop picks.
Strategies that underperform get lower weights. Sectors with false signals get stricter filters. Stops calibrated to ATR.
The next scanner run reads all retrospectives and applies the cumulative learnings. The system improves with each cycle.
Backtesting tells you how a strategy would have performed. Forward testing (paper trading, retrospectives on live calls) tells you how it actually performs. The DailyTickers retrospective loop is a forward test: the scanner makes real-time calls, and the retrospective measures real outcomes. This is more reliable than backtesting because it includes all the real-world factors that backtests miss: slippage, data delays, regime shifts, and the agent's actual reasoning quality.
The DailyTickers system runs four distinct agent types in production, each serving a different function in the trading intelligence pipeline.
Provide a comprehensive market overview for the day ahead. Cover US, Europe, Asia-Pacific, crypto, and macro events.
MCP GetMarketOverview, QueryData for 16+ tickers, WebSearch for calendar and news. 3-5 tool calls total.
50-70KB HTML report with dashboards, trade ideas, formation du jour, calendar grid. Published and indexed automatically.
8-12 minutes end-to-end. Zero human intervention. Bot triggers via Discord schedule, agent runs in tmux session.
The most complex agent in the fleet. It reads past retrospectives, runs multiple screening strategies, validates against spot prices, and produces diversified trade ideas.
// 1. Read retrospective history (learning loop) retros = readAll("scanner/retrospective/*/index.html") learnings = extractLearnings(retros) → "Momentum: 68% HR, Oversold: 54% HR, Energy: false signals" // 2. Read previous scan (anti-doublon) prevScan = readLatest("scanner/*/index.html") prevTickers = extract10Tickers(prevScan) → Must have min 70% new tickers // 3. Run screeners (parallel fan-out) candidates = [ RunAutoScreener(), → regime + auto candidates RunScreener("oversold"), → oversold bounce RunScreener("momentum"), → momentum breakout RunScreener("breakout"), → technical breakout RunScreener("EU symbols"), → European stocks RunScreener("APAC"), → Asia-Pacific RunScreener("ETFs") → Sector/thematic ETFs ] // 4. Validate all candidates (P0 check) validated = candidates.filter(c => { spot = QueryData("quote", c.ticker).price return Math.abs(c.entry - spot) / spot < 0.10 }) // 5. Select final 10 with diversification final = selectTop10(validated, { minUS: 5, minEU: 2, minAPAC: 1, minETF: 2, strategyWeights: learnings.strategyWeights, excluded: prevTickers.slice(0, 3) // anti-doublon })
Evaluates all scanner calls from the past 10 days, grades the system, and feeds learnings back into the scanner. This is the agent that closes the learning loop.
Deep-dive analysis of any ticker. The most data-intensive agent, collecting 15+ data types and producing multi-variant reports with trade ideas, social radar, and ECharts visualizations.
Q1: What is the minimum confluence score for an A+ setup in the scanner?
A: 10/14 confirming signals across technical (6 possible), fundamental (4 possible), and sentiment (4 possible) dimensions. Grade B+ requires 7+, A requires 8+.
Q2: Why is the retrospective agent critical for the scanner's improvement?
A: It closes the learning loop. By measuring actual outcomes (TP1 hit, stopped out, in-progress) for every published trade idea, it generates data to adjust strategy weights. A strategy with declining hit rates gets lower weight in future scans.
Q3: What is the P0 check and why is it mandatory?
A: The P0 check validates that the entry price in a trade idea is within 10% of the live spot price. This catches stale data, hallucinated prices, and outdated screener results before they reach publication.