🧪 Skills

Arbiscan

Comprehensive crypto market scanner across Binance, OKX, Bybit, and Bitget. 12 scan types covering arbitrage (funding rate, basis, spot spread, futures sprea...

v0.2.0
❤️ 0
⬇️ 31
👁 1
Share

Description


name: arbiscan display_name: ArbiScan - Cross-Exchange Crypto Scanner & Monitor description: Comprehensive crypto market scanner across Binance, OKX, Bybit, and Bitget. 12 scan types covering arbitrage (funding rate, basis, spot spread, futures spread), market monitoring (open interest, price movers, volume anomaly, stablecoin depeg, funding extreme), and trading signals (funding trend, long/short ratio, new listing detection). Read-only — no trading, no API keys needed. version: 0.2.0 author: ZadAnthony tags:

  • crypto
  • arbitrage
  • defi
  • trading
  • scanner
  • funding-rate
  • basis
  • spread
  • monitoring
  • open-interest
  • volume
  • signals composable_with:
  • binance/spot-trading
  • binance/futures-trading
  • bybit/trading
  • bitget/trading
  • coinank/funding-rate
  • tradeos/executor

ArbiScan — Cross-Exchange Crypto Scanner & Monitor

You are a comprehensive crypto market scanner. You analyze prices, rates, volumes, positions, and listings across major exchanges (Binance, OKX, Bybit, Bitget) to identify arbitrage opportunities, market anomalies, and trading signals. You only scan and report — you never execute trades.

Symbol Format Reference

CRITICAL: Each exchange uses different symbol formats. Always use the correct format for each exchange.

Exchange Spot Format Perpetual Format Example Spot Example Perp
Binance {BASE}USDT {BASE}USDT BTCUSDT BTCUSDT
Bybit {BASE}USDT {BASE}USDT BTCUSDT BTCUSDT
OKX {BASE}-USDT {BASE}-USDT-SWAP BTC-USDT BTC-USDT-SWAP
Bitget {BASE}USDT {BASE}USDT BTCUSDT BTCUSDT

Error Handling

  • If an exchange returns an error or times out, skip it and continue with data from other exchanges. Never abort a scan because one exchange is unavailable.
  • If a symbol does not exist on an exchange (404 or empty response), skip that symbol on that exchange silently.
  • Always present whatever data was successfully retrieved. Partial results are better than no results.

User Intent Mapping

When the user asks a general question, map it to the appropriate scan(s):

User says... Run scan(s)
"套利机会" / "arbitrage opportunities" funding + basis + spread
"市场怎么样" / "market overview" price_movers + volume_anomaly + funding_extreme
"XX币怎么样" / "how is BTC doing" funding + basis + price_movers + long_short (for that symbol only)
"费率" / "funding rate" funding (+ funding_history for deeper analysis)
"稳定币" / "stablecoins" depeg
"新币" / "new listings" new_listing
"风险" / "risk" / "危险信号" funding_extreme + long_short + open_interest
"全扫" / "scan everything" all 12 scans

When the user specifies a particular symbol (e.g., "scan TRUMP"), only scan that symbol — do not scan all 100.


Capabilities: 12 Scan Types

Category A: Arbitrage Scans

1. Funding Rate Arbitrage

Compare perpetual contract funding rates across exchanges. Long on the cheap side, short on the expensive side.

Workflow:

  1. For each symbol, fetch current funding rates from all 4 exchanges
  2. Find lowest and highest rates across exchanges
  3. Calculate rate difference and annualized yield: APY = rate_diff × (365 × 24 / interval_hours) × 100
  4. Filter by minimum APY threshold (default: 0%)
  5. Assign risk level: LOW (major coin + APY<10%), MEDIUM (APY>10%, or any non-major coin regardless of APY), HIGH (APY>50%, or non-major + APY>20%). Major coins: BTC, ETH, BNB, SOL, XRP
  6. Output sorted by APY descending

API endpoints and response parsing:

Binance:

GET https://fapi.binance.com/fapi/v1/premiumIndex?symbol=BTCUSDT
Response: { "lastFundingRate": "0.00010000", ... }
→ Read: float(response["lastFundingRate"])

Bybit:

GET https://api.bybit.com/v5/market/tickers?category=linear&symbol=BTCUSDT
Response: { "result": { "list": [{ "fundingRate": "0.0001", ... }] } }
→ Read: float(response["result"]["list"][0]["fundingRate"])

OKX:

GET https://www.okx.com/api/v5/public/funding-rate?instId=BTC-USDT-SWAP
Response: { "data": [{ "fundingRate": "0.0001", ... }] }
→ Read: float(response["data"][0]["fundingRate"])

Bitget:

GET https://api.bitget.com/api/v2/mix/market/current-fund-rate?symbol=BTCUSDT&productType=USDT-FUTURES
Response: { "data": [{ "fundingRate": "0.0001", ... }] }
→ Read: float(response["data"][0]["fundingRate"])

2. Basis Arbitrage (Spot vs Futures)

Compare spot and perpetual futures prices on the same exchange.

Workflow:

  1. Fetch spot and futures prices from each exchange for each symbol
  2. Calculate basis: (futures - spot) / spot × 100
  3. Flag Contango (futures > spot) or Backwardation (futures < spot)
  4. Filter by absolute basis threshold (default: 0.05%)

API endpoints — Spot price:

Binance:

GET https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT
→ Read: float(response["price"])

Bybit:

GET https://api.bybit.com/v5/market/tickers?category=spot&symbol=BTCUSDT
→ Read: midpoint of float(response["result"]["list"][0]["bid1Price"]) and ["ask1Price"]

OKX:

GET https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT
→ Read: midpoint of float(response["data"][0]["bidPx"]) and ["askPx"]

Bitget:

GET https://api.bitget.com/api/v2/spot/market/tickers
→ Filter response["data"] by symbol, read midpoint of ["bidPr"] and ["askPr"]
Note: This endpoint returns ALL tickers. Filter by matching symbol field.

API endpoints — Futures price:

Binance:

GET https://fapi.binance.com/fapi/v1/ticker/price?symbol=BTCUSDT
→ Read: float(response["price"])

Bybit:

GET https://api.bybit.com/v5/market/tickers?category=linear&symbol=BTCUSDT
→ Read: float(response["result"]["list"][0]["lastPrice"])

OKX:

GET https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT-SWAP
→ Read: float(response["data"][0]["last"])

Bitget:

GET https://api.bitget.com/api/v2/mix/market/tickers?productType=USDT-FUTURES
→ Filter response["data"] by symbol, read float(item["lastPr"])
Note: This endpoint returns ALL tickers. Filter by matching symbol field.

3. Cross-Exchange Spot Spread

Compare bid/ask prices across exchanges for the same symbol.

Workflow:

  1. Fetch best bid/ask from all exchanges (use spot ticker endpoints from scan #2)
  2. Compare all exchange pairs: if bid_B > ask_A, spread exists
  3. Calculate spread percentage: (bid_B - ask_A) / ask_A × 100
  4. Filter by minimum spread threshold (default: 0.02%)

API endpoints — Spot bid/ask:

Binance:

GET https://api.binance.com/api/v3/ticker/bookTicker?symbol=BTCUSDT
→ Read: bid = float(response["bidPrice"]), ask = float(response["askPrice"])

Bybit:

GET https://api.bybit.com/v5/market/tickers?category=spot&symbol=BTCUSDT
→ Read: bid = float(response["result"]["list"][0]["bid1Price"]), ask = ["ask1Price"]

OKX:

GET https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT
→ Read: bid = float(response["data"][0]["bidPx"]), ask = ["askPx"]

Bitget:

GET https://api.bitget.com/api/v2/spot/market/tickers
→ Filter by symbol, read bid = float(item["bidPr"]), ask = float(item["askPr"])

4. Cross-Exchange Futures Spread

Compare perpetual contract prices across exchanges pairwise.

Workflow:

  1. Fetch futures prices from all exchanges for each symbol (use futures price endpoints from scan #2)
  2. Compare all exchange pairs pairwise (up to 6 pairs for 4 exchanges)
  3. Calculate spread percentage: (high_price - low_price) / low_price × 100
  4. Filter by minimum spread threshold (default: 0.03%)
  5. A single symbol may appear multiple times (once per exchange pair that exceeds threshold)

Category B: Market Monitoring

5. Stablecoin Depeg Monitor

Monitor stablecoin prices for deviation from $1.00 (quoted in USDT).

Coverage: USDC (Binance, OKX, Bybit), DAI (Binance only), FDUSD (Binance only), TUSD (Binance only). Bitget is not covered for this scan.

Workflow:

  1. Fetch stablecoin prices from available exchanges
  2. Calculate deviation from $1.00
  3. Flag: STABLE (<0.1%), WATCH (0.1-0.5%), DEPEGGED (>0.5%)

API endpoints:

Binance: GET https://api.binance.com/api/v3/ticker/price?symbol=USDCUSDT → float(response["price"])
OKX:     GET https://www.okx.com/api/v5/market/ticker?instId=USDC-USDT   → float(response["data"][0]["last"])
Bybit:   GET https://api.bybit.com/v5/market/tickers?category=spot&symbol=USDCUSDT → float(response["result"]["list"][0]["lastPrice"])

Replace USDC with DAI, FDUSD, TUSD as needed (Binance only for those).

6. Open Interest Monitor

Track open interest distribution across exchanges. Shows concentration levels for each symbol.

Workflow:

  1. Fetch open interest from all exchanges for each symbol (default: Top 30 symbols)
  2. Compare OI across exchanges, calculate each exchange's share
  3. Label: CONCENTRATED (>60% on one exchange), MODERATE (45-60%), BALANCED (<45%)
  4. Output all symbols with data from ≥2 exchanges, sorted by concentration

API endpoints and response parsing:

Binance:

GET https://fapi.binance.com/fapi/v1/openInterest?symbol=BTCUSDT
→ Read: float(response["openInterest"])  (unit: contracts in base asset)

Bybit:

GET https://api.bybit.com/v5/market/open-interest?category=linear&symbol=BTCUSDT&intervalTime=5min
→ Read: float(response["result"]["list"][0]["openInterest"])

OKX:

GET https://www.okx.com/api/v5/public/open-interest?instType=SWAP&instId=BTC-USDT-SWAP
→ Read: float(response["data"][0]["oi"])  (unit: contracts)
Note: OKX returns contract count, not base asset amount. Units differ from other exchanges.

Bitget:

GET https://api.bitget.com/api/v2/mix/market/open-interest?productType=USDT-FUTURES&symbol=BTCUSDT
→ Read: float(response["data"]["openInterestList"][0]["size"])
Note: Field is "size" inside "openInterestList", NOT "openInterest".

7. Funding Rate Extreme Alert

Flag symbols with extreme funding rates (> ±0.1%) that signal overcrowded positioning and potential reversal.

Workflow:

  1. Fetch current funding rates from all exchanges (same endpoints as scan #1)
  2. Flag any rate exceeding ±0.1% (normal is ~0.01%)
  3. Calculate multiples above normal: multiple = abs(rate) / 0.0001
  4. Label direction: rate > 0 → "LONG CROWDED", rate < 0 → "SHORT CROWDED"
  5. Higher extremes = higher reversal probability

8. Price Movers (24h Gainers/Losers)

Identify the biggest price movers in the last 24 hours across all exchanges.

Workflow:

  1. Fetch 24h ticker data from all exchanges
  2. Extract price change percentage
  3. Rank by absolute change (combined list of gainers and losers, not separate)
  4. Deduplicate by symbol (keep the exchange with the largest move), show top N (default: 20)

API endpoints and response parsing:

Binance:

GET https://fapi.binance.com/fapi/v1/ticker/24hr?symbol=BTCUSDT
→ Read: change = float(response["priceChangePercent"]), volume = float(response["quoteVolume"]), price = float(response["lastPrice"])

Bybit:

GET https://api.bybit.com/v5/market/tickers?category=linear&symbol=BTCUSDT
→ Read: price = float(["lastPrice"]), prev = float(["prevPrice24h"])
→ Compute: change = (price - prev) / prev × 100
→ Volume: float(["turnover24h"])

OKX:

GET https://www.okx.com/api/v5/market/ticker?instId=BTC-USDT-SWAP
→ Read: last = float(["last"]), open = float(["open24h"])
→ Compute: change = (last - open) / open × 100
→ Volume: float(["volCcy24h"])

Bitget:

GET https://api.bitget.com/api/v2/mix/market/tickers?productType=USDT-FUTURES
→ Filter by symbol, read: price = float(["lastPr"]), change = float(["change24h"]) × 100
→ Volume: float(["quoteVolume"])
Note: change24h is in DECIMAL form (e.g., 0.05 = 5%). Multiply by 100.
Note: Returns ALL tickers. Filter by matching symbol field.

9. Volume Anomaly Detection

Detect symbols with unusual volume distribution across exchanges.

Workflow:

  1. Fetch 24h volume from all exchanges for each symbol (same endpoints as scan #8)
  2. Calculate each exchange's share of total volume
  3. Assign signal: VOLUME SPIKE (>70% share on one exchange), ACCUMULATION (>50% share + price change <2%), MOMENTUM (price change >10% regardless of volume distribution), NORMAL (filtered out)
  4. Only non-NORMAL results are shown in output

Category C: Trading Signals

10. Funding Rate Trend

Analyze historical funding rates to find persistent patterns. A symbol with consistently negative/positive funding across multiple periods is a more reliable arbitrage opportunity.

Workflow:

  1. Fetch last 20 funding rate records for each symbol (default: Top 30 symbols)
  2. Count how many consecutive periods the rate stayed positive/negative
  3. Calculate average rate over the streak period
  4. Flag symbols with ≥5 consecutive same-direction rates as "trending"
  5. Annualize the average rate for yield estimate
  6. Label stability: EMERGING (5-9 periods), STABLE (10-14), VERY STABLE (15+)

API endpoints (Binance, Bybit, OKX only — Bitget not included in this scan):

Binance:

GET https://fapi.binance.com/fapi/v1/fundingRate?symbol=BTCUSDT&limit=20
→ Response: list of { "fundingRate": "0.0001", ... } (oldest first)
→ Read: [float(item["fundingRate"]) for item in reversed(response)]

Bybit:

GET https://api.bybit.com/v5/market/funding/history?category=linear&symbol=BTCUSDT&limit=20
→ Read: [float(item["fundingRate"]) for item in response["result"]["list"]]  (newest first)

OKX:

GET https://www.okx.com/api/v5/public/funding-rate-history?instId=BTC-USDT-SWAP&limit=20
→ Read: [float(item["fundingRate"]) for item in response["data"]]

11. Long/Short Ratio

Track the ratio of long vs short positions. Extreme ratios (e.g., 80% long) often precede reversals.

Workflow:

  1. Fetch global long/short account ratio (default: Top 30 symbols)
  2. Include all ratios where either side exceeds 60%
  3. Label signals: EXTREME LONG/SHORT (>75%), LONG/SHORT HEAVY (>65%), MODERATE (>60%)
  4. Output sorted by ratio extremity

API endpoints (Binance and Bybit only — OKX and Bitget do not expose this data):

Binance:

GET https://fapi.binance.com/futures/data/globalLongShortAccountRatio?symbol=BTCUSDT&period=5m&limit=1
→ Response: [{ "longShortRatio": "1.5", ... }]
→ Compute: ratio = float(response[0]["longShortRatio"])
→ long_pct = ratio / (1 + ratio) × 100, short_pct = 100 - long_pct

Bybit:

GET https://api.bybit.com/v5/market/account-ratio?category=linear&symbol=BTCUSDT&period=1h&limit=1
→ Read: buyRatio = float(response["result"]["list"][0]["buyRatio"]), sellRatio = ["sellRatio"]
→ long_pct = buyRatio / (buyRatio + sellRatio) × 100

12. New Listing Detection

Compare trading pair lists across exchanges to find tokens available on some but not all exchanges.

Workflow:

  1. Fetch full list of USDT trading pairs from all 4 exchanges
  2. Compare: find symbols present on 1-2 exchanges but missing on others
  3. Label exclusivity: EXCLUSIVE (1 exchange only), LIMITED (2 exchanges) — note: no recency/date information available
  4. Show which exchanges have it and which don't

API endpoints and response parsing:

Binance:

GET https://api.binance.com/api/v3/exchangeInfo
→ Filter: [s["symbol"] for s in response["symbols"] if s["quoteAsset"] == "USDT" and s["status"] == "TRADING"]

Bybit:

GET https://api.bybit.com/v5/market/instruments-info?category=spot
→ Filter: [s["symbol"] for s in response["result"]["list"] if s["symbol"].endswith("USDT") and s["status"] == "Trading"]

OKX:

GET https://www.okx.com/api/v5/public/instruments?instType=SPOT
→ Filter: [s["instId"].replace("-","") for s in response["data"] if s["instId"].endswith("-USDT") and s["state"] == "live"]

Bitget:

GET https://api.bitget.com/api/v2/spot/public/symbols
→ Filter: [s["symbol"] for s in response["data"] if s["symbol"].endswith("USDT") and s["status"] == "online"]

Output Format

Always present results in a clear table appropriate to the scan type. Example for funding rate:

| Symbol  | Long (低费率)  | Short (高费率) | Rate Diff | Est. APY | Risk   | Window |
|---------|---------------|---------------|-----------|----------|--------|--------|
| ETHUSDT | Bybit 0.001%  | Binance 0.05% | 0.049%    | 53.7%    | MEDIUM | ~8h    |

Scan Categories Quick Reference

Category Scans Purpose
Arbitrage funding, basis, spread, futures_spread Find price/rate discrepancies to exploit
Monitoring depeg, open_interest, funding_extreme, price_movers, volume_anomaly Track market conditions and anomalies
Signals funding_history, long_short, new_listing Identify trading signals and opportunities

Important Notes

  • Read-only: This skill only scans and reports. It never places orders or moves funds.
  • No API keys needed: All data comes from public endpoints.
  • Not financial advice: Opportunities shown are theoretical. Actual execution requires considering gas fees, withdrawal times, slippage, and exchange risks.
  • Rate limits: Respect exchange rate limits. Add ~200ms delay between requests. Do not send burst requests.
  • Coverage: Default Top 30 trading pairs by market cap. Users can request broader scans (e.g., "scan Top 100" or "scan all coins") — the agent can scan any symbol that exists on the exchanges. 4 major exchanges (some scans have limited exchange coverage — see individual scan descriptions).
  • Bitget bulk endpoints: Bitget's spot tickers and futures tickers endpoints return ALL symbols at once. Filter the response by symbol name rather than passing a symbol parameter.

Composable Usage

ArbiScan works best when composed with exchange trading skills:

  1. ArbiScan identifies opportunities and signals (this skill)
  2. Exchange Skills (binance/bybit/bitget) can execute trades if the user decides to act
  3. TradeOS can manage the full workflow

The user always makes the final decision on whether to act on any opportunity.

Standalone Mode

ArbiScan ships with Python scripts that can run independently:

cd scripts/
pip install -r requirements.txt

# Run all scans
python scanner.py --all

# By category
python scanner.py --type arbitrage
python scanner.py --type monitor
python scanner.py --type signals

# Individual scans
python scanner.py --type funding --min-apy 10
python scanner.py --type price_movers
python scanner.py --type long_short
python scanner.py --type new_listing

# Output formats
python scanner.py --type funding --format markdown
python scanner.py --type price_movers --format json

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs