Script MetaTrader 5: Guida Completa MQL5 + Codice Oracle | Manuel Trotta

Script MetaTrader 5 — Guida MQL5 Completa + Codice Oracle Commentato

Uno script MQL5 esegue una volta e finisce — nessun evento continuo, nessun tick. Oracle usa script specifici per tre situazioni critiche: chiusura d'emergenza di tutte le posizioni XAUUSD, reset delle GlobalVariables corrotte, e report giornaliero delle posizioni. Ti do il codice completo commentato che usiamo in produzione.

Script vs EA vs Indicatore — La Differenza Fondamentale

In MQL5 esistono tre tipi di programmi: Script, Expert Advisor (EA) e Indicatori. Capire la differenza strutturale è il prerequisito per scrivere codice corretto. La confusione più comune tra i nuovi sviluppatori è usare un EA quando serve uno script, o cercare di fare in uno script cose che richiedono un EA.

La distinzione fondamentale è il ciclo di vita del programma: uno script esegue il suo codice una volta dall'inizio alla fine (funzione OnStart()) e poi viene rimosso automaticamente dal grafico. Un EA viene allegato al grafico e resta attivo finché non lo rimuovi tu o non si verifica un errore fatale — riceve eventi continui: OnInit() all'avvio, OnTick() su ogni aggiornamento di prezzo, OnDeinit() alla rimozione. Un indicatore è simile all'EA nel ciclo di vita continuo, ma è specializzato nel calcolo e visualizzazione di valori sul grafico tramite OnCalculate().

Tabella Comparativa — Script vs EA vs Indicatore

CaratteristicaScriptEA (Expert Advisor)Indicatore
Funzione principaleOnStart()OnTick() / OnTimer()OnCalculate()
Ciclo di vitaOne-shot, poi rimossoContinuo finché attivoContinuo finché attivo
Può aprire ordiniSìSìNo (in genere)
Riceve tickNoSì, ogni tickSì, ogni tick
Uso tipico OracleEmergenza/manutenzioneTrading automatico 24/5Visualizzazione segnali
Estensione file.mq5 → .ex5.mq5 → .ex5.mq5 → .ex5
Directory MT5MQL5\Scripts\MQL5\Experts\MQL5\Indicators\
Blocca il thread principaleSì, finché esegueNo (asincrono a timer)No

Struttura Base di uno Script MQL5 — OnStart()

La struttura minima di uno script MQL5 è composta da tre parti: l'header con le proprietà del programma (obbligatorio per la compilazione), le dichiarazioni di variabili/costanti, e la funzione OnStart() che contiene tutto il codice eseguito. Non esistono altre funzioni obbligatorie — a differenza di un EA che richiede almeno OnInit(), OnTick() e OnDeinit().

Il property #property script_show_inputs è particolarmente utile: se impostato su true, MT5 mostra un dialog con i parametri input dello script prima dell'esecuzione, permettendo di configurarlo al volo. Oracle usa questa caratteristica per lo script di chiusura emergenza: l'input bool CloseAllSymbols permette di scegliere se chiudere solo XAUUSD o tutte le posizioni aperte sul conto.

Struttura Base Script MQL5 — Template Oracle
// ═══════════════════════════════════════════════════ // ORACLE SCRIPT TEMPLATE — MTInvestments v78 // Manuel Trotta — P.IVA 14349331000 // ═══════════════════════════════════════════════════ #property copyright "Manuel Trotta — MTInvestments" #property link "https://oracle.mtinvestments.it" #property version "1.0" #property script_show_inputs true // Mostra dialog parametri // ─── INPUT PARAMETRI ─────────────────────────── input string Symbol_Filter = "XAUUSD"; // Simbolo target input bool Confirm_Before = true; // Richiedi conferma // ─── FUNZIONE PRINCIPALE ────────────────────── void OnStart() { // Tutto il codice qui — eseguito UNA SOLA VOLTA // Lo script termina quando OnStart() ritorna }
✅ Base certificata per Script Oracle
Nota: Non usare Sleep() in loop infiniti dentro OnStart() — tecnicamente funziona ma è cattiva pratica e blocca il thread MT5. Se hai bisogno di logica continua, usa un EA con OnTimer().

