Tuesday, June 2, 2015

Custom & Built-In Stops

Programmazione ProRealtime
by Marcello Belguardi

La differenza tra una exit e uno stop è che la prima è l'uscita dalla posizione in guadagno, la seconda in perdita rispetto al prezzo di ingresso. E' importante distinguerle ai fini della programmazione.

Un'altra distinzione esiste tra i custom stop ed i built-in stop. La prima categoria comprende tutte le tecniche di uscita dalla posizione che possiamo programmare e  aggiornare ad ogni barra, con semplici comandi sell ed exit short, la seconda categoria si riferisce ai comandi di protezione stop offerti nativamente dalla piattaforma. Vediamo di chiarire il concetto con gli esempi che seguono (per il caso long). Iniziamo con alcuni custom stop.

Breakeven Stop

E' lo stop in pari, il tipo di stop più semplice. Si esce dalla posizione corrente appena il prezzo passa sotto il prezzo d'acquisto. Non c'e' sostanzialmente perdita salvo slippage e commissioni.
Ai fini della simulazione, come faccio di solito, utilizzo ingressi forzati ad una certa data.

Ingresso: in chiusura di barra il 20-02-2015 lo script gira e la condizione goLong è verificata. Ciò implica che si invia un ordine a mercato valido per il giorno dopo (il 20 è un venerdì quindi valido per il lunedì successivo, il 23). Il 23 si entra in posizione long in apertura a mercato.

Uscita: Il 23 in chiusura di barra quando lo script gira, si è a mercato, e la condizione if longonmarket è verificata. Il trading system invia quindi un ordine di vendita di tipo stop valido per il giorno dopo al prezzo di breakeven, che è il prezzo registrato di ingresso TRADEPRICE, che è 129.62 . Il giorno dopo, il 24 questo prezzo non viene toccato e l'ordine stop non scatta, e scade perchè è un ordine daily.
Il 24 però in chiusura di barra lo script viene ovviamente valutato nuovamente ed il sistema invia un ordine di vendita di tipo stop valido per il giorno dopo. Questa volta, il 25, scatta lo stop in pari.





Notare i triangolini che mostrano l'ingresso e l'uscita dalla posizione allo stesso prezzo (129.62$), di breakeven appunto.

Il codice per la simulazione è il seguente:

goLong = (date=20150220)

if goLong then

buy 1 share at market
endif

if longonmarket then

sell at TRADEPRICE stop
endif


NOTE:

TRADEPRICE (o TRADEPRICE(1)) è il prezzo di ingresso in posizione al trade più recente.

Tenete presente inoltre che le tre linee di codice seguenti sono equivalenti quando il timeframe è daily:

buy 1 share at market
buy 1 share at market NextBarOpen
buy 1 share at market TomorrowOpen

Classic Stop Loss

Complichiamo le cose: settiamo lo stop loss  di protezione. Se scatta c'e' una perdita perchè il mercato ci sta dando torto. Poniamo lo stop ad una distanza del 3%  dal prezzo. 

Stesso ingresso di prima il 23 Febbraio a 129.62$. Dalla chiusura del 24 Febbraio fino alla chiusura del 4 Marzo lo script viene fatto girare dal sistema ed un ordine stop è inviato per il giorno dopo. Ad ogni barra scade perchè è un ordine daily ed è quindi rinnovato in chiusura. Scatterà per la prima volta il 5 Marzo quando il prezzo perforerà al ribasso il prezzo di ingresso del 3%, a 125.73$, come previsto.




Questo il codice della simulazione, dovrebbe risultare autoesplicativo:

// stop loss %

goLong = (date=20150220)
percentStop = 3 // percent stop at 3%

if longonmarket then
stopLossPrice = (TRADEPRICE(1) - TRADEPRICE(1)*percentStop*0.01)
endif

if goLong then
buy 1 share at market TomorrowOpen
endif

if longonmarket then
sell at stopLossPrice stop
endif

Built-In Stop

Ci sono, inoltre, i comandi di stop loss predefiniti dalla piattaforma.

Esempio:

// built-in stop loss percentuale rispetto al prezzo di ingresso
SET STOP %LOSS 1.5
// built-in stop loss in dollari rispetto al prezzo di ingresso
SET STOP $LOSS 2

Perche quindi esistono questi comandi di stop se è possibile, come abbiamo visto, programmare gli stop utilizzando semplici comandi di sell per posizioni long (ed exit short per posizioni short) ?

I motivi sono due: il primo è che con gli ordini predefiniti si è protetti sin dalla barra di ingresso. Infatti l'ordine di stop che viene inserito nello script è attivo dalla barra seguente,  naturalmente se si è effettivamente entrati in posizione.
L'altro motivo è che questo tipo di stop va inteso attivo  per tutta la durata del trade (Good Until Cancel - GTC) e non solo per una barra come i precedenti ordini daily. E' insomma uno stop loss di protezione assoluta che andrebbe sempre inserito (in aggiunta agli stop custom). 

