Vorrei ottimizzare i miei backtest mettendo insieme un sistema di scarti che il processore di backtest deve “saltare”.
In pratica pensavo di inserire nel codice dei ProOrder una serie di if..then..else, che escludano alcune combinazioni.
Ad esempio, quando in un sistema si vanno ad ottimizzare due medie mobili all’incrocio insieme con dei parametri di exit, si potrebbe scartare i casi in cui la media A sia uguale o troppo vicina alla media B, eliminando cosi un quantità notevole di combinazioni.
Tra le istruzioni di PRT non ho però trovato nessuna istruzione che mi permetta di “saltare” il codice sottostante, una sorta di “exit” disponibile in altri linguaggi che mi farebbe uscire senza eseguire tutto il codice, guadagnando cosi tempo e velocizzando i test.
Come potrei fare ? Ho già pensato di mettere tutto in una grossa IF ma non so come lavora il processore interprete del PRT per cui, questo metodo, potrebbe anche essere controproducente perché a seconda di come lavora l’interprete, il codice sottostante potrebbe essere comunque “lavorato” pur non producendo nulla.
Cosa mi suggerite ?
Ciao! Beh, la curiosità mi ha stuzzicato e ho fatto 4 prove.
Con questo codice di base ho aggiunto dei filtri.
Prova 1: la base. Incrocio di medie da ottimizzare (lenta da 5 a 60 con passo 1 e veloce da 5 a 30 con passo 1).
Il risultato è stato che ci sono voluti 43 secondi.
Prova 2: aggiungo un filtro delle differenze tra le medie per scartarne alcune.
Il risultato è stato che ci sono voluti 39 secondi.
Prova 3: rimuovo il filtro delle differenze tra le medie e inserisco una condizione all’inizio del codice che esegue QUIT se i periodi della media veloce sono superiori a quelli della media lenta.
Il risultato è stato che ci sono voluti 32 secondi.
Prova 4: aggiungo il filtro delle differenze e il comando QUIT.
Il risultato è stato che ci sono voluti 30 secondi.
Ecco il codice che ho utilizzato
// Definition of parameters (example for optimization)
// FastPeriod = 10 (variable optimized 5-30 step 1)
// SlowPeriod = 20 (variable optimized 5-60 step 1)
// ---------------------------------------------------------
// OPTIMIZATION FILTER
// ---------------------------------------------------------
IF FastPeriod >= SlowPeriod THEN
QUIT
ENDIF
// ---------------------------------------------------------
// INDICATORS AND TRADING LOGIC
// ---------------------------------------------------------
myFastMA = Average[FastPeriod](close)
mySlowMA = Average[SlowPeriod](close)
// Check for proximity (Example: avoiding MAs being too close)
diff = ABS(myFastMA - mySlowMA)
minDistance = 5 * PointSize // Minimal distance required
IF diff > minDistance THEN
IF myFastMA CROSSES OVER mySlowMA THEN
BUY 1 CONTRACT AT MARKET
ENDIF
IF myFastMA CROSSES UNDER mySlowMA THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
ENDIF
// Stops and Targets
SET STOP PLOSS 50
SET TARGET PPROFIT 100
Cose che forse dovremmo tenere in considerazione sono:
1) i backtest vengono eseguiti sui server PRT, quindi a seconda del loro carico i backtest potrebbero richiedere più o meno tempo.
2) Questo non lo so, ma forse viene presa in considerazione la cache e se si ripete immediatamente il backtest i risultati cambiano. Io ho effettivamente eseguito i test in ordine inverso, quindi questa teoria verrebbe smentita.
Quindi la mia teoria sarebbe confermata ?
Riguardo alla cache si, la usano sicuramente perchè quando lanci lo stesso backtest più volte le volte successive non parte da zero ma si prende una parte dei risultati precedenti.
Ma veniamo all’istruzione Quit. Io credevo che usandola mi uscisse dal backtest invece tu mi dici che esce solo da quel ciclo ed essendo in BT ne inizia un’altro ?
Sarebbe l’uovo di colombo…..
Dunque ho rivisto il codice originale di Ivan per farne uno script facilmente esportabile e incollabile all’inizio di ogni ProOrder.
Lo allego qui sotto.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Backtest filtering and optimizing script
//
// Scope : optimize the Backtest time, excluding or jumping over the combination that are not useful
// for the Backtest. Example: if you are using the cross of 2 or more MA to detect order input or
// exit, for sure, you have some not useful combinations like:
// - MA1=MA2
// - FastMA>SlowMA
// - a minimum distance from the periods of the MA
// so, you can exclude this combination from the backtest.
//
// Usage : include and adapt this script to your ProOrder code, inserting it at the beginning
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Detecting and exclude combinations
C1=MAFAst>=MASlow
C2=MASlow<MAFast+5 C3=Timestart>=TimeStop
C4=TimeStop<TimeStart+6
//adding other conditions if necessary, including them into the if test
if C1 and C2 and C3 and C4 then
Quit
endif
// End script