Skip to main content
Natural-language signals ({ "text": "..." }) are parsed by the same engine used for Telegram and Discord signal groups. Use this reference when authoring text lines or testing in the sandbox.

Entry patterns

IntentExample phrases
Buy / longBUY SOL, LONG $BTC, APE WIF, entry on SOL
Sell / exitSELL SOL, CLOSE, EXIT ALL, closed fully
Size$500, 100 USDC, 500 USD notional
Take profitTP 180, TP1: 95.00, target 2.10
Stop lossSL 165, stop 0.00372
LeverageLEV 5X, 5x leverage, isolated 10x
Entry zoneZONE 140-145, BETWEEN 0.21 and 0.22
BreakoutBREAKOUT ABOVE 150, BREAK BELOW 140

Lifecycle patterns

IntentKeywords
CancelCANCEL, INVALIDATED, ABORT, SETUP BROKEN, SKIP
BreakevenBREAKEVEN, BE, MOVE SL TO BE, SL TO BE
Partial closeTAKE HALF, CLOSE 50%, TRIM, SCALE OUT, PARTIAL
SL hitSL HIT, STOPPED OUT, HIT SL
Amend SL/TPSL updated 165 → 170, TP1 retargeted 180

Token resolution

  • Tickers: $SOL, SOL, WIF (after entry verbs)
  • Contract: Solana mint address in structured/legacy payloads
  • Unresolved tickers return token_unresolved skip reason

Multi TP ladders

BUY SOL $500 TP1 180 TP2 195 SL 165
TP3: 92.00 - sell 20%

Custom keywords

Per-agent signalDetectionRule can override buy/sell/TP/SL keyword lists. Test parsing:
curl -sS -X POST "https://mcp.echozero.app/api/sandbox/strategies/{strategyId}/signals/simulate" \
  -H "x-api-key: $EZ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "message": "BUY SOL at $145, TP $160, SL $138" }'

Always include idempotency

Always send a stable idempotencyKey with NL text signals. Without it, a retried or replayed signed request can execute twice (bug #391).
{ "text": "BUY SOL $100", "idempotencyKey": "my-bot-2026-07-07-001" }

Structured alternative

For production bots, prefer structured eventType payloads in Signal envelope to avoid parser ambiguity.