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.
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 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.
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, cioè il classico oscillatore di prezzo.
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 as "double average oscillator"
// prezzo - media mobile
A=close-average[x]
return A as "price oscillator"
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).
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
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.
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) e dello stocastico 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:
Scrivi commento