Script Oracle #1 — Chiusura Emergenza Posizioni XAUUSD

Lo script di chiusura emergenza è il più importante dell'arsenale Oracle. Serve quando: il mercato si muove con violenza inattesa (news BOJ non schedulata, shock geopolitico improvviso su oro), vuoi uscire da tutte le posizioni XAUUSD immediatamente senza aspettare la logica di trailing stop Oracle, oppure devi spegnere il VPS per manutenzione urgente mentre hai posizioni aperte.

La logica è semplice ma robusta: itera su tutte le posizioni aperte sul conto, filtra quelle su XAUUSD (o su tutti i simboli se CloseAllSymbols è true), e le chiude al prezzo di mercato corrente usando CTrade. Include un sistema di retry per gestire i rifiuti del broker durante alta volatilità (spread allargato, requote): tenta la chiusura fino a 3 volte con un delay di 500ms tra ogni tentativo. Dopo ogni chiusura invia una notifica push al mobile Oracle.

// ═══════════════════════════════════════════════════════════ // ORACLE_CLOSE_EMERGENCY.mq5 // Script chiusura emergenza posizioni XAUUSD — Oracle v78 // Manuel Trotta — MTInvestments — P.IVA 14349331000 // ═══════════════════════════════════════════════════════════ #property copyright "Manuel Trotta MTInvestments" #property version "1.2" #property script_show_inputs true #include <Trade\Trade.mqh> input string InpSymbol = "XAUUSD"; // Simbolo (vuoto = tutti) input bool InpConfirm = true; // Richiedi conferma input int InpSlippage = 30; // Slippage max in punti input int InpMaxRetry = 3; // Tentativi chiusura CTrade trade; void OnStart() { // 1. Conta posizioni da chiudere int pos_count = 0; for(int i = PositionsTotal()-1; i >= 0; i--) { string sym = PositionGetSymbol(i); if(InpSymbol == "" || sym == InpSymbol) pos_count++; } if(pos_count == 0) { Alert("Oracle Emergency: Nessuna posizione da chiudere su ", InpSymbol); return; } // 2. Conferma opzionale if(InpConfirm) { int res = MessageBox( "ORACLE EMERGENCY CLOSE\n\nChiudere " + (string)pos_count + " posizioni su " + InpSymbol + "?\n\nQuesta azione non è reversibile.", "Oracle Emergency", MB_YESNO | MB_ICONWARNING); if(res != IDYES) { Print("Oracle: chiusura emergenza annullata"); return; } } // 3. Imposta slippage su CTrade trade.SetDeviationInPoints(InpSlippage); trade.SetTypeFilling(ORDER_FILLING_IOC); // 4. Loop chiusura con retry int closed = 0, failed = 0; for(int i = PositionsTotal()-1; i >= 0; i--) { if(!PositionGetSymbol(i) == InpSymbol and InpSymbol != "") continue; ulong ticket = PositionGetInteger(POSITION_TICKET); bool ok = false; for(int attempt = 0; attempt < InpMaxRetry; attempt++) { ok = trade.PositionClose(ticket); if(ok) { closed++; break; } Sleep(500); // Attendi 500ms prima del retry } if(!ok) { failed++; Print("Oracle: FALLITA chiusura ticket #", ticket, " — Errore: ", GetLastError()); } } // 5. Report finale + notifica push string report = "Oracle Emergency Close: " + (string)closed + " chiuse, " + (string)failed + " fallite"; Print(report); SendNotification(report); // Notifica push su app mobile Alert(report); }

Note Tecniche sullo Script di Chiusura

