problema con ATR

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • #243771 quote
    Nettuno
    Participant
    New

    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 ?

    #243784 quote
    robertogozzi
    Moderator
    Master

    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.

    #243858 quote
    Nettuno
    Participant
    New

    Grazie Roberto,
    come vedi non risolve il mio problema!

    #243863 quote
    Nettuno
    Participant
    New

    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
    
    #243867 quote
    JS
    Participant
    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ì…

    robertogozzi thanked this post
    #243872 quote
    Nettuno
    Participant
    New

    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
    
    #243873 quote
    Nettuno
    Participant
    New

    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 
    
    #243876 quote
    JS
    Participant
    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…)

    #243884 quote
    robertogozzi
    Moderator
    Master
    Il timeframe di default deve essere il più piccolo tra quelli utilizzati, quello che è sul grafico.
    #243887 quote
    Nettuno
    Participant
    New
    capisco, c’è un modo per creare una condizione o, attivare ( e ovviamente leggere) da codice l’ATR di PRT ? grazie per la pazienza
    #243890 quote
    Nettuno
    Participant
    New
    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 ?
    #243901 quote
    robertogozzi
    Moderator
    Master
    Non si può.
Viewing 12 posts - 1 through 12 (of 12 total)
  • You must be logged in to reply to this topic.

problema con ATR


ProBuilder: Indicatori & Strumenti Personalizzati

New Reply
Author
author-avatar
Nettuno @nettuno Participant
Summary

This topic contains 11 replies,
has 3 voices, and was last updated by robertogozzi
11 months, 3 weeks ago.

Topic Details
Forum: ProBuilder: Indicatori & Strumenti Personalizzati
Language: Italian
Started: 02/13/2025
Status: Active
Attachments: 7 files
Logo Logo
Loading...