Salve, volevo chiedere se qualcuno ha una spiegazione a questa “anomalia” che ho riscontrato sulla grafica tracciata su timeframe diversi dal default:
se inserisco un istruzione per disegnare un rettangolo alle 12:00 di ogni giorno (orario a caso) in una zona di codice TIMEFRAME (30 MINUTES), o anche altro elemento grafico (ho provato con un testi, un punto, ecc) mi succede questo:
Se uso l’indicatore sullo stesso timeframe (M30) tutto viene plottato correttamente. Se lo provo su timeframe inferiori (per esempio M15 o M5), l’elemento grafico viene disegnato indietro nel tempo e su orari apparentemente casuali – vedere i printscreen che sono molto più chiari della mia descrizione. Ho provato sia con l’istruzione
TIMEFRAME (30 minutes) che con TIMEFRAME (30 minutes, updateonclose), ma il risultato non cambia
Qualcuno ha idea del motivo? Oppure sto sbagliando io qualcosa?
Grazie, buona serata
timeframe (30 minutes, updateonclose)
if opentime=120000 then
drawrectangle (barindex, low, barindex+5, High)
drawtext("TEST",barindex+5,high)
drawpoint(barindex,low,3)
ENDIF
return
JSParticipant
Senior
Ciao,
Per poter utilizzare il tuo indicatore su diversi timeframe, puoi modificare la eerste regel del codice in:
TimeFrame (Default)
Con questa opzione verrà sempre utilizzato il timeframe del grafico…
Grazie per la risposta JS, ma non era quello che intendevo:
Ho un indicatore costruito sul timeframe 30 minuti (o altro timeframe) che disegna testi, frecce e punti, e voglio visualizzare gli stessi elementi grafici anche su timeframe inferiori (ovviamente sottomultipli di quello principale).
Per fare questo ho inserito la sezione di codice Timeframe (30 minutes, updateonclose), pensando che anche su TF più bassi comparissero gli stessi elementi grafici negli stessi esatti punti del M30.
Invece, per ragioni che non riesco a capire, vengono tracciati in punti strani, diversi da quello che avviene sul M30
Ti faccio un altro esempio: ho aggiunto il supetrend sul M30, con il tracciamento di frecce per ogni commutazione up/down
Su TF inferiori, il supertend viene tracciato correttamente (la linea commuta esattamente negli stessi orari), mentre il tracciamento delle frecce è completamente sbagliato
timeframe (30 minutes, updateonclose)
//timeframe (30 minutes)
if opentime=120000 then
drawrectangle (barindex, low, barindex+5, High)
drawtext("TEST",barindex+5,high)
drawpoint(barindex,low,3)
ENDIF
st=Supertrend[3,10]
if close crosses over st then
drawarrowup (barindex, high+10) coloured ("blue")
elsif close crosses under st then
drawarrowdown (barindex, low-10) coloured ("magenta")
endif
return st
JSParticipant
Senior
Succede perché vengono utilizzati due timeframe diversi allo stesso tempo: apri un timeframe fisso di 30 minuti su un grafico a 15 minuti…
Di conseguenza, gli elementi grafici nel grafico a 15 minuti verranno spostati per adattarsi al timeframe di 30 minuti…
Si può vedere anche così: gli elementi grafici con timeframe a 30 minuti vengono proiettati nel grafico a 15 minuti… (per questo motivo gli elementi grafici si spostano)
Questo viene spesso utilizzato, ad esempio, per proiettare una media con timeframe a 30 minuti in un grafico di 15 minuti…
Scusa ma ancora non mi è chiaro:
Le curve calcolate sul M30 (medie mobili, supertrend, eccetera) vengono plottate esattamente negli stessi punti su qualsiasi timeframe inferiore (come è giusto che sia)
I corrispondenti elementi grafici no. Se guardi gli esempi, l’ultima communtazione del supertrend avviene alla candela del 14/11/25 alle ore 15:30; sul TF M15 o M5 avviene esattamente nello stesso giorno allo stesso orario (giustamente).
La freccia di questa ultima commutazione, invece, viene disegnata su M15 il 4/11/25 alle ore 22:30; su M5 il 10/11/25 alle ore 13:00.
Proprio non capisco perchè.
E’ come se la funzione “multi-timeframe” per gli indicatore funzionasse bene per tutte le curve plottate dal comando finale return, ma non per gli elementi grafici generati nelle sezioni con TF diverso dal default
JSParticipant
Senior
È difficile da spiegare, forse è meglio veder het zo: quando utilizzi un timeframe di 30 minuti, come nel tuo codice, tutto è basato su questi 30 minuti, quindi anche il
BarIndex…
Quando disegni un oggetto e utilizzi il
BarIndex, questo
BarIndex sarà diverso nei vari timeframe, e quindi gli oggetti verranno disegnati in un’altra posizione (si sposteranno)…
I calcoli non cambiano, perché sono “fissati” nel timeframe di 30 minuti…
Ci avevo pensato anche io, ma non trovo corrispondenza:
sul TF M30 la prima freccia è indietro di 14 barre = 420 minuti
sul TF M15 la prima freccia è indietro di 765 barre = 11475 minuti
sul TF M5 la prima freccia è indietro di 1269 barre = 6345 minuti
non c’è un senso logico
JSParticipant
Senior
Non cercare di trovarci una logica, perché si tratta di calcoli interni (sconosciuti) di PRT…
La cosa più importante è capire che gli oggetti vengono disegnati in modo diverso nei vari timeframe a causa dell’uso del “BarIndex” e di un prezzo (OHLC)…
Si si, infatti mi arrendo.
ero solo curioso di capire se c’era un mio errore o una spiegazione logica.
Questo vuol dire che nel multi-timeframe i calcoli vengono eseguiti correttamente, ma che i valori ottenuti non vanno applicati ad elementi grafici, altrimenti non si capisce più nulla 🙂
Dovrò risolvere il problema in altro modo.
Per chi può essere interessato… il problema risiede nell’assegnazione del barindex sui TF superiori (cosa che avviene con criteri non molto chiari), mentre i valori sull’asse Y sono sempre calcolati corretti.
Per risolvere, basta modificare il codice di esempio come sotto. In questo modo ad ogni variazione dell’indicatore sull’asse Y nel TF superiore, viene plottata la grafica nel TF Default sul suo barindex, ESATTAMENTE NEGLI STESSI PUNTI. Le eventuali lunghezze di segmenti o rettangoli andranno ricalcolate rapportando il valore di GetTimeframe superiore/GetTimeframe inferiore
timeframe (30 minutes, updateonclose)
//timeframe (30 minutes)
TFsup=GetTimeFrame // minuti/candela timeframe superiore
if opentime=120000 then
YY1=low
YY2=High
//drawrectangle (barindex, low, barindex+5, High)
//drawtext("TEST",barindex+5,high)
//drawpoint(barindex,low,3)
ENDIF
st=Supertrend[3,10]
if close crosses over st then
//drawarrowup (barindex, high+10) coloured ("blue")
yy3=high
elsif close crosses under st then
//drawarrowdown (barindex, low-10) coloured ("magenta")
yy4=low
endif
timeframe (default)
MoltTF=TFsup/GetTimeFrame //eventuale moltiplicatore lunghezze segmenti sui TF inferiori
if yy1<>yy1[1] then
drawrectangle (barindex, yy1,barindex+5*MoltTF, yy2)
drawtext("TEST",barindex+5*MoltTF,yy2)
drawpoint(barindex,yy1,3)
endif
if yy3<>yy3[1] then
drawarrowup (barindex, yy3+10) coloured ("blue")
endif
if yy4<>yy4[1] then
drawarrowdown (barindex, yy4-10) coloured ("magenta")
endif
return st
In questo modo, un indicatore che viene utilizzato sul TF 4 ore (per esempio) e che ha una sua grafica fatta non solo di curve ma anche di testi/frecce/bande/forme varie, plotterà le stesse indicazioni su qualsiasi timeframe inferiore (sottomultiolo ovviamente) negli stessi punti (che era quello che mi serviva per non tener aperti più grafici per confrontare indicatori utilizzati su TF diversi)
Buona giornata
Questo l’ho provato sul DAX, 1 minuto e 5 minuti, e funziona:
timeframe (30 minutes,updateonclose)
if time=120000 then
high12 = high
low12 = low
ENDIF
//
timeframe(default)
if opentime=120000 then
drawrectangle (barindex, low12, barindex+5, High12)
drawtext("TEST",barindex+5,high12)
drawpoint(barindex,low12,3)
ENDIF
return
nel TF a 30 minuti ho sostituitio
OpenTime con
Time, perché UpdateOnClose aggiorna i dati alla chiusura, quindi alle 12:30, perché deve verificare l’orario che era all’apertura (OPENtime) cioè le 12:00. Il problema è che il TF ad 1 minuto detta il passo, per cui lui si aggiorna ogni minuto, quindi la candela che apre alle 12:00 chiude alle 12:01, ma sul TF a 30 minuti la candela delle 12:00 chiuderà alle 12:30, quando ormai sul TF a 1 minuto quell’orario sarà passato e non stamperà più.
Per questo vedi orari e prezzi strambi.
Ahhhh…. perfetto! Era quello il vero problema 🙂
In effetti con quella piccola correzione funziona tutto bene senza troppe complicazioni.
Per adattare le lunghezze orizzontali basta moltiplicare per il rapporto fra i gettimeframe, ma il punto di riferimento da cui partire ora è corretto su ogni TF
Grazie Rob!