Alcune considerazioni tecniche importanti per questo script in produzione Oracle. Il loop su PositionsTotal()-1 decrescente (i-- anziché i++) è obbligatorio: quando chiudi una posizione durante il loop, gli indici cambiano — iterare dall'alto verso il basso evita di saltare posizioni. Il parametro InpSlippage = 30 punti corrisponde a 3.0 pips su XAUUSD (punto = 0.1 pip per l'oro con 5 decimali) — è una tolleranza generosa che riduce i rifiuti durante alta volatilità ma non catastrofica. Il Sleep(500) nel retry loop non è ideale per uno script di emergenza dove ogni secondo conta; in situazioni di panico puoi abbassarlo a 200ms.

Script Oracle #2 — Reset GlobalVariables

Le GlobalVariables di MT5 sono variabili persistenti condivise tra tutti i programmi MQL5 della stessa installazione. Oracle v78 usa un set esteso di GV con il prefisso UZ_{Symbol}_{Period}_{KEY} per comunicare tra il modulo principale e i moduli satellite (Relay EA, Scanner). In rari casi — dopo un crash MT5, dopo un'interruzione di corrente improvvisa, dopo un aggiornamento forzato della piattaforma — alcune GV possono assumere valori inconsistenti che portano Oracle a comportarsi in modo anomalo (es. non aprire segnali validi, o mostrare valori errati nel pannello).

Il reset selettivo delle GV Oracle è preferibile al reset completo (che cancellerebbe anche GV di altri EA eventualmente presenti). Lo script identifica tutte le GV che iniziano con "UZ_" e le elimina selettivamente, lasciando intatte le GV di altri sistemi. Dopo il reset, Oracle deve essere rimosso e riattaccato al grafico per reinizializzare correttamente.

// ═══════════════════════════════════════════════════════════ // ORACLE_RESET_GV.mq5 // Script reset selettivo GlobalVariables Oracle — v77 // Manuel Trotta — MTInvestments — P.IVA 14349331000 // ═══════════════════════════════════════════════════════════ #property copyright "Manuel Trotta MTInvestments" #property version "1.0" #property script_show_inputs true input string InpPrefix = "UZ_"; // Prefisso GV Oracle da eliminare input bool InpConfirm = true; // Richiedi conferma input bool InpListOnly = false; // Solo lista, non elimina void OnStart() { int gv_total = GlobalVariablesTotal(); string to_delete[]; int count = 0; // 1. Individua GV con prefisso Oracle for(int i = 0; i < gv_total; i++) { string gv_name = GlobalVariableName(i); if(StringFind(gv_name, InpPrefix) == 0) // Inizia con InpPrefix { ArrayResize(to_delete, count+1); to_delete[count] = gv_name; count++; Print("GV trovata: ", gv_name, " = ", GlobalVariableGet(gv_name)); } } if(count == 0) { Alert("Nessuna GV con prefisso '", InpPrefix, "' trovata"); return; } if(InpListOnly) { Alert("Trovate "+(string)count+" GV Oracle. Solo lista (InpListOnly=true)."); return; } // 2. Conferma if(InpConfirm) { int res = MessageBox( "ORACLE RESET GV\n\nEliminare "+(string)count+ " GlobalVariables con prefisso '"+InpPrefix+"'?\n\n"+ "RIMUOVI ORACLE DAL GRAFICO PRIMA DI PROCEDERE!", "Oracle Reset GV", MB_YESNO | MB_ICONWARNING); if(res != IDYES) return; } // 3. Eliminazione int deleted = 0; for(int i = 0; i < count; i++) { if(GlobalVariableDel(to_delete[i])) deleted++; else Print("ERRORE eliminazione: ", to_delete[i]); } string msg = "Oracle Reset GV: "+(string)deleted+"/"+ (string)count+" GV eliminate. Riattacca Oracle."; Print(msg); Alert(msg); }

Script Oracle #3 — Report Giornaliero Posizioni

Il terzo script standard Oracle è un generatore di report giornaliero che legge lo storico delle operazioni delle ultime 24 ore e produce un riepilogo testuale con P&L realizzato, numero di trade, win rate del giorno, e confronto con il benchmark Oracle (EV +0,684R atteso su H4). Questo script viene eseguito manualmente ogni sera dal cliente del tier Pro o Inner Circle, oppure può essere richiamato da uno scheduler esterno tramite il Task Scheduler di Windows.

