Sospendi le puntate nella fascia oraria in cui costano il doppio

Su 6060 aste concluse con prezzo e valore noti, la stessa asta non costa uguale a
tutte le ore. Prezzo di chiusura mediano in percentuale del valore del prodotto:
4,6% alle 12 e 5,3% fra le 10 e le 13, contro 8,6% a mezzanotte e 9,7% alle 9. Le
puntate necessarie per vincere seguono la stessa curva: 21-24 nelle ore buone,
26-29 in quelle cattive. Quasi il doppio del costo per lo stesso oggetto.

Il motivo e' che di notte Bidoo sospende le puntate: restano poche aste in corso e
la concorrenza si concentra li'. Le ore di confine, mezzanotte e le nove, sono le
peggiori, perche' c'e' ancora qualcosa da giocare e ci sono tutti addosso.

La fascia predefinita e' 00:00-10:00. Sospende le puntate, NON il monitoraggio:
l'asta resta in stato Attiva, continua a essere seguita e riprende a puntare da
sola alla fine della fascia. E' voluto: le aste lunghe attraversano la fascia, e
fermarle davvero significherebbe perderle invece che risparmiare. Ogni puntata
saltata scrive nel registro il motivo e l'orario di ripresa.

Tre livelli di override, dal piu' specifico al piu' generale: la singola asta
scavalca il prodotto, il prodotto scavalca le impostazioni generali. Un null non
vuol dire "no" ma "non ho un'opinione", ed e' la differenza che permette di
spegnere il filtro su una sola asta senza toccare il resto.

Una fascia a cavallo di mezzanotte (22-6) funziona; inizio uguale a fine vuol dire
filtro spento, che e' l'unica lettura sensata visto che l'alternativa sarebbe non
puntare mai.

Backtest della regola sul duello, completato su tutte le soglie. Sui dossier veri
in cui il bot ha puntato: 13 aste, 366 puntate, zero vittorie. Con soglia 5 le
puntate sarebbero state 49, risparmiate 317 (86,6%), nessuna vittoria persa. Il
risultato tiene da soglia 2 a soglia 10, che e' quanto ci si puo' aspettare da un
campione in cui non si era vinto niente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 15:50:06 +02:00
co-authored by Claude Opus 5
parent 5bac29b0af
commit 8b9691d692
6 changed files with 239 additions and 0 deletions
+40
View File
@@ -190,6 +190,26 @@ namespace AutoBidder.Services
return decision;
}
// 0-bis. FASCIA ORARIA SOSPESA.
//
// L'asta NON viene fermata: resta Attiva, continua a essere seguita e
// riprende a puntare da sola alla fine della fascia. È voluto — le aste
// lunghe attraversano la fascia, e fermarle davvero significherebbe
// perderle invece che risparmiare.
//
// Su 6060 aste concluse: chiusura mediana al 4,6% del valore alle 12 e al
// 5,3% fra le 10 e le 13, contro l'8,6% a mezzanotte e il 9,7% alle 9, con
// 26-29 puntate per vincere invece di 21-24. Quasi il doppio del costo per
// lo stesso oggetto.
if (QuietHoursApply(auction, settings) &&
Utilities.BiddingHours.IsQuiet(DateTime.Now, settings.QuietHoursStart, settings.QuietHoursEnd))
{
decision.ShouldBid = false;
decision.Reason = Utilities.BiddingHours.Spiegazione(
settings.QuietHoursStart, settings.QuietHoursEnd);
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%!
@@ -486,6 +506,26 @@ namespace AutoBidder.Services
/// <summary>
/// Registra una puntata effettuata (per tracking)
/// </summary>
/// <summary>
/// La sospensione a fascia oraria vale per quest'asta?
///
/// <para>Tre livelli, dal più specifico al più generale: l'asta scavalca il
/// prodotto, il prodotto scavalca le impostazioni generali. Un <c>null</c> non
/// significa "no", significa "non ho un'opinione": è la differenza che permette di
/// spegnere il filtro su una singola asta senza toccare il resto.</para>
/// </summary>
public static bool QuietHoursApply(AuctionInfo auction, AppSettings settings)
{
if (auction?.QuietHoursEnabledOverride is { } perAsta) return perAsta;
// Le aste del monitor non portano con sé l'id prodotto di Bidoo: la scheda si
// ritrova dal nome, che è la via prevista da WatchedProductsStore.
var scheda = WatchedProductsStore.FindByName(auction?.Name);
if (scheda?.QuietHoursEnabled is { } perProdotto) return perProdotto;
return settings.QuietHoursEnabled;
}
public void RecordBidAttempt(AuctionInfo auction, bool success, bool collision = false)
{
auction.SessionBidCount++;