From 429a05f8854e1be013a6d61b7463daed9718cef2 Mon Sep 17 00:00:00 2001 From: Richard Date: Tue, 7 Jul 2026 19:14:50 +0200 Subject: [PATCH] Phase 4.1: Maker-Einstieg (dormant, per-Master-Flag) - Ist TrackedTrader.MakerEntry gesetzt, wird der BUY OHNE Preisaufschlag als ruhendes GTC-Limit am Master-Preis platziert (statt teurem Taker-Fill via GTD), spart Fees/Spread bei langsamen Mastern. Nutzt die getestete CopyTradingRisk.CalculateBuyOrderPrice (0 % Aufschlag). Default aus -> dormant. (Ohne Orderbuch ist der Master-Preis die Naeherung fuer den Bid; echte Bid-Platzierung + Nichtfill-Eskalation folgen mit dem Market-Channel/Zielland.) 207 Tests gruen. Build/Smoke gruen. Co-Authored-By: Claude Opus 4.8 --- .../Services/CopyTradingEngine.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs b/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs index 8300887..c4122b7 100644 --- a/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs +++ b/src/PolyTrader.Modules.CopyTrading/Services/CopyTradingEngine.cs @@ -371,9 +371,14 @@ namespace PolyTraderSharp.Services return; } - // Limit-Preis (HF-fest / prozentual, gedeckelt) – CopyTradingRisk, unit-getestet - orderPrice = CopyTradingRisk.CalculateBuyOrderPrice( - signal.Price, trader != null && trader.Category == "HF", settings.MaxPriceDifference, settings.MaxBuyPrice); + // Limit-Preis (HF-fest / prozentual, gedeckelt) – CopyTradingRisk, unit-getestet. + // Phase 4.1: Maker-Einstieg platziert OHNE Aufschlag (ruhendes GTC-Limit am + // Master-Preis statt teurem Taker-Fill über dem Ask) – spart Fees/Spread bei + // langsamen Mastern. (Ohne Orderbuch ist der Master-Preis die Näherung für den Bid.) + bool makerEntry = trader != null && trader.MakerEntry; + orderPrice = makerEntry + ? CopyTradingRisk.CalculateBuyOrderPrice(signal.Price, false, 0m, settings.MaxBuyPrice) + : CopyTradingRisk.CalculateBuyOrderPrice(signal.Price, trader != null && trader.Category == "HF", settings.MaxPriceDifference, settings.MaxBuyPrice); var exact = PolymarketClobClient.CalculateExactOrderAmounts(maxAmountToBuy, orderPrice, orderPrice, "BUY"); if (exact.shares <= 0 || exact.usdc > account.AvailableBalance) @@ -527,7 +532,9 @@ namespace PolyTraderSharp.Services $" Account: {account.Name}\n" + $" Limit: ${orderPrice:F3} (Target: {signal.Price:F3})"); - var result = await _clob.PlaceOrderAsync(account, signal.TokenId, signal.Side, exactUsdc, orderPrice, "GTD", _state.DebugOrderPayloadLog, isNegRisk); + // Maker-Einstieg (Phase 4.1) ruht als GTC-Limit; sonst GTD (Taker-nah). + string buyOrderType = (trader != null && trader.MakerEntry) ? "GTC" : "GTD"; + var result = await _clob.PlaceOrderAsync(account, signal.TokenId, signal.Side, exactUsdc, orderPrice, buyOrderType, _state.DebugOrderPayloadLog, isNegRisk); if (result == "OK") {