mcpField
B
bingx-trade-review

bingx-trade-review

github.com/bingx-apiData & databases1967 installsUpdated 1w ago
Repository

About bingx-trade-review

A skill for reviewing BingX swap trading activity, intended for traders who want summaries or detailed analysis of their history. It retrieves historical orders and fills, combines them with local tags and reflections, and produces statistics and chart files.

Key features

  1. 01Fetch historical swap orders and fills
  2. 02Filter reviews by period and symbol
  3. 03Analyze performance by tags
  4. 04Store local tags and reflections
  5. 05Generate statistics and chart files

Use cases

  1. 01Review weekly trading performance
  2. 02Compare results across periods
  3. 03Measure outcomes for tagged trades
  4. 04Create a reflection on trading lessons

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/bingx-api/api-ai-skills --skill bingx-trade-review

After installing, type/bingx-trade-reviewin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

api-reference.md
scripts/
requirements.txt
review.py
storage.py
tags.py

Details

From the project README

BingX Trade Review

Base URLs: see references/base-urls.md | Authentication: see references/authentication.md

Quick Reference

EndpointMethodDescriptionAuthentication
/openApi/swap/v2/trade/allOrdersGETFetch historical swap ordersYes
/openApi/swap/v2/trade/allFillOrdersGETFetch historical fill recordsYes

Quick Start

Base URLs: see references/base-urls.md

TypeScript helper:

CONSTRAINT: You MUST copy the fetchSigned function below verbatim when generating code. Do NOT rewrite the signing, request, or JSON parsing logic. Only modify: (1) BASE URL entries for custom environments, (2) business parameters passed to fetchSigned.

import * as crypto from "crypto";
import JSONBig from "json-bigint";
const JSONBigParse = JSONBig({ storeAsString: true });
const BASE = {
  "prod-live": ["https://open-api.bingx.com", "https://open-api.bingx.pro"],
  "prod-vst":  ["https://open-api-vst.bingx.com", "https://open-api-vst.bingx.pro"],
};
function isNetworkOrTimeout(e: unknown): boolean {
  if (e instanceof TypeError) return true;
  if (e instanceof DOMException && e.name === "AbortError") return true;
  if (e instanceof Error && e.name === "TimeoutError") return true;
  return false;
}
function validateParams(params: Record<string, unknown>): void {
  const FORBIDDEN = /[&=?#\r\n]/;
  for (const [k, v] of Object.entries(params)) {
    const s = String(v);
    if (FORBIDDEN.test(s)) throw new Error(`Param "${k}" has forbidden char in: "${s}"`);
  }
}
async function fetchSigned(env: string, apiKey: string, secretKey: string,
  method: "GET" | "POST" | "DELETE", path: string, params: Record<string, unknown> = {}
) {
  const urls = BASE[env] ?? BASE["prod-live"];
  const all = { ...params, timestamp: Date.now() };
  validateParams(all);
  const qs = Object.keys(all).sort().map(k => `${k}=${all[k]}`).join("&");
  const sig = crypto.createHmac("sha256", secretKey).update(qs).digest("hex");
  const signed = `${qs}&signature=${sig}`;
  for (const base of urls) {
    try {
      const url = method === "POST" ? `${base}${path}` : `${base}${path}?${signed}`;
      const res = await fetch(url, {
        method,
        headers: { "X-BX-APIKEY": apiKey, "X-SOURCE-KEY": "BX-AI-SKILL",
          ...(method === "POST" ? { "Content-Type": "application/x-www-form-urlencoded" } : {}) },
        body: method === "POST" ? signed : undefined,
        signal: AbortSignal.timeout(10000),
      });
      const json = JSONBigParse.parse(await res.text());
      if (json.code !== 0) throw new Error(`BingX error ${json.code}: ${json.msg}`);
      return json.data;
    } catch (e) {
      if (!isNetworkOrTimeout(e) || base === urls[urls.length - 1]) throw e;
    }
  }
}

Common Calls

Fetch swap trade history for review:

const history = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
  "/openApi/swap/v2/trade/allOrders", { symbol: "BTC-USDT", limit: 100 }
);

