Variables d’appel dans le code d’un indicateur
Forums › ProRealTime forum Français › Support plateforme ProRealTime › Variables d’appel dans le code d’un indicateur
-
-
08/19/2025 at 8:22 PM #24988908/19/2025 at 11:19 PM #24989208/19/2025 at 11:35 PM #249893
Bon, je remercie tous ceux qui ont pris la peine de me répondre, mon problème est maintenant résolu, même si ce n’est pas de la façon que j’imaginais. Mon besoin étant de calculer un temps écoulé (en jours calendaires ou en jours de bourse) depuis un évènement dont la date m’est connue, j’avais imaginé de passer en argument CurrentDay= Days. Cela ne marche pas, mais par contre CurrentDay= Date marche. Toutefois faire la différence entre deux dates en format YYYMMDD ne donne pas un nombre de jours. Sur une idée de kingmordecal, j’ai donc créée l’indicateur PSEUDODAYS, qui me permet de faire une soustraction me donnant un résultat qui, s’il introduit de petites bizarreries dans le décompte à cause des années bissextiles, ou des mois dont le nb de jours n’est pas égal à 30, répond quand même à mon besoin. Bon, pour les puristes, c’est un peu crade comme solution, mais je vais m’en contenter….
(je fais une parenthèse : j’ai développé une application (en LibreOffice , puis en Excel) de thermique qui calcule la température sur une année dans ma maison (mon grenier, ma cave, mon séjour, les tuiles de mon toit, etc …) en intégrant l’équation de Fourier à l’intérieur de mes murs (pas de deux minutes .. ) en tenant compte de l’effet du rayonnement solaire sur mes tuiles, etc .. en utilisant d’une température extérieure reconstituée par morceaux de sinusoïdes à partir des Min et des Max journaliers sur une année. C’est une plaisanterie qui m’a demandé des milliers d’heures de travail. Et bien le plus dur dans tout ça, ce n’a pas été les problèmes de thermique (pourtant difficiles), mais la gestion des années bissextiles sur des durées d’exécution à cheval sur deux années ! (ainsi que le fait de slalomer entre les bugs d’Excel dans les dates) !!!!
Indicateur PSEUDODAYS (variable d’appel TheDate)
TheYear = Floor(TheDate / 10000, 0)
TempDay = Floor(TheDate / 100, 0)
TheDay = ((TheDate / 100) – TempDay) * 100TempMonth = Floor(TheDate / 100, 0) * 100
TempMonth2 = TempMonth / 10000
TheMonth = (TempMonth2 – Floor(TempMonth / 10000, 0)) * 100PseudoDays= (TheYear-1900)*365+TheMonth*30+TheDAY
Return PseudoDays
08/20/2025 at 2:10 PM #249921Bonjour,
Ce code est moins sujet aux erreurs d’arrondi…PseudoDays1234567TheYear = Floor(TheDate / 10000)TheMonth = Floor(TheDate / 100) MOD 100TheDay = TheDate MOD 100PseudoDays = (TheYear - 1900) * 365 + TheMonth * 30 + TheDayRETURN PseudoDays1 user thanked author for this post.
08/20/2025 at 2:12 PM #24992308/20/2025 at 4:02 PM #249926DAYS restitue le nombre de jours écoulés depuis le 1/1/1970 (en mode similaire à Unix) à la barre indiquée entre le carré des parents.
Si cette barre est indiquée, vous devez vous assurer du courant par défaut.Je ne sais pas à quoi servent vos codes, mais juste pour tester le fonctionnement de CALL, les codes que j’ai postés fonctionnent.
1 user thanked author for this post.
08/21/2025 at 8:42 PM #249961Bon, grâce à JS, je peux même propose une version de PSEUDODAYS qui devrait donner le résultat exact (sauf que mon code plante (“calculation error”), et je ne sais pas pourquoi !)
$JOURS[1]=0
$JOURS[2]=31
$JOURS[3]=59
$JOURS[4]=90
$JOURS[5]=120
$JOURS[6]=151
$JOURS[7]=181
$JOURS[8]=212
$JOURS[9]=243
$JOURS[10]=273
$JOURS[11]=304
$JOURS[12]=334
$JOURS[13]=365TheYear = Floor(TheDate / 10000)
TheMonth = Floor(TheDate / 100) MOD 100
TheDay = TheDate MOD 100DaysOfPreviousMonths=$JOURS[TheMonth]
CorrectBissext=FLOOR((TheYear-1900)/4)
NewPseudoDays = (TheYear – 1900) * 365+CorrectBissext + DaysOfPreviousMonths + TheDay
RETURN NewPseudoDays
08/21/2025 at 8:57 PM #24996308/21/2025 at 9:49 PM #249964Salut,
Ce qui est frappant, c’est que « $Days[ ] » et « $Jours[ ] » sont utilisés de manière interchangeable…
Le code est adapté au format de date : YYYYMMDD (et non DDMMYYYY)
Je pense que le code fonctionne bien…
1 user thanked author for this post.
08/21/2025 at 9:56 PM #24996508/21/2025 at 10:16 PM #249966Le code fonctionne bien jusqu’en 2099 car les années du siècle (2100, 2200, 2300,…) ne sont pas des années bissextiles et avec « Floor((TheYear-1900)/4) » après 2100 vous comptez 1 jour de trop…
1 user thanked author for this post.
08/22/2025 at 8:12 AM #249969Avec ça, le résultat devrait être correct .. (NB : 1) je teste CurrentYearFeb29Issue par rapport à 1, le logiciel a refusé de faire le test par rapport à True. Pourquoi ? 2) mon code plante toujours .. des idées ?)
JOURS[1]=0
$JOURS[2]=31
$JOURS[3]=59
$JOURS[4]=90
$JOURS[5]=120
$JOURS[6]=151
$JOURS[7]=181
$JOURS[8]=212
$JOURS[9]=243
$JOURS[10]=273
$JOURS[11]=304
$JOURS[12]=334
$JOURS[13]=365TheYear = Floor(TheDate / 10000)
TheMonth = Floor(TheDate / 100) MOD 100
TheDay = TheDate MOD 100CurrentYearFeb29Issue=(TheYear MOD 4) =0 AND (TheYear MOD 100) <>0
IF (CurrentYearFeb29Issue = 1) AND (TheMonth>2) THEN
Feb29Issue=1
Else
Feb29Issue=0
ENDIFDaysOfPreviousMonths=$JOURS[TheMonth]+Feb29Issue
CorrectBissext=FLOOR((TheYear-1901)/4)-FLOOR((TheYear-1901)/100)
NewPseudoDays = (TheYear – 1901) * 365+CorrectBissext + DaysOfPreviousMonths + TheDay
RETURN NewPseudoDays
08/22/2025 at 1:00 PM #249980Salut,
Je pense que le code est correct maintenant…
Attention aux traductions de l’anglais vers le français car ce n’est pas toujours cohérent…
J’ai joint le « itf-file » que vous pouvez importer dans les indicateurs de PRT…
123456789101112131415161718192021222324252627282930313233343536TheDate=20250822If BarIndex=0 then$Days[1]=0$Days[2]=31$Days[3]=59$Days[4]=90$Days[5]=120$Days[6]=151$Days[7]=181$Days[8]=212$Days[9]=243$Days[10]=273$Days[11]=304$Days[12]=334EndIfTheYear=Floor(TheDate/10000)TheMonth=Floor(TheDate/100) MOD 100TheDay=TheDate MOD 100CurrentYearFeb29Issue=(TheYear MOD 4)=0 and (TheYear MOD 100)<>0 or (TheYear MOD 400)=0If CurrentYearFeb29Issue and TheMonth>2 thenFeb29Issue=1ElseFeb29Issue=0EndIfDaysOfPreviousMonths=$Days[TheMonth]+Feb29IssueCorrectBissext=Floor((TheYear-1901)/4)-Floor((TheYear-1901)/100)+Floor((TheYear-1601)/400)NewPseudoDays = (TheYear-1901)*365+CorrectBissext+DaysOfPreviousMonths+TheDayRETURN NewPseudoDays08/22/2025 at 1:31 PM #249982 -
AuthorPosts
Find exclusive trading pro-tools on