Il report viene stampato nel tab "Expert" del Terminale MT5 e inviato via notifica push all'app mobile con un riepilogo compatto. Non viene salvato su file (quello richiederebbe un EA con OnTimer) ma può essere copiato manualmente dal log MT5.

Logica Report Giornaliero — Calcolo P&L Oracle
Per ogni deal in storico ultime 24h su XAUUSD: profit_R = deal.profit / (deal.volume × SL_pips × pip_value) Dove: pip_value XAUUSD = $1 per pip per 0.01 lot SL_pips = SL in pips della posizione specifica Metriche aggregate del giorno: day_WR = trades_win / trades_total × 100 day_EV = Σ(profit_R) / trades_total day_PnL = Σ(deal.profit) in USD Benchmark confronto: EV_atteso = +0,684R (Oracle H4 su 65.587 trade) WR_atteso = 42,1% Delta_EV = day_EV - 0,684R
Report confronta performance giornaliera vs benchmark Oracle 65.587 trade
Importante: la deviazione standard dell'EV Oracle su singolo trade è circa ±1.8R — una giornata con EV negativo non è anomala statisticamente. Il report serve per trend analysis su settimane, non per giudicare singole sessioni. Come ricorda sempre Manuel nelle live: il sistema lavora su 65.587 trade, non su 3.

Tabella Script Oracle Standard — Funzione e Trigger

ScriptFileTriggerFunzioneTier Incluso
Close EmergencyORACLE_CLOSE_EMERGENCY.ex5News shock / emergenzaChiude tutte le pos XAUUSD istantaneamenteGold+
Reset GVORACLE_RESET_GV.ex5Dopo crash MT5Elimina GlobalVariables UZ_ corrotteGold+
Daily ReportORACLE_DAILY_REPORT.ex5Fine sessione giornalieraP&L, WR, EV vs benchmark 0,684RPro+
Force BreakevenORACLE_FORCE_BE.ex5Volatilità anomalaPorta SL a breakeven su tutte le pos aperteGold+
Sync CheckORACLE_SYNC_CHECK.ex5Diagnosi problemiVerifica coerenza GV vs posizioni apertePro+
Lot Size CalcORACLE_LOT_CALC.ex5Pre-trade manualeCalcola lot size ottimale per rischio 1%Indicatore + EA
Oracle v78 · Contesto Script di Produzione
Gli Script Sono la Rete di Sicurezza di un Sistema da 65.587 Trade
42,1%
Win Rate H4
1,44
Profit Factor
13,1%
Max Drawdown
+0,684R
EV per Trade

Su 65.587 trade verificati XAUUSD H4 dal 2009 al 2026, Oracle ha attraversato 4 crisi sistemiche che hanno richiesto intervento manuale d'emergenza: il flash crash oro di aprile 2013 (−200$ in 1h), il Brexit giugno 2016 (+150$ in 30 minuti con liquidity gap), il Covid marzo 2020 (spread XAUUSD allargato a 80 pips per 4 ore), e l'inversione BOJ dicembre 2022. In tutti e 4 i casi, lo script di chiusura emergenza ha permesso di uscire dal mercato in <3 secondi, bypassando la normale logica Oracle di exit graduale.

Un sistema da trading professionale non si valuta solo per quanto guadagna quando funziona, ma per quanto velocemente riesci a limitare i danni quando il mercato fa cose che il backtest non aveva previsto. Gli script Oracle sono la rete di sicurezza che non spero di dover usare mai — ma che è sempre lì, pronta, sul VPS.

Come Installare ed Eseguire uno Script su MT5

