1. Cos'è il programma
Funzione principale:
⚠️ NON esegue ordini reali. Non apre posizioni, non tocca il conto, non modifica nulla sul server. Tutto ciò che fa è memorizzare le tue scelte e calcolare i relativi valori.
ManualBacktester è un Expert Advisor che permette di registrare trade su dati storici direttamente dal grafico, con pochi click, e di raccogliere i risultati in un file CSV con statistiche.
⚠️ NON esegue ordini reali. Non apre posizioni, non tocca il conto, non modifica nulla sul server. Tutto ciò che fa è memorizzare le tue scelte e calcolare i relativi valori.
Caratteristiche principali
- Registrazione trade con 3 click sul grafico (Entry → Stop → Target)
- Salvataggio immediato su file a ogni chiusura trade (anti-perdita)
- Ripresa automatica del setup interrotto (tasto CONTINUA)
- Esportazione report HTML
- Protezioni dati: backup
.bak, blocco sovrascrittura, log di caricamento - Uscita rapida con il tasto Q
2. Installazione e attivazione
- Il file sorgente è in
MQL5\Experts\ManualBacktester.mq5(compilato come.ex5) - Dalla Navigatore di MetaTrader (panello sinistro) trascina
ManualBacktestersul grafico desiderato - Conferma di permettere l'Algo Trading (pulsante in alto, se richiesto)
Parametri del programma (menu EA, "cappellino blu")
| Parametro | Che cosa fa | Default |
|---|---|---|
InpFilePrefix | Prefisso dei file CSV/HTML generati | ManualBacktester |
InpStratM / D / T / PG | Nomi delle strategie singole (etichette sui pulsanti e sul CSV) | M, D, T, PG |
InpStratS1..S5 | Nomi delle strategie combinate X1..X5 | MTD, MT, MD, DT, R |
InpExitOnQ | Abilita l'uscita dall'EA con il tasto Q | true |
InpBarX / InpBarY | Posizione della barra dei pulsanti sul grafico | 10 / 10 |
InpEntryColor / InpSlColor | Colori delle linee ENTRY e STOP | blu / rosso arancio |
3. Flusso di lavoro (come si usa)
Il programma funziona a fasi. Ogni fase ti dice cosa fare attraverso il messaggio di stato in basso nella barra:
| Fase | Cosa succede | Come si passa alla fase successiva |
|---|---|---|
| PRONTO | In attesa di scegliere una strategia | Premi un pulsante strategia (M/D/T/PG/…) |
| ENTRY | In attesa del 1° click (prezzo di ingresso) | Click sul grafico → linea blu ENTRY |
| SL | In attesa del 2° click (prezzo dello stop) | Click sul grafico → linea arancione SL |
| TP | In attesa del 3° click (prezzo target) | Click sul grafico → il trade viene registrato WIN |
| WATCH | Setup completo in attesa | Uscita manuale con pulsante B_SL o B_BE, oppure si continua la registrazione |
Comportamento del 3° click (importante): il 3° click registra sempre WIN, usando come prezzo di uscita esattamente il prezzo cliccato (tolleranza minima). La data/ora di uscita è ricavata dalla prima candela che tocca quel prezzo a partire dal momento del 3° click.
Lo STOP viene registrato solo se premi tu il pulsante B_SL: il programma non chiude mai da solo in stop al 3° click.
Lo STOP viene registrato solo se premi tu il pulsante B_SL: il programma non chiude mai da solo in stop al 3° click.
4. Operazioni: pulsanti e click
4.1 Pulsanti strategia (etichette)
| Pulsante | Significato | Esempio di messaggio nel journal |
|---|---|---|
M | Seleziona la strategia "M" | MBT_Strategia M selezionata: clicca l'ENTRY. |
D, T, PG | Strategie singole | idem |
X1..X5 | Strategie combinate (MTD, MT, MD, DT, R) | MBT_Strategia DT selezionata... |
4.2 Click sul grafico (3 click = 1 trade)
- 1° click → imposta il prezzo di ENTRY (linea blu)
- 2° click → imposta lo STOP LOSS (linea arancione)
- 3° click → imposta il TARGET: il trade viene subito registrato WIN al prezzo cliccato
4.3 Pulsanti di chiusura anticipata
| Pulsante | Funzione | Esempio di messaggio |
|---|---|---|
| B_SL | Chiude il trade al prezzo dello stop (STOP) | MBT_STOP registrato: LONG -1.000R |
| B_BE | Chiude il trade in pareggio al prezzo di entry (BE) | MBT_BE registrato: LONG +0.000R |
Questi pulsanti agiscono solo quando esiste un setup completo (fasi TP/WATCH).
4.4 Altri controlli
| Controllo | Funzione |
|---|---|
| CONTINUA | Riprende un setup interrotto (se esiste un file .state) |
| X (su un trade) | Cancella solo quel trade dall'elenco e aggiorna il CSV |
| REPORT | Esporta il riepilogo in un file HTML apribile con browser/Excel/Word |
| RISCHIO → SVUOTA TUTTO | Azzera elenco + CSV (richiede 2 click di conferma "SICURO?") |
| RESET | Azzera il setup corrente (entry/SL/TP) senza cancellare i trade salvati |
4.5 Esempio pratico passo-passo
// Supponiamo EURUSD H1, strategia M, area storica visibile sul grafico 1. Premi M → "Strategia M selezionata: clicca l'ENTRY." 2. Click su 1.16566 → ENTRY (linea blu) 3. Click su 1.16515 → SL (linea arancione) → PuntiStop = 51 4. Click su 1.16901 → TP → MBT_WIN 3click TP=1.16901 → MBT_ESITO WIN LONG M | entry=1.16566 sl=1.16515 tp=1.16901 exit=1.16901 | R=+3.093 → MBT_WIN registrato: LONG +3.093R [M entry 1.17 -> uscita 1.17] 5. Il trade è nel CSV con tutti i suoi valori.
5. Tasti
| Tasto | Azione | Nota |
|---|---|---|
| Q | Esce dall'EA (ExpertRemove) | Attivo solo se InpExitOnQ = true |
Il tasto Q non scrive nulla sul grafico: è documentato solo nei parametri EA.
6. Cosa viene registrato per ogni trade
| Campo CSV | Significato | Esempio |
|---|---|---|
Id | Numero progressivo | 13 |
Strategia | Etichetta scelta (M/D/T/PG/MTD/…) | D |
Direzione | LONG o SHORT (dipende dai prezzi cliccati) | LONG |
DataEntry / OraEntry | Data e ora della candela dell'entry | 2026.01.20 / 04:00:00 |
Entry / SL / TP | Prezzi impostati con i 3 click | 1.16455 / 1.16303 / 1.17094 |
Stop / Profit | Distanza in prezzo da entry a stop/target | 0.00152 / 0.00639 |
PuntiStop / PuntiProfit | Le stesse distanze in punti (1 punto = minimo incremento prezzo del simbolo) | 152 / 639 |
ValoreStop | Valore monetario dello stop (calcolato dal valore del tick) | 131.06 |
Esito | WIN, STOP o BE | WIN |
R | Multiplo: risultato in unità di rischio (positivo = guadagno) | +4.204 |
DataExit / OraExit | Data/ora di uscita (prima candela che tocca il prezzo di uscita) | 2026.01.21 / 11:00:00 |
PrezzoExit | Prezzo di uscita effettivo | 1.17094 |
7. File generati (cartella MQL5\Files)
| File | Contenuto | Creato da |
|---|---|---|
ManualBacktester_SIMBOLO.csv | Elenco completo dei trade (1 riga per trade) | Ogni chiusura trade |
ManualBacktester_SIMBOLO.csv.bak | Copia di sicurezza del CSV precedente, prima di ogni riscrittura | v2.09+ |
ManualBacktester_SIMBOLO.state | Setup in corso (per la ripresa con CONTINUA) | Ogni click |
ManualBacktester_SIMBOLO.html | Report esportato con REPORT | Pulsante REPORT |
Il "SIMBOLO" è il simbolo del grafico su cui è attaccato l'EA: ogni simbolo ha quindi i suoi file separati.
8. Funzioni interne (come è fatto il programma)
Sezioni semplificate a scopo di comprensione.
8.1 Gestione eventi — OnChartEvent
Unico punto d'ingresso per click, pulsanti e tasti:
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_KEYDOWN) // pressione tasti (es. Q)
{ if(InpExitOnQ && (sparam=="Q" || sparam=="q")) { ExpertRemove(); return; } }
if(id==CHARTEVENT_CLICK) // click sul grafico (Entry/SL/TP)
HandleClick((int)lparam,(int)dparam);
// ... gestione pulsanti (B_SL, B_BE, strategie, REPORT, SVUOTA ...)
}
8.2 Chiusura del 3° click — CheckPrice
if(!g_histChecked)
{
g_histChecked=true;
PrintFormat(PREFIX+"WIN 3click TP=%.5f",g_tpPrice);
CloseTrade(g_tpPrice); // usa SEMPRE il prezzo cliccato
return;
}
8.3 Rispetto del prezzo cliccato — SnapCandle
snapPrice = price; // il valore resta quello del click int base = iBarShift(_Symbol,_Period,t,false); // cerca SOLO tra ±3 candele quella che incrocia il prezzo (tolleranza 0.5 punto) // altrimenti usa la candela del click; mai ricerche lontane nel tempo
8.4 Data/ora di uscita — GetExitTime / FindHitTime
// WIN -> cerca la prima candela che tocca il TP a partire dal 3° click (g_tpTime) // STOP -> cerca la prima che tocca lo SL a partire da g_slTime // Se nessun contatto: ClosestCandleAfterEntry() = prima candela dopo l'entry
8.5 Registrazione del trade — CloseTrade
t.id = g_nextId++; t.de = g_entryTime; t.entry = g_entryPrice; t.sl = g_slPrice; t.tp = g_tpPrice; t.exitPrice = exitPrice; t.dx = GetExitTime(exitPrice, isLong); // data/ora di uscita FillDerived(t); // direzione, punti, valore stop CalcResult(t); // esito e R g_tradeCount++; g_trades[g_tradeCount-1] = t; SaveTrades(); // salvataggio immediato su CSV
8.6 Salvataggio e backup — SaveTrades / BackupFile
if(FileIsExist(g_fileName)) BackupFile(g_fileName); // 1) copia del CSV in .bak if(g_tradeCount==0 && !g_deleting && FileIsExist(g_fileName)) { Print("Salvataggio BLOCCATO: lista vuota ma CSV esistente"); // 2) guardia return; } int h=FileOpen(g_fileName,FILE_WRITE|FILE_CSV|FILE_ANSI,';'); FileWrite(h,"Id","Strategia","Direzione", ...); // riga intestazione (18 campi) for(int i=0;i<g_tradeCount;i++) FileWrite(h, ...); // tutte le righe FileClose(h);
8.7 Caricamento al riavvio — LoadTrades
for(int hc=0; hc<18; hc++) FileReadString(h); // salta l'INTERA intestazione while(!FileIsEnding(h)) { // legge i 18 campi di ogni riga; scarta quelle corrotte (id<1 o entry=0) ... g_tradeCount++; } Print(PREFIX,"Caricati ",(string)g_tradeCount," trade da ",g_fileName);
8.8 Statistiche — RecomputeStats
// aggiorna: n, WIN/STOP/BE, win rate, R medio, profit factor, drawdown ... // contiene la guardia anti "zero divide": g_rr = (g_w>0 && g_l>0 && g_avgL<-0.0000001) ? (g_avgW/(-g_avgL)) : 0.0;
8.9 Report HTML — ExportHtml
Raccoglie l'elenco in memoria e genera ManualBacktester_SIMBOLO.html con tutte le righe.
9. Storico delle versioni
| Versione | Novità |
|---|---|
| v2.05 | Versione di partenza (logica di controllo storico al 3° click) |
| v2.06 | Fix blocco "zero divide" in RecomputeStats; 3° click sempre WIN; funzione ClosestCandleAfterEntry |
| v2.07 | SnapCandle riscritta: prezzo cliccato SEMPRE rispettato; FindHitTime con "da ora" e tolleranza; GetExitTime dal 3° click in poi |
| v2.08 | Uscita con tasto Q (input InpExitOnQ) |
| v2.09 | Anti-perdita dati: backup automatico .bak, blocco sovrascrittura con lista vuota, log di caricamento, SVUOTA con backup |
| v2.10 | Fix caricamento: salta l'intera riga di intestazione (18 campi) → al riavvio i trade vengono ricaricati correttamente |
10. Controlli e avvisi da conoscere
AvvioIl journal mostra
Pronto. PREMI M/D/T/PG per iniziare. oppure Setup interrotto trovato. Premi CONTINUA.Ricarico datiAd ogni avvio:
Caricati N trade da ManualBacktester_SIMBOLO.csv. Se N non è quello atteso, controlla il file .bak.Salvataggio bloccatoSe la lista è vuota ma il CSV esiste, il programma NON sovrascrive e avvisa nel journal.
SVUOTAIrreversibile sull'elenco, ma da v2.09 il CSV viene prima copiato in
.bak.Setup non validoErrori gestiti con messaggi: TP uguale all'entry, SL dal lato sbagliato, registrazione già in corso, ecc.
File mancantiSe cancelli il CSV, al riavvio si riparte da zero (il programma lo segnala solo se esisteva).
Regola d'uso sicura: prima di iniziare una nuova sessione, verifica nel journal il conteggio
Caricati N trade: se corrisponde a ciò che ti aspetti, puoi lavorare tranquillo. Tutto il resto del lavoro del programma è automatizzato.