{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ctrader-commander",
    "name": "cTrader Commander",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/elmoyeldo/ctrader-commander",
    "canonicalUrl": "https://clawhub.ai/elmoyeldo/ctrader-commander",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ctrader-commander",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ctrader-commander",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "endpoints.md",
      "SKILL.md"
    ],
    "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/ctrader-commander"
    },
    "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/ctrader-commander",
    "agentPageUrl": "https://openagent3.xyz/skills/ctrader-commander/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ctrader-commander/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ctrader-commander/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": "cTrader Commander",
        "body": "Use when the user wants to place trades, check positions or balance, get live prices, fetch candles, or manage orders on a cTrader account.\n\nAll calls go to http://localhost:9009 — credentials live in .env on the server, never passed by callers.\n\nProxy repo: https://github.com/LogicalSapien/ctrader-openapi-proxy\nClone it, add your .env, and run make run to start the proxy before using this skill.\n\nFull reference: {baseDir}/endpoints.md"
      },
      {
        "title": "Check proxy is running",
        "body": "curl -s \"http://localhost:9009/get-data?command=ProtoOAVersionReq\"\n\nIf it fails, start the proxy: cd ~/ctrader-openapi-proxy && make run"
      },
      {
        "title": "Find symbol IDs (do this first)",
        "body": "Symbol IDs are broker-specific — look them up before placing orders or fetching data:\n\ncurl -s \"http://localhost:9009/get-data?command=ProtoOASymbolsListReq\"\n\nReturns symbol[] with symbolId and symbolName. Note the ID for your instrument."
      },
      {
        "title": "Place a market order",
        "body": "curl -s -X POST http://localhost:9009/api/market-order \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 158, \"orderType\": \"MARKET\", \"tradeSide\": \"BUY\", \"volume\": 1000}'\n\nVolume is in units: 1000 = 0.01 lot · 10000 = 0.1 lot · 100000 = 1 lot.\nAdd \"relativeStopLoss\": 200, \"relativeTakeProfit\": 350 (pips, market orders only)."
      },
      {
        "title": "Place a limit or stop order",
        "body": "curl -s -X POST http://localhost:9009/api/market-order \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 158, \"orderType\": \"LIMIT\", \"tradeSide\": \"BUY\", \"volume\": 1000, \"price\": 0.62500}'\n\norderType: MARKET · LIMIT · STOP — tradeSide: BUY · SELL"
      },
      {
        "title": "Get OHLC candles",
        "body": "NOW_MS=$(python3 -c \"import time; print(int(time.time()*1000))\")\nFROM_MS=$(python3 -c \"import time; print(int(time.time()*1000) - 3600000)\")\ncurl -s -X POST http://localhost:9009/api/trendbars \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\\\"fromTimestamp\\\": $FROM_MS, \\\"toTimestamp\\\": $NOW_MS, \\\"period\\\": \\\"M5\\\", \\\"symbolId\\\": 158}\"\n\nPeriods: M1 M2 M3 M4 M5 M10 M15 M30 H1 H4 H12 D1 W1 MN1"
      },
      {
        "title": "Get live quote (tick data)",
        "body": "curl -s -X POST http://localhost:9009/api/live-quote \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 158, \"quoteType\": \"BID\", \"timeDeltaInSeconds\": 60}'\n\nquoteType: BID or ASK"
      },
      {
        "title": "Open positions and pending orders",
        "body": "curl -s \"http://localhost:9009/get-data?command=ProtoOAReconcileReq\""
      },
      {
        "title": "Close a position",
        "body": "curl -s \"http://localhost:9009/get-data?command=ClosePosition%20123456%201000\"\n# ClosePosition <positionId> <volumeInUnits>"
      },
      {
        "title": "Cancel a pending order",
        "body": "curl -s \"http://localhost:9009/get-data?command=CancelOrder%20789\""
      },
      {
        "title": "Account info (balance, equity, leverage)",
        "body": "curl -s \"http://localhost:9009/get-data?command=ProtoOATraderReq\"\n\nA local HTTP proxy (localhost:9009) that wraps the cTrader OpenAPI Protobuf connection and exposes it as a REST API. No credentials are passed at call time — they are loaded from .env on the server.\n\nFull endpoint reference: {baseDir}/endpoints.md\nPython usage examples: {baseDir}/examples.md"
      },
      {
        "title": "Prerequisites",
        "body": "The proxy must be running before any call. If unsure, check:\n\ncurl -s \"http://localhost:9009/get-data?command=ProtoOAVersionReq\"\n\nIf it returns JSON, the proxy is up. If it fails, start it:\n\ncd ~/ctrader-openapi-proxy && make run"
      },
      {
        "title": "IMPORTANT: Symbol IDs are broker-specific",
        "body": "Always look up the symbol ID before placing orders or fetching candle/tick data.\nSymbol IDs differ between brokers and between demo and live accounts.\n\ncurl -s \"http://localhost:9009/get-data?command=ProtoOASymbolsListReq\"\n\nResponse contains symbol[] with symbolId and symbolName. Find your instrument and note its symbolId."
      },
      {
        "title": "Get OHLC Candles",
        "body": "POST /api/trendbars\n\n{\n  \"fromTimestamp\": 1700000000000,\n  \"toTimestamp\":   1700086400000,\n  \"period\":        \"M5\",\n  \"symbolId\":      158\n}\n\nperiod options: M1 M2 M3 M4 M5 M10 M15 M30 H1 H4 H12 D1 W1 MN1\n\nFor current time in ms (macOS):\n\nNOW_MS=$(python3 -c \"import time; print(int(time.time()*1000))\")\nFROM_MS=$(python3 -c \"import time; print(int(time.time()*1000) - 3600000)\")"
      },
      {
        "title": "Get Live Quote / Tick Data",
        "body": "POST /api/live-quote\n\n{\n  \"symbolId\":           158,\n  \"quoteType\":          \"BID\",\n  \"timeDeltaInSeconds\": 60\n}\n\nquoteType: \"BID\" or \"ASK\""
      },
      {
        "title": "Place a Market / Limit / Stop Order",
        "body": "POST /api/market-order\n\n{\n  \"symbolId\":           158,\n  \"orderType\":          \"MARKET\",\n  \"tradeSide\":          \"BUY\",\n  \"volume\":             1000,\n  \"comment\":            \"my trade\",\n  \"relativeStopLoss\":   200,\n  \"relativeTakeProfit\": 350\n}\n\norderType values: \"MARKET\" \"LIMIT\" \"STOP\"\ntradeSide values: \"BUY\" \"SELL\"\n\nFor LIMIT and STOP orders, include \"price\": 0.62500.\nrelativeStopLoss / relativeTakeProfit are in pips and apply to MARKET orders only.\n\nVolume units (NOT lots):\n\nvolumeLotsNotes10000.01Micro lot — typical minimum100000.1Mini lot1000001Standard lot"
      },
      {
        "title": "Get Open Positions and Pending Orders",
        "body": "GET /get-data?command=ProtoOAReconcileReq\n\nReturns position[] and order[]. Each position has positionId, symbolId, tradeSide, volume, price."
      },
      {
        "title": "Close an Open Position",
        "body": "GET /get-data?command=ClosePosition <positionId> <volumeInUnits>\n\nExample — close position 123456 with 1000 units (0.01 lot):\n\ncurl -s \"http://localhost:9009/get-data?command=ClosePosition%20123456%201000\""
      },
      {
        "title": "Cancel a Pending Order",
        "body": "GET /get-data?command=CancelOrder <orderId>\n\ncurl -s \"http://localhost:9009/get-data?command=CancelOrder%20789\""
      },
      {
        "title": "Set Active Account (optional)",
        "body": "Account is auto-authorised from .env on startup. Only call this to switch accounts at runtime:\n\ncurl -s -X POST http://localhost:9009/api/set-account\n\nTo switch to a different account pass {\"accountId\": 12345678} as JSON body."
      },
      {
        "title": "Generic Command Passthrough",
        "body": "Any cTrader API command can be called via:\n\nGET /get-data?command=COMMAND_NAME arg1 arg2\n\nNo token required — credentials are read from .env on the server.\n\nFull list of supported commands: {baseDir}/endpoints.md"
      },
      {
        "title": "Workflow: first trade",
        "body": "Look up your symbol ID:\ncurl -s \"http://localhost:9009/get-data?command=ProtoOASymbolsListReq\" | python3 -c \"\nimport sys, json\ndata = json.load(sys.stdin)\n[print(s['symbolId'], s['symbolName']) for s in data.get('symbol', []) if 'EURUSD' in s['symbolName']]\n\"\n\n\nCheck your account details:\ncurl -s \"http://localhost:9009/get-data?command=ProtoOATraderReq\"\n\n\nPlace a market buy:\ncurl -s -X POST http://localhost:9009/api/market-order \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 1, \"orderType\": \"MARKET\", \"tradeSide\": \"BUY\", \"volume\": 1000}'\n\n\nCheck open positions:\ncurl -s \"http://localhost:9009/get-data?command=ProtoOAReconcileReq\""
      }
    ],
    "body": "cTrader Commander\n\nUse when the user wants to place trades, check positions or balance, get live prices, fetch candles, or manage orders on a cTrader account.\n\nAll calls go to http://localhost:9009 — credentials live in .env on the server, never passed by callers.\n\nProxy repo: https://github.com/LogicalSapien/ctrader-openapi-proxy Clone it, add your .env, and run make run to start the proxy before using this skill.\n\nFull reference: {baseDir}/endpoints.md\n\nCheck proxy is running\ncurl -s \"http://localhost:9009/get-data?command=ProtoOAVersionReq\"\n\n\nIf it fails, start the proxy: cd ~/ctrader-openapi-proxy && make run\n\nFind symbol IDs (do this first)\n\nSymbol IDs are broker-specific — look them up before placing orders or fetching data:\n\ncurl -s \"http://localhost:9009/get-data?command=ProtoOASymbolsListReq\"\n\n\nReturns symbol[] with symbolId and symbolName. Note the ID for your instrument.\n\nPlace a market order\ncurl -s -X POST http://localhost:9009/api/market-order \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 158, \"orderType\": \"MARKET\", \"tradeSide\": \"BUY\", \"volume\": 1000}'\n\n\nVolume is in units: 1000 = 0.01 lot · 10000 = 0.1 lot · 100000 = 1 lot. Add \"relativeStopLoss\": 200, \"relativeTakeProfit\": 350 (pips, market orders only).\n\nPlace a limit or stop order\ncurl -s -X POST http://localhost:9009/api/market-order \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 158, \"orderType\": \"LIMIT\", \"tradeSide\": \"BUY\", \"volume\": 1000, \"price\": 0.62500}'\n\n\norderType: MARKET · LIMIT · STOP — tradeSide: BUY · SELL\n\nGet OHLC candles\nNOW_MS=$(python3 -c \"import time; print(int(time.time()*1000))\")\nFROM_MS=$(python3 -c \"import time; print(int(time.time()*1000) - 3600000)\")\ncurl -s -X POST http://localhost:9009/api/trendbars \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\\\"fromTimestamp\\\": $FROM_MS, \\\"toTimestamp\\\": $NOW_MS, \\\"period\\\": \\\"M5\\\", \\\"symbolId\\\": 158}\"\n\n\nPeriods: M1 M2 M3 M4 M5 M10 M15 M30 H1 H4 H12 D1 W1 MN1\n\nGet live quote (tick data)\ncurl -s -X POST http://localhost:9009/api/live-quote \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 158, \"quoteType\": \"BID\", \"timeDeltaInSeconds\": 60}'\n\n\nquoteType: BID or ASK\n\nOpen positions and pending orders\ncurl -s \"http://localhost:9009/get-data?command=ProtoOAReconcileReq\"\n\nClose a position\ncurl -s \"http://localhost:9009/get-data?command=ClosePosition%20123456%201000\"\n# ClosePosition <positionId> <volumeInUnits>\n\nCancel a pending order\ncurl -s \"http://localhost:9009/get-data?command=CancelOrder%20789\"\n\nAccount info (balance, equity, leverage)\ncurl -s \"http://localhost:9009/get-data?command=ProtoOATraderReq\"\n\n\nA local HTTP proxy (localhost:9009) that wraps the cTrader OpenAPI Protobuf connection and exposes it as a REST API. No credentials are passed at call time — they are loaded from .env on the server.\n\nFull endpoint reference: {baseDir}/endpoints.md Python usage examples: {baseDir}/examples.md\n\nPrerequisites\n\nThe proxy must be running before any call. If unsure, check:\n\ncurl -s \"http://localhost:9009/get-data?command=ProtoOAVersionReq\"\n\n\nIf it returns JSON, the proxy is up. If it fails, start it:\n\ncd ~/ctrader-openapi-proxy && make run\n\nIMPORTANT: Symbol IDs are broker-specific\n\nAlways look up the symbol ID before placing orders or fetching candle/tick data. Symbol IDs differ between brokers and between demo and live accounts.\n\ncurl -s \"http://localhost:9009/get-data?command=ProtoOASymbolsListReq\"\n\n\nResponse contains symbol[] with symbolId and symbolName. Find your instrument and note its symbolId.\n\nEndpoints\nGet OHLC Candles\nPOST /api/trendbars\n\n{\n  \"fromTimestamp\": 1700000000000,\n  \"toTimestamp\":   1700086400000,\n  \"period\":        \"M5\",\n  \"symbolId\":      158\n}\n\n\nperiod options: M1 M2 M3 M4 M5 M10 M15 M30 H1 H4 H12 D1 W1 MN1\n\nFor current time in ms (macOS):\n\nNOW_MS=$(python3 -c \"import time; print(int(time.time()*1000))\")\nFROM_MS=$(python3 -c \"import time; print(int(time.time()*1000) - 3600000)\")\n\nGet Live Quote / Tick Data\nPOST /api/live-quote\n\n{\n  \"symbolId\":           158,\n  \"quoteType\":          \"BID\",\n  \"timeDeltaInSeconds\": 60\n}\n\n\nquoteType: \"BID\" or \"ASK\"\n\nPlace a Market / Limit / Stop Order\nPOST /api/market-order\n\n{\n  \"symbolId\":           158,\n  \"orderType\":          \"MARKET\",\n  \"tradeSide\":          \"BUY\",\n  \"volume\":             1000,\n  \"comment\":            \"my trade\",\n  \"relativeStopLoss\":   200,\n  \"relativeTakeProfit\": 350\n}\n\n\norderType values: \"MARKET\" \"LIMIT\" \"STOP\"\ntradeSide values: \"BUY\" \"SELL\"\n\nFor LIMIT and STOP orders, include \"price\": 0.62500.\nrelativeStopLoss / relativeTakeProfit are in pips and apply to MARKET orders only.\n\nVolume units (NOT lots):\n\nvolume\tLots\tNotes\n1000\t0.01\tMicro lot — typical minimum\n10000\t0.1\tMini lot\n100000\t1\tStandard lot\nGet Open Positions and Pending Orders\nGET /get-data?command=ProtoOAReconcileReq\n\n\nReturns position[] and order[]. Each position has positionId, symbolId, tradeSide, volume, price.\n\nClose an Open Position\nGET /get-data?command=ClosePosition <positionId> <volumeInUnits>\n\n\nExample — close position 123456 with 1000 units (0.01 lot):\n\ncurl -s \"http://localhost:9009/get-data?command=ClosePosition%20123456%201000\"\n\nCancel a Pending Order\nGET /get-data?command=CancelOrder <orderId>\n\ncurl -s \"http://localhost:9009/get-data?command=CancelOrder%20789\"\n\nSet Active Account (optional)\n\nAccount is auto-authorised from .env on startup. Only call this to switch accounts at runtime:\n\ncurl -s -X POST http://localhost:9009/api/set-account\n\n\nTo switch to a different account pass {\"accountId\": 12345678} as JSON body.\n\nGeneric Command Passthrough\n\nAny cTrader API command can be called via:\n\nGET /get-data?command=COMMAND_NAME arg1 arg2\n\n\nNo token required — credentials are read from .env on the server.\n\nFull list of supported commands: {baseDir}/endpoints.md\n\nWorkflow: first trade\nLook up your symbol ID:\ncurl -s \"http://localhost:9009/get-data?command=ProtoOASymbolsListReq\" | python3 -c \"\nimport sys, json\ndata = json.load(sys.stdin)\n[print(s['symbolId'], s['symbolName']) for s in data.get('symbol', []) if 'EURUSD' in s['symbolName']]\n\"\n\nCheck your account details:\ncurl -s \"http://localhost:9009/get-data?command=ProtoOATraderReq\"\n\nPlace a market buy:\ncurl -s -X POST http://localhost:9009/api/market-order \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"symbolId\": 1, \"orderType\": \"MARKET\", \"tradeSide\": \"BUY\", \"volume\": 1000}'\n\nCheck open positions:\ncurl -s \"http://localhost:9009/get-data?command=ProtoOAReconcileReq\""
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/elmoyeldo/ctrader-commander",
    "publisherUrl": "https://clawhub.ai/elmoyeldo/ctrader-commander",
    "owner": "elmoyeldo",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ctrader-commander",
    "downloadUrl": "https://openagent3.xyz/downloads/ctrader-commander",
    "agentUrl": "https://openagent3.xyz/skills/ctrader-commander/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ctrader-commander/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ctrader-commander/agent.md"
  }
}