Ritirati dai duelli con l'autopuntata, e punta a mezzo secondo
La strategia A, dai numeri dei dossier: 5410 aste, 2,08 milioni di puntate. Bidoo dichiara per ogni puntata se e' automatica o manuale. Le automatiche sono il 75,3% del totale ma vincono il 46,0% delle aste; le manuali sono il 24,7% e ne vincono il 53,9%. Una puntata manuale vale 3,6 volte una automatica: 178 puntate per vittoria contro 634. Il meccanismo del duello e' stato ricostruito esattamente. L'intervallo mediano fra due puntate consecutive e' 6,0 s su 2.799.681 intervalli: il timer si azzera a ~8 s e l'autopuntata scatta a 2 s, quindi 8-2=6. Il ciclo da 13,0 s osservato nelle prove reali era la somma di 7 s di attesa nostra e 6 s della sua risposta. Puntare tardi non evita l'autopuntata avversaria: la sveglia, perche' si riarma quando il suo padrone perde la testa della classifica, non a un orario fisso. Contro una macchina cosi' non esiste attrito vincibile. Adesso il motore conta le risposte con la firma dei 6+/-2,5 s e dopo cinque di fila smette di puntare su quell'asta. Una risposta fuori firma azzera il conteggio invece di scalarlo: l'errore costoso e' ritirarsi da un'asta che si poteva vincere, non spendere cinque puntate di troppo. Rigiocato sui dossier veri in cui il bot ha puntato: 366 puntate spese, 13 aste, zero vittorie. Con la regola a soglia 3 sarebbero state 31 puntate, 335 risparmiate (91,5%), nessuna vittoria persa. L'anticipo passa da 1000 a 500 ms. Le due ragioni per stare larghi sono cadute: il p99,9 del ping a 444 ms era misurato col tetto di 40 richieste al secondo che accodava le chiamate, e senza tetto il ping sta fra 47 e 78 ms; e la concorrenza sotto i due secondi non e' fitta ma rada, visto che tre quarti degli avversari sono autopuntate che hanno gia' sparato. Il tipo di puntata non viene piu' inventato. In due punti il motore ricostruiva una puntata da un cambio di prezzo fra due interrogazioni e la marcava "Auto" comunque: adesso quelle portano un trattino, perche' il tipo non lo ha detto nessuno. La colonna in cronologia mostra quindi solo tipi dichiarati dal server. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -620,7 +620,7 @@ namespace AutoBidder.Services
|
||||
Username = state.LastBidder,
|
||||
Price = statePrice,
|
||||
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
|
||||
BidType = "Auto"
|
||||
BidType = BidHistoryEntry.TipoSconosciuto
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1193,10 +1193,20 @@ namespace AutoBidder.Services
|
||||
Username = currentBidder,
|
||||
Price = statePrice,
|
||||
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
|
||||
BidType = "Auto"
|
||||
BidType = BidHistoryEntry.TipoSconosciuto
|
||||
});
|
||||
}
|
||||
|
||||
// Una puntata avversaria: se arriva col ritardo tipico dell'autopuntata
|
||||
// (~6 s dalla nostra) alimenta il conteggio del duello.
|
||||
var impostazioni = SettingsManager.Load();
|
||||
if (impostazioni.AutoBidDuelWithdrawEnabled &&
|
||||
auction.NoteOpponentResponse(DateTime.UtcNow, impostazioni.AutoBidDuelResponses))
|
||||
{
|
||||
auction.AddLog(AutoBidDuel.Spiegazione(auction.AutoResponsesInARow),
|
||||
AuctionLogLevel.Warning, AuctionLogCategory.Strategy);
|
||||
}
|
||||
|
||||
// I conteggi per utente restano a carico di UpdateBidderStatsFromRecentBids,
|
||||
// unico punto che li tocca: contarli anche qui li raddoppierebbe.
|
||||
}
|
||||
|
||||
@@ -169,7 +169,27 @@ namespace AutoBidder.Services
|
||||
{
|
||||
return decision;
|
||||
}
|
||||
|
||||
|
||||
// 0. DUELLO CON L'AUTOPUNTATA — il primo controllo, perché è quello che
|
||||
// costa di più sbagliare.
|
||||
//
|
||||
// L'autopuntata del sito scatta a 2 secondi e si riarma ogni volta che il suo
|
||||
// padrone perde la testa: risponde sempre, risponde in ~6 secondi, e non si
|
||||
// stanca. Contro di lei non esiste attrito che si possa vincere — si
|
||||
// scambiano puntate una a una finché uno dei due esaurisce il credito.
|
||||
//
|
||||
// Nelle prove reali il motore ci ha lasciato 191 puntate su tre aste per zero
|
||||
// vittorie, con un ciclo regolare da 13,0 secondi (7 di attesa nostra più 6
|
||||
// della sua risposta). Rigiocando i dossier con questa regola, quelle aste
|
||||
// sarebbero costate una manciata di puntate senza perdere nessuna vittoria,
|
||||
// perché vittorie non ce n'erano.
|
||||
if (settings.AutoBidDuelWithdrawEnabled && auction.AutoBidDuelDetected)
|
||||
{
|
||||
decision.ShouldBid = false;
|
||||
decision.Reason = Utilities.AutoBidDuel.Spiegazione(auction.AutoResponsesInARow);
|
||||
return decision;
|
||||
}
|
||||
|
||||
// ? RIMOSSO: Entry Point - Era sbagliato!
|
||||
// I limiti MinPrice/MaxPrice impostati dall'utente sono RIGIDI.
|
||||
// Se l'utente imposta MaxPrice=2�, vuole puntare FINO A 2�, non fino al 70%!
|
||||
@@ -475,6 +495,11 @@ namespace AutoBidder.Services
|
||||
{
|
||||
auction.SuccessfulBidCount++;
|
||||
auction.ConsecutiveCollisions = 0;
|
||||
|
||||
// Da qui si misura quanto tarda la risposta avversaria: e' l'unico punto
|
||||
// attraversato sia dal motore dal vivo sia dalla rigiocata sui dossier,
|
||||
// quindi la regola del duello vede le stesse cose in entrambi.
|
||||
auction.LastMyBidAtUtc = DateTime.UtcNow;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user