Salve a tutti, ho trovato in rete un indicatore di tendenza chiamato “Choppiness” o “Choppy” che riporto qui sotto:
100 * LOG10( SUM(ATR(1), n) / ( MaxHi(n) - MinLo(n) ) ) / LOG10(n)
n = periodo definito dall'utente
LOG10(n) = logaritmo base-10 di n
ATR(1) = Average True Range (con periodo 1)
SUM(ATR(1), n) = Somma dell'Average True Range per le n barre passare MaxHi(n) = il massimo più alto della serie in esame
Poichè sono poco pratico di programmazione non sono riuscito a tradurlo in linguaggio Prorealtime; c’è qualcuno che potrebbe darmi una mano? Inoltre, visto che faccio operazioni intraday sul Dax, se è possibile vorrei che l’indicatore NON tenesse conto del gap notturno (che se significativo “sballa” tutti i valori degli indicatori) e iniziasse a elaborare i suoi valori con l’apertura giornaliera.
Grazie in anticipo per il vostro aiuto.
Paolo Bonsanti
ecco:
n=10
atr1=averagetruerange[1](close)
sumAtr=summation[n](atr1)
maxhin=highest[n](high)
minlon=lowest[n](low)
chopi = 100*log(sumAtr)/(maxhin-minlon)/log(n)
return chopi
JSParticipant
Senior
Penso che l’idea sia quella di prendere il logaritmo del “rapporto” e non solo del “percorso”…
chopi = 100*log((sumAtr)/(maxhin-minlon))/log(n)
Leggendo di nuovo il tuo messaggio ora vedo che non ho tenuto conto dei gap di apertura. Ho modificato il codice e nel frattempo ho effettuato i calcoli con i logaritmi in base 10.
// --- INPUTS
n = 10
// --- DAILY RESET
ONCE idx = 0
IF intradaybarindex = 0 THEN
UnSet($tr)
UnSet($hi)
UnSet($lo)
idx = 0
ENDIF
// --- TRUE RANGE
trClassic = MAX(high - low, MAX(ABS(high - close[1]), ABS(low - close[1])))
IF intradaybarindex = 0 THEN
trBar = high - low
ELSE
trBar = trClassic
ENDIF
$tr[idx] = trBar
$hi[idx] = high
$lo[idx] = low
idx = idx + 1
cnt = MIN(idx, n)
sumTR = 0
IF cnt > 0 THEN
hh = $hi[idx - 1]
ll = $lo[idx - 1]
FOR k = 0 TO cnt - 1 DO
j = idx - 1 - k
sumTR = sumTR + $tr[j]
IF $hi[j] > hh THEN
hh = $hi[j]
ENDIF
IF $lo[j] < ll THEN
ll = $lo[j]
ENDIF
NEXT
rango = hh - ll
// --- CHOPPINESS ---
IF cnt >= n AND rango > 0 AND n > 1 THEN
chopi = 100 * ( LOG(sumTR / rango) / LOG(10) ) / ( LOG(n) / LOG(10) )
ELSE
chopi = chopi
ENDIF
ELSE
chopi = 0
ENDIF
RETURN chopi COLOURED(0,0,255) AS "Choppiness (without open gap)"
JSParticipant
Senior
Questo è un indicatore interessante e utile, che merita una spiegazione più approfondita…
Con AverageTrueRange[1](Close) si misura la volatilità per barra (inclusi i gap)…
Con Summation[n](ATR1) si somma tale volatilità per ottenere il percorso “tortuoso” compiuto dal prezzo…
Con Highest[n](High) - Lowest[n](Low) si misura il percorso rettilineo (netto) nello stesso intervallo…
Il rapporto è quindi: percorso tortuoso ÷ percorso rettilineo…
Applicando il logaritmo a questo rapporto (e normalizzandolo rispetto a n) si ottiene una scala stabilizzata…
L’indicatore Choppy, su una scala 0–100, mostra quanto il movimento sia “tortuoso”: valori bassi indicano un movimento relativamente rettilineo (spesso di trend), mentre valori più alti segnalano una dinamica più laterale/rumorosa…
Nell’ultima versione il gap overnight non è considerato (ancora un ottimo contributo di Iván)…
Grazie mille a tutti, siete bravissimi!!!