Fix: live market buy was buying N coins instead of spending N EUR #8

Merged
DasAoD merged 1 commit from fix/live-market-buy-cost into main 2026-08-29 01:53:21 +02:00
Owner

Live-Bug, auf dem Deploy-Host gefunden. Jeder Live-buy schlug mit EOrder:Insufficient funds fehl.

Ursache

kraken_client.live_market_buy hat das EUR-Budget als amount an create_order(..., "market", "buy", quote_budget) übergeben, zusammen mit options["createMarketBuyOrderRequiresPrice"] = False. Die eingesetzte ccxt-Version (4.5.76) liest diesen amount als Basis-Menge → buy 6 heißt „6 BTC kaufen" (~400.000 €), nicht „6 € ausgeben". Ergebnis: jede Order abgelehnt.

Auf einem gut gefüllten Konto hätte das stattdessen eine massiv überdimensionierte Order platzieren können – deshalb kritisch.

Fix

exchange.create_market_buy_order_with_cost(symbol, quote_budget) verwenden. Gegen Kraken per validate geprüft:

Kraken descr.order
alt (create_order, amount=6.0) buy 6.00000 XBT @ market
neu (..._with_cost(6.0)) buy 6.00 XBTEUR @ market ✓

Der Rest von live_market_buy (Re-Fetch der Fill-Details, Fee-Parsing) bleibt unverändert.

Tests

  • test_kraken_client.py (neu): live_market_buy ruft die Cost-Methode mit dem Budget als cost auf (nicht create_order); Re-Fetch-Pfad; „kein Fill → failed"
  • pytest → 79 passed

Nach dem Merge (Deploy vpn)

git pull in /opt/krypto-dca-bot, systemctl restart krypto-dca-backend.service, systemctl reset-failed krypto-dca-buy.service. Es wurde nie echtes Geld bewegt (0 Live-Trades, Guthaben unverändert 100 €).

Co-authored-by: Claude claude@anthropic.com

**Live-Bug, auf dem Deploy-Host gefunden.** Jeder Live-`buy` schlug mit `EOrder:Insufficient funds` fehl. ## Ursache `kraken_client.live_market_buy` hat das EUR-Budget als `amount` an `create_order(..., "market", "buy", quote_budget)` übergeben, zusammen mit `options["createMarketBuyOrderRequiresPrice"] = False`. Die eingesetzte ccxt-Version (4.5.76) liest diesen `amount` als **Basis-Menge** → `buy 6` heißt „6 BTC kaufen" (~400.000 €), nicht „6 € ausgeben". Ergebnis: jede Order abgelehnt. Auf einem gut gefüllten Konto hätte das stattdessen eine massiv überdimensionierte Order platzieren können – deshalb kritisch. ## Fix `exchange.create_market_buy_order_with_cost(symbol, quote_budget)` verwenden. Gegen Kraken per `validate` geprüft: | | Kraken `descr.order` | |---|---| | alt (`create_order`, `amount=6.0`) | `buy 6.00000 XBT @ market` | | neu (`..._with_cost(6.0)`) | `buy 6.00 XBTEUR @ market` ✓ | Der Rest von `live_market_buy` (Re-Fetch der Fill-Details, Fee-Parsing) bleibt unverändert. ## Tests - `test_kraken_client.py` (neu): `live_market_buy` ruft die Cost-Methode mit dem Budget als `cost` auf (nicht `create_order`); Re-Fetch-Pfad; „kein Fill → failed" - `pytest` → **79 passed** ## Nach dem Merge (Deploy `vpn`) `git pull` in `/opt/krypto-dca-bot`, `systemctl restart krypto-dca-backend.service`, `systemctl reset-failed krypto-dca-buy.service`. Es wurde nie echtes Geld bewegt (0 Live-Trades, Guthaben unverändert 100 €). Co-authored-by: Claude <claude@anthropic.com>
live_market_buy passed the EUR budget as the plain `amount` to create_order
with options["createMarketBuyOrderRequiresPrice"] = False. Current ccxt (4.5.76)
reads that amount as a BASE quantity, so `buy 6` meant "buy 6 BTC" (~400k EUR)
and every live buy failed with EOrder:Insufficient funds. On a well-funded
account it could instead have placed a massively oversized order.

- use exchange.create_market_buy_order_with_cost(symbol, quote_budget); verified
  against Kraken via validate: order descr becomes "buy 6.00 XBTEUR @ market"
- tests: live_market_buy calls the cost method with the budget as cost, the
  re-fetch path still works, no-fill -> failed

Co-authored-by: Claude <claude@anthropic.com>
DasAoD merged commit 7227769d67 into main 2026-08-29 01:53:21 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
DasAoD/krypto-dca-bot!8
No description provided.