Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
37-tool crypto derivatives data suite: funding rates, open interest, liquidations, Hyperliquid whale tracking, and ETF flows.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
tools/futures_market.py
1#!/usr/bin/env python32"""3Coinglass Futures Market Module45Provides futures market data: supported coins, exchanges, pairs,6coin-level market data, pair-level data, and OHLC price history.7"""89import sys10import json11import argparse12from typing import Dict, Any, Optional, List1314from ._api import cg_request151617def _format_funding_rate(val: Any) -> Any:18"""Format numeric funding-rate values to percent strings."""19if isinstance(val, (int, float)):20sign = "+" if val >= 0 else ""21return f"{sign}{val:.4f}%"22if isinstance(val, str):23s = val.strip()24if s.endswith("%"):25return s26try:27num = float(s)28sign = "+" if num >= 0 else ""29return f"{sign}{num:.4f}%"30except ValueError:31return val32return val333435def _normalize_funding_fields(obj: Any) -> Any:36"""Recursively normalize only funding-rate fields; keep all other fields unchanged."""37if isinstance(obj, list):38return [_normalize_funding_fields(x) for x in obj]39if isinstance(obj, dict):40out = {}41for k, v in obj.items():42lk = k.lower()43if "funding" in lk and "rate" in lk:44out[k] = _format_funding_rate(v)45else:46out[k] = _normalize_funding_fields(v)47return out48return obj495051def get_supported_coins() -> Optional[List[str]]:52"""Get list of coins supported by Coinglass futures data."""53return cg_request("api/futures/supported-coins")545556def get_supported_exchanges() -> Optional[List[Dict[str, Any]]]:57"""Get list of exchanges with supported trading pairs."""58return cg_request("api/futures/supported-exchange-pairs")596061def get_supported_pairs(62exchange: str = "Binance"63) -> Optional[List[Dict[str, Any]]]:64"""65Get supported trading pairs for a specific exchange.6667Args:68exchange: Exchange name (Binance, OKX, Bybit, etc.)69"""70return cg_request(71"api/futures/supported-exchange-pairs",72params={"exchange": exchange}73)747576def get_coins_data(77symbol: Optional[str] = None78) -> Optional[List[Dict[str, Any]]]:79"""80Get futures market data aggregated by coin.8182Args:83symbol: Optional coin filter (BTC, ETH, etc.)84"""85params = {}86if symbol:87params["symbol"] = symbol88data = cg_request("api/futures/coins-markets", params=params or None)89return _normalize_funding_fields(data)909192def get_pair_data(93symbol: str = "BTC",94exchange: Optional[str] = None95) -> Optional[List[Dict[str, Any]]]:96"""97Get futures market data by trading pair.9899Args:100symbol: Coin symbol (BTC, ETH, etc.)101exchange: Optional exchange filter.102"""103params = {"symbol": symbol}104if exchange:105params["exchange"] = exchange106data = cg_request("api/futures/pairs-markets", params=params)107return _normalize_funding_fields(data)108109110def get_ohlc_history(111symbol: str = "BTC",112interval: str = "h4",113exchange: Optional[str] = None114) -> Optional[List[Dict[str, Any]]]:115"""116Get OHLC price history for a futures pair.117118Args:119symbol: Coin symbol.120interval: Time interval (m1, m5, m15, h1, h4, h12, h24).121exchange: Optional exchange filter.122"""123params = {"symbol": symbol, "interval": interval}124if exchange:125params["exchange"] = exchange126return cg_request("api/futures/price/history", params=params)127128129def main():130"""CLI entry point."""131parser = argparse.ArgumentParser(132description="Coinglass Futures Market Tools"133)134parser.add_argument("action", choices=[135"coins", "exchanges", "pairs", "market", "ohlc"136])137parser.add_argument("--symbol", "-s", default="BTC")138parser.add_argument("--exchange", "-e", default=None)139parser.add_argument("--interval", "-i", default="h4")140args = parser.parse_args()141142actions = {143"coins": get_supported_coins,144"exchanges": get_supported_exchanges,145"pairs": lambda: get_supported_pairs(args.exchange or "Binance"),146"market": lambda: get_coins_data(args.symbol),147"ohlc": lambda: get_ohlc_history(148args.symbol, args.interval, args.exchange149),150}151152try:153result = actions[args.action]()154print(json.dumps(result, indent=2))155except Exception as e:156print(f"Error: {e}", file=sys.stderr)157sys.exit(1)158159160if __name__ == "__main__":161main()162