Quindi per ricapitolare: Gli stop inseriti come ordini sell o exit short che abbiamo visto all'inizio del post sono attivi non dalla prima barra in posizione ma dalla seconda, perchè la condizione onmarket che va inserita nel codice è testata in chiusura della barra in cui si è entrati in ingresso e vanno rinnovati ad ogni barra, eventualmente con condizioni differenti, per esempio per creare un trailing stop.

Gli ordini standard della piattaforma invece sono automaticamente attivi, statici per tutta la durata del trade, ed è la piattaforma che verifica che la posizione sia attiva prima di agganciare lo stop relativo e rinnovare lo stop ogni giorno.
Sono gli stop "di emergenza" per proteggerci da situazioni anomale.

Vediamo un esempio: l'ordine scatta il 24 Febbraio e il sistema entra in posizione il 25 in apertura di mercato. Si assiste ad un downtrend intraday quel giorno e lo stop ci farà uscire ad una distanza del 1.5 % dal prezzo di apertura.





Il codice relativo è il seguente:


// stop loss %

goLong = (date=20150224)

if goLong then
buy 1 share at market TomorrowOpen
endif

SET STOP %LOSS 1.5
//SET STOP $LOSS 2

Lo stop in dollari, commentato nel codice, ha un effetto simile consentendoci di uscire ad una distanza di 2 dollari dal prezzo di ingresso. I due stop sono mutualmente esclusivi.

Un'altra osservazione riguarda il fatto che lo stop built-in aggiunto non è contenuto in uno statement condizionale per esempio di tipo if/then.  In questo modo la riga di codice è sempre eseguita ad ogni run dello script, ad ogni chiusura di barra.

Gli esempi sono stati fatti per semplicità solo per posizioni long, ma è immediato scriverli anche per posizioni short.

Sunday, May 31, 2015

Timeframe daily su 10 anni

Funzionalità ProRealtime
by Marcello Belguardi

In ProRealtime è possibile visualizzare i grafici a 5/10 anni con timeframe daily (per poter per esempio backtestare i trading systems su periodi estesi) ma la funzionalità non è immediata. Appena infatti si seleziona il periodo ad esempio appunto 10 anni come in figura...




... gli unici timeframe più brevi disponibili sono quella mensile e settimanale. Se si seleziona quella daily si perde la visualizzazione sul periodo.



L'unico modo è selezionare il periodo in punti, per esempio 10000 punti come in figura, e poi lasciare daily come timeframe. Allora funziona.


 Se si vuole si può zoomare un'area e lavorare su quella. Esempio:



Si clicca sul grafico e si seleziona l'area.



Per tornare alla visualizzazione precedente la zoommata basta selezionare l'icona di reset visualizzazione in basso a sinistra.



IMA (Ideal Moving Average)

Programmazione ProRealtime
by Marcello Belguardi

La IMA (Ideal Moving Average) è una media con lag (ritardo) nullo e smoothing (lisciatura) perfetto. Sovrapposta al grafico e calcolata la rispettiva slope (pendenza) si riescono ad identificare con prontezza i turning point (i punti di svolta), i momenti cioè in cui i downtrend lasciano la via agli uptrend e viceversa.

Ideal Moving Average - Piattaforma Prorealtime


