{
  "schemaVersion": "1.0",
  "item": {
    "slug": "tradr",
    "name": "tradr",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/riskanon/tradr",
    "canonicalUrl": "https://clawhub.ai/riskanon/tradr",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/tradr",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=tradr",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "adapters/README.md",
      "adapters/example-adapter.py",
      "config-template.json",
      "dashboard/index.html",
      "scripts/exit-manager.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/tradr"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/tradr",
    "agentPageUrl": "https://openagent3.xyz/skills/tradr/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tradr/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tradr/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "tradr",
        "body": "Full onchain trade execution engine. You bring the signal, tradr handles everything else.\n\nInput: Contract address + score\nOutput: Buy → monitor → exit (mechanical)\n\nNo signal generation. No opinion on what to buy. All opinion on how to manage it once you're in."
      },
      {
        "title": "Quick Start",
        "body": "# 1. Install\n./scripts/setup.sh\n\n# 2. Edit config\nvi config.json    # Add wallet addresses, tune scoring/modes\n\n# 3. Start the exit manager daemon\nsudo systemctl start tradr-exit-manager\n\n# 4. Feed a trade\npython3 scripts/tradr-enter.py <CA> --score <N> [--chain base] [--mode snipe]"
      },
      {
        "title": "Prerequisites",
        "body": "OpenClaw running (the agent runtime)\nBankr skill installed (~/.openclaw/skills/bankr/) with a valid API key — this is what executes on-chain trades. Sign up at bankr.bot to get your API key, then add it to ~/.openclaw/skills/bankr/config.json\nPython 3.8+ and jq\nA funded wallet (Solana and/or EVM) — Bankr creates wallets for you on supported chains (Base, Solana, ETH, Polygon, Unichain). Fund them before trading."
      },
      {
        "title": "Step-by-Step",
        "body": "Install tradr:\ncd ~/.openclaw/skills/tradr   # or wherever you unpacked the skill\n./scripts/setup.sh            # creates config, installs systemd service\n\n\n\nConfigure your wallets:\nEdit config.json and add your wallet addresses under wallets. These are used for on-chain balance verification (read-only — tradr never touches your private keys).\n\n\nTune your strategy:\n\nscore_to_size — how much USD to spend at each confidence level\nmodes — exit behavior profiles (stop loss, take profit, trailing stop)\nmcap_ceiling_usd — maximum market cap for entries\n\n\n\nStart the exit manager:\nsudo systemctl start tradr-exit-manager\nsudo systemctl status tradr-exit-manager  # verify it's running\n\n\n\nConnect a signal source:\ntradr doesn't generate signals — you bring your own. See adapters/README.md for the interface spec and adapters/example-adapter.py for a working template.\nOr feed trades manually:\npython3 scripts/tradr-enter.py 0xABC... --score 5 --chain base --token PEPE\n\n\n\nMonitor via dashboard:\nThe dashboard/index.html file provides a real-time dashboard. It expects four API endpoints:\n\nGET /api/positions — returns positions.json contents\nGET /api/trades — returns trade-log.jsonl as JSON array\nGET /api/tradr-config — returns config.json contents\nGET /api/health — returns system health (optional)\n\nYou can serve these from any HTTP server that reads the flat files, or embed the dashboard in your existing server."
      },
      {
        "title": "File Layout",
        "body": "tradr/\n├── config.json              # Your live config (created from template)\n├── config-template.json     # Default config for new installs\n├── SKILL.md                 # This file\n├── scripts/\n│   ├── tradr-enter.py       # Entry engine\n│   ├── exit-manager.py      # Exit daemon\n│   ├── setup.sh             # Installer\n│   └── notify-telegram.sh   # Example notification hook\n├── adapters/\n│   ├── README.md            # Signal adapter interface spec\n│   └── example-adapter.py   # Working adapter template\n└── dashboard/\n    └── index.html           # Real-time monitoring dashboard"
      },
      {
        "title": "Signal Adapters",
        "body": "tradr is execution-only — it doesn't have opinions about what to buy. You bring the signal, tradr handles the trade lifecycle.\n\nThe interface is one command:\n\npython3 scripts/tradr-enter.py <ca> --score <N> [--chain <chain>] [--token <name>]\n\nA signal adapter is any script or service that watches a source, detects signals, scores them, and calls that command. See adapters/README.md for the full spec and adapters/example-adapter.py for a working template.\n\nSignal source ideas: Twitter KOL tracking, on-chain whale monitoring, Telegram alpha groups, DEX volume spikes, copy-trading apps, custom aggregators."
      },
      {
        "title": "Scripts",
        "body": "scripts/tradr-enter.py — Entry engine. Takes CA + score, sizes position, buys via Bankr, writes position with mode attached.\nscripts/exit-manager.py — Exit daemon. Polls prices, applies mode-specific exit rules, sells via Bankr, verifies on-chain, logs everything. Runs as systemd service.\nscripts/setup.sh — Installer. Creates config from template, sets up systemd service."
      },
      {
        "title": "Exit Modes",
        "body": "Each position carries a mode that determines its exit behavior. Four built-in modes ship as defaults — you can customize them or create your own.\n\nModeStop AtTake ProfitTrailingUse Casesnipe0.85x1.3x (sell 30%)10% from peakQuick in/out. Low-conviction plays.swing0.70x1.3x (sell 30%)Tiered: 15% tight / 25% wideStandard hold. The default.gamble0.50xnone30% from peakHigh risk, let it ride or die.diamondnonenonenonePure conviction. Manual exit only.\n\nSwing mode has tiered trailing: tight trail (15%) when peak is below 2x, wide trail (25%) when peak is above 2x. Protects modest gains while letting big winners run."
      },
      {
        "title": "Custom Modes",
        "body": "Add your own modes by adding a key to modes in config.json. Any name works — the exit manager reads mode params dynamically. No code changes needed.\n\n\"modes\": {\n  \"snipe\": { ... },\n  \"swing\": { ... },\n  \"my-custom-mode\": {\n    \"stop_at\": 0.80,\n    \"take_profit_1\": 1.2,\n    \"take_profit_1_size\": 0.5,\n    \"trailing_stop\": 0.12\n  }\n}\n\nThen use it: tradr-enter.py <CA> --score 5 --mode my-custom-mode"
      },
      {
        "title": "Mode Selection",
        "body": "Modes are selected per-trade in order of priority:\n\nExplicit --mode flag on entry (always wins)\nScore-based auto-selection via score_to_mode config map\ndefault_mode fallback (default: swing)"
      },
      {
        "title": "Entry Guards",
        "body": "tradr rejects entries that fail any of these checks:\n\n**Mcap ceiling -- token mcap exceeds mcap_ceiling_usd default: $10M)\nCooldown — same token was closed less than cooldown_minutes ago (default: 30)\nMax position size — scored size exceeds max_position_size_usd\nAlready in position — open position exists for this CA"
      },
      {
        "title": "Partial Sell Tracking",
        "body": "When a take-profit triggers, tradr tracks remaining_usd on the position. This means:\n\nP&L calculations account for what was already sold at TP vs what's left at final exit\nThe trade log records actual sold amounts, not the full original position\nYou can see how much USD value is still in play at any time"
      },
      {
        "title": "Notification Hook",
        "body": "The notification script receives three arguments: level, type, message.\n\nlevel: info, trade, warning, error\ntype: buy, sell, confluence, error, info\nmessage: human-readable text\n\nThis lets your hook route notifications — e.g., buys to DM only, sells to DM + broadcast channel.\n\nExample hook:\n\n#!/bin/bash\nLEVEL=\"$1\"  TYPE=\"$2\"  MSG=\"$3\"\nif [ \"$TYPE\" = \"sell\" ]; then\n  # Route to both DM and broadcast\n  send-dm \"$MSG\"\n  send-broadcast \"$MSG\"\nelse\n  # Everything else just DM\n  send-dm \"$MSG\"\nfi"
      },
      {
        "title": "Config Reference",
        "body": "config.json (created from config-template.json on first setup):\n\npositions_file       — path to positions.json\ntrade_log            — path to trade-log.jsonl\nlog_file             — path to tradr.log\nbankr_script         — path to bankr.sh\nlockfile             — exit manager lock (prevents duplicates)\npoll_interval_seconds — price check interval (default: 10)\ndexscreener_delay    — delay between DexScreener calls (default: 1.5s)\nreconcile_every_cycles — on-chain reconciliation interval (default: every 30 cycles)\n\nmodes                — exit params per mode (add custom modes here)\n  stop_at            — exit multiplier (e.g. 0.85 = sell if price drops to 0.85x entry)\n  take_profit_1      — first TP multiplier (null = no TP)\n  take_profit_1_size — fraction to sell at TP (e.g. 0.3 = 30%)\n  trailing_stop      — trail % from peak (null = no trail)\n  trailing_stop_tight — optional tight trail (swing mode)\n  trailing_stop_tight_below — peak threshold for tight vs wide\n\ndefault_mode         — fallback mode when not specified\nscore_to_mode        — map of score thresholds → mode names\nscore_to_size        — map of score thresholds → position size in USD\n\nmcap_ceiling_usd     — reject entries above this mcap (0 = no limit)\ncooldown_minutes     — block re-entry on same token for N minutes after close (0 = no cooldown)\nmax_position_size_usd — hard cap on any single position\n\nwallets.solana       — Solana wallet address (for on-chain verification)\nwallets.evm          — EVM wallet address (for on-chain verification)\nrpc_urls             — custom RPC endpoints per chain\n\nnotifications.enabled — enable/disable notifications\nnotifications.script  — path to notification hook script (receives: level, type, message)"
      },
      {
        "title": "Dashboard",
        "body": "tradr ships with a real-time monitoring dashboard (dashboard/index.html) that shows:\n\nOpen positions — live P&L, entry/current/peak market cap, exit mode, time held\nPerformance stats — total P&L, win rate, avg peak, best trade\nTrade history — searchable table with entry/exit details, tx links\nConfiguration — collapsible view of exit modes, sizing tiers, limits\n\nThe dashboard is a standalone HTML file that fetches data from four JSON API endpoints. It auto-refreshes every 15 seconds. Dark theme, mobile responsive.\n\nTo use it, serve these endpoints from your HTTP server:\n\nGET /api/positions — contents of positions.json\nGET /api/trades — trade-log.jsonl parsed as { \"trades\": [...] }\nGET /api/tradr-config — contents of config.json\nGET /api/health — system health (optional)"
      },
      {
        "title": "Architecture",
        "body": "Signal Source (your adapter)\n    |\n    | CA + score [+ chain] [+ token]\n    v\ntradr-enter.py\n    |\n    |-- Guards: mcap ceiling, cooldown, size cap\n    |-- Resolves mode (explicit > score_to_mode > default)\n    |-- Sizes position (score_to_size map)\n    |-- Fetches price/mcap from DexScreener\n    |-- Executes buy via bankr.sh\n    |-- Writes positions.json (with mode + remaining_usd fields)\n    |-- Logs to trade-log.jsonl\n    |-- Notifies (type=buy)\n    |\n    v\nexit-manager.py (daemon, 10s poll)\n    |\n    |-- Reads positions.json\n    |-- For each open position:\n    |     |-- Reads position's mode → gets exit params from config\n    |     |-- Fetches price from DexScreener\n    |     |-- Applies: hard stop → TP → trailing\n    |     |-- Executes sell via bankr.sh if triggered\n    |     |-- Tracks remaining_usd after partial sells\n    |     |-- Verifies on-chain balance (Solana RPC / EVM eth_call)\n    |     |-- Updates positions.json + trade-log.jsonl\n    |     |-- Notifies (type=sell)\n    |\n    |-- Every N cycles: reconcile (close stale positions where wallet is empty)"
      },
      {
        "title": "Position Schema",
        "body": "Each position in positions.json (keyed by contract address):\n\n{\n  \"token\": \"EXAMPLE\",\n  \"chain\": \"base\",\n  \"buy_ts\": \"2026-02-11T14:00:00Z\",\n  \"entry_mcap\": 500000,\n  \"entry_price\": 0.0001,\n  \"buy_amount_usd\": 7.50,\n  \"remaining_usd\": 7.50,\n  \"mode\": \"swing\",\n  \"score\": 5,\n  \"current_mcap\": 600000,\n  \"current_price\": 0.00012,\n  \"peak_mcap\": 700000,\n  \"first_exit_done\": false,\n  \"closed\": false,\n  \"close_ts\": null,\n  \"close_reason\": null,\n  \"close_mcap\": null,\n  \"close_multiple\": null,\n  \"est_pnl_usd\": null,\n  \"tx_hash\": \"0x...\"\n}"
      },
      {
        "title": "Requirements",
        "body": "Python 3.8+\nBankr skill installed (~/.openclaw/skills/bankr/)\njq (used by bankr.sh)\nsystemd (for exit manager daemon)\nNo paid APIs. No LLM cost. Pure Python."
      },
      {
        "title": "What tradr Is Not",
        "body": "Not a signal generator. It doesn't tell you what to buy. You bring the alpha.\nNot an LLM. Zero AI cost at runtime. Pure Python, pure math.\nNot a wallet. It never holds or accesses private keys. Execution goes through Bankr.\nNot opinionated about chains. Works on Solana, Base, Ethereum, Polygon, Unichain — anywhere Bankr supports."
      }
    ],
    "body": "tradr\n\nFull onchain trade execution engine. You bring the signal, tradr handles everything else.\n\nInput: Contract address + score Output: Buy → monitor → exit (mechanical)\n\nNo signal generation. No opinion on what to buy. All opinion on how to manage it once you're in.\n\nQuick Start\n# 1. Install\n./scripts/setup.sh\n\n# 2. Edit config\nvi config.json    # Add wallet addresses, tune scoring/modes\n\n# 3. Start the exit manager daemon\nsudo systemctl start tradr-exit-manager\n\n# 4. Feed a trade\npython3 scripts/tradr-enter.py <CA> --score <N> [--chain base] [--mode snipe]\n\nGetting Started from Zero\nPrerequisites\nOpenClaw running (the agent runtime)\nBankr skill installed (~/.openclaw/skills/bankr/) with a valid API key — this is what executes on-chain trades. Sign up at bankr.bot to get your API key, then add it to ~/.openclaw/skills/bankr/config.json\nPython 3.8+ and jq\nA funded wallet (Solana and/or EVM) — Bankr creates wallets for you on supported chains (Base, Solana, ETH, Polygon, Unichain). Fund them before trading.\nStep-by-Step\n\nInstall tradr:\n\ncd ~/.openclaw/skills/tradr   # or wherever you unpacked the skill\n./scripts/setup.sh            # creates config, installs systemd service\n\n\nConfigure your wallets: Edit config.json and add your wallet addresses under wallets. These are used for on-chain balance verification (read-only — tradr never touches your private keys).\n\nTune your strategy:\n\nscore_to_size — how much USD to spend at each confidence level\nmodes — exit behavior profiles (stop loss, take profit, trailing stop)\nmcap_ceiling_usd — maximum market cap for entries\n\nStart the exit manager:\n\nsudo systemctl start tradr-exit-manager\nsudo systemctl status tradr-exit-manager  # verify it's running\n\n\nConnect a signal source: tradr doesn't generate signals — you bring your own. See adapters/README.md for the interface spec and adapters/example-adapter.py for a working template.\n\nOr feed trades manually:\n\npython3 scripts/tradr-enter.py 0xABC... --score 5 --chain base --token PEPE\n\n\nMonitor via dashboard: The dashboard/index.html file provides a real-time dashboard. It expects four API endpoints:\n\nGET /api/positions — returns positions.json contents\nGET /api/trades — returns trade-log.jsonl as JSON array\nGET /api/tradr-config — returns config.json contents\nGET /api/health — returns system health (optional)\n\nYou can serve these from any HTTP server that reads the flat files, or embed the dashboard in your existing server.\n\nFile Layout\ntradr/\n├── config.json              # Your live config (created from template)\n├── config-template.json     # Default config for new installs\n├── SKILL.md                 # This file\n├── scripts/\n│   ├── tradr-enter.py       # Entry engine\n│   ├── exit-manager.py      # Exit daemon\n│   ├── setup.sh             # Installer\n│   └── notify-telegram.sh   # Example notification hook\n├── adapters/\n│   ├── README.md            # Signal adapter interface spec\n│   └── example-adapter.py   # Working adapter template\n└── dashboard/\n    └── index.html           # Real-time monitoring dashboard\n\nSignal Adapters\n\ntradr is execution-only — it doesn't have opinions about what to buy. You bring the signal, tradr handles the trade lifecycle.\n\nThe interface is one command:\n\npython3 scripts/tradr-enter.py <ca> --score <N> [--chain <chain>] [--token <name>]\n\n\nA signal adapter is any script or service that watches a source, detects signals, scores them, and calls that command. See adapters/README.md for the full spec and adapters/example-adapter.py for a working template.\n\nSignal source ideas: Twitter KOL tracking, on-chain whale monitoring, Telegram alpha groups, DEX volume spikes, copy-trading apps, custom aggregators.\n\nScripts\nscripts/tradr-enter.py — Entry engine. Takes CA + score, sizes position, buys via Bankr, writes position with mode attached.\nscripts/exit-manager.py — Exit daemon. Polls prices, applies mode-specific exit rules, sells via Bankr, verifies on-chain, logs everything. Runs as systemd service.\nscripts/setup.sh — Installer. Creates config from template, sets up systemd service.\nExit Modes\n\nEach position carries a mode that determines its exit behavior. Four built-in modes ship as defaults — you can customize them or create your own.\n\nMode\tStop At\tTake Profit\tTrailing\tUse Case\nsnipe\t0.85x\t1.3x (sell 30%)\t10% from peak\tQuick in/out. Low-conviction plays.\nswing\t0.70x\t1.3x (sell 30%)\tTiered: 15% tight / 25% wide\tStandard hold. The default.\ngamble\t0.50x\tnone\t30% from peak\tHigh risk, let it ride or die.\ndiamond\tnone\tnone\tnone\tPure conviction. Manual exit only.\n\nSwing mode has tiered trailing: tight trail (15%) when peak is below 2x, wide trail (25%) when peak is above 2x. Protects modest gains while letting big winners run.\n\nCustom Modes\n\nAdd your own modes by adding a key to modes in config.json. Any name works — the exit manager reads mode params dynamically. No code changes needed.\n\n\"modes\": {\n  \"snipe\": { ... },\n  \"swing\": { ... },\n  \"my-custom-mode\": {\n    \"stop_at\": 0.80,\n    \"take_profit_1\": 1.2,\n    \"take_profit_1_size\": 0.5,\n    \"trailing_stop\": 0.12\n  }\n}\n\n\nThen use it: tradr-enter.py <CA> --score 5 --mode my-custom-mode\n\nMode Selection\n\nModes are selected per-trade in order of priority:\n\nExplicit --mode flag on entry (always wins)\nScore-based auto-selection via score_to_mode config map\ndefault_mode fallback (default: swing)\nEntry Guards\n\ntradr rejects entries that fail any of these checks:\n\n**Mcap ceiling -- token mcap exceeds mcap_ceiling_usd default: $10M)\nCooldown — same token was closed less than cooldown_minutes ago (default: 30)\nMax position size — scored size exceeds max_position_size_usd\nAlready in position — open position exists for this CA\nPartial Sell Tracking\n\nWhen a take-profit triggers, tradr tracks remaining_usd on the position. This means:\n\nP&L calculations account for what was already sold at TP vs what's left at final exit\nThe trade log records actual sold amounts, not the full original position\nYou can see how much USD value is still in play at any time\nNotification Hook\n\nThe notification script receives three arguments: level, type, message.\n\nlevel: info, trade, warning, error\ntype: buy, sell, confluence, error, info\nmessage: human-readable text\n\nThis lets your hook route notifications — e.g., buys to DM only, sells to DM + broadcast channel.\n\nExample hook:\n\n#!/bin/bash\nLEVEL=\"$1\"  TYPE=\"$2\"  MSG=\"$3\"\nif [ \"$TYPE\" = \"sell\" ]; then\n  # Route to both DM and broadcast\n  send-dm \"$MSG\"\n  send-broadcast \"$MSG\"\nelse\n  # Everything else just DM\n  send-dm \"$MSG\"\nfi\n\nConfig Reference\n\nconfig.json (created from config-template.json on first setup):\n\npositions_file       — path to positions.json\ntrade_log            — path to trade-log.jsonl\nlog_file             — path to tradr.log\nbankr_script         — path to bankr.sh\nlockfile             — exit manager lock (prevents duplicates)\npoll_interval_seconds — price check interval (default: 10)\ndexscreener_delay    — delay between DexScreener calls (default: 1.5s)\nreconcile_every_cycles — on-chain reconciliation interval (default: every 30 cycles)\n\nmodes                — exit params per mode (add custom modes here)\n  stop_at            — exit multiplier (e.g. 0.85 = sell if price drops to 0.85x entry)\n  take_profit_1      — first TP multiplier (null = no TP)\n  take_profit_1_size — fraction to sell at TP (e.g. 0.3 = 30%)\n  trailing_stop      — trail % from peak (null = no trail)\n  trailing_stop_tight — optional tight trail (swing mode)\n  trailing_stop_tight_below — peak threshold for tight vs wide\n\ndefault_mode         — fallback mode when not specified\nscore_to_mode        — map of score thresholds → mode names\nscore_to_size        — map of score thresholds → position size in USD\n\nmcap_ceiling_usd     — reject entries above this mcap (0 = no limit)\ncooldown_minutes     — block re-entry on same token for N minutes after close (0 = no cooldown)\nmax_position_size_usd — hard cap on any single position\n\nwallets.solana       — Solana wallet address (for on-chain verification)\nwallets.evm          — EVM wallet address (for on-chain verification)\nrpc_urls             — custom RPC endpoints per chain\n\nnotifications.enabled — enable/disable notifications\nnotifications.script  — path to notification hook script (receives: level, type, message)\n\nDashboard\n\ntradr ships with a real-time monitoring dashboard (dashboard/index.html) that shows:\n\nOpen positions — live P&L, entry/current/peak market cap, exit mode, time held\nPerformance stats — total P&L, win rate, avg peak, best trade\nTrade history — searchable table with entry/exit details, tx links\nConfiguration — collapsible view of exit modes, sizing tiers, limits\n\nThe dashboard is a standalone HTML file that fetches data from four JSON API endpoints. It auto-refreshes every 15 seconds. Dark theme, mobile responsive.\n\nTo use it, serve these endpoints from your HTTP server:\n\nGET /api/positions — contents of positions.json\nGET /api/trades — trade-log.jsonl parsed as { \"trades\": [...] }\nGET /api/tradr-config — contents of config.json\nGET /api/health — system health (optional)\nArchitecture\nSignal Source (your adapter)\n    |\n    | CA + score [+ chain] [+ token]\n    v\ntradr-enter.py\n    |\n    |-- Guards: mcap ceiling, cooldown, size cap\n    |-- Resolves mode (explicit > score_to_mode > default)\n    |-- Sizes position (score_to_size map)\n    |-- Fetches price/mcap from DexScreener\n    |-- Executes buy via bankr.sh\n    |-- Writes positions.json (with mode + remaining_usd fields)\n    |-- Logs to trade-log.jsonl\n    |-- Notifies (type=buy)\n    |\n    v\nexit-manager.py (daemon, 10s poll)\n    |\n    |-- Reads positions.json\n    |-- For each open position:\n    |     |-- Reads position's mode → gets exit params from config\n    |     |-- Fetches price from DexScreener\n    |     |-- Applies: hard stop → TP → trailing\n    |     |-- Executes sell via bankr.sh if triggered\n    |     |-- Tracks remaining_usd after partial sells\n    |     |-- Verifies on-chain balance (Solana RPC / EVM eth_call)\n    |     |-- Updates positions.json + trade-log.jsonl\n    |     |-- Notifies (type=sell)\n    |\n    |-- Every N cycles: reconcile (close stale positions where wallet is empty)\n\nPosition Schema\n\nEach position in positions.json (keyed by contract address):\n\n{\n  \"token\": \"EXAMPLE\",\n  \"chain\": \"base\",\n  \"buy_ts\": \"2026-02-11T14:00:00Z\",\n  \"entry_mcap\": 500000,\n  \"entry_price\": 0.0001,\n  \"buy_amount_usd\": 7.50,\n  \"remaining_usd\": 7.50,\n  \"mode\": \"swing\",\n  \"score\": 5,\n  \"current_mcap\": 600000,\n  \"current_price\": 0.00012,\n  \"peak_mcap\": 700000,\n  \"first_exit_done\": false,\n  \"closed\": false,\n  \"close_ts\": null,\n  \"close_reason\": null,\n  \"close_mcap\": null,\n  \"close_multiple\": null,\n  \"est_pnl_usd\": null,\n  \"tx_hash\": \"0x...\"\n}\n\nRequirements\nPython 3.8+\nBankr skill installed (~/.openclaw/skills/bankr/)\njq (used by bankr.sh)\nsystemd (for exit manager daemon)\nNo paid APIs. No LLM cost. Pure Python.\nWhat tradr Is Not\nNot a signal generator. It doesn't tell you what to buy. You bring the alpha.\nNot an LLM. Zero AI cost at runtime. Pure Python, pure math.\nNot a wallet. It never holds or accesses private keys. Execution goes through Bankr.\nNot opinionated about chains. Works on Solana, Base, Ethereum, Polygon, Unichain — anywhere Bankr supports."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/riskanon/tradr",
    "publisherUrl": "https://clawhub.ai/riskanon/tradr",
    "owner": "riskanon",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/tradr",
    "downloadUrl": "https://openagent3.xyz/downloads/tradr",
    "agentUrl": "https://openagent3.xyz/skills/tradr/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tradr/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tradr/agent.md"
  }
}