Cosa Sono le GlobalVariables MQL5: Il Meccanismo
Le GlobalVariables (GV) in MQL5 sono variabili di tipo double accessibili da tutti gli EA, indicatori e script in esecuzione sullo stesso terminale MetaTrader 5. Non sono “globali” nel senso della variabile globale del linguaggio C — sono variabili condivise a livello di processo del terminale, residenti in memoria condivisa. Un valore scritto da UlcerZenith LITE sul chart XAUUSD H4 è leggibile immediatamente da Zenith Executor su qualsiasi chart aperto nello stesso terminale.
La distinzione critica rispetto alle variabili globali MQL5 dichiarate con scope file: quelle esistono per la durata dell’EA che le dichiara. Le GlobalVariables esistono per la durata del terminale — sopravvivono alla chiusura di un chart, al deinit di un EA, e al reattach di un EA su un chart diverso. Questo le rende il meccanismo di IPC (Inter-Process Communication) ideale per sistemi multi-componente come Oracle.
Lifecycle delle GlobalVariables
Una GV viene creata la prima volta che si chiama GlobalVariableSet(name, value). Esiste finché il terminale MT5 è aperto o finché viene eliminata con GlobalVariableDelete(name). Alla chiusura del terminale, tutte le GV vengono perse a meno che non si chiami GlobalVariableSave() prima della chiusura — questa funzione serializza tutte le GV correnti su un file nella cartella del profilo. Oracle chiama GlobalVariableSave() in OnDeinit() e GlobalVariableLoad() in OnInit().
Schema di Naming Oracle: UZ_{Symbol}_{Period}_{KEY}
Il naming convention Oracle per le GV segue il pattern UZ_{Symbol}_{Period()}_{KEY}. Il prefisso UZ identifica UlcerZenith come sistema di origine. Il simbolo e il period garantiscono unicità cross-simbolo e cross-timeframe. La KEY specifica il dato trasportato. Esempio per XAUUSD H4: UZ_XAUUSD_16384_SCORE (il valore 16384 è la costante numerica di PERIOD_H4 in MQL5).
API Completa: GlobalVariableSet, Get, Check, Delete
MQL5 offre 8 funzioni native per la gestione delle GlobalVariables. Le 4 principali usate in Oracle sono Set, Get, Check e Delete. Il codice seguente mostra come Oracle le usa, con gestione degli errori e pattern difensivi.
Architettura del Bridge: Flusso Dati Oracle
Il bridge GlobalVariables Oracle ha due componenti fisicamente separati: il produttore (UlcerZenith LITE come custom indicator su XAUUSD H4) e il consumatore (Zenith Executor come EA sullo stesso chart o su chart diverso nello stesso terminale). La comunicazione avviene interamente in memoria condivisa del processo MT5.
Custom Indicator • XAUUSD H4
ogni nuova candela H4
Memoria condivisa • <0.5µs
UZ_XAUUSD_16384_*
Expert Advisor • qualsiasi chart
entry • BE • trailing • exit
XAUUSD • Risk 1% • RR 1:3
con ticket posizione
Period() ritorna la costante ENUM_TIMEFRAMES del chart corrente, non i minuti. Usare sempre (string)Period() nel naming — non calcolare manualmente. Su H4: Period() = 16388 (non 240).Latenza e Limiti: Quando la GV Non Basta
La latenza di lettura/scrittura di una GlobalVariable in MQL5 è 0.1–0.5 microsecondi — sono operazioni in memoria condivisa dello stesso processo. Su un timeframe H4, il segnale viene aggiornato ogni 4 ore. Zenith Executor legge le GV in OnTick() su XAUUSD che produce circa 2.000–5.000 tick per candela H4. Ogni ciclo di lettura costa circa 4 microsecondi totali (8 GV × 0.5μs). Non esiste overhead misurabile per nessun timeframe fino a M1.
| Aspetto | GlobalVariables | Bridge JSON (ZENITH_LIVE_BRIDGE_V3) |
|---|---|---|
| Latenza lettura | <0.5 microsecondi | 0.5–5 ms (file I/O) |
| Tipi supportati | Solo double | JSON: string, array, oggetti annidati |
| Scope accesso | Solo stesso terminale MT5 | Qualsiasi sistema esterno |
| Storico dati | Solo valore corrente | Log rotante degli ultimi N segnali |
| Persistenza | Persa a chiusura terminale | File permanente su disco |
| Integrazione web | Non possibile | Dashboard, Claude AI, app mobile |
| Complessità codice | Minima | Media (FileOpen/Write/Close) |
| Uso Oracle | Comunicazione intra-MT5 | Dashboard live + Claude AI ZENITH OS |
Il Bridge JSON: ZENITH_LIVE_BRIDGE_V3.mq5
Oracle dispone anche di un secondo meccanismo di bridge: un EA dedicato (ZENITH_LIVE_BRIDGE_V3.mq5) che legge le GlobalVariables da UlcerZenith e le serializza in un file JSON in MQL5/Files/zenith_live.json. Questo file viene poi letto dalla dashboard web e dal sistema Zenith AI Trading OS (l’interfaccia React drag-and-drop che espone il segnale Oracle in formato visuale). La struttura JSON include anche dati di live price action non disponibili nelle sole GV: spread corrente, tempo alla chiusura candela, distanza del prezzo dai livelli chiave.
Architettura Multi-Simbolo: Oracle su 6 Strumenti
Oracle UlcerZenith LITE gira su 6 strumenti: EURUSD, USDJPY, XAUUSD, AUDUSD, GBPUSD, NZDUSD. Ogni istanza è un indicatore separato sul chart H4 del rispettivo strumento. Le GlobalVariables di ogni istanza sono isolate grazie al simbolo nel naming — non c’è nessun rischio di conflitto tra UZ_EURUSD_16388_SCORE e UZ_XAUUSD_16388_SCORE.
Zenith Executor può operare su tutti e 6 i simboli contemporaneamente: basta aprire un’istanza dell’EA su ogni chart con il magic e il Symbol() corrispondente. La struttura OracleSignal viene letta con il simbolo e il period del chart su cui gira l’EA — nessuna configurazione manuale necessaria.
| Simbolo | GV Prefix | Score Soglia Entry | WR Storico H4 | PF H4 |
|---|---|---|---|---|
| XAUUSD | UZ_XAUUSD_16388_ | ≥65 | 42,1% | 1,44 |
| EURUSD | UZ_EURUSD_16388_ | ≥60 | 43,8% | 1,38 |
| USDJPY | UZ_USDJPY_16388_ | ≥62 | 41,5% | 1,36 |
| GBPUSD | UZ_GBPUSD_16388_ | ≥63 | 40,2% | 1,31 |
| AUDUSD | UZ_AUDUSD_16388_ | ≥60 | 42,7% | 1,39 |
| NZDUSD | UZ_NZDUSD_16388_ | ≥60 | 40,9% | 1,33 |
Il bridge GV Oracle è in produzione dal 2018. UlcerZenith (produttore) scrive 8 GV per simbolo all’apertura di ogni candela H4. Zenith Executor (consumatore) le legge in OnTick() con controllo stale e fallback sicuro (nessun trade se GV assenti). Latenza totale del ciclo segnale→ordine: <50ms dalla chiusura candela H4 su VPS Equinix.
Il TIMESTAMP nella GV permette a Zenith Executor di rilevare se UlcerZenith è stato rimosso dal chart o è crashato: se il timestamp è più vecchio di 4 ore (durata di una candela H4), l’EA si mette in “modalità silente” — non apre nuove posizioni ma gestisce quelle esistenti. Questo è il motivo per cui Oracle non ha mai generato un ordine non autorizzato in 6 anni di VPS continuo.
Persistenza tra Sessioni: GlobalVariableSave e Load
La perdita delle GV al restart del terminale è un problema reale su VPS con aggiornamenti automatici di MT5. Oracle gestisce questo con un ciclo save/load esplicito. La chiamata GlobalVariableSave() serializza tutte le GV correnti in un file binario nella cartella del profilo del terminale. GlobalVariableLoad() le ripristina all’avvio. Questo garantisce che Zenith Executor, al primo tick dopo un restart, trovi già le GV Oracle popolate — senza attendere la prossima candela H4.
Debug e Diagnostica: Strumenti per Isolare i Problemi
Il debugging di un bridge GV è complicato dal fatto che i problemi si manifestano in Zenith Executor ma l’origine potrebbe essere in UlcerZenith. Oracle prevede un set di funzioni di diagnostica che stampano lo stato completo del bridge.
Oracle in Diretta — GV Live, Segnali Reali
Vedi le GlobalVariables Oracle aggiornate in tempo reale durante le live. . Rossella ti manda il link.
SEGUI LA LIVE GRATUITA WHATSAPP ROSSELLAFAQ — GlobalVariables MQL5 Oracle
double condivise tra tutti gli EA, script e indicatori in esecuzione sul terminale MetaTrader 5. Hanno scope globale a livello di terminale: un valore scritto da UlcerZenith su XAUUSD è leggibile immediatamente da Zenith Executor su qualsiasi chart. Persistono anche dopo la chiusura dei chart (ma non dopo la chiusura del terminale, salvo GlobalVariableSave). Limite: massimo 16.384 variabili per terminale, solo tipo double.UZ_{Symbol}_{Period()}_{KEY}. Esempi: UZ_XAUUSD_16388_SCORE, UZ_XAUUSD_16388_DIR, UZ_XAUUSD_16388_SL, UZ_XAUUSD_16388_TP, UZ_XAUUSD_16388_EVENTBLOCK. Il valore 16388 corrisponde a PERIOD_H4 in MQL5. Questa convenzione permette a più istanze di Zenith Executor su simboli diversi di operare in isolamento completo.GlobalVariableSave() (salva su file) e GlobalVariableLoad() per ripristinarle. Oracle chiama GlobalVariableSave() in OnDeinit() e GlobalVariableLoad() in OnInit() — garantisce continuità tra sessioni e restart del terminale su VPS.GlobalVariableCheck(name) che ritorna true se la variabile esiste. Senza questo controllo, GlobalVariableGet() su una variabile inesistente ritorna 0.0 senza errore — un falso zero che può far interpretare a Zenith Executor uno score inesistente come zero (nessun segnale). Pattern Oracle: if(!GlobalVariableCheck(gv_name)) { Print("GV non trovata"); return; }MQL5/Files/zenith_live.json, Zenith Executor dell’altro terminale legge lo stesso file. Questo permette di usare il segnale Oracle del conto ICMarkets anche su un conto PropFirm separato.