Query, explain and evaluate TraderSpy's AI crypto futures signals — the newest signals, signals for one coin, what a signal's entry / take-profit / stop levels and triggered conditions mean, whether a signal still stands at the current price, and how signals have performed (hit rate, hits vs stops) over the last 4h to 7d. Use this whenever the user mentions crypto signals, AI alerts, "any setups", "what is the AI seeing", long/short ideas, TraderSpy alerts, signal performance or track record — even when they never say the word "signal". Not for placing trades (no tool can), not for whale or top-trader positioning (smart-money), not for indicator reads on a coin (technical-analysis).
80
100%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
TraderSpy's AI signals are automated reads of the market: a named preset fires when several technical conditions line up on one crypto futures pair, a validator scores the alignment, and the published signal carries an entry, a take-profit ladder, a stop and — later — what actually happened. The signals feed at https://traderspy.app/signals publishes every one with its resolved outcome. Your job is to fetch, translate and contextualise them; the decision stays with the user.
| Tool | Use it for | Key arguments |
|---|---|---|
get_signals | The list: newest first | limit 1–50 (default 20), skip, importance high / medium / low / all, coin |
get_signal_details | One signal in full, plus the live price | signalId (the id from the list) |
get_signal_stats | Aggregate hit rate over a window | period 4h / 8h / 24h / 7d |
Three argument behaviours that are easy to get wrong:
importance is inclusive downward. high returns high only, medium returns high AND
medium, low returns everything. To show "medium and above" pass medium, not low.coin is a prefix match on the pair name. BTC matches BTCUSDT and also BTCDOMUSDT;
check the coin field of each row before presenting "BTC signals".limit is what gets rendered. In hosts that draw signal cards, every fetched row becomes a
card. If the user asks for "the last 5", pass limit: 5 — do not fetch 20 and show 5.strategyName (the preset, e.g. "OBV Divergence Buy (4H)") · action buy / sell · timeframe
1h / 4h / 1d · price at trigger · targets[] as {label, type, pct} where pct is measured from
price · triggeredConditions[] in plain language · importance · signalStrength weak /
moderate / strong / very_strong · resolutionStatus · createdAt.
Convert target percentages to prices before showing them — users think in prices:
get_signal_stats, and do not call a
sub-1 R:R "bad" on its own).resolutionStatus is the outcome so far:
| Status | Meaning |
|---|---|
pending | Still inside its tracking window, nothing hit yet |
tp1_hit / tp2_hit / tp3_hit | Highest take-profit reached (a later stop touch does not downgrade it) |
profit_locked | Trend exhaustion detected before TP1; a partial gain was locked |
stop | Stop level touched before any take-profit |
expired | Window ended with neither side touched |
Outcomes are judged on 1-minute wicks, so "TP1 hit" means price actually traded there. The
tracking window is 24 × the signal timeframe (24h for a 1h signal, 4 days for a 4h signal); a 1h
signal that is still pending two days later is stale rather than alive.
"Latest signals" / "any setups?" → get_signals with the limit the user implies (default 10 if
they gave no number). Lead with the newest, group by side if several, and make the resolved ones
visible — a list that mixes three winners, two stops and five pending rows should say so.
"Signals for SOL" → get_signals with coin. If the result is empty, say there is no recent
signal on that pair rather than offering a different pair as if it were the same thing.
"Is this signal still valid?" / "Should I still care about it?" → get_signal_details, then
compare livePrice with the entry, TP1 and SL in the same units:
pending buy with livePrice below the SL price
is finished in everything but paperwork — say so)history.highestPrice / lowestPrice show the best and worst it has seen since entryindicatorValues are the readings at trigger time, not now; if the user wants the current
picture, hand off to technical-analysis rather than re-reading stale values as if they were live"How are the signals doing?" → get_signal_stats. Explain the number honestly: winRate is
hits ÷ (hits + stops) over signals CREATED in the window, so it ignores pending rows, and a 4h
window is a handful of signals. Prefer 7d for a track-record question and say how many signals
it rests on (total, pending).
For a list, ALWAYS use a compact table and keep one signal per row:
| Coin | Side | TF | Entry | TP1 | SL | Preset | Status | Age |
For one signal, use this order: headline (coin, side, timeframe, preset, importance) → the levels
as prices with the % in brackets → what triggered it (the triggeredConditions, lightly
rephrased) → where price is now versus entry / TP1 / SL → the outcome so far → the one-line risk
note. Quote livePrice with its timestamp when the answer depends on it.
Do not invent an "AI review" if aiReview is null — most signals do not carry one. When it exists,
report score and decision as the reviewer's opinion, not as a verdict.
For the full field glossary, including the indicatorValues keys, read
references/signal-fields.md.
target1m/traderspy-mcp
3631399
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.