🛠 ManualBacktester — Manuale del programma

Guida all'uso e al funzionamento interno · versione 2.10 · file: ManualBacktester.mq5

1. Cos'è il programma

Funzione principale: 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

2. Installazione e attivazione

  1. Il file sorgente è in MQL5\Experts\ManualBacktester.mq5 (compilato come .ex5)
  2. Dalla Navigatore di MetaTrader (panello sinistro) trascina ManualBacktester sul grafico desiderato
  3. Conferma di permettere l'Algo Trading (pulsante in alto, se richiesto)

Parametri del programma (menu EA, "cappellino blu")

ParametroChe cosa faDefault
InpFilePrefixPrefisso dei file CSV/HTML generatiManualBacktester
InpStratM / D / T / PGNomi delle strategie singole (etichette sui pulsanti e sul CSV)M, D, T, PG
InpStratS1..S5Nomi delle strategie combinate X1..X5MTD, MT, MD, DT, R
InpExitOnQAbilita l'uscita dall'EA con il tasto Qtrue
InpBarX / InpBarYPosizione della barra dei pulsanti sul grafico10 / 10
InpEntryColor / InpSlColorColori delle linee ENTRY e STOPblu / 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:
FaseCosa succedeCome si passa alla fase successiva
PRONTOIn attesa di scegliere una strategiaPremi un pulsante strategia (M/D/T/PG/…)
ENTRYIn attesa del 1° click (prezzo di ingresso)Click sul grafico → linea blu ENTRY
SLIn attesa del 2° click (prezzo dello stop)Click sul grafico → linea arancione SL
TPIn attesa del 3° click (prezzo target)Click sul grafico → il trade viene registrato WIN
WATCHSetup completo in attesaUscita 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.

4. Operazioni: pulsanti e click

4.1 Pulsanti strategia (etichette)

PulsanteSignificatoEsempio di messaggio nel journal
MSeleziona la strategia "M"MBT_Strategia M selezionata: clicca l'ENTRY.
D, T, PGStrategie singoleidem
X1..X5Strategie combinate (MTD, MT, MD, DT, R)MBT_Strategia DT selezionata...

4.2 Click sul grafico (3 click = 1 trade)

  1. 1° click → imposta il prezzo di ENTRY (linea blu)
  2. 2° click → imposta lo STOP LOSS (linea arancione)
  3. 3° click → imposta il TARGET: il trade viene subito registrato WIN al prezzo cliccato

4.3 Pulsanti di chiusura anticipata

PulsanteFunzioneEsempio di messaggio
B_SLChiude il trade al prezzo dello stop (STOP)MBT_STOP registrato: LONG -1.000R
B_BEChiude 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

ControlloFunzione
CONTINUARiprende un setup interrotto (se esiste un file .state)
X (su un trade)Cancella solo quel trade dall'elenco e aggiorna il CSV
REPORTEsporta il riepilogo in un file HTML apribile con browser/Excel/Word
RISCHIO → SVUOTA TUTTOAzzera elenco + CSV (richiede 2 click di conferma "SICURO?")
RESETAzzera 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

TastoAzioneNota
QEsce 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 CSVSignificatoEsempio
IdNumero progressivo13
StrategiaEtichetta scelta (M/D/T/PG/MTD/…)D
DirezioneLONG o SHORT (dipende dai prezzi cliccati)LONG
DataEntry / OraEntryData e ora della candela dell'entry2026.01.20 / 04:00:00
Entry / SL / TPPrezzi impostati con i 3 click1.16455 / 1.16303 / 1.17094
Stop / ProfitDistanza in prezzo da entry a stop/target0.00152 / 0.00639
PuntiStop / PuntiProfitLe stesse distanze in punti (1 punto = minimo incremento prezzo del simbolo)152 / 639
ValoreStopValore monetario dello stop (calcolato dal valore del tick)131.06
EsitoWIN, STOP o BEWIN
RMultiplo: risultato in unità di rischio (positivo = guadagno)+4.204
DataExit / OraExitData/ora di uscita (prima candela che tocca il prezzo di uscita)2026.01.21 / 11:00:00
PrezzoExitPrezzo di uscita effettivo1.17094

7. File generati (cartella MQL5\Files)

FileContenutoCreato da
ManualBacktester_SIMBOLO.csvElenco completo dei trade (1 riga per trade)Ogni chiusura trade
ManualBacktester_SIMBOLO.csv.bakCopia di sicurezza del CSV precedente, prima di ogni riscritturav2.09+
ManualBacktester_SIMBOLO.stateSetup in corso (per la ripresa con CONTINUA)Ogni click
ManualBacktester_SIMBOLO.htmlReport esportato con REPORTPulsante 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

VersioneNovità
v2.05Versione di partenza (logica di controllo storico al 3° click)
v2.06Fix blocco "zero divide" in RecomputeStats; 3° click sempre WIN; funzione ClosestCandleAfterEntry
v2.07SnapCandle riscritta: prezzo cliccato SEMPRE rispettato; FindHitTime con "da ora" e tolleranza; GetExitTime dal 3° click in poi
v2.08Uscita con tasto Q (input InpExitOnQ)
v2.09Anti-perdita dati: backup automatico .bak, blocco sovrascrittura con lista vuota, log di caricamento, SVUOTA con backup
v2.10Fix 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.