Untitled

 avatar
unknown
python
10 months ago
4.0 kB
17
Indexable
def verify_and_restore_orders_strict():
    """
    Erzwingt: pro Grid-Step/Side existiert genau EINE offene Order.
    - Gruppenbildung per Prefix: grid-{symbol}-{step}-{b|s}
    - behält die älteste pro Gruppe, cancelt alle weiteren Duplikate
    - spiegelt die behaltene Order ins Grid
    - erstellt fehlende Orders
    - cancelt alle offenen Orders, deren Prefix zu keinem aktuellen Grid-Step gehört
    """
    # 1) Offene Orders komplett holen
    opens = get_all_open_orders()

    # 2) Prefix -> Liste Orders
    groups = {}
    for o in opens:
        lid = o.get("orderLinkId") or ""
        if not lid.startswith("grid-"):
            continue
        info = parse_link_id(lid)
        if info is None:
            # Fallback: grid-SYMBOL-step-s|b-...
            parts = lid.split('-')
            if len(parts) < 4:
                continue
            pref = '-'.join(parts[:4])
        else:
            pref = link_prefix(info["step"], info["side"])

        groups.setdefault(pref, []).append(o)

    # 3) Erlaubte Prefixe aus aktuellem Grid (sorgt auch dafür, dass alte BOOT_IDs egal sind)
    valid_prefixes = {link_prefix(g["step"], g["current_side"]) for g in grid}

    # 4) Für jede Gruppe: eine behalten (älteste), Rest canceln
    kept_by_prefix = {}
    for pref, lst in groups.items():
        # älteste = kleinste createdTime
        def _created_ts(o):
            try:
                return int(o.get("createdTime", "0"))
            except Exception:
                return 0

        lst_sorted = sorted(lst, key=_created_ts)
        keep = lst_sorted[0]
        kept_by_prefix[pref] = keep

        for extra in lst_sorted[1:]:
            try:
                session.cancel_order(category=category, symbol=symbol_btcusd, orderId=extra["orderId"])
                debug(f"Duplikat gelöscht (gleicher Prefix): {extra.get('orderLinkId')} @ {extra.get('price')}")
            except Exception as e:
                debug(f"Cancel-Fehler Duplikat {extra.get('orderId')}: {e}")

    # 5) Alle offenen Orders, deren Prefix NICHT im aktuellen Grid ist, canceln
    for pref, o in list(kept_by_prefix.items()):
        if pref not in valid_prefixes:
            try:
                session.cancel_order(category=category, symbol=symbol_btcusd, orderId=o["orderId"])
                debug(f"Order außerhalb Grid gelöscht: {o.get('orderLinkId')} @ {o.get('price')}")
                kept_by_prefix.pop(pref, None)
            except Exception as e:
                debug(f"Cancel-Fehler außerhalb Grid {o.get('orderId')}: {e}")

    # 6) Für jeden Grid-Step: spiegeln oder neu erstellen
    for g in grid:
        pref = link_prefix(g["step"], g["current_side"])
        o = kept_by_prefix.get(pref)
        if o:
            # Sync ins Grid
            if g.get("current_order_id") != o["orderId"]:
                debug(f"Sync orderId: Step {g['step']} {g.get('current_order_id')} → {o['orderId']}")
            g["current_order_id"] = o["orderId"]
            g["current_link_id"] = o.get("orderLinkId")
            try:
                g["current_order_price"] = float(o["price"])
            except Exception:
                pass
        else:
            # fehlend → exakt EINE neue Order erzeugen
            size = order_size_buy if g["current_side"] == "Buy" else order_size_sell
            base_price = g["buy_base"] if g["current_side"] == "Buy" else g["sell_base"]
            g["link_gen"] = int(g.get("link_gen", 0)) + 1
            g["current_link_id"] = make_link_id(g["step"], g["current_side"], g["link_gen"])
            new_id, created_time, final_price = create_single_order(size, base_price, g["current_side"], g["step"])
            if new_id:
                g["current_order_id"] = new_id
                g["current_createdTime"] = created_time
                g["current_value"] = size
                g["current_order_price"] = final_price
Editor is loading...
Leave a Comment