Option Explicit
Sub Main
Dim Ruota
Dim nCasiWalkForward
Dim nOrizzonteColpi
Dim nTargetClasse
Dim nSogliaColpiRim
Dim bOscuraFreddi
Dim bUsaJarvis
Dim idConc
Dim Ini
Dim Fin
Dim tStart
Dim tEnd
Dim aRuote(1)
Dim aJarvis(29)
Dim aCinq(5)
Dim nColpiDisponibili
Dim nColpiDaTestare
Dim nEsito
Dim nColpo
Dim sCentrati
Dim idEstEsito
Dim nTotCasi
Dim nTotChiusi
Dim nTotVinti
Dim nCMax
Dim nStreakNegativo
Dim nMaxStreakNegativo
Dim nInCorsoTot
Dim nInCorsoCaldi
Dim nInCorsoFreddi
Dim nAmbi
Dim nTerni
Dim nQuaterne
Dim nCinquine
Dim nPunti
Dim k
Dim c
Dim sLabel
Dim sSimbolo
Dim sMsgEsito
Dim sCinqStr
Dim sJarvisPresi
Dim nJarvisCount
Dim sUrgenza
Dim nColpiRimCmax
Dim nColpiRimAbs
Dim sDecStr
Dim nDec
Dim nContaDec
Dim nDenomFiltrato
Dim rPercChiusi
Dim rPercGlobale
Dim rPercOscurata
Dim rPercSing
Dim rPercCumul
Dim nCumul
Dim sBarra
Dim nQuantiBarra
Dim bSfaldato(100)
Dim nColpoEsito(100)
Dim nColpiTrascorsi(100)
Dim bInCorso(100)
Dim nPuntiMax(100)
Dim sFormaz(100)
Dim nIdConcorso(100)
Dim aCinqArchivio(100, 5)
Dim aFreqColpi(90)
Dim idxCaso
Dim aUnioneJarvis(90)
Dim aComuneJarvis(90)
Dim nTotUnione
Dim nTotComune
Dim sUnione
Dim sComune
Dim bPrimoCasoRadar
' =========================================================================
' 1. PANNELLO DI CONTROLLO (PARAMETRI IDENTICI AL PYTHON)
' =========================================================================
' By Gemma Spacy (gemini 3.8 flash) & tom
Ruota = PA_
nCasiWalkForward = 100
nOrizzonteColpi = 90
nTargetClasse = 5
nSogliaColpiRim = 16
bOscuraFreddi = True
bUsaJarvis = True
aRuote(1) = Ruota
tStart = Timer
' SET ABS DEI 29 NUMERI DI JARVIS
aJarvis(1) = 1
aJarvis(2) = 4
aJarvis(3) = 9
aJarvis(4) = 11
aJarvis(5) = 13
aJarvis(6) = 16
aJarvis(7) = 17
aJarvis(8) = 23
aJarvis(9) = 25
aJarvis(10) = 26
aJarvis(11) = 30
aJarvis(12) = 40
aJarvis(13) = 42
aJarvis(14) = 49
aJarvis(15) = 55
aJarvis(16) = 58
aJarvis(17) = 59
aJarvis(18) = 61
aJarvis(19) = 67
aJarvis(20) = 68
aJarvis(21) = 73
aJarvis(22) = 77
aJarvis(23) = 81
aJarvis(24) = 83
aJarvis(25) = 85
aJarvis(26) = 86
aJarvis(27) = 88
aJarvis(28) = 89
aJarvis(29) = 90
Call ResetTimer
Call Scrivi(String(80, "="), 1)
Call Scrivi("🎛️ CONFIGURAZIONE ATTIVA:", 1)
Call Scrivi(" • Ruota: " & NomeRuota(Ruota), 1)
Call Scrivi(" • Concorsi: " & nCasiWalkForward, 1)
Call Scrivi(" • Orizzonte: " & nOrizzonteColpi & " colpi", 1)
Call Scrivi(" • Classe: RIGIDAMENTE OMOGENEA A " & nTargetClasse & " NUMERI", 1)
If bUsaJarvis Then
Call Scrivi(" • Jarvis 29: ATTIVO", 1)
Else
Call Scrivi(" • Jarvis 29: DISATTIVO", 1)
End If
Call Scrivi(" • Fascia Calda: ≤ " & nSogliaColpiRim & " colpi a C_max", 1)
If bOscuraFreddi Then
Call Scrivi(" • Oscura Freddi: SÌ", 1)
Else
Call Scrivi(" • Oscura Freddi: NO", 1)
End If
Call Scrivi(String(80, "="), 1)
Call Scrivi("")
' =========================================================================
' 2. ESECUZIONE WALK-FORWARD VALIDATION
' =========================================================================
Fin = EstrazioneFin
Ini = Fin - nCasiWalkForward + 1
Call Scrivi(String(80, "="), 1)
Call Scrivi(" AVVIO WALK-FORWARD VALIDATION (" & nCasiWalkForward & " CONCORSI)", 1)
Call Scrivi("🔒 CLASSE: RIGIDAMENTE OMOGENEA A " & nTargetClasse & " NUMERI", 1)
Call Scrivi("⏱️ Orizzonte di attesa: fino a " & nOrizzonteColpi & " colpi", 1)
Call Scrivi(String(80, "="), 1)
idxCaso = 0
For idConc = Ini To Fin
idxCaso = idxCaso + 1
nIdConcorso(idxCaso) = idConc
' Generazione del Micro-Dominio Rigido di 5 numeri
Call GeneraMicroDominio(idConc, Ruota, aCinq)
For k = 1 To 5
aCinqArchivio(idxCaso, k) = aCinq(k)
Next
sCinqStr = StringaNumeri(aCinq, ".", True)
sFormaz(idxCaso) = sCinqStr
nColpiDisponibili = Fin - idConc
nColpiDaTestare = nColpiDisponibili
If nColpiDaTestare > nOrizzonteColpi Then
nColpiDaTestare = nOrizzonteColpi
End If
bSfaldato(idxCaso) = False
nColpoEsito(idxCaso) = 0
nPuntiMax(idxCaso) = 0
If nColpiDaTestare > 0 Then
Call VerificaEsitoTurbo(aCinq, aRuote, idConc + 1, 2, nColpiDaTestare, 0, nEsito, nColpo, sCentrati, idEstEsito)
If nEsito > 0 Then
bSfaldato(idxCaso) = True
nColpoEsito(idxCaso) = nColpo
nPunti = nEsito
nPuntiMax(idxCaso) = nPunti
nColpiTrascorsi(idxCaso) = nColpo
bInCorso(idxCaso) = False
Else
If nColpiDisponibili < nOrizzonteColpi Then
bInCorso(idxCaso) = True
nColpiTrascorsi(idxCaso) = nColpiDisponibili
Else
bInCorso(idxCaso) = False
nColpiTrascorsi(idxCaso) = nOrizzonteColpi
End If
End If
Else
bInCorso(idxCaso) = True
nColpiTrascorsi(idxCaso) = 0
End If
' Costruzione Messaggio
If bSfaldato(idxCaso) Then
sSimbolo = "🏆"
If nPuntiMax(idxCaso) = 2 Then
sLabel = "AMBO"
ElseIf nPuntiMax(idxCaso) = 3 Then
sLabel = "TERNO"
ElseIf nPuntiMax(idxCaso) = 4 Then
sLabel = "QUATERNA"
Else
sLabel = "CINQUINA"
End If
sMsgEsito = sSimbolo & " " & sLabel & " al " & nColpoEsito(idxCaso) & "° colpo (Conc. " & (idConc + nColpoEsito(idxCaso)) & ") | Centrati: " & sCentrati
Else
If bInCorso(idxCaso) Then
sMsgEsito = "⏳ IN CORSO (trascorsi " & nColpiTrascorsi(idxCaso) & "/" & nOrizzonteColpi & " colpi)"
Else
sMsgEsito = "❌ NEGATIVO dopo " & nOrizzonteColpi & " colpi"
End If
End If
Call Scrivi(" [Conc. " & FormatSpace(idConc, 5) & "] Micro: 5 num (Intersez.+Consensus ) | " & sMsgEsito)
Next
' =========================================================================
' 3. CALCOLO METRICHE GAP HUNTING, C_MAX & STREAK
' =========================================================================
nTotCasi = idxCaso
nTotChiusi = 0
nTotVinti = 0
nCMax = 0
nStreakNegativo = 0
nMaxStreakNegativo = 0
nInCorsoTot = 0
nInCorsoCaldi = 0
nInCorsoFreddi = 0
nAmbi = 0
nTerni = 0
nQuaterne = 0
nCinquine = 0
For c = 1 To 90
aFreqColpi(c) = 0
Next
' Primo loop: C_Max e Vincenti
For k = 1 To nTotCasi
If Not bInCorso(k) Then
nTotChiusi = nTotChiusi + 1
If bSfaldato(k) Then
nTotVinti = nTotVinti + 1
If nColpoEsito(k) > nCMax Then
nCMax = nColpoEsito(k)
End If
aFreqColpi(nColpoEsito(k)) = aFreqColpi(nColpoEsito(k)) + 1
If nPuntiMax(k) = 2 Then
nAmbi = nAmbi + 1
ElseIf nPuntiMax(k) = 3 Then
nTerni = nTerni + 1
ElseIf nPuntiMax(k) = 4 Then
nQuaterne = nQuaterne + 1
ElseIf nPuntiMax(k) = 5 Then
nCinquine = nCinquine + 1
End If
nStreakNegativo = 0
Else
nStreakNegativo = nStreakNegativo + 1
If nStreakNegativo > nMaxStreakNegativo Then
nMaxStreakNegativo = nStreakNegativo
End If
End If
Else
nInCorsoTot = nInCorsoTot + 1
End If
Next
' Conteggio Casi Caldi / Freddi
For k = 1 To nTotCasi
If bInCorso(k) Then
nColpiRimCmax = nCMax - nColpiTrascorsi(k)
If nColpiRimCmax <= nSogliaColpiRim Then
nInCorsoCaldi = nInCorsoCaldi + 1
Else
nInCorsoFreddi = nInCorsoFreddi + 1
End If
End If
Next
If nTotChiusi > 0 Then
rPercChiusi = Round((nTotVinti / nTotChiusi) * 100, 2)
Else
rPercChiusi = 0
End If
rPercGlobale = Round((nTotVinti / nTotCasi) * 100, 2)
nDenomFiltrato = nTotCasi - nInCorsoFreddi
If nDenomFiltrato > 0 Then
rPercOscurata = Round((nTotVinti / nDenomFiltrato) * 100, 2)
Else
rPercOscurata = 0
End If
Call Scrivi("")
Call Scrivi(String(80, "="), 1)
Call Scrivi("📊 REPORT FINALE SCIENTIFICO: GAP HUNTING & C_MAX (" & nCMax & "° COLPO)", 1)
Call Scrivi(String(80, "="), 1)
Call Scrivi(" - Ruota Esaminata: " & NomeRuota(Ruota))
Call Scrivi(" - Dimensione Classe Formazioni: " & nTargetClasse & " NUMERI (Omogenea = True)")
Call Scrivi(" - Totale Concorsi Analizzati: " & nTotCasi)
Call Scrivi(" - Concorsi Chiusi Definitivi: " & nTotChiusi)
Call Scrivi(" - Concorsi In Corso TOTALI: " & nInCorsoTot)
Call Scrivi(" ├─ 🔥 In Fascia Calda (<= " & nSogliaColpiRim & " colpi a C_max): " & nInCorsoCaldi & " CASI OPERATIVI (Sotto Tiro!)")
Call Scrivi(" └─ ❄️ In Incubazione Fredda (> " & nSogliaColpiRim & " colpi a C_max): " & nInCorsoFreddi & " Casi Oscurati")
Call Scrivi(" - 🎯 COLPO MASSIMO RILEVATO (C_max): " & nCMax & "° colpo (Picco assoluto storico)")
Call Scrivi(" - 🛡️ MASSIMO STREAK NEGATIVO: " & nMaxStreakNegativo & " CASI CONSECUTIVI")
Call Scrivi(String(80, "="), 1)
Call Scrivi(" 🏆 % SU CASI CHIUSI DEFINITIVI: " & rPercChiusi & "% (" & nTotVinti & " su " & nTotChiusi & ")", 1)
Call Scrivi(" 🌐 % GLOBALE DI BASE (Tutti inclusi): " & rPercGlobale & "% (" & nTotVinti & " su " & nTotCasi & ")")
Call Scrivi(" 🌟 % RICALCOLATA (CON OSCURAMENTO): " & rPercOscurata & "% (" & nTotVinti & " su " & nDenomFiltrato & " casi attivi/chiusi)", 1)
Call Scrivi(String(80, "-"))
Call Scrivi("DETTAGLIO SORTI REALIZZATE:")
Call Scrivi(" - Ambi centrati: " & nAmbi)
Call Scrivi(" - Terni centrati: " & nTerni)
Call Scrivi(" - Quaterne centrate: " & nQuaterne)
Call Scrivi(" - Cinquine centrate: " & nCinquine)
Call Scrivi(String(80, "-"))
Call Scrivi("DISTRIBUZIONE DEGLI SFALDAMENTI PER COLPO:")
nCumul = 0
For c = 1 To nCMax
If aFreqColpi(c) > 0 Then
nCumul = nCumul + aFreqColpi(c)
If nTotChiusi > 0 Then
rPercSing = Round((aFreqColpi(c) / nTotChiusi) * 100, 1)
rPercCumul = Round((nCumul / nTotChiusi) * 100, 1)
Else
rPercSing = 0
rPercCumul = 0
End If
nQuantiBarra = Int(rPercSing)
If nQuantiBarra < 1 Then
nQuantiBarra = 1
End If
sBarra = String(nQuantiBarra, "█")
Call Scrivi(" Colpo " & FormatSpace(c, 3) & ": " & FormatSpace(aFreqColpi(c), 2) & " vittorie (" & FormatSpace(rPercSing, 5) & "%) | Cumulata: " & FormatSpace(rPercCumul, 5) & "% | " & sBarra)
End If
Next
tEnd = Timer
Call Scrivi(String(80, "-"))
Call Scrivi("Tempo totale di calcolo: " & Round(tEnd - tStart, 2) & " secondi")
Call Scrivi(String(80, "="), 1)
' =========================================================================
' 4. RADAR LIVE APEX: CONVERGENZE SUI 29 DI JARVIS
' =========================================================================
Call Scrivi("")
Call Scrivi(String(40, "🔮"), 1)
Call Scrivi("🚨 RADAR LIVE APEX: FORMAZIONI IN FASCIA CALDA (<= " & nSogliaColpiRim & " COLPI A C_MAX)", 1)
Call Scrivi("💎 COLLIMAZIONE ATOMICA CON IL GRUPPO CENTENARIO DEI 29 DI JARVIS", 1)
Call Scrivi(String(40, "🔮"), 1)
For c = 1 To 90
aUnioneJarvis(c) = False
aComuneJarvis(c) = True
Next
bPrimoCasoRadar = True
For k = 1 To nTotCasi
If bInCorso(k) Then
nColpiRimCmax = nCMax - nColpiTrascorsi(k)
nColpiRimAbs = nOrizzonteColpi - nColpiTrascorsi(k)
If (Not bOscuraFreddi) Or (bOscuraFreddi And nColpiRimCmax <= nSogliaColpiRim) Then
' Ricostruzione Cinquina
For c = 1 To 5
aCinq(c) = aCinqArchivio(k, c)
Next
' Intersezione con Jarvis
sJarvisPresi = ""
nJarvisCount = 0
Dim bQuestaCinqJarvis(90)
For c = 1 To 90
bQuestaCinqJarvis(c) = False
Next
For c = 1 To 5
If IsInJarvis(aCinq(c), aJarvis) Then
nJarvisCount = nJarvisCount + 1
If sJarvisPresi <> "" Then
sJarvisPresi = sJarvisPresi & "."
End If
sJarvisPresi = sJarvisPresi & Format2(aCinq(c))
aUnioneJarvis(aCinq(c)) = True
bQuestaCinqJarvis(aCinq(c)) = True
End If
Next
If sJarvisPresi = "" Then
sJarvisPresi = "Nessuna"
End If
' Aggiornamento Comune
For c = 1 To 90
If Not bQuestaCinqJarvis(c) Then
aComuneJarvis(c) = False
End If
Next
bPrimoCasoRadar = False
' Urgenza
If nColpiRimCmax <= 0 Then
sUrgenza = "⚡ OLTRE C_MAX STORICO! (+" & Abs(nColpiRimCmax) & " colpi oltre il record del " & nCMax & "°)"
ElseIf nColpiRimCmax <= 6 Then
sUrgenza = "🔥🔥 MASSIMA TENSIONE ELASTICA APEX! (Solo " & nColpiRimCmax & " colpi al record storico di " & nCMax & "!)"
Else
sUrgenza = "🟡 FASCIA CALDA D'ATTACCO (" & nColpiRimCmax & " colpi al picco di " & nCMax & ")"
End If
Call Scrivi("")
Call Scrivi(" Ruota di Gioco: " & NomeRuota(Ruota))
Call Scrivi(" Concorso Base Originario: " & nIdConcorso(k))
Call Scrivi(" Colpi Trascorsi: " & nColpiTrascorsi(k) & " estrazioni")
Call Scrivi(" ⏳ TENSIONE AL C_MAX (" & nCMax & "°): " & nColpiRimCmax & " COLPI RIMANENTI! (Orizzonte Max: " & nColpiRimAbs & ")")
Call Scrivi(" Grado di Urgenza: " & sUrgenza, 1)
Call Scrivi(" FORMAZIONE COMPLETA (CLASSE 5): " & sFormaz(k), 1)
Call Scrivi(" 💎 COLLIMAZIONE CON JARVIS 29: [" & sJarvisPresi & "] -> (" & nJarvisCount & " NUMERI CONVERGENTI!)", 1)
' Scomposizione in Decine
sDecStr = ""
For nDec = 0 To 8
sCinqStr = ""
nContaDec = 0
For c = 1 To 5
If DecinaNumeri(aCinq(c)) = nDec Then
nContaDec = nContaDec + 1
If sCinqStr <> "" Then
sCinqStr = sCinqStr & "."
End If
sCinqStr = sCinqStr & Format2(aCinq(c))
End If
Next
If nContaDec > 0 Then
sDecStr = sDecStr & "D" & nDec & ":[" & sCinqStr & "] "
End If
Next
Call Scrivi(" 🧩 Decine Cinquina: " & sDecStr)
Call Scrivi(String(80, "-"))
End If
End If
Next
' =========================================================================
' 5. SINTESI STRATEGICA GLOBALE DELLE FORMAZIONI IN GIOCO
' =========================================================================
Call Scrivi("")
Call Scrivi(String(40, "👑"), 1)
Call Scrivi(" SINTESI OPERATIVA CONVERGENZA ASSOLUTA (LIVE APEX RADAR)", 1)
Call Scrivi(String(40, "👑"), 1)
nTotUnione = 0
sUnione = ""
For c = 1 To 90
If aUnioneJarvis(c) Then
nTotUnione = nTotUnione + 1
If sUnione <> "" Then
sUnione = sUnione & "."
End If
sUnione = sUnione & Format2(c)
End If
Next
Call Scrivi(" • Formazioni Calde Attive Sotto Tiro: " & nInCorsoCaldi)
Call Scrivi(" • Micro-Lunghetta Globale (Tutti in Jarvis): [" & sUnione & "] (" & nTotUnione & " numeri)", 1)
nTotComune = 0
sComune = ""
If Not bPrimoCasoRadar Then
For c = 1 To 90
If aComuneJarvis(c) Then
nTotComune = nTotComune + 1
If sComune <> "" Then
sComune = sComune & "."
End If
sComune = sComune & Format2(c)
End If
Next
End If
If nTotComune > 0 Then
Call Scrivi(" 🌟 APEX DUO (Numeri Comuni a TUTTE le Cinquine Calde + Jarvis): [" & sComune & "]", 1)
Else
Call Scrivi(" 🌟 APEX DUO: Le formazioni calde colpiscono rami complementari di JARVIS.")
End If
Call Scrivi(String(80, "="), 1)
End Sub
' =============================================================================
' FUNZIONI AUSILIARIE DI SUPPORTO
' =============================================================================
' Genera il Micro-Dominio Rigido di 5 numeri
Sub GeneraMicroDominio(idConc, Ruota, aCinqOut)
Dim n
Dim aPunteggi(90)
Dim aNumeri(90)
Dim k
Dim j
Dim nTemp
Dim nTempP
Dim nRit
Dim nFreq
For n = 1 To 90
aNumeri(n) = n
nRit = RitardoEstrattoTurbo(n, idConc, Ruota)
nFreq = EstrattoFrequenzaTurbo(Ruota, n, idConc - 100 + 1, idConc)
' Algoritmo di Gap Hunting & Calibrazione Ritardo/Frequenza
aPunteggi(n) =(nRit * 2) +(nFreq * 5)
Next
' Ordinamento Decrescente
For k = 1 To 89
For j = k + 1 To 90
If aPunteggi(j) > aPunteggi(k) Then
nTempP = aPunteggi(k)
aPunteggi(k) = aPunteggi(j)
aPunteggi(j) = nTempP
nTemp = aNumeri(k)
aNumeri(k) = aNumeri(j)
aNumeri(j) = nTemp
End If
Next
Next
' Selezione dei primi 5 numeri
For k = 1 To 5
aCinqOut(k) = aNumeri(k)
Next
Call OrdinaMatrice(aCinqOut, 1)
End Sub
' Verifica se un numero appartiene al set sacro Jarvis 29
Function IsInJarvis(num, aJarvis)
Dim i
IsInJarvis = False
For i = 1 To 29
If aJarvis(i) = num Then
IsInJarvis = True
Exit Function
End If
Next
End Function
' Calcola la Decina (0 per 1-9, 1 per 10-19, ..., 8 per 80-90)
Function DecinaNumeri(num)
If num >= 1 And num <= 9 Then
DecinaNumeri = 0
ElseIf num >= 80 And num <= 90 Then
DecinaNumeri = 8
Else
DecinaNumeri = Int(num / 10)
End If
End Function
'NESSUNA CERTEZZA SOLO POCA PROBABILITA'