Backtesting e creazione di un file di report

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico

Moderator: Dainesi

Post Reply
SebaX75
Posts: 18
Joined: 15/04/2015, 14:54

Backtesting e creazione di un file di report

Post by SebaX75 » 26/04/2016, 16:40

Ciao a tutti,
vorrei creare un report simile a quello che si ottiene alla fine di ogni ciclo di testing e scrivere i risultati all'interno di un file.
Il codice l'ho inserito all'interno della chiamata OnTester() e la maggior parte dei valori che mi servono li recupero con la funzione TesterStatistics(STAT_qualcosa), ma ci sono dei valori che questa funzione non include e, metre per alcuni ho trovato una soluzione, per altri non saprei come fare:
- il cross considerato (trovato con la funzione Symbols());
- il timeframe (trovato con la funzione Period());
- il numero di barre esaminate dal tester (?);
- la data di inzio del periodo di test (?);
- la data di fine del periodo di test (?);

Qualcuno sa dirmi come fare?

Grazie,
SebaX75

User avatar
carlo10
Posts: 1874
Joined: 08/05/2014, 21:17

Re: Backtesting e creazione di un file di report

Post by carlo10 » 27/04/2016, 8:45

Il nuermo di barre dovresti ottenerlo con la funzione Bars -> https://docs.mql4.com/predefined/bars

Con Time[0] all'interno della onInit() ti salvi la data di inizio mentre con Time[0] all'interno della deInit() ti salvi la data di fine.

SebaX75
Posts: 18
Joined: 15/04/2015, 14:54

Re: Backtesting e creazione di un file di report

Post by SebaX75 » 27/04/2016, 14:37

Ciao Carlo10,
grazie per l'aiuto, ha funzionato quasi tutto... pensavo che la variabile Bars fosse utilizzabile solamente all'interno della OnTick od OnCalculate per gli indicatori.
Per quello che riguarda il tempo solamente una precisazione che può essere utile a chi rileggerà questo post:
- per stampare il report io ho utilizzato la OnTester();
- la funzione OnTester() viene eseguita prima della OnDeInit();
- per stampare il valore corretto, la Time[0] di fine la chiamo nella OnTester() e poi stampo.

Il report che stampo adesso è quasi identico a quello che si vede nei tab, mi mancherebbero ancora:
- Ticks adoperati per il modello;
- Qualita' del modello;
- Errori di grafici;
ma per adesso non ho trovato nulla a riguardo.

Se a qualcuno può interessare, questa è la parte di codice che restituisce i valori nello stesso ordine in cui li si leggono nel report "ufficiale" (il tab):

Code: Select all

Bars,0,0,0,
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_INITIAL_DEPOSIT),roundTo)),ReplaceDotComma(DoubleToStr((Ask-Bid)/Point(),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFIT),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_GROSS_PROFIT),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_GROSS_LOSS),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFIT_FACTOR),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_EXPECTED_PAYOFF),roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_INITIAL_DEPOSIT)-TesterStatistics(STAT_EQUITYMIN),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_EQUITY_DD),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_EQUITYDD_PERCENT),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_EQUITY_DDREL_PERCENT),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_EQUITY_DD_RELATIVE),roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_SHORT_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFIT_SHORTTRADES)/TesterStatistics(STAT_SHORT_TRADES)*100,roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_LONG_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFIT_LONGTRADES)/TesterStatistics(STAT_LONG_TRADES)*100,roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFIT_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFIT_TRADES)/TesterStatistics(STAT_TRADES)*100,roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_LOSS_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_LOSS_TRADES)/TesterStatistics(STAT_TRADES)*100,roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_MAX_PROFITTRADE),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_MAX_LOSSTRADE),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_GROSS_PROFIT)/TesterStatistics(STAT_PROFIT_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_GROSS_LOSS)/TesterStatistics(STAT_LOSS_TRADES),roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_CONPROFITMAX_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_CONPROFITMAX),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_CONLOSSMAX_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_CONLOSSMAX),roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_MAX_CONWINS),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_MAX_CONPROFIT_TRADES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_MAX_CONLOSSES),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_MAX_CONLOSS_TRADES),roundTo)),
ReplaceDotComma(DoubleToString(TesterStatistics(STAT_PROFITTRADES_AVGCON),roundTo)),ReplaceDotComma(DoubleToString(TesterStatistics(STAT_LOSSTRADES_AVGCON),roundTo))
Nota: lo spread è rappresentato in punti ed è quello dell'ultimo prezzo ricevuto, la funzione ReplaceDotComma sostituisce i punti con le virgole in modo da poter poi importare i dati in excel senza problemi.

Grazie,
SebaX75

Post Reply

Who is online

Users browsing this forum: No registered users and 2 guests