PROBACKTEST
1 - PROBACKTEST
Se siete traders che utilizzano solamente i dati giornalieri come base per il vostro trading, prorealtime è
sicuramente la piattaforma che fa per voi.
Vi sarà utilissima per analizzare i mercati e sperimentare le vostre strategie, fare i backtest e poi
immettere gli ordini sulla piattaforma del vostro Broker, e questo credetemi è già un grandissimo
vantaggio.
I delay tra dati giornalieri della piattaforma e quelli del broker non dovrebbero essere rilevanti.
Probacktest ci serve ai fini di ricavare le statistiche delle varie strategie long o short term che devono
fungere principalmente da supporto psicologico per la nostra operatività di trading.
Grazie a questo programma possiamo renderci conto delle possibilità e delle potenzialità che realmente
hanno i nostri sistemi, grazie al profit factory, alle percentuali di vincite e di perdite ed a tutta una serie di
statistiche relative al money management.
Non solo, ma possiamo paragonare i diversi sistemi l'uno con l'altro, ottimizzare i parametri da utilizzare nel
trading reale su tutti i mercati disponibili, anche senza utilizzare il trading automatico del software, cioè
Proorder.
Possiamo fare una lista dei parametri adatti per ogni tipo di mercato:
Una volta che sappiamo cosa cercare, lo facciamo tramite proscreener quando i mercati sono chiusi.
Inoltre, probacktest è utilissimo per identificare i parametri dominanti dei vari indicatori che possono non
essere affatto i valori di default.
Per esempio, non è detto che il periodo dominante dell'RSI sia 14 per un determinato mercato, come non è
detto che l'ipercomprato l'ipervenduto siano ai livelli di 70 e 30.
Per capire quali siano, basta impsotare un trading system che ottimizza questi 3 parametri in modo da
vedere quali siano i valori più adatti per quel mercato.
Possiamo per esempio vedere quale sia la media mobile che funziona meglio, facendo un sistema di
incrocio col prezzo.
2 - FINESTRA DI PROGRAMMAZIONE
Prima di iniziare consiglio sempre di vedere i video offerti dal sito prorealtime, scaricare la guida in PDF
probacktest & proorder, leggere la pagina dedicata ai sistemi automatici, e visitare il sito prorealcode.
Vediamo ora nel dettaglio il procedimento di impiego di Probacktest nella scrittura dei programmi di
trading o EA - Expert Advisors (consiglieri esperti).
Come per inserire un indicatore, cliccate sulla stessa icona in alto a destra della finestra prezzo e
successivamente sulla sezione di destra della finestra di controllo "backtesting e trading automatico".
A sinistra della finestra verranno visualizzati i vostri trading systems salvati e quelli predefiniti di esempio
che vi fornisce la piattaforma.
Per creare un nuovo trading system, dovete cliccare su nuovo e si apre la finestra di programmazione.
Anche in questo caso, potete utilizzare la creazione semplificata cliccando sugli indicatori del grafico per
definire le condizioni ed immettere le operazioni.
Orari di trading.
Oppure, possiamo inserire direttamente i codici noi stessi, scrivendoli nella finestra di programmazione, ed
è ciò che faremo.
Dobbiamo semplicemente inserire al posto della dicitura "TueCondizioni" appunto, le condizioni del nostro
sistema.
Sulla sezione di destra, dobbiamo settare alcuni parametri relativi al money management e cioè:
1) Il capitale iniziale (del conto di trading che è relativo alla valuta dello strumento su cui stiamo
lavorando).
2) Misura per lotto, solo per il forex (microlotto 1000, minilotto 10000, lotto 100000 o multipli o divisori,
ecc....)
4) Spread.
Quando è tutto impostato potete spuntare la casella "mantieni la finestra aperta" ed eseguire il comando
"Probacktesta il mio sistema".
Possiamo inserire le variabili come abbiamo visto con gli indicatori probuilder ed effettuare le
ottimizzazioni.
Le ottimizzazioni ci permettono di vedere quali sono i parametri che danno le migliori performance in
termini di profitto.
In seguito vedremo un esempio con i risultati dei sistemi visualizzati sul grafico e sulla tabella delle
statistiche.
FASE 1
Per prima cosa dobbiamo settare la possibilità di eseguire solo un ordine oppure più ordini
successivamente, cioè l'istruzione del CUMULO DI ORDINI.
Possiamo settare inoltre, il numero di barre da caricare per il backtest ed affinchè il nostro sistema funzioni
in reale:
DEFPARAM preloadbars=10000
Oppure, per la simulazione ed il trading reale in intraday, possiamo selezionare l'intervallo di tempo in cui il
nostro sistema deve oparare:
DEFPARAM flatbefore=hhmmss
il sistema non deve essere operativo prima di un certo orario (ora, minuti, secondi) per esempio: 09:00:00.
Il sistema aprirà operazioni a partire dalle 09:00:00.
DEFPARAM flatafter=hhmmss
il sistema non deve essere operativo dopo un certo orario (ora, minuti, secondi) per esempio: 22:00:00. Il
sistema chiuderà tutte le operazioni in essere alle 22:00:00.
________________________________________________________________________________________
FASE 2
Il secondo step è quello dell'inserimento di tutti gli indicatori e delle condizioni come abbiamo fatto con
proscreener e probuilder.
Possiamo definirli come C1, C2, C3 oppure con qualsiasi altro nome a nostro piacimento, l'importante è che
successivamente vengano richiamati con gli stessi nominativi nelle istruzioni di acquisto e vendita.
________________________________________________________________________________________
FASE 3
In seguito, come abbiamo visto nella scaletta della programmazione semplificata immettiamo le istruzioni
secondo lo schema generale seguente:
ENDIF
SELL AT MARKET
ENDIF
ENDIF
EXITSHORT AT MARKET
ENDIF
VEDI PUNTO 7
SET STOP XLOSS X
Inoltre possiamo omettere il punto 5, in quanto nelle istruzioni 2 e 4 sono già previste le uscite dai trades
long e short.
4 - ISTRUZIONI IMPORTANTI
Vediamo ora alcune istruzioni importanti per la programmazione di probacktest che abbiamo già visto, in
parte, nelle istruzioni precedenti.
I comandi sono:
Stop, se il prezzo di acquisto è superiore al prezzo corrente od il prezzo di vendita inferiore al prezzo
corrente.
Limit, se il prezzo di acquisto è inferiore od il prezo di vendita superiore rispetto al prezzi corrente.
Se utilizzo il comando AT MARKET, vado direttamente a mercato quando il segnale di acquisto o di vendita
impostato si verifica.
In realtà, non si va subito a mercato, ma all'apertura della barra successiva, cioè NEXTBAROPEN, e questo
accade sempre con i sistemi di trading automatici di Proorder.
Ad esempio, se il mio sistema prevede di comprare su un nuovo massimo mensile (se il backtest è
impostato su timeframe daily), inserisco una condizione, per esempio:
MASSIMO20=high[0]>=highest[20](high)[1]
ENDIF
Cioè, traducendo: se non sono a mercato con un trade long, ogni qualvolta il prezzo fa un nuovo massimo a
20 periodi o giorni, il sistema genera un segnale di acquisto e all'APERTURA DELLA BARRA SUCCESSIVA
acquisterà 1 contratto come da me specificato.
Se ho impostato il cumulo di ordini su TRUE, questo avverrà ad ogni massimo successivo mensile.
Se ho impostato FALSE, avverrà solo la prima volta fino alla chiusura del trade.
________________________________________________________________________________________
Per farlo basta semplicemente settare la condizione di massimo o minimo del canale di donchian ma non
riferito al giorno prima (quindi senza il [1] finale) e cioè:
C1=HIGHEST[N](HIGH)
C2=LOWEST [N](LOW)
If C1 then
Come vedete, ordino che non appena il prezzo tocca la resistenza a N periodi il mio sistema backtest
compra a quel livello di prezzo C1 e non all'apertura della candela successiva.
Il contrario per l'operazione short andando a vendere su C2 con un ordine stop al punto C2, cioè quando si
verifica il minimo su cui andare a breakdown.
Per acquistare quando il prezzo tocca il massimo od il minimo della candela precedente si utilizzano i
seguenti parametri:
C1=HIGHEST[1](HIGH)
C2=LOWEST [1](LOW)
Lo stesso può essere fatto sui tutti i tipi di canali, come il canale di donchian sui prezzi di chiusura, le bande
di bollinger od il canale di Keltener, le envelopes, ecc...basta determinare i codici del canale e inserire
l'istruzione base che ho scritto sopra per
negoziare a breakout.
Nell'esempio sopra:
If C2 then
________________________________________________________________________________________
_
3) ISTRUZIONE DI INCROCIO.
Queste istruzioni sono molto utili perchè permettono di comprare o vendere a seguito dell'incrocio di un
livello di valore dall'alto verso il basso (crosses under) o dal basso verso l'altro (crosses over).
Viene utilizzato per le medie mobili, ma anche per tutti gli altri indicatori che hanno livelli di valori per
esempio:
l'incrocio dello 0 nel ROC, dei livelli di ipercomprato e ipervenduto degli oscillatori, dei massimi e minimi dei
canali di Donchian, oppure delle bande di Bollinger.
Esempio:
________________________________________________________________________________________
_
4) QUANTITA'
SHARES rappresenta il lotto minimo, per le azioni equivale ad 1 azione e per le commodities e gli indici ad 1
contratto.
L'istruzione è:
Se ho impostato 1000 come misura per lotto (solo per il forex) significa che ogni SHARE equivale a 1.000 $
della valuta quotata.
Invece, per determinare la quantità di azioni, contratti forex, commodities o indici acquistabili per trade in
base ad una % di rischio, per esempio il 2% dobbiamo utilizzare la formula:
Definendo prima i livelli di ENTRY e di STOP LOSS del nostro sistema mediante indicatori e condizioni.
2) Oppure possiamo utilizzare il codice CASH, cioè soldi.
Con questo comando posso determinare l'ammontare della mia scommessa mediante una % del conto di
trading impostato nella sezione di destra della finestra di programmazione.
Per esempio, se il conto è di 10.000 $ e voglio negoziare il 10% per trade, imposto 1.000 $, cioè:
________________________________________________________________________________________
_
Queste variabili sono introdotte con l'istruzioni IF e IF NOT prima di un'entrata in posizione come abbiamo
visto nello schema delle fasi generali:
________________________________________________________________________________________
_
Ad esso sono legate le istruzioni per determinare la grandezza della posizione in lotti o contratti e quindi la
definizione di quante volte successivamente entrare a mercato:
COUNTOFLONGSHARES : grandezza di una posizione lunga se c'è una posizione lunga aperta, altrimenti 0.
COUNTOFSHORTSHARES: grandezza di una posizione corta, se c'è una posizione corta aperta, altrimenti 0.
Queste istruzioni vanno aggiunte alle istruzioni IF LONGONMARKET per determinare acquisti e vendite.
Per esempio, se determinate l'ammontare del lotto FOREX a 1000, significa che 1 contratto o share equivale
a 1.000 $ della valuta base.
Quando vogliamo limitare l'acquisto a 5 contratti o 5.000 $, dovremo specificare nel codice di acquisto:
ENDIF
ENDIF
In questo modo sostituiamo quindi il codice IF NOT LONGONMARKET con i codici delle posizioni massime
long e short.
ATTENZIONE:
Quando non definite il lotto dei contratti nella sezione di destra, ma utilizzate la formula:
BUY 200/(ENTRY - STOP LOSS) SHARES AT MARKET, in questo caso dovete capire che la definizione del
lotto negoziabile non è fissa ma è variabile.
Quindi, non abbiamo per esempio nelle azioni un LOTTO specifico ma azioni il cui numero varia in base ai
livelli di prezzo di ENTRY e di STOP LOSS.
Quindi, in base al prezzo del titolo dobbiamo fare una stima della posizione totale che vogliamo assumere
in quel particolare mercato e dobbiamo porre un limite di posizione totale in $.
ENDIF
ENDIF
Negozierete 1000 azioni o contratti per posizione fino ad un totale di 10000 azioni.
________________________________________________________________________________________
_
- TRADEINDEX consente di accedere alla barra dell'ennesimo ordine precedente eseguito e cioè mediante il
comando: TRADEINDEX(N).
- TRADEPRICE trova invece il prezzo della transazione precedentemente eseguita mediante il comando:
TRADEPRICE (N).
Quest'ultima è utile per esempio quando vogliamo entrare con una seconda posizione quando la prima è a
break-even, cioè quando il trailing profit (stop loss) settato da un indicatore trailing lineare come il
supertrend è a livello dell'entrata del trade precedente.
// prima posizione
- BARINDEX, si riferisce alla barra corrente e di solito è utilizzata con TRADEINDEX per identificare per
quante barre deve rimanere aperta una posizione:
endif.
In questo caso, la nostra posizione durerà 3 barre, cioè chiuderà all'apertura della quarta candela "at
market", cioè sempre nextbaropen.
________________________________________________________________________________________
_
8) TIME.
Con questa funzione, possiamo ordinare al sistema di compiere operazioni entro una determinata fascia
oraria, sia per le operazioni long che quelle short.
Per esempio se vogliamo che le operazioni long siano svolte dalle 15:00 alle 18:00, impostiamo una
funzione mediante IF (TIME=>15:00 and TIME <=18:00 and condizioni.....).
In questo caso, le operazioni si aprono solo in quelle ore, ma rimangono attive anche oltre se non
dichiarate ulteriormente.
DEFPARAM flatbefore=hhmmss e DEFPARAM flatafter=hhmmss che indicano le fasce orarie entro le quali
i trading system sono validi durante la giornata.
_________________________________________________________________________________
Vedi sotto.
Stop loss, target e trailing verranno calcolati dal punto di entrata in un trade, e quindi dall'apertura della
barra successiva rispetto al segnale di trading impostato se AT MARKET.
A meno che non si entri a breakout di un livello di prezzo con ordini STOP.
Come abbiamo visto in strumenti operativi i punti o pips dei vari strumenti dipendono dai decimali della
quotazione.
Per calcolare i Pip, le unità di prezzo vanno moltiplicate per i decimali del prezzo.
Per esempio nel forex 1 pip equivale a 0.0001 unità di prezzo perchè:
0.0001*10.000=1.
Negli indici, azioni o commodities con 2 decimali dopo la virgola il punto sarà al centesimo.
Questi codici vanno scritti alla fine della programmazione e calcolano direttamente la direzione e la
distanza dal punto di entrata nel trade.
Va prima definita la distanza dal punto di entrata allo stop loss mediante una condizione od un indicatore
nell'elenco principale oppure direttamente nel codice finale.
Per esempio se il vostro sistema ha uno stop loss iniziale pari a 2 volte il valore dell'ATR che è espresso in
unità di prezzo (quindi senza dichiarazioni nei codici), può essere definito nell'elenco a priori:
Sloss=averagetruerange[14](close)*2
SET STOP LOSS avreagetruerange[14](close)*2
In questo modo il programma setta lo stop loss ad una distanza dal prezzo di entrata pari a 2 volte l'ATR
(in unità).
Se avete utilizzato invece l'opzione della determinazione del rischio in $, cioè per esempio:
Se voglio impostare un target profit pari a 3 volte il mio rischio, imposterò a seconda dei 2 casi:
oppure:
Quindi è fondamentale indicare i parametri giusti dell'indicatore di stop loss, trailing o target e l'unità di
misura: unità, punti, % o cash $
C'è la possibilità di impostare uno stop loss iniziale e farlo diventare un trailing profit quando il prezzo
raggiunge un certo livello.
Per esempio:
In questo caso setto uno stop loss ad una distanza di 20 punti dal prezzo di entrata nel trade, ad esempio a
5000.
Non appena la distanza tra stop loss e prezzo corrente diventa di 50 punti, scatta il trailing profit, cioè a
5030.
Quindi se successivamente il prezzo sale fino a 5100 il trailing profit si muove fino a 5050 rimanendo alla
distanza di 50 punti.
N.B: IMPORTANTE!
Stop loss, target profit e trailing profit possono essere inclusi più specificatamente dopo le istruzioni di buy
(acquisto) e sellshort (vendita allo scoperto) e prima dell'istruzione ENDIF.
In questo caso, potete settare parametri diversi per trades long e short, per esempio:
_________________________________________________________________________________
Come nel caso di Proscreener, anche con Probacktest possiamo richiamare indicatori personalizzati.
E' possibile, quando si ha progettato un indicatore personalizzato e quindi salvato, richiamare l'indicatore
tramite la funzione "CALL" o richiamo.
Ciò va fatto inserendo nello screener la condizione con il richiamo del nostro indicatore e con i parametri da
cui è costituito.
Esempio:
C1=CALL "nomeindicatore[a,b](price)"<=>valore
_________________________________________________________________________________
Possiamo ora scrivere il nostro modulo di programmazione base, che ci servirà come "modello" dei nostri
sistemi di trading.
Vi consiglio di copiarlo nella vostra libreria di prorealtime come "sistema base" in modo che possiate
inserire le condizioni e modificarlo a vostro piacimento.
Tutte le funzioni che non volete utilizzare come ad esempio stop loss, take profit, trailing profit, ecc..
lasciatele precedere dalle 2 barre e verranno ignorate.
defparam cumulateorders=false
// condizioni long
endif
endif
// condizioni short
endif
endif
_______________________________________________________________________________________
Facciamo un esempio.
defparam cumulateorders=false
// condizioni long
c1=close>exponentialaverage[10](close)
c2=exponentialaverage[20](close)>exponentialaverage[100](close)
c4=macd[12,26,9]>0
c5=rsi[14]>50
c6=adx[14]>20
endif
c7=close[0]<lowest[10](low)[1]
endif
// condizioni short
c8=close<exponentialaverage[10](close)
c9=exponentialaverage[20](close)<exponentialaverage[100](close)
c10=close[0]<open[0] and close[0]<close[1]
c11=macd[12,26,9]<0
c12=rsi[14]<50
c13=adx[14]>20
if not shortonmarket and c8 and c9 and c10 and c11 and c12 and c13 then
endif
c14=close[0]>highest[10](high)[1]
endif
I codici che non mi servono restano inattivi mediante le 2 barre poste all'inizio.