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") {