Untitled
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_priceEditor is loading...
Leave a Comment