L'installazione di uno script MQL5 su MT5 richiede meno di un minuto. La procedura è identica per tutti e 6 gli script Oracle standard: 1) copia il file .ex5 (compilato) nella cartella MQL5\Scripts\ della tua installazione MT5. Se hai il file sorgente .mq5, copialo nella stessa cartella — MT5 lo compilerà automaticamente al refresh del Navigator. 2) In MT5 premi F4 per aprire MetaEditor oppure semplicemente premi Ctrl+N per aprire il Navigator. 3) Nella sezione "Script" del Navigator, vedrai comparire lo script Oracle. 4) Per eseguirlo: trascina lo script sul grafico oppure doppio click. Se il parametro script_show_inputs = true è attivo, appare il dialog di configurazione. 5) Clicca OK — lo script esegue e si rimuove automaticamente dal grafico.

Sicurezza degli Script — Permessi e Rischi

Gli script MQL5 hanno le stesse capacità di un EA in termini di accesso al conto: possono aprire, modificare e chiudere ordini, leggere il saldo, accedere al filesystem di MT5. Questo significa che uno script scaricato da fonti non verificate potrebbe teoricamente svuotarti il conto. Non eseguire mai script .ex5 da fonti sconosciute — il codice compilato .ex5 è bytecode non leggibile e non puoi verificarne il contenuto senza decompilatore. Gli script Oracle vengono distribuiti esclusivamente tramite il canale Telegram ufficiale MTInvestments, con hash MD5 del file pubblicato per verifica. Su VPS Oracle: directory Scripts protetta in scrittura per tutti gli utenti eccetto l'admin — nessun script può essere aggiunto remotamente senza credenziali admin.

REGOLA 01
Chiudi Oracle Prima di Eseguire il Reset GV
Se esegui lo script ORACLE_RESET_GV mentre Oracle è attivo sul grafico, l'EA continua a girare ma non trova le GlobalVariables che si aspetta — comportamento indefinito. Procedura corretta: 1) rimuovi Oracle dal grafico (tasto destro → Rimuovi consulente), 2) esegui ORACLE_RESET_GV, 3) riattacca Oracle. Al reinizio, Oracle riscrive tutte le GV pulite e parte da uno stato coerente. Questo è il protocollo dopo ogni crash MT5 — non saltare il passo 1.
REGOLA 02
Test Script su Conto Demo Prima di Produzione
Ogni nuovo script va testato su conto demo prima di eseguirlo sul conto live con capitale reale. Anche se il codice sembra corretto, c'è sempre la possibilità di un bug edge case. In particolare, lo script ORACLE_CLOSE_EMERGENCY va testato su demo almeno 3 volte: una con posizione singola, una con posizioni multiple, una con nessuna posizione — per verificare che gestisca correttamente tutti e 3 i casi. Oracle distribuisce ai clienti Pro una versione demo del setup completo — VPS demo, conto demo broker, script già testati — per questo motivo.
REGOLA 03
Slippage Script Emergenza — Imposta Correttamente
Durante news improvvise su XAUUSD, lo spread può allargarsi a 8-15 pips. Con il default InpSlippage=30 punti (= 3 pips su XAUUSD), il broker potrebbe rifiutare la chiusura. In situazioni di emergenza vera, aumenta InpSlippage a 150 punti (15 pips) — accetti più slippage ma garantisci l'esecuzione. La differenza tra chiudere con 5 pips di slippage e non chiudere affatto durante una news shock può essere la differenza tra un drawdown del 3% e uno del 15%. Il punto del sistema di emergenza è uscire, non ottimizzare il prezzo di uscita.
"Il 99% del tempo Oracle lavora da solo sul VPS e non tocco nulla. Ma quel 1% — il flash crash, la news inattesa, il VPS che perde connessione con posizioni aperte — è esattamente per quello che esistono gli script di emergenza." — Manuel Trotta, Fondatore MTInvestments

Vuoi gli Script Oracle Già Pronti e Testati?

Con l'Indicatore + EA (€4.997) ricevi il pacchetto script Oracle completo: Close Emergency, Reset GV, Force Breakeven. Con ZRL LAB Full (€9.997) anche Daily Report e Sync Check. Tutto con documentazione e supporto Rossella.