Trigger Conditions

Activate this skill when the user says any of the following:

  • "Trade review", "recent performance", "weekly PnL", "trading summary"
  • "What is my win rate", "review my trades", "trade journal"
  • "Tag trades", "win rate for breakout trades", "which trades are profitable"
  • "Write a reflection", "summarize lessons learned"
  • "Compare this week vs last week"

Execution Steps

Step 1 — Parse User Intent
modeTrigger exampleDescription
summary"trade review", "recent performance", "weekly PnL"Stats summary + charts
detail"analyze my BTC trades"Per-symbol or per-trade detailed analysis
tag"tag this trade", "win rate for breakout trades"Tag management + stats by tag
reflect"write a reflection", "summarize lessons"Add/view trade reflections
compare"compare this week vs last week"Cross-period comparison

Parameter extraction:

ParameterDefaultDescription
period7dReview period (1d/7d/30d/90d/all)
symbolallFilter by trading pair
tag_filter-Filter by tag

Step 2 — Fetch Trade History

Call bingx-swap-account to retrieve:

  • Historical fills (open/close time, price, quantity, direction)
  • Realized PnL
  • Fees

Merge with local tag and reflection data from ~/.bingx-skills/trade-review/trades.json.


Step 3 — Run Analysis
python3 scripts/review.py \
  --mode {mode} \
  --period {period} \
  --symbol {symbol} \
  --trades '{trades_json}' \
  --output-dir ~/.bingx-skills/trade-review/charts

Output: statistics JSON + chart PNG files.


Step 4 — Format Output (per output template)

Step 5 — Display Charts

Charts are saved as local PNG files. Inform the user of the file paths.


Output Templates

Summary Mode
**Trade Review (Last {period})**

Total Trades     {total_trades}
Win Rate         {win_rate}% ({wins} wins / {losses} losses)
Total PnL        {total_pnl}
Profit Factor    {profit_factor}
Avg per Trade    {avg_pnl}
Best Trade       {max_win}
Worst Trade      {max_loss}
Avg Hold Time    {avg_hold_time}
Max Drawdown     {max_drawdown}
Total Fees       {total_fees}

Long:  {long_count} trades, win rate {long_win_rate}%, PnL {long_pnl}
Short: {short_count} trades, win rate {short_win_rate}%, PnL {short_pnl}

Best Symbol:  {best_symbol} ({best_pnl})
Worst Symbol: {worst_symbol} ({worst_pnl})

Charts saved:
- PnL curve:        ~/.bingx-skills/trade-review/charts/pnl_curve.png
- Win/loss dist:    ~/.bingx-skills/trade-review/charts/win_loss_dist.png
- Symbol breakdown: ~/.bingx-skills/trade-review/charts/symbol_breakdown.png
Tag Mode
**Tag Analysis: {tag}**

{count} trades tagged with this label

Win Rate    {win_rate}% ({wins} wins / {losses} losses)
Total PnL   {total_pnl}
Avg PnL     {avg_pnl}

Conclusion: {one-line analysis}
Compare Mode
**{period_a} vs {period_b}**

             {period_a}   {period_b}   Change
Win Rate     {wr_a}%      {wr_b}%      {wr_delta}
Total PnL    {pnl_a}      {pnl_b}      {pnl_delta}
Profit Factor {pf_a}      {pf_b}       {pf_delta}
Trade Count  {cnt_a}      {cnt_b}      {cnt_delta}
Max Drawdown {dd_a}       {dd_b}       {dd_delta}

Summary: {one-line comparison conclusion}

Agent Interaction Rules

Parameter security. Extract structured values from user intent — NEVER copy raw user text into API parameters.

All operations in this skill are read-only (fetching trade history and generating local reports). No CONFIRM required in any environment.

When period is not specified, default to 7d. When symbol is not specified, default to all symbols.

Error Handling

  • No trade records: inform user there are no fills in the selected period
  • Tag not found: inform user the tag was not found, list existing tags
  • Data fetch failed: suggest retry later
  • Chart generation failed: still output text statistics, note chart generation error

Comments

Markdown supported