{"record":{"id":"2598d92dd755f33a","repo":"HKUDS/Vibe-Trading","slug":"instrument-not-found-for-symbol-token-r","errorCode":null,"errorMessage":"instrument not found for symbol {token!r}","messagePattern":"instrument not found for symbol (.+?)","errorType":"exception","errorClass":"EtoroAPIError","httpStatus":null,"severity":"error","filePath":"agent/src/trading/connectors/etoro/instruments.py","lineNumber":328,"sourceCode":"        for item in _search_by_symbol(cfg, lookup, limit=25):\n            instrument_id = _instrument_id(item)\n            if instrument_id is None:\n                continue\n            priority = _match_priority(item, lookup, canonical, token)\n            if priority > 0:\n                candidates.append((priority, instrument_id))\n\n    if not candidates:\n        for item in _search_by_text(cfg, canonical, limit=25):\n            instrument_id = _instrument_id(item)\n            if instrument_id is None:\n                continue\n            priority = _match_priority(item, canonical, canonical, token)\n            if priority > 0:\n                candidates.append((priority, instrument_id))\n\n    if not candidates:\n        raise EtoroAPIError(f\"instrument not found for symbol {token!r}\")\n\n    candidates.sort(key=lambda pair: (-pair[0], pair[1]))\n    return candidates[0][1]\n\n\ndef get_instrument_metadata(\n    instrument_ids: list[int] | tuple[int, ...],\n    config: EtoroConfig | None = None,\n) -> dict[str, Any]:\n    \"\"\"Fetch display metadata for one or more instrument ids (batch ≤ 50).\"\"\"\n    from src.trading.connectors.etoro.client import load_config\n\n    cfg = config or load_config()\n    ids = [int(i) for i in instrument_ids if int(i) not in _INVALID_INSTRUMENT_IDS and int(i) > 0]\n    if not ids:\n        raise EtoroAPIError(\"at least one valid instrument_id is required\")\n    if len(ids) > 50:\n        raise EtoroAPIError(\"instrumentIds batch limit is 50\")","sourceCodeStart":310,"sourceCodeEnd":346,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/trading/connectors/etoro/instruments.py#L310-L346","documentation":"Raised by resolve_instrument_id when no lookup variant of the symbol (raw, canonical ticker, alias variants) matched any instrument with positive match priority. The ticker is unknown to eToro.","triggerScenarios":"resolve_instrument_id('XYZZY') for a ticker eToro doesn't list; delisted symbols; wrong exchange suffix; misspelled ticker passed to get_quote or place_order.","commonSituations":"Delisted or renamed tickers, OTC symbols not on eToro, user typos, symbols formatted like 'BTC-USD' when eToro expects 'BTCUSD'.","solutions":["Verify the ticker with search_instruments(symbol) first","Try common variants (drop suffixes like '-USD', remove dots)","Check the asset is actually listed on eToro"],"exampleFix":"# before\nresolve_instrument_id('BTC-USD')\n# after\nmatches = search_instruments('BTC-USD', mode='symbol')\nresolve_instrument_id(str(matches[0]['instrumentId']))","handlingStrategy":"fallback","validationCode":"matches = search_instruments(symbol, mode='symbol') or search_instruments(symbol, mode='discover')\nif not matches:\n    raise ValueError(f'{symbol} not listed on eToro')","typeGuard":null,"tryCatchPattern":"try:\n    iid = resolve_instrument_id(symbol)\nexcept EtoroAPIError as exc:\n    if 'not found' in str(exc):\n        suggestions = search_instruments(symbol, mode='discover')\n        # offer suggestions or fail gracefully\n    raise","preventionTips":["Resolve/validate tickers via search before quoting or ordering","Normalize ticker formats (strip exchange suffixes) before resolving"],"tags":["etoro","symbol","not-found"],"backgroundTag":"symbol-not-found","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}