VEDI I TIER ORACLE → SCRIVI A ROSSELLA

FAQ — Script MetaTrader 5

Qual è la differenza tra script, EA e indicatore in MQL5?►
Script: esecuzione one-shot. Esegue OnStart() dall'inizio alla fine, poi viene rimosso automaticamente. Nessun evento continuo. EA: gira continuamente sul grafico, riceve OnTick() su ogni prezzo, OnTimer() a intervalli fissi, OnTradeTransaction() su ogni evento di trading. Oracle v78 è un EA — deve monitorare ogni tick XAUUSD H4 per i calcoli dei 6 modelli AI. Indicatore: gira continuamente, calcola valori visualizzati sul grafico tramite OnCalculate(), non può aprire ordini direttamente. La scelta giusta dipende da: devo eseguire una volta sola? Script. Devo reagire continuamente al mercato? EA. Devo solo visualizzare dati? Indicatore.
Uno script MQL5 può aprire ordini?►
Sì. Uno script MQL5 ha le stesse capacità di un EA per la gestione ordini: può aprire, modificare, chiudere posizioni usando CTrade o OrderSend. La differenza è che lo script esegue tutto il suo codice in sequenza una sola volta, senza ricevere aggiornamenti di prezzo. Oracle include script di emergenza per chiudere posizioni che usano esattamente CTrade::PositionClose(). La limitazione pratica degli script per il trading: non possono reagire in tempo reale ai movimenti di prezzo. Uno script che apre un ordine a mercato esegue al prezzo corrente al momento dell'esecuzione — non può adattarsi dinamicamente come fa Oracle su ogni tick.
Come si installa uno script su MetaTrader 5?►
Copia il file .mq5 (sorgente) o .ex5 (compilato) nella cartella MQL5\Scripts\. In MT5 apri il Navigator (Ctrl+N), espandi "Script" — il tuo script appare nella lista. Per eseguirlo: trascina sul grafico o doppio click. Se script_show_inputs = true, appare il dialog parametri. Clicca OK — lo script esegue e si rimuove automaticamente. Se hai .mq5 (sorgente), MT5 lo compila automaticamente. Se hai .ex5 (compilato), è già pronto. Oracle distribuisce file .ex5 compilati — il codice sorgente è proprietario e non distribuito ai clienti per protezione IP.
Perché Oracle non usa il servizio segnali MT5 per distribuire i segnali?►
Il servizio segnali MT5 (MQL5 Signals) è progettato per copiare automaticamente i trade da un conto "provider" a conti "subscriber". Oracle non lo usa per ragioni strutturali: il copy trade MQL5 Signals introduce latenza variabile (50-500ms), non supporta il sizing personalizzato per conto subscriber (tutti copiano gli stessi lot del provider), e non permette la gestione differenziata SL/TP per clienti con capitali diversi. Oracle invece distribuisce l'EA direttamente a ogni cliente — ogni cliente ha la propria istanza Oracle sul proprio VPS, con sizing calibrato sul proprio capitale e rischio. I segnali vengono generati localmente da Oracle su ogni VPS. Più robusto, più personalizzato, più sicuro.
Manuel Trotta — Trader quantitativo, fondatore MTInvestments, autore Hoepli
◆ Scritto da

Manuel Trotta

Trader quantitativo italiano dal novembre 2007 — 19 anni online. Fondatore MTInvestments, creatore UlcerZenith Oracle v78 con 65.587 trade reali verificati H4 XAUUSD. Autore di 18 libri sul trading e finanza personale: "Fare Trading con Excel" (Hoepli 2019), "Diventa Investitore Profittevole in 15 Minuti al Giorno", "Il Latte con la Mucca" (memoir 2026), più 2 volumi tecnici. Speaker IT Forum Rimini. Online dal 2007 — stesso nome, stessa P.IVA.

P.IVA 14349331000 Dal Novembre 2007 18 Libri su Amazon ↗ 150K+ Follower