PROREALTIME - PROBUILDER
ESEMPI DI INDICATORI PERSONALIZZATI
Esporrò ora, come già anticipato nella precedente pagina, alcuni semplici algoritmi e comandi per 4
tipologie di indicatore in modo che possiate utilizzare gli esempi come base per i vostri.
1) Segnali di trading o di formazione di patterns.
2) Elaborazione di dati.
2) Indicatore lineare sul grafico del prezzo.
3) Oscillatore a pista ciclica.
Vediamoli ora uno per uno e quali sono le funzioni necessarie per la loro programazione.
Potete trovare alcuni indicatori programmati da prorealtime e da utenti nella biblioteca indicatori del sito di
prorealtime oppure in quella di prorealcode.
1 - SEGNALI DI TRADING O DI FORMAZIONE DI PATTERNS
Questo tipo di indicatore è detto binario e viene posto sotto il grafico del prezzo.
Permette di visualizzare in forma di istogramma o di linee, la generazione di un segnale di trading in base
alla vostra strategia, per esempio un incrocio di medie mobili a rialzo o a ribasso.
Nel caso si generino segnali di acquisto verrà visualizzata una barra verso l'alto (+1) di colore verde
(personalizzabile), nel caso di un segnale di vendita viene visualizzata una barra verso il basso (-1) di colore
rosso (personalizzabile).
Lo stesso può essere impostato qualora si formino dei pattern rialzisti o ribasissisti.
In questo modo sarà più semplice la visualizzazione dei segnali di trading.
I comandi chiave per questa tipologia sono le istruzioni condizionate descritte a pagina 15 del manuale
probuilder:
IF : (SE)
THEN : (ALLORA o QUINDI): Istruzione che segue l'istruzione condizionale "IF"
ELSE : (ALTRO) : Istruzione per introdurre la seconda condizione in alternativa alla prima uscita di IF.
ELSIF : (ALTRIMENTI): Contrazione di ELSE IF (da inserire all'interno della condizione).
ENDIF: (FINE): Istruzione di chiusura delle istruzioni condizionali.
Nello specifico queste istruzioni si utilizzano in questo modo:
IF/THEN/ENDIF:
IF a THEN b
ENDIF
Insieme di istruzioni condizionali senza la seconda condizione.
IF/THEN/ELSE/ENDIF:
IF a THEN b ELSE c
ENDIF
Insieme di più istruzioni condizionali.
Vediamo un esempio concreto.
Un facile esempio ad una codizione è l'incrocio di 2 medie mobili semplici.
Questo sistema genera un segnale di acquisto (+1) nel caso in cui la media mobile semplice (SMA) breve
incrocia a rialzo la media mobile lunga.
Al contrario genera un segnale di vendita (-1) quando la media mobile breve incrocia a ribasso la media
mobile lunga.
Traduco mediante le // le operazioni.
// definizione indicatori:
a=Average[breve](close)
b=Average[lunga](close)
// se la SMA breve incrocia a rialzo la SMA lunga ALLORA
IF a crosses over b THEN
// mi da Risultato +1
R=+1
// ALTRIMENTI SE la SMA breve incrocia a ribasso la SMA lunga ALLORA
ELSIF a crosses under b THEN
// mi da risultato -1
R=-1
// ALTRIMENTI
ELSE
// mi da risultato nullo 0
R=0
// CHIUDO ISTRUZIONI
ENDIF
RETURN R
Come vedete, prima di tutto elenco gli indicatori che mi servono per determinare i segnali.
Poi descrivo le condizioni mediante le istruzioni condizionate.
In questo caso ci sono 2 condizioni (i 2 incroci di SMA) e 3 risultati R (+1, -1, 0).
Devo in seguito definire le variabili (breve) e (lunga) delle SMA.
Metto dei valori di default che possono essere 5 per la breve e 20 per la lunga.
Clicco su CONVALIDA PROGRAMMA e si apre la finestra di settaggio degli indicatori.
Qui posso cambiare colori, stile (da linea ad istogramma), eliminare od aggiungere zone di colore, inserire
linee orizzontali, ecc...
Ecco creato l'indicatore binario ad istogramma.
Gli istogrammi verdi sono i segnali di acquisto, mentre quelli rossi sono segnali di vendita.
E' anche possibile dare un nome a R nel seguente modo:
RETURN R AS "NOME".
IMPORTANTE:
Una volta impostati i colori e gli stili del vostro indicatore, cliccate sull'opzione APPLICA QUESTA
CONFIGURAZIONE AGLI ALTRI INDICATORI.
Facendo così il vostro indicatore rimarrà in memoria con gli utlimi settaggi altrimenti ritornerà con quelli di
default.
Vediamo ora un sistema di trading in cui vengono implicati 4 segnali.
Uno di entrata in posizione di acquisto (long).
Uno di uscita dalla posizione di acquisto (exit long).
Uno di entrata in vendita (short).
Uno di uscita dalla vendita (exit short).
Per questo sistema devo avere quattro condizioni da settare:
Voglio acquistare quando il prezzo chiude sopra la resistenza a 50 giorni.
Voglio uscire dalla posizione long quando il prezzo incrocia a ribasso la media mobile a 10 periodi (Lo
utilizzo come stop e trailing profit).
Voglio vendere quando il prezzo chiude sotto il supporto di 50 giorni.
Voglio uscire dalla posizione short quando il prezzo incrocia a rialzo la media mobile a 10 periodi (Lo utilizzo
come stop e trailing profit).
Voglio inoltre inserire i periodi come variabili in modo da poter cambiare i settaggi.
Per prima cosa inserisco gli indicatori che mi servono per questi segnali.
// definizione indicatori:
prezzo=close[0]
resistenza=highest[x](high)[1]
supporto=lowest[x](low)[1]
trailin=average[y](close)
// SE il prezzo è superiore alla resistenza, ALLORA
IF prezzo > resistenza THEN
// RISULTATO +2
R=+2
// ALTRIMENTI SE il prezzo incrocia a ribasso la media mobile, ALLORA
ELSIF prezzo crosses under trailin THEN
// risultato -1
R=-1
// ALTRIMENTI SE il prezzo è inferiore al supporto, ALLORA
ELSIF prezzo <supporto THEN
// RISULTATO -2
R=-2
// ALTRIMENTI SE il prezzo incrocia a rialzo la media mobile, ALLORA
ELSIF prezzo crosses over trailin THEN
// RISULTATO +1
R=+1
// ALTRIMENTI
ELSE
// RISULTATO 0
R=0
// CHIUDO ISTRUZIONI
ENDIF
RETURN R
Definiamo le variabili di default e scegliamo stile e colori dell'indicatore.
Le barre più lunghe sono le entrate in posizione long e short.
Quelle più piccole sono le uscite.
Ovviamente vanno ignorate le barre piccole quando non siamo in posizione.
Convalidiamo e cambiamo i settaggi dell'indicatore e clicchiamo su:
APPLICA QUESTA CONFIGURAZIONE AGLI ALTRI INDICATORI.
Vediamo ora un esempio con alcuni pattern di candele reversals che abbiamo programmato nel capitolo
precedente, per esempio:
l'engulfing, hammer e swing point low per il segnale rialzista,
mentre l'engulfing, shooting star e swing point high per il segnale ribassista.
In questo caso il nostro indicatore ci segnalerà la formazione di tutti i patterns di prezzo che vogliamo.
// definizione indicatori:
// engulfing pattern rialzista (anche reversal day)
C1=range[0]>=range[1] AND close[1]<open[1] AND close[0]>open[0] AND open[0]<=close[1] AND
close[0]>=open[1]
// hammer rialzista
C2 = close[1]<open[1] AND open[0]>low[0]+(range*0.66) AND close[0]>low[0]+(range*0.66) AND
range[0]>abs(open-close)*4 AND low[0]<low[1]
// swing point low + one white soldier (rialzista)
C3 = close[2]<open[2] AND low[2]>low[1] AND low[0]>low[1] AND close[0]>open[0] AND
close[0]>high[1] AND high[2]>high[1] AND high[0]>high[1] AND high[0]>high[2] AND close[0]>open[2]
AND close[0]>=low[0]+(range[1]*0.50)
// engulfing pattern ribassista (anche reversal day)
C4=range[0]>=range[1] AND close[1]>open[1] AND close[0]<open[0] AND open[0]>=close[1] AND
close[0]<=open[1]
// shooting star ribassista
C5 = close[1]>open[1] AND open[0]<high[0]-(range*0.66) AND close[0]<high[0]-(range*0.66) AND
range[0]>abs(open-close)*4 AND high[0]>high[1]
// swing point high + one white soldier (ribassista)
C6 = close[2]>open[2] AND high[2]<high[1] AND high[0]<high[1] AND close[0]<open[0] AND
close[0]<low[1] AND low[2]<low[1] AND low[0]<low[1] AND low[0]<low[2] AND close[0]<open[2] AND
close[0]<=high[0]-(range[1]*0.50)
// range del pattern rialzista maggiore al valore di volatilità ATR
C7= range[0]>averagetruerange[Y](close)*1
// identificazione patterns rialzisti
IF (C1 OR C2 OR C3) AND C7 THEN
// risultato +1
R=+1
// identificazione patterns ribassisti
ELSIF (C4 OR C5 OR C6) AND C7 THEN
// risultato -1
R=-1
ELSE
R=0
ENDIF
RETURN R AS "PATTERN"
Inseriamo la variabile dell'ATR, Y, per la grandezza del range del pattern reversal e se volete settate il
moltiplicatore a vostro piacimento (es: *1,5) e convalidiamo.
Cambiamo i settaggi dell'indicatore e clicchiamo su APPLICA QUESTA CONFIGURAZIONE AGLI ALTRI
INDICATORI.
2 - ELABORAZIONE DI DATI
E' possibile sempre tramite un grafico sottostante il grafico del prezzo, elaborare i dati riguardante il prezzo
stesso o di altri indicatori come per esempio fa l'ATR (Average True Range) oppure il ROC (Rate Of Change).
Esempio:
voglio determinare la differenza tra due medie mobili oppure tra una media mobile ed il prezzo di chiusura.
Voglio fare questo per capire se due medie mobili si stanno avvicinando.
Lo stesso per il prezzo e la media mobile.
Si tratta quindi per entrambi i casi di una semplice sottrazione.
// media mobile a breve periodo - media mobile a lungo periodo
A=average[breve]-average[lunga]
return A
// prezzo - media mobile
A=close-average[x]
return A as "differenza"
Posso impostare il grafico ad istogramma od a linee.
Inserisco una linea di valore 0 e setto i colori verde quando il valore è positivo (incrocio a rialzo) e rosso
quando il valore è negativo (incrocio a ribasso).
DISTANZA MEDIA MOBILE-PREZZO GRAFICO A LINEA
DISTANZA TRA 2 MEDIE MOBILI GRAFICO AD ISTOGRAMMA
La stessa cosa può essere fatta per esempio con supporti e resistenze del canale di donchian.
// resistenza - supporto
A=highest[x](high)-lowest[x](low)
return A
2) ROC IN PIPS
Un altro esempio è quello di determinare la differenza tra la chiusura di oggi e quella di N periodi
precedenti ma in pips (per il mercato forex).
E' praticamente l'indicatore ROC ma espresso in pips.
Le variabili sono:
X: il periodo
Y: il moltiplicatore, 10000 per i cross con 4 cifre dopo la virgola e 100 per i cross con 2 cifre dopo la virgola
(es: JPY)
A=(close[0]-close[x])*y
return A as "rocpips"
3) PREZZO STOP LOSS IN ATR
Un altro esempio è quello relativo alla determinazione del prezzo di stop loss.
Molti traders determinano lo stop loss in base all'indicatore di volatilità Average True Range (ATR).
In pratica designano lo stop loss (per un trade long) sottraendo al minimo od al prezzo di chiusura al
momento dell'apertura di un trade, oppure aggiungendo al massimo od al prezzo corrente (per un trade
short) il valore di un multiplo dell'ATR.
Quindi costruiamo un indicatore che ci dica subito il livello di prezzo dello stop loss per il trade, senza
calcolare noi ogni volta il prezzo.
Per fare questo basta creare il codice che veda entrambi i prezzi sia in direzione long che in direzione short.
//definizione indicatori
A=high
b=low
c=averagetruerange[periodoATR](close)
d=moltiplicatore
// calcolo stop loss posizione long
e=b-(c*d)
// calcolo stop loss posizione short
f=a+(c*d)
return e as "stoplosslong", f as "stoplossshort"
Inseriamo le variabili con i valori predefiniti:
periodoATR
moltiplicatore
Convalidiamo e settiamo i colori delle linee di prezzo dello stop loss.
La linea rossa sarà lo stop loss in caso di trade short.
Quella blu sarà lo stop loss in caso di trade long.
4) VOLATILITY FACTOR
Un altro strumento interessante è il volatility factor.
Esso determina la distanza tra massimo e minimo di un periodo (designato dal canale di Donchian) in %.
Questo indicatore è utile da utilizzare anche negli screeners per definire periodi di bassa o alta volatilità.
La bassa volatilità è segnale di trading range, l'alta volatilià di trend.
Aggiungendo una media mobile all'indicatore possiamo determinare se la volatilità è maggiore o minore
della media di periodo.
// volatility factor
upper=highest[x](high)[1]
lower=lowest[x](low)[1]
volatilityfactor= ((upper-lower)/close)*100
return volatilityfactor
5) % DI MOVIMENTO MEDIA MOBILE
Un altro indicatore utilissimo è quello che calcola la % di movimento del prezzo di una media mobile
esponenziale (o qualunque altra), dal periodo corrente ad un periodo precedente Y.
Anche questo indicatore può essere utilizzato per lo screeneing di mercato.
Quando l'istogramma aumenta sopra lo 0 il trend è in fase up, quando aumenta in senso contrario, sotto lo
0, il trend è in fase down.
emaX = exponentialaverage[X](CLOSE)
emaXPrev = ExponentialAverage[X][Y]
PercentageMove = (((emaX - emaXPrev) / emaXPrev) * 100)
Return PercentageMove
3 - INDICATORI LINEARI SUL GRAFICO DEL PREZZO
Ora che avete appreso le basi per l'indicatore di segnali e di elaborazione dati vediamo la tipologia degli
indicatori sul prezzo.
Questa tiplogia di indicatore viene rappresentata sul grafico del prezzo.
E' il classico indicatore lineare come la media mobile od i canali di donchian.
Ricordo che vanno inseriti tramite l'icona della chiave inglese altrimenti vengono visualizzati di default in
una finestra separata sotto il grafico del prezzo.
Vediamo degli esempi.
Vogliamo creare un indicatore che replica il famoso donchian channels ma applicato ai prezzi di chiusura
invece che a massimi e minimi.
Il codice per il donchian channels è il seguente:
//Resistenza:
resistenza= highest[x](high)[1]
//Supporto:
supporto=lowest[x](low)[1]
//Linea mediana:
mediana=((highest[x](high)[1])+(lowest[x](low)[1]))/2
return resistenza, supporto, mediana
Nel caso utilizziate il grafico col solo prezzo di chiusura (a linee) adattiamo gli algoritmi precedenti ai prezzi
di chiusura:
//Resistenza:
resistenza=highest[x](close)[1]
//Supporto:
supporto=lowest[x](close)[1]
//Linea mediana:
mediana=((highest[x](close)[1])+(lowest[x](close)[1]))/2
return resistenza, supporto, mediana
Dove X rappresenta il periodo del canale ed il [1] rappresenta il periodo precedente.
Settiamo i parametri ed i colori e li salviamo.
Se vogliamo applicare una lisciatura su supporti e resistenze del canale per farle diventare curve come delle
envelopes, possiamo applicare una media mobile ai valori dei canali direttamente nel comando return,
impostando poi anche la variabile della media mobile Y:
return average[y](resistenza) , average[y](supporto), average[y](mediana)
oppure fare dei codici prima del comando RETURN.
//Resistenza:
resistenza=highest[x](close)[1]
//Supporto:
supporto=lowest[x](close)[1]
//Linea mediana:
mediana=((highest[x](close)[1])+(lowest[x](close)[1]))/2
// lisciatura resistenza
lisciares=average[y](resistenza)
// lisciatura supporto
lisciasupp=average[y](supporto)
// lisciatura mediana
lisciamed=average[y](mediana)
return lisciares, lisciasupp, lisciamed
Vediamo ora alcuni indicatori importanti lineari che fungono da stop loss e trailing profit e che possono
essere utili da studiare.
Essi sono dei veri e propri sistemi di trading di tipo stop and reverse come il parabolic SAR e sono costruiti
(come il volatility stop) sull'indicatore ATR.
Il primo è il SUPERTREND il cui codice ho trovato proprio sul sito di prorealcode.
Sebbene il principio di questo indicatore sia abbastanza facile ed intuitivo, i codici che lo compongono sono
abbastanza elaborati.
Questa versione può essere usata solo con la piattaforma v10.3 o versione superiore.
E' disponibile nella stessa pagina anche il codice per la versione v10.2.
In base al fatto che il trend sia rialzista o ribassista, l'indicatore si posiziona al di sopra o al di sotto del
prezzo medio ad una distanza pari all'ATR moltiplicata per un coefficiente (multiplier).
Man mano che il trend prosegue, la linea supertrend porsegue nella stessa direzione mantenendosi alla
distanza impostata.
Se il prezzo ritraccia, il supertrend rimane fermo facendo da stop profit.
Le impostazioni di default sono:
3 per il multiplier e
10 per il periodo dell'ATR.
Ecco il codice:
multiplier=X
period=Y
moy=averagetruerange[period](close)
price=medianprice
up=price+multiplier*moy
dn=price-multiplier*moy
once trend=1
if close>up[1] then
trend=1
elsif close<dn[1] then
trend=-1
endif
if trend<0 and trend[1]>0 then
flag=1
else
flag=0
endif
if trend>0 and trend[1]<0 then
flagh=1
else
flagh=0
endif
if trend>0 and dn<dn[1] then
dn=dn[1]
endif
if trend<0 and up>up[1] then
up=up[1]
endif
if flag=1 then
up=price+multiplier*moy
endif
if flagh=1 then
dn=price-multiplier*moy
endif
if trend=1 then
mysupertrend=dn
else
mysupertrend=up
endif
if mysupertrend > mysupertrend[1] then
elsif mysupertrend < mysupertrend[1] then
endif
return mysupertrend as "SuperTrend"
_________________________________________________________________________________
Il secondo indicatore è il VOLATILITY STOP.
E' lo stesso codice del Supertrend con la differenza che si applica ai prezzi di chiusura. Quindi basta
sostituire l'istruzione "medianprice" con l'istruzione "close" nella quarta riga:
price=medianprice
price=close
Nel grafico sotto metto in comparazione i due indicatori.
La linea rossa è il supertrend, quella blu è il volatility stop settati con gli stessi parametri: 3 e 10.
Come potete vedere le differenze sono minime.
_________________________________________________________________________________
Il terzo indicatore lineare che voglio illustrarvi è il famoso ABRAHAM indicator e funziona similmente agli
altri due.
Ho trovato due versioni di questo indicatore, che sono abbastanza diverse fra loro.
La prima sul forum di finanzaonline su cui alcuni utenti hanno postato degli indicatori per prorealtime
incluso questo.
Anche in questo caso vanno impostate le variabili:
ATRMult (moltiplicatore) e
ATRLen (periodo dell'ATR).
Riporto qui il codice:
ATRMult=3
ATRLen=21
ONCE HClose=Close
ONCE LClose=Close
ONCE Value2= HClose - Value1
Value1=ATRMult * average[ATRLen](AverageTrueRange[ATRLen])
IF CLOSE > HClose THEN
HClose = CLOSE
ENDIF
IF CLOSE < LClose THEN
LClose = CLOSE
ENDIF
IF CLOSE <= Value2 THEN
Value2= LClose + Value1
HClose=CLOSE
ELSE
Value2=HClose - Value1
LClose=CLOSE
ENDIF
Col=SGN (Value2 - Close)
RETURN value2 AS "Abraham Trend"
Sotto comparo invece l'Abraham indicator (blu) con il supertrend (rosso).
Come potete vedere anche in questo caso le linee sono simili, anche se la Abraham indicator line risulta più
curva in certi passaggi di prezzo.
La seconda versione chiamata anche TREND TRADER (non so a questo punto se è un indicatore diverso, ma
è sempre di Andrew Abraham) l'ho trovata sempre sul sito prorealcode, da cui vi riporto il codice:
avrTR = weightedaverage[Length](AverageTrueRange[1](close))
highestC = highest[Length](high)
lowestC = lowest[Length](low)
hiLimit = highestC[1]-(avrTR[1]*Multiplier)
lolimit = lowestC[1]+(avrTR[1]*Multiplier)
if(close > hiLimit AND close > loLimit) THEN
ret = hiLimit
ELSIF (close < loLimit AND close < hiLimit) THEN
ret = loLimit
ELSE
ret = ret[1]
ENDIF
RETURN ret as "Trend Trader"
Anche in questo caso le variabili sono:
Length
Multiplier
Vediamo le differenze tra i due.
In blu è visualizzato l'abraham indicator, mentre in rosso il trend trader.
Come possiamo notare, le linee supertrend e volatility stop rimangono fisse, mentre gli ultimi due indicatori
possono anche retrocedere di qualche unità, soprattutto l'Abraham indicator, che forma anche linee curve.
4 - OSCILLATORE A PISTA CICLICA
Questa tipologia di indicatore viene rappresentata direttamente sotto il grafico del prezzo e quindi può
essere aggiunto direttamente tramite l'icona indicatori.
Vediamo ora come creare un oscillatore, cioè un indicatore a pista ciclica compreso tra due fasce di valori.
Questo oscillatore di mia invenzione chiamato "trend/volatility" è una variante del Rate of change (ROC) in
cui metto in rapporto il valore della performance dello strumento su un dato periodo (cioè il ROC) con la
volatilità del trend espressa dal valore più alto e più basso (massimi e minimi assoluti) dello stesso periodo.
Il rapporto è espresso in % ed oscilla tra i valori di +100 e -100 che rappresentano anche la direzione e la
forza di uptrend e downtrend.
Più l'uptrend è forte, più s'avvicina +100 e quindi possiamo considerarlo ipercomprato.
Al contrario, più il downtrend è forte, più s'avvicina -100 e quindi possiamo considerarlo ipervenduto.
Quando la linea oscilla constantemente tra +50 e -50 il prezzo è da considerarsi in trading range.
Quando il prezzo dopo una fase di forte ipercomprato o ipervenduto riscende dal valore +50 o risale dal
valore -50 un'inversione di tendenza è chiaramente in atto.
E' più adatto ai trend di lungo periodo.
La formula:
// definizione roc (performance) di X periodi
A=ROC[X]
// definizione più alto valore di chiusura di X periodi
b=HIGHEST[X](high)[0]
// definizione più basso valore di chiusura di X periodi
c=LOWEST[x](low)[0]
// determinazione del periodo tra il più alto e più basso valore: (volatilità)
d=b-c
// determinazione rapporto tra performance e volatilità
e= 100/C*D
trasformazione in % del rapporto tra roc e volatilità
F=(A/E)*100
//lisciatura con media mobile esponenziale di Y periodi
g=exponentialaverage[Y](F)
return g
Con X variabile per il periodo di analisi del trend da impostare.
Y è il periodo della media mobile esponenziale per la lisciatura dei dati.
Come potete vedere successivamente ho aggiunto le linee orizzontali di valore
di +100, +50, 0, -50 e -100 e le zone di colore sopra la linea +50 in verde, e sotto la linea -50 in rosso che
identificano le fasce di ipercomprato ed ipervenduto.
Questo indicatore è utile per misurare la forza del trend a rialzo o a ribasso,
definire zone di ipercomprato e ipervenduto e determinare eventuali divergenze col prezzo.
Nell'esempio ho settato i parametri a 252 (ciclo annuale) ed una lisciatura di 5 giorni (1 settimana).
Va utilizzato in comparazione e come strumento di conferma col grafico del prezzo:
TREND/VOLATILITY (252-5)