The Bot Ledger
DE

Start / Anleitungen

Limitless-API-Anleitung: Trading-Bot in 5 Schritten anbinden

Limitless-Exchange-API für einen Bot: Wallet-Auth, Märkte, Orderbuch, signierte Orders, On-Chain-Fills auf Base und eine Gebühr, die in Token bezahlt wird.

A world map with a network of connections
Auth
Wallet-Signatur; Orders sind signierte Nachrichten, die auf Base abgewickelt werden.
Lesen
REST für Märkte und Orderbücher; Orderbuch-Snapshots tragen die Bedingungen des Liquiditätsprogramms inline.
Handeln
Signierte Limit-Orders; Fills sind On-Chain-Events.
Taker-Gebühr
Etwa 3 Prozent bei 50 Cent, fallend auf unter 0,5 Prozent nahe 1.00, bezahlt in Outcome-Token. Maker zahlen nichts.
Abrechnung
60-Sekunden-Orakel-Durchschnitt; Schluss auf oder über Eröffnung löst als Up auf.
Geografie
Sperrt die USA.
Doku
docs.limitless.exchange

Fünf Schritte, vereinfacht. Wie bei Predict.fun ändern sich die exakten Pfade; die Form ist das, was zählt.

  1. Mit der Wallet anmelden

    from eth_account import Account
    from eth_account.messages import encode_defunct
    import requests
    
    BASE = "https://api.limitless.exchange"       # in der Doku bestätigen
    acct = Account.from_key(PRIVATE_KEY)
    nonce = requests.get(f"{BASE}/auth/nonce", params={"address": acct.address}).json()["nonce"]
    sig = acct.sign_message(encode_defunct(text=nonce)).signature.hex()
    token = requests.post(f"{BASE}/auth/login", json={"address": acct.address, "signature": sig}).json()["token"]
    H = {"Authorization": f"Bearer {token}"}
  2. Das aktuelle Fenster finden

    m = requests.get(f"{BASE}/markets/btc-updown-5m-1757500800", headers=H).json()
    print(m["resolvePrice"], m["metadata"])      # resolvePrice erscheint nach der Abrechnung
  3. Das Orderbuch lesen

    book = requests.get(f"{BASE}/markets/{m['slug']}/orderbook", headers=H).json()
    best_ask, best_bid = book["asks"][0], book["bids"][0]
    if best_ask[0] - best_bid[0] > 0.08:
        pass                                       # die meisten späten Fenster scheitern an diesem Filter

    Das späte Orderbuch ist oft 20 Cent breit. Ein Spread-Filter, der auf Polymarket funktioniert, blockiert hier fast jede Auslösung; entscheide vorher, ob du den breiteren Spread akzeptierst oder die Börse auslässt.

  4. Einen Taker-Kauf platzieren

    order = {"market": m["slug"], "outcome": "UP", "side": "BUY", "price": best_ask[0], "size": 30}
    signed = sign_order(order, acct)              # die Doku zeigt das Typed-Data-Layout
    r = requests.post(f"{BASE}/orders", json=signed, headers=H).json()
  5. Fills von der Chain lesen

    Jeder Fill ist ein Event auf Base. Ein Indexer wie HyperSync zieht die komplette Historie einer Wallet in Minuten, was auch der günstigste Weg ist, einen Konkurrenten zu prüfen.

    fills = requests.get(f"{BASE}/fills", params={"address": acct.address}, headers=H).json()

Zwei Fakten, die die Rechnung ändern

  • Die Kaufgebühr ist ein Prozentsatz des Preises, nicht p(1-p), also sind billige Kontrakte teuer zu kaufen und teure Kontrakte fast kostenlos. Der Break-even-Rechner auf der Startseite nutzt die veröffentlichte Kurve.
  • Modelle, die auf Fill-Preisen statt auf ausführbaren Asks trainiert wurden, sahen in der Validierung hervorragend aus und verloren auf echten Orderbüchern. Bepreise die Down-Seite aus dem Down-Orderbuch, nie als eins minus dem Up-Ask.