Bene, sei stato gentile, Grazie
Nel proseguire, ho un problema con ATR (non so se devo aprire un altro post)
L’obbiettivo è sapere il valore dell’ATR a 5 periodi “giorno” da mettere nel codice per un successivo calcolo.
Ho creato l’indicatore di PRT che mette il nome “ATR (5) D” ma, così non lo legge:
ValoreIndicatore = CALL "ATR (5) D"
IF gettimeframe >= 300 AND gettimeframe <= 14400 THEN
ecc...
allora ho fatto questo che, sarebbe ideale:
TimeFrame(1 day, updateonclose)
ATR5D = AverageTrueRange[5]
TimeFrame(Default)
ValoreIndicatore = CALL "ATR5D"
IF gettimeframe >= 300 AND gettimeframe <= 14400 THEN
ecc...
che crea un comodo indicatore “ATR5D” ma, varia il valore se cambio il Time Frame …divento matto
inoltre, come vedi dall’immagine “ATR5D”restituisce un valore diverso da quello corretto di “ATR (5) D” di PRT
mi puoi aiutare ?
Si, occorre aprire un nuovo argomento, l’ho aperto io.
Ho anche spostato entrambi nel supporto ProBuilder in quanto si tratta di indicatori.
Questo indicatore puoi metterlo su qualunque TF intraday:
Timeframe(Daily,UpdateOnClose)
ATRD = AverageTrueRange[5](close)
Timeframe(default)
RETURN ATRD AS "ATR Daily"
il risultato che vedrai è qullo dell’ultima barra GIORNALIERA chiusa, non quella corrente.
C’è una differenza molto lieve, inferiore ad 1 unità solitamente, che penso sia dovuta a qualche differenza negli arrotondamenti.
Grazie Roberto,
come vedi non risolve il mio problema!
dopo molti tentativi, questo sembra funzionare :
timeframe(1 day, updateonclose)
TrueRange = 0
FOR i = 0 TO 4 DO
TR1 = high[i] - low[i]
TR2 = abs(high[i] - close[i+1])
TR3 = abs(low[i] - close[i+1])
TrueRange = TrueRange + max(TR1, max(TR2, TR3))
NEXT
ATR5D = TrueRange / 5
timeframe(default)
ValoreIndicatore = ATR5D
IF gettimeframe >= 900 AND gettimeframe <= 3600 THEN
bene…ma adesso da errore su time fame superiori a 1 Day. Ho provato così ma da erori:
IF gettimeframe <= 86400 THEN // 86400 secondi = 1 giorno
timeframe(1 day, updateonclose)
TrueRange = 0
FOR i = 0 TO 4 DO
TR1 = high[i] - low[i]
TR2 = abs(high[i] - close[i+1])
TR3 = abs(low[i] - close[i+1])
TrueRange = TrueRange + max(TR1, max(TR2, TR3))
NEXT
ATR5D = TrueRange / 5
timeframe(default)
ENDIF
ValoreIndicatore = ATR5D
IF gettimeframe >= 900 AND gettimeframe <= 3600 THEN
JSParticipant
Senior
Le differenze tra gli indicatori non sono dovute agli arrotondamenti, ma alle differenze nei prezzi di chiusura…
I prezzi di chiusura vengono determinati in momenti diversi. Puoi vedere chiaramente la differenza nella “barra di venerdì”: l’opzione “UpdateOnClose” chiude solo domenica sera, mentre senza “UpdateOnClose” viene utilizzata la “Close” della barra di venerdì…
dopo molti tentativi, questo sembra funzionare :
timeframe(1 day, updateonclose)
TrueRange = 0
FOR i = 0 TO 4 DO
TR1 = high[i] - low[i]
TR2 = abs(high[i] - close[i+1])
TR3 = abs(low[i] - close[i+1])
TrueRange = TrueRange + max(TR1, max(TR2, TR3))
NEXT
ATR5D = TrueRange / 5
timeframe(default)
ValoreIndicatore = ATR5D
IF gettimeframe >= 900 AND gettimeframe <= 3600 THEN
bene…ma adesso da errore su time fame superiori a 1 Day. Ho provato così ma da erori:
IF gettimeframe <= 86400 THEN // 86400 secondi = 1 giorno
timeframe(1 day, updateonclose)
TrueRange = 0
FOR i = 0 TO 4 DO
TR1 = high[i] - low[i]
TR2 = abs(high[i] - close[i+1])
TR3 = abs(low[i] - close[i+1])
TrueRange = TrueRange + max(TR1, max(TR2, TR3))
NEXT
ATR5D = TrueRange / 5
timeframe(default)
ENDIF
ValoreIndicatore = ATR5D
IF gettimeframe >= 900 AND gettimeframe <= 3600 THEN
Come dicevo a Roberto, sono nuovo.
Questo funziona correttamente (per un successivo calcolo sul prezzo)ma, se alzo il time fame oltre 1 giorno, mi da errore.
defparam DrawOnLastBarOnly = true
once openMorningBox = 000000
once closeMorningBox = 073000
once maxHighMorningBox = high
once minLowMorningBox = low
timeframe(1 day, updateonclose)
TrueRange = 0
FOR i = 0 TO 4 DO
TR1 = high[i] - low[i]
TR2 = abs(high[i] - close[i+1])
TR3 = abs(low[i] - close[i+1])
TrueRange = TrueRange + max(TR1, max(TR2, TR3))
NEXT
ATR5D = TrueRange / 5
timeframe(default)
ValoreIndicatore = ATR5D
IF gettimeframe >= 900 AND gettimeframe <= 3600 THEN
MorningBoxRange = maxHighMorningBox - minLowMorningBox
MorningBoxPercentage = (MorningBoxRange / ValoreIndicatore) * 100
DRAWTEXT( ROUND(ValoreIndicatore, 4), LastBar - 1, maxHighMorningBox + (MorningBoxRange * 0.2)) COLOURED(200, 20, 150)
DRAWTEXT("ATR5D", LastBar-4, MAXHIGHMorningBox + (MorningBoxRange * 0.2)) COLOURED(200, 20, 150)
if OpenTime >= openMorningBox and OpenTime <= closeMorningBox then
if OpenTime = openMorningBox THEN
barMorningBox = BarIndex
maxHighMorningBox = high
minLowMorningBox = low
LastBar = BarIndex
else
LastBar = LastBar + 1
endif
maxHighMorningBox = max(maxHighMorningBox,high)
minLowMorningBox = min(minLowMorningBox,low)
if OpenTime = closeMorningBox then
prevLowMorningBox = minLowMorningBox
prevHighMorningBox = maxHighMorningBox
previdxMorningBox = barindex
MorningBoxRange = maxHighMorningBox - minLowMorningBox
ENDIF
ENDIF
drawrectangle(barMorningBox, minLowMorningBox, LastBar, maxHighMorningBox)COLOURED(0, 200, 0, 60) fillcolor(0, 200, 0, 20)
ENDIF
RETURN ATR5D
JSParticipant
Senior
Quando utilizzi orari “IntraDay”, ad esempio per la “MorningBox”, devi anche utilizzare timeframe “IntraDay”, altrimenti riceverai un messaggio di errore.
Se utilizzi un orario come “073000”, il timeframe deve essere uguale o inferiore a 30 minuti, altrimenti l’orario “073000” non può essere letto correttamente.
(L’ATR giornaliero che calcoli manualmente con il “loop” non corrisponde all’ATR di PRT…)
Il timeframe di default deve essere il più piccolo tra quelli utilizzati, quello che è sul grafico.
capisco, c’è un modo per creare una condizione o, attivare ( e ovviamente leggere) da codice l’ATR di PRT ?
grazie per la pazienza
credo che il problema sia qui:
IF gettimeframe <= 86400 THEN // 86400 secondi = 1 giorno
timeframe(1 day, updateonclose)
non permette la condizione. Come posso fare si che il codice non venga considerato su time frame superiori ?