Sostituisci le euristiche a soglia con regime e anticipo adattivi; un solo archivio per asta
Le strategie a numero fisso (calore, ritiro morbido, anti-bot, avversari aggressivi, puntata probabilistica, velocità del prezzo, esaurimento, concorrenza) e le impostazioni morte (cadenze di polling, finestra critica, database, log avanzati, suggerimenti sull'anticipo, schede dettagliate) non ci sono più: rigiocate sui dossier non fermavano una puntata sbagliata senza fermarne anche di giuste, e i loro numeri andavano tarati a mano. Restano i paletti dell'utente (tetti, budget, fascia oraria) e il duello. Al loro posto due componenti che imparano dalla sessione in corso, dentro i paletti: - CompetitionRegime per asta (Calmo / Sfogo / Sondaggio) guidato dal valore atteso appreso: tre negativi di fila e si lascia sfogare gli altri, si rientra con una puntata di prova dopo abbastanza cicli buoni, e se viene coperta subito la pazienza raddoppia. È il "capire da soli quando tornare a puntare". - LatencyModel per l'anticipo: margine + p99 della latenza misurata adesso, tenuto fra LeadMinMs e LeadMaxMs; una puntata tardiva alza il margine subito, venti in tempo lo abbassano piano. Un anticipo scritto a mano su un'asta vince sempre (BidLeadIsManual). Archiviazione: l'archivio mensile aste-AAAA-MM.jsonl (95 MB) duplicava il riepilogo che ogni dossier ha già in coda. AuctionDetailStore ora legge testa e coda dei dossier, con cache: 6349 file in 6 s la prima volta. Pulsanti per svuotare le esportazioni e per azzerare le statistiche voce per voce (lo storico passa dalla copia di sicurezza). Scheda Apprendimento: sezione "Autonomia sul momento" con il modello di latenza e il regime di ogni asta seguita. Ml/LEGGIMI.md descrive l'algoritmo per intero. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,9 @@ namespace AutoBidder
|
||||
|
||||
// Carica impostazioni predefinite aste
|
||||
DefaultBidBeforeDeadlineMs.Text = settings.DefaultBidBeforeDeadlineMs.ToString();
|
||||
Settings.AdaptiveLeadCheckBox.IsChecked = settings.AdaptiveLeadEnabled;
|
||||
Settings.LeadMinMsTextBox.Text = settings.LeadMinMs.ToString();
|
||||
Settings.LeadMaxMsTextBox.Text = settings.LeadMaxMs.ToString();
|
||||
DefaultMinPrice.Text = settings.DefaultMinPrice.ToString("F2", System.Globalization.CultureInfo.InvariantCulture);
|
||||
DefaultMaxPrice.Text = settings.DefaultMaxPrice.ToString("F2", System.Globalization.CultureInfo.InvariantCulture);
|
||||
DefaultMaxClicks.Text = settings.DefaultMaxClicks.ToString();
|
||||
@@ -63,11 +66,6 @@ namespace AutoBidder
|
||||
}
|
||||
|
||||
// Motore di precisione
|
||||
Settings.PollIntervalFarMsTextBox.Text = settings.PollIntervalFarMs.ToString();
|
||||
Settings.PollIntervalMidMsTextBox.Text = settings.PollIntervalMidMs.ToString();
|
||||
Settings.PollIntervalNearMsTextBox.Text = settings.PollIntervalNearMs.ToString();
|
||||
Settings.PollIntervalCriticalMsTextBox.Text = settings.PollIntervalCriticalMs.ToString();
|
||||
Settings.CriticalWindowMsTextBox.Text = settings.CriticalWindowMs.ToString();
|
||||
Settings.MaxRequestsPerSecondTextBox.Text = settings.MaxRequestsPerSecond.ToString("F0", System.Globalization.CultureInfo.InvariantCulture);
|
||||
Settings.PrecisionTimerCheckBox.IsChecked = settings.PrecisionTimerEnabled;
|
||||
|
||||
@@ -88,7 +86,6 @@ namespace AutoBidder
|
||||
|
||||
// Anticipo, aste programmate, notifiche, cartelle
|
||||
Settings.BidLeadTrackingCheckBox.IsChecked = settings.BidLeadTrackingEnabled;
|
||||
Settings.BidLeadSuggestionsCheckBox.IsChecked = settings.BidLeadSuggestionsEnabled;
|
||||
Settings.BidLeadMinSamplesTextBox.Text = settings.BidLeadMinSamples.ToString();
|
||||
|
||||
Settings.ScheduledBackoffCheckBox.IsChecked = settings.ScheduledAuctionBackoffEnabled;
|
||||
@@ -104,7 +101,6 @@ namespace AutoBidder
|
||||
// ed è quello che serve sapere.
|
||||
RefreshDataFolderFields();
|
||||
|
||||
Settings.DetailedStatsCheckBox.IsChecked = settings.DetailedStatsEnabled;
|
||||
Settings.CatalogCacheSecondsTextBox.Text = settings.CatalogCacheSeconds.ToString();
|
||||
|
||||
Settings.QuietHoursCheckBox.IsChecked = settings.QuietHoursEnabled;
|
||||
@@ -190,6 +186,16 @@ namespace AutoBidder
|
||||
Log("[ERRORE] Valore anticipo puntata non valido (deve essere 0-5000ms)", LogLevel.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
// Paletti dell'anticipo adattivo: minimo sotto il massimo, entrambi sensati.
|
||||
settings.AdaptiveLeadEnabled = Settings.AdaptiveLeadCheckBox.IsChecked == true;
|
||||
settings.LeadMinMs = ReadBounded(Settings.LeadMinMsTextBox.Text, settings.LeadMinMs, 100, 5000, "anticipo minimo", " ms");
|
||||
settings.LeadMaxMs = ReadBounded(Settings.LeadMaxMsTextBox.Text, settings.LeadMaxMs, 100, 5000, "anticipo massimo", " ms");
|
||||
if (settings.LeadMaxMs < settings.LeadMinMs)
|
||||
{
|
||||
Log($"[ERRORE] Anticipo massimo ({settings.LeadMaxMs} ms) sotto il minimo ({settings.LeadMinMs} ms): riportato al minimo", LogLevel.Error);
|
||||
settings.LeadMaxMs = settings.LeadMinMs;
|
||||
}
|
||||
|
||||
|
||||
if (double.TryParse(DefaultMinPrice.Text.Replace(',', '.'), System.Globalization.NumberStyles.Any,
|
||||
@@ -320,11 +326,6 @@ namespace AutoBidder
|
||||
// === SEZIONE: Motore di precisione ===
|
||||
// Ogni cadenza ha un minimo sensato: sotto i 100 ms si spreca banda senza
|
||||
// guadagnare precisione, perché la puntata la decide il cecchino, non il poll.
|
||||
settings.PollIntervalFarMs = ReadBounded(Settings.PollIntervalFarMsTextBox.Text, settings.PollIntervalFarMs, 200, 30000, "polling lontano");
|
||||
settings.PollIntervalMidMs = ReadBounded(Settings.PollIntervalMidMsTextBox.Text, settings.PollIntervalMidMs, 150, 10000, "polling medio");
|
||||
settings.PollIntervalNearMs = ReadBounded(Settings.PollIntervalNearMsTextBox.Text, settings.PollIntervalNearMs, 100, 5000, "polling vicino");
|
||||
settings.PollIntervalCriticalMs = ReadBounded(Settings.PollIntervalCriticalMsTextBox.Text, settings.PollIntervalCriticalMs, 100, 3000, "polling critico");
|
||||
settings.CriticalWindowMs = ReadBounded(Settings.CriticalWindowMsTextBox.Text, settings.CriticalWindowMs, 1000, 60000, "finestra critica");
|
||||
|
||||
if (double.TryParse(Settings.MaxRequestsPerSecondTextBox.Text.Replace(',', '.'),
|
||||
System.Globalization.NumberStyles.Any,
|
||||
@@ -392,7 +393,6 @@ namespace AutoBidder
|
||||
|
||||
// === SEZIONE: Anticipo puntata ===
|
||||
settings.BidLeadTrackingEnabled = Settings.BidLeadTrackingCheckBox.IsChecked ?? true;
|
||||
settings.BidLeadSuggestionsEnabled = Settings.BidLeadSuggestionsCheckBox.IsChecked ?? true;
|
||||
settings.BidLeadMinSamples = ReadBounded(Settings.BidLeadMinSamplesTextBox.Text,
|
||||
settings.BidLeadMinSamples, 5, 500, "puntate minime per il consiglio", "");
|
||||
|
||||
@@ -420,7 +420,6 @@ namespace AutoBidder
|
||||
settings.StatsFolder = NormalizeFolderChoice(Settings.StatsFolderTextBox.Text, AppPaths.StatsFolder, settings.StatsFolder);
|
||||
settings.LogFolder = NormalizeFolderChoice(Settings.LogFolderTextBox.Text, AppPaths.LogFolder, settings.LogFolder);
|
||||
|
||||
settings.DetailedStatsEnabled = Settings.DetailedStatsCheckBox.IsChecked ?? true;
|
||||
|
||||
settings.QuietHoursEnabled = Settings.QuietHoursCheckBox.IsChecked ?? true;
|
||||
if (int.TryParse(Settings.QuietHoursStartTextBox.Text?.Trim(), out var qStart) && qStart is >= 0 and <= 23)
|
||||
|
||||
Reference in New Issue
Block a user