Mi spiego meglio,
premetto che è da molto poco che scrivo codici su PRT, ho esperienza soprattutto su altre piattaforme, prevalentemente su Multicharts; ho scritto alcuni indicatori qui su PRT, funzionano come desidero, in live nessun problema, tuttavia quando vado a caricarli su storici di 6 mesi o un anno (in particolare su barre 100 ticks con IG) i tempi di caricamento si dilatano eccessivamente e l’attesa diventa davvero un problema. Mi è utile caricarli per fare un po’ di analisi grafica/visuale/manuale sul loro funzionamento sullo storico passato.
Mi chiedevo se esistano delle tecniche/astuzie per “velocizzarne il caricamento” senza troncare il caricamento dell’indicatore (per capirsi non cerco un “DEFPARAM CalculateOnLastBars = 200”).
Anche su questo punto (il “velocizzare il caricamento”) vorrei fare alcune precisazioni:
- mi chiedevo se esiste qualcosa come il “max bars study reference” di Multicharts, in modo tale da liberare memoria via via che si avanza nella computazione (un qualche comando “magico”)
- ho l’impressione che il problema sia soprattutto legato alla heap size di java, il caricamento viaggia veloce inizialmente, poi quando la memoria raggiunge all’incirca i 2Gb di memoria c’è un calo drastico nell’avanzamento del caricamento dell’indicatore. Se fossi nel giusto, ovvero che spesso la heap size di java è un collo di bottiglia, potreste per favore indicarmi un modo per cambiare questa dimensione della memoria coinvolta? Ho provato a lanciare la piattaforma utilizzando java e settando un quantitativo di memoria dalla interfaccia ma sembra che questa variazione non sortisca alcun effetto.
- vorrei capire meglio, per il futuro, quali sono i componenti che solitamente impattano di più sul caricamento, per fare alcuni esempi:
- utilizzare trasparenze nei colori impatta diversamente a livello di piattaforma sul caricamento oppure la piattaforma non dovrebbe percepire una differenza netta?
- i comandi che è bene non utilizzare per un caricamento su storici di una certa lunghezza: ad esempio uno che so per certo, perché me lo indica PRT stesso è il “CALL”… ma ad esempio “backgroundcolor” è pesante? e il “drawtext”? So che magari sono un po’ vago, però non so… se esistesse un modo per me per capire quali comandi evitare per visualizzare indicatori su storici grossi
- un’altra cosa che ho notato è la seguente, e vorrei capire un po’ meglio il perché:
- ho un indicatore che utilizza dei valori a barra chiusa
- lo carico su un anno di storico e ci impiega circa 15 minuti a caricare del tutto…
- lo stesso indicatore lo carico 3 volte dentro una strategia utilizzando la keyword CALL in combinazione con “timeframe(100 ticks, updateonclose)”, “timeframe(200 ticks, updateonclose)” e “timeframe(500 ticks, updateonclose)” e impiega 1-2 minuti in tutto a caricare su uno storico di 1 anno…
- capisco che l'”updateonclose” può fare la differenza e che probabilmente la strategia avanza e nell’avanzare non memorizza le variabili coinvolte ma solo gli ingressi e le uscite a mercato
- tuttavia se anche fosse così deduco che tutto l’overhead che ho nel caricare l’indicatore è dovuto alla grafica
- però non può essere solo dovuto a questo perché quando carico il “VWAP Bands” di default di PRT è velocissimo, quindi o sono io che ancora non ho colto qualche punto chiave oppure questi indicatori di default sono calcolati con delle tecniche differenti (cosa che mi viene suggerita dal fatto che non posso invocare un indicatore come “Points Pivots” utilizzando il comando “CALL”)
Uno degli indicatori in questione è il seguente, un semplice VWAP che parte ad un orario specifico invece che alla prima barra del grafico, basta provare a caricarlo su 1 anno di dati a 100 ticks di IG per osservare quanto da me descritto sopra (soprattutto al punto 2).
// VWAP@Time intraday
// 10.04.2020
// Daniele Maddaluno
// Unefficient way:
// vwap = summation[n](volume*totalprice)/summation[n](volume)
// vwapstd = sqrt(summation[n](square(totalprice - vwap)) / n)
if opentime < startTime then
n = 0
dwapT = 0
priced = 0
shared = 0
summ = 0
vwap = close
vwapstd = 0
else
n = n + 1
// This if has been added just for plot reasons
if n <= 1 then
dwapT = 0
else
dwapT = 255
endif
priced = priced + (totalprice*volume)
shared = shared + volume
if shared>0 then
vwap = priced/shared
summ = summ + square(totalprice - vwap)
vwapstd = sqrt(summ / n)
endif
endif
// Manage the coloring of vwap mid line
if close > vwap then
dwapR = 0
dwapG = 128
dwapB = 192
else
dwapR = 255
dwapG = 0
dwapB = 0
endif
vwapstd1 = vwapstd*NumDevs1
vwapstd2 = vwapstd*NumDevs2
vwapstd3 = vwapstd*NumDevs3
return vwap coloured(dwapR, dwapG, dwapB, dwapT) as "vwap", vwap + vwapstd1 coloured(128, 128, 0, dwapT) as "upVwap1", vwap - vwapstd1 coloured(128, 128, 0, dwapT) as "dwVwap1", vwap + vwapstd2 coloured(128, 128, 0, dwapT) as "upVwap2", vwap - vwapstd2 coloured(128, 128, 0, dwapT) as "dwVwap2", vwap + vwapstd3 coloured(128, 128, 0, dwapT) as "upVwap3", vwap - vwapstd3 coloured(128, 128, 0, dwapT) as "dwVwap3"
Se mi illuminate anche solo su alcuni di questi punti sicuramente mi sarà di aiuto,
grazie in anticipo per la disponibilità.