Saturday, May 30, 2015

Equity Indicator

Programmazione ProRealtime
by Marcello Belguardi

Qualche tempo fa ho codificato un indicatore che, date le regole di un generico trading system, produce in output la rispettiva equity. Lo riporto qui perchè credo sia un utile esercizio di programmazione e perchè dalla curva di equity si possono estrarre preziose informazioni. (Con la nuova versione di ProRealtime e l'introduzione delle "backtest variables" è molto più facile ed immediato produrre questo output come vedremo successivamente).

Per calcolare la curva dell’equity correttamente, dobbiamo prima osservare come in un trading system le condizioni di acquisto o vendita, cioè i decisori c1 e c2, funzionano in ProRealtime.

Ecco la sezione di codice del noto TS con incrocio di SMA (Simple Moving Average).

c1 = shortMA >= longMA
c2 = shortMA < longMA

In backtesting lo script viene ri-eseguito per ogni barra in chiusura.

Ad ogni barra quindi si assegnano c1 e c2 che comandano la posizione che verrà presa all’indomani.

La posizione corrente, non quella di domani, è indicata da c1[1] e c2[1], cioè quella determinata alla barra precedente. Questa ci è utile per calcolare l’equity, non c1 e c2 che indicano la posizione futura.

Se alla barra corrente c’è stato un ordine di acquisto o vendita, il gap dato dalla differenza dalla chiusura di ieri all’apertura di oggi ha il segno deciso due barre fa, che corrisponde cioè a c1[2] e c2[2].

Quindi l’equity in chiusura della barra corrente si calcola così: l’equity della barra corrente più la differenza tra la chiusura di ieri e l’apertura di oggi. I segni degli addendi dipendono dalle  posizioni long o short determinate nelle barre precedenti.




…per cui questo è lo script dell'indicatore per calcolare l’equity.



// SMA Cross (Eq)
// S,L: 3 to 31


shortMA = Average[S](close)
longMA = Average[L](close)

c1 = shortMA >= longMA
c2 = shortMA < longMA

if barindex > 0 then


if c1[1] then
thisBarGain = close - open
endif

if c2[1] then
thisBarGain = -(close - open)
endif

if c1[2] then
gapGain = open - close[1]
endif

if c2[2] then
gapGain = - (open - close[1])
endif

EQ = EQ[1] + thisBarGain + gapGain

endif


return EQ AS "SMA Cross (Eq)"






Abbiamo realizzato un indicatore che mima esattamente la curva dell’equity calcolata in backtesting da ProRealtime. (Naturalmente dobbiamo sostituire le variabili S ed L calcolate dall’ottimizzatore per avere la stessa curva). Esempio:















Facciamo un altro esperimento: utilizziamo ora  la pendenza della regressione lineare applicata alla curva dell’equity come rivelatore dei periodi nei quali il trading system guadagna o perde.

Se costruiamo un indicatore binario che indichi quando l’equity sale (1) e quando invece scende (0) vediamo l’effetto graficamente:

Ecco il risultato aggiunto sul grafico dell’esempio precedente:




Ho aggiunto l’oscillatore e per chiarezza anche la regressione linerare sulla curva dell’equity (può essere aggiunta graficamente mediante la finestra a tendina e aggiungendo l’indicatore Linear Regression di ProRealtime). 

 Cosa notiamo: l’indicatore “Equity Slope Oscillator” è 0 quando l’equity scende ed 1 quando l’equity sale; ci dà un informazione importante su come si sta comportando il trading system. 

Nota: Questo è il TS completo di riferimento, incrocio di medie mobili. S & L da ottimizzare da 3 a 31

// SMA Cross Trading System 
// S,L: 3 to 31

shortMA = Average[S](close)
longMA = Average[L](close)

c1 = shortMA >= longMA
c2 = shortMA < longMA

if c1 and not longonmarket then
 buy 10000 cash at market
endif

if c2 and not shortonmarket then
 sellshort 10000 cash at market
endif