Methodology
How TradeMind AI generates signals, locks them permanently, tracks outcomes, and computes performance metrics. Everything is derived from the live database โ no hardcoded numbers, no cherry-picking.
1. How signals are generated
When a user requests a signal for a ticker, the system assembles a structured prompt for the Claude AI model containing:
- Latest closing price, 14-day RSI, 20/50-day moving averages, ATR, Bollinger Band position
- Fundamental data: P/E ratio, market cap, analyst target, next earnings date
- Recent news sentiment score (โ100 to +100) from the last 24 hours
- Sector context: sector average monthly performance
Claude returns a structured JSON signal or NO_SIGNAL with a reason. A signal is only issued when the model meets all validity constraints:
- Entry within 0.5% of last close (1% for crypto)
- Stop loss between 0.5%โ5% from entry (up to 8% for crypto)
- Risk/reward ratio โฅ 1.5 : 1
- Confidence score โฅ 50 / 100
- At least 2 specific, numbered signal drivers
The model ID, training date, and full driver list are stored with every signal.
2. The immutable lock
The moment a signal is saved to the database, locked_at is set equal to issued_at. This happens in the same database transaction as the insert.
After that point, no field can ever be changed: not the entry price, not the stop, not the target, and not the direction. There is no admin panel that allows edits. The application code contains no UPDATE statement for signal fields.
3. R-multiple formula
R-multiple measures performance relative to the initial risk taken. One "R" equals the distance between entry and stop.
// BULLISH signal
R = (outcome_price โ entry_price) / (entry_price โ stop_price)
// BEARISH signal
R = (entry_price โ outcome_price) / (entry_price โ stop_price)
- +2.0R โ profit of twice the risk (target hit early)
- +1.5R โ minimum target, always โฅ 1.5R at issuance
- โ1.0R โ stop loss triggered, full risk lost
A 0.1% slippage assumption is applied to all calculations to reflect real-world execution costs.
4. Auto-resolution
A background task runs every hour to resolve PENDING signals automatically:
- BULLISH: resolved as HIT_TARGET if current price โฅ target; as STOPPED_OUT if current price โค stop
- BEARISH: reversed โ hit target if price โค target, stopped out if price โฅ stop
- NEUTRAL: never auto-resolved; requires manual review
Stocks are resolved against the latest stored daily close from our database. Crypto signals (e.g., BTC-USD) are resolved against the live CoinGecko price, updated every hour โ because crypto markets never close.
Verify it yourself
Every signal ever issued is in the public signal history โ including every loss. The timestamp on each signal proves it existed before the market move.
Browse all signals