Si possono utilizzare i cross tra due IMA o tra una IMA ed il prezzo per individuare i punti di ingresso ed uscita da un trade. Con loopback (quante barre includere nell'indicatore) più ampi può funzionare come supporto o resistenza osservandone la posizione relativa ai prezzi. (la classica prezzo > media a 200 periodi per accertare un trend al rialzo primario).

Esiste un compromesso tra la smoothness di una media mobile ed il suo lag e numerosi sforzi sono stati fatti per avere il meglio delle due caratteristiche nello stesso indicatore.
Noi vorremmo utilizzare la media come filtro dei movimenti impulsivi dei prezzi per estrarne il trend di fondo eliminando cioè le alte frequenze, per così dire, il rumore. E vorremmo che oltre a questo andamento armonico la media non avesse ritardi. Cerchiamo un indicatore che dia il numero minimo di falsi segnali rimanendo liberi di selezionarne il periodo, il loopback.

Per questo motivo la IMA è una illusione, una provocazione, non esiste, proprio per via di questo tradeoff tra lag e smoothing; potremmo però tentare di tracciarla, a mano, su un grafico.
Se agganciassimo un ipotetico trading system ai relativi segnali probabilmente avremmo performance fenomenali.

Come ho fatto allora a raffigurarla con ProRealtime nella figura precedente se la IMA non esiste? Facile: con una media mobile triangolare con lookback 8 e poi centrata, cioè fatta scorrere indietro di 3 barre. Per cui l'indicatore non è tracciato sulle ultime 3 barre. Inoltre ho basato la media non sul close ma sul total price (O+H+L+C)/4.




ProRealtime, così come le altre piattaforme, chiede di accontentarci e offre diversi tipi di moving average: Simple, Exponential, Weighted, Wilder's, Triangular, End Point, Time Series, Zero Lag Exponential, Hull.

Inoltre abbiamo nativamente tra gli indicatori la DEMA (Double Smoothing) e la TEMA (Triple Smoothing).



John Ehlers, noto autore ed analista americano, ha studiato per decenni il problema ed ha elaborato  il Supersmoother concludendo che questa è la media definitiva, la migliore.

Vorrei in un prossimo post verificare quale di queste medie si avvicina, senza compromessi, alla IMA. Se ha ragione John Ehlers perchè utilizzare, d'ora in poi, le altre medie?


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



Friday, May 29, 2015

Non solo ingressi market

Programmazione ProRealtime
by Marcello Belguardi

Ci sono due principali classi alle quali sembrano appartenere i trading systems:



  • Trend following, che comprende anche la sottoclasse dei breakout.
  • Reversal o controtrend, mean reverting, contrarian: tutti termini per indicare lo stesso concetto.

Analizzandole, le due tipologie di setup sono piuttosto differenti perchè:


  • il segnale di un sistema trend following indica una alta probabilità che la corrente direzione del trend persista. Il segnale arriva infatti dopo un turning point.
  • il segnale di un sistema reversal indica una alta probabilità che la corrente direzione del trend non persista e si esaurisca in fretta. Il segnale arriva infatti prima di un turning point.

Resta inteso ovviamente che quando si è in posizione il trade avrà successo se e solo se dal punto di ingresso al punto di uscita dalla posizione esisterà un trend composto da un numero sufficiente di barre che assecondi la direzione del trade long o short, sia che si sia entrati poco dopo l’inizio del trend (trend following) o prima dell’inizio del trend (reversal).

Senza addentrarci qui di quali specifiche soluzioni logiche si avvalgano le due differenti categorie di sistemi si può dire che oltre agli specifici setup esistono precise tipologie di ingressi o entry che possono confermare o non confermare i setup.


Oltre agli ingressi di tipo market, esistono infatti gli ingressi di tipo stop e limit. Vediamoli:


L’ordine di ingresso di tipo stop viene eseguito solo se almeno un prezzo sulla barra che segue l’ordine supererà un determinato ammontare in $ o euro (per posizioni long) o ne sia inferiore (per posizioni short).


L’ordine di ingresso di tipo limit viene eseguito solo se un prezzo sulla barra che segue l’ordine rimarrà inferiore ad un determinato ammontare (per posizioni long) o superiore ad esso (per posizione short).


Per esempio un sistema breakout che preveda un superamento di un certo prezzo affinchè si entri in posizione può trarre beneficio da un ordine di tipo stop.


Se si decide per esempio in un contesto daily che si entrerà in posizione long solo se l’apertura di domani è maggiore della chiusura di oggi (o del massimo di oggi), sarà sufficiente impostare un ordine stop con il valore della chiusura (o del massimo) di oggi.


Fortunatamente in ProRealtime questo meccanismo è implementabile perchè esiste un apposito comando. 


Analogamente, in un sistema reversal, per coadiuvare l’idea di anticipare il trend che verrà, si può pensare di entrare in posizione solo se il prezzo di domani sarà inferiore al prezzo di oggi, per esempio inferiore alla chiusura o al minimo di oggi. Questo è implementabile con Prorealtime perchè esiste l’apposito comando.


Iniziamo a vedere come funziona il normale ordine market. In questo caso non ci sono particolari condizioni sulla entry. Il nostro setup è un segnale scattato l’11 di marzo in chiusura di barra che dice di entrare il 12 di marzo in apertura a mercato.

Piattaforma ProRealtime

Il codice per la simulazione equivalente è il seguente:

data = Date

goLong = (data = 20150311)


IF  goLong THEN

BUY 1 CONTRACTS AT MARKET
ENDIF

graph goLong as "Long"



Questa volta invece, come anticipato, si vuole seguire una strategia trend following o breakout. Dato il segnale in chiusura di barra l’11 Marzo vorrei entrare sulla barra successiva solo se il prezzo supererà il massimo di oggi. Utilizzo un ordine stop con il seguente effetto:


Piattaforma ProRealtime

Notare nella figura il triangolino con il livello di ingresso. La simulazione ha il seguente codice:

data = Date

goLong = (data = 20150311)


if  goLong then

Buy 1 contracts at high stop
endif

graph goLong as "Long"



Terzo caso: la strategia è reversal e si vuole insistere nell’andare controtrend, per cui dato il segnale il 5 Marzo chiederò al sistema di entrare il 6 Marzo solo se il prezzo scenderà sotto il minimo del 5 marzo, con un ordine di tipo limit. Questo l’effetto:


Piattaforma ProRealtime


E questo il codice equivalente:

data = Date

goLong = (data = 20150305)


if  goLong then

Buy 1 contracts at low limit
endif

graph goLong as "Long"


Gli ordini di tipo stop e limit possono essere anche interpretati come filtri, perchè se il movimento sottostante non è confermato anche dalla entry non si entrerà, evitando così dannosi falsi segnali.

Per ora è tutto. Buon trading!