pj27Participant
Junior
Bonjour,
Je souhaitais utiliser la fonction Time, qui fournit l’heure de clôture de la barre en court (à diviser par 10.000 pour avoir un format hh.mmss), pour déterminer l’unité de temps du graphe en cours, en calculant la différence de temps entre 2 barres passées (vu que je n’ai pas trouvé de variable récupérant l’unité actuelle du graphe)
L’objectif était de calculer par exemple des MM ou Bollinger sur d’autres unités de temps et les poser sur le graphe en court quelque soit l’unité en question (exemple: tracer une MM20 5 min sur mon graphe en UT 50 secondes).
Mon code fonctionne techniquement mais la donnée Time de 2 barres consécutives n’est pas fiable et peut fortement varier particulièrement en absence de transactions.
Exemple ci dessous, avec le code qui afiche time [1] et time [2] sur une UT 10 secondes, on obtient à 21:51:20 time[1]=21:50:30 et time[2]=21:50:10 là ou j’aurais du avoir time[1]=21:51:10 et time[2]=21:51:00
Sachant qu’il s’agit d’une période ou il y peu de transaction
Le bug semble être moins fréquent s’il y a beaucoup de ticks sur la période.
Je pourrais utiliser les fonction hour et minute, mais j’aurais besoin de la fonction second, qui n’existe pas
Si quelqu’un à une astuce, je suis preneur
Merci
pj27Participant
Junior
Après test de toutes les fonctions “date” (time, opentime..”), à défaut de variation du prix sur la période d’une barre (pas d’achat/vente), les données de la barre concernée concernant la date/heure début ou fermeture de la barre ne sont pas actualisées, ils conservent les données de la dernière barre qui a subit une évolution de prix.
Dommage qu’on ne puisse pas accéder dans la définition d’un indicateur à l’unité de temps sélectionnée directement ou également au code/nom de la valeur du sousjacent
pj27Participant
Junior
Merci pour la réponse
Mais cela ne marche pas pour les UT inférieures à une minute, faute de fonction opensecond
De plus, je soupçonne qu’elle subirait le même bug dans le cas de cours flat pendant plus de 1 minute, car ce sont des dérivées de opentime
pj27Participant
Junior
Bonjour,
J’ai contourné le problème en réalisant une itération sur les premières barres pour déterminer l’UT probable du graphe.
J’ai donc créé une fonction qui retourne l’UT sous-jacente en seconde UTDetect (ci dessous), et un indicateur MMUT (plus bas)
qui appelle cette fonction pour tracer une moyenne mobile et/ou des bandes de bollinger sur une autre unité de temps.
On peut donc tracer par exemple une MM7 5minutes et une Bollinger (20;2.5) 10 mminutes sur un graphe en 50 secondes
Si quelqu’un veut bien tester
defparam DRAWONLASTBARONLY=true
umini=call utdetect
If umini<>9999 then
TF=round(UTTargetInMinute*60/umini) // calcul ratio entre UT actuelle (umini) et UT demandée
mm=average[TF*MMPeriod]
//mmr=round(mm*100)/100
if DisplayText then
DRAWTEXT(" MM#MMPeriod# #UTTargetInMinute#m",barindex,mm,SansSerif,Standard,20)
endif
avgB = average[TF*BBPeriod]
BUp = avgB+std[TF*BBPeriod]*BBDeviation
if displaytext then
DRAWTEXT(" BBUp#BBPeriod# #UTTargetInMinute#m",barindex,BUp,SansSerif,standard,20)
endif
avgB = average[TF*BBPeriod]
BDown = avgB-std[TF*BBPeriod]*BBDeviation
if displaytext then
DRAWTEXT(" BBDo#BBPeriod# #UTTargetInMinute#mi",barindex,BDown,SansSerif,standard,20)
endif
else
endif
return mm as "MM",BUp as "BollingerUP",BDown as "BollingerDown"
// calcul l'unité de temps d'un graphique et le retourne en secondes
// parametre Utest=nombre d'itération pour détecter l'UT
UTest=5
if barindex=utest+2 then
for n=2 to UTest+1//barindex
utm1=opentime[n-1]/10000
utm2=opentime[n] /10000
h1=-1
for nn=23 downto 0
if utm1>=nn and h1=-1 then
h1=nn
reste1=(utm1-h1)*100
//zz2=reste1
break
endif
next
h2=-1
for nn=23 downto 0
if utm2>=nn and h2=-1 then
h2=nn
reste2=(utm2-h2)*100
break
endif
next
m1=-1
for nn=59 downto 0
if reste1>=nn and m1=-1 then
m1=nn
s1=round((reste1-m1)*100)
break
endif
next
m2=-1
for nn=59 downto 0
if reste2>=nn and m2=-1 then
m2=nn
s2=round((reste2-m2)*100)
break
endif
next
if h2=23 and h1=0 then
h1=24
endif
//if m2=59 and m1=0 then
//m1=60
//endif
x1=h1*60*60+m1*60+s1
x2=h2*60*60+m2*60+s2
utm=x1-x2
utm=utm
if utm<umini and utm<>0 then
umini=utm
endif
next
else
if barindex>1 then
umini=umini[1]
else
umini=9999
endif
endif
return umini
Bravo et merci pour le retour et le partage.