Problème utilisation variable décimale dans le code
Forums › ProRealTime forum Français › Support ProScreener › Problème utilisation variable décimale dans le code
- This topic has 3 replies, 2 voices, and was last updated 2 years ago by Sly.
-
-
07/22/2022 at 1:27 AM #197663
Bonjour,
Après avoir tenté moult solutions, et configurations, je ne comprends pas d’où vient mon soucis et fait donc appel à vos connaissances.
Je viens de coder un screener ( #setup-patrick-config1&2-v1.3 ci joint) qui utilise des variables pour pouvoir modifier les critères sans avoir a entrer dans le code.
Je rencontre le soucis suivant, la variable “PointP” qui est définie en tant que variable décimale n’est prise en compte dans le résultat rendu par le screener qu’en tant “qu’unité sans décimale” :
Si je met 1.2 ou 1.8 par exemple ça calcule comme si c’était 1. Si je mets 2.7 ça calcule avec un 2.
Mais si au lieu d’utiliser une variable je rentre en lieu et place de “PointP” dans le code, le chiffre décimal directement alors le calcul est bien fait avec les décimales prisent en compte.
Cette variable est utilisée dans la dernière partie du code que voici :
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120/// On Recherche l'une des 2 config suivantes en fonction de la tendance en UT 1heure ////// En tendance baissière : Config 1 = Le prix a croisé MM20 ut15 à la hausse il y a peu ET le prix croise MM7 ut1h ////// En tendance haussière: Config 2 = Le prix fait un pullback sur la MM définie en ut1h ///// v1.3 = v1.2 + ajout du critères "cours actuel à moins de X,X% du point P (Stop théorique du set up)" pour ne pas afficher les résultat "trop tard" qui sont trop loin au dessus du stop/// Critères de filtrage de titres ///// Choix de l'UT pour effectuer le filtrageTIMEFRAME (Daily)// Volume moyen minimumIF VolumeExprimeEnCapital = 0 THENVOL = average[PeriodeVolumeMoyen](volume) >= VolumeMoyenMinimumELSIF VolumeExprimeEnCapital = 1 THENVOL = average[PeriodeVolumeMoyen](volume) * close [0] >= VolumeMoyenMinimumENDIF// Cours MinimumCMin = close >= CoursMinimum/// Config 1 ////// Le prix a croisé la MM20 à la hausse en UT 15min dans les 4 dernières bougies ET est au dessus actuellement ///// Choix de l'UTTIMEFRAME(15mn)// Croisement haussier de la MM20 en UT 15 dans l'une des 4 dernières bougiesCroisementHaussierMM20UT15 = close [0] CROSSES OVER Average[20](close) OR close [1] CROSSES OVER Average[20](close) OR close [2] CROSSES OVER Average[20](close) OR close [3] CROSSES OVER Average[20](close)// Le cours est au dessus de m20 UT 15CoursAuDesssusM20UT15 = close >= Average[20](close)// Croisement Haussier MM20 UT 15 valide et en coursCroisementMM20Valide = CoursAuDesssusM20UT15 AND CroisementHaussierMM20UT15// Le prix croise la MM7 à la hausse en UT 1heure //// Choix de l'UTTIMEFRAME(1hour)// Tendance Baissière Validée en UT 1heure. m7 < m20TendanceBaissiereUT1h = Average[7](close) <= Average[20](close)// Croisement haussier de la MM7 validé en UT 1heure en coursCroisementMM7Valide = close CROSSES OVER Average[7](close)// Resultats de Config 1Config1 = CroisementMM20Valide AND CroisementMM7Valide AND TendanceBaissiereUT1h AND VOL AND CMin/// Config 2 ////// Pullback sur la MM définie en UT 1heure ///// Choix de l'UTTIMEFRAME(1hour)// Tendance Haussière Validée en UT 1heure. m7 > m20TendanceHaussiereUT1h = Average[7](close) >= Average[20](close)// La bougie actuelle fait un pullback sur la mm définiePullbackSurMM = ( open > Average[MoyennePullback7ou20](close) ) AND ( low <= Average[MoyennePullback7ou20](close) ) AND ( low [1] >= Average[MoyennePullback7ou20](close) )// Resultats de Config 2Config2 = PullbackSurMM AND TendanceHaussiereUT1h AND VOL AND CMin// XXpourCentMaxiAuDessusStopTheorique/// RESULTATS SCREENER Config 1 ou Config 2 ///// Critères "cours actuel à moins de X,X% du point P (potentiel Stop du set up)" pour ne pas afficher les résultats "trop tard"IF TendanceBaissiereUT1h = 1 THENTIMEFRAME (15mn)StopOK = close <= ( ( 100 + PointP ) / 100 ) * Average[20](close)ELSIF TendanceHaussiereUT1h = 1 AND MoyennePullback7ou20 = 7 THENTIMEFRAME (1hour)StopOK = close <= ( ( 100 + PointP ) / 100 ) * Average[20](close)ELSIF TendanceHaussiereUT1h = 1 AND MoyennePullback7ou20 = 20 THENStopOK = close <= ( ( 100 + PointP ) / 100 ) * ( 0.99 * Average[20](close) )ENDIF// Critere de classement des resultats //IF TendanceBaissiereUT1h = 1 THENConfig = 1ELSIF TendanceHaussiereUT1h = 1 THENConfig = 2ENDIF// RESULTATSSCREENER [ StopOK AND ( Config1 OR Config2 )] (Config AS "Config")J’ai beau chercher je ne comprends pas d’où vient ce problème.
D’autant que j’ai déjà utilisé des variables décimales dans un autre screener pour faire une multiplication et que cela fonctionne toujours très bien. Voir le screener joint “Marteaux”
Merci d’avance pour le coup de main
07/22/2022 at 8:58 PM #19774908/03/2022 at 9:22 AM #198400L’instruction TIMEFRAME ne peut pas être conditionné (donc inclut dans un IF/ENDIF).
Ta variable StopOK se trouve dans ce bloc conditionnel qui ne peut pas fonctionner, je ne sais pas ce qui peut ressortir de ce calcul par conséquent, en tout les cas c’est erroné, d’où ton problème.
08/05/2022 at 4:11 PM #198568Bonjour Nicolas,
et merci de ta réponse.
En ayant fait de nombreux tests, il me semble pourtant que le timeframe fonctionne dans le “IF” (le but étant de choisir la moyenne mobile de l’ut voulue), et les résultats semblent cohérents. Cependant je vais m’y repencher pour m’assurer que je raconte pas de bêtise.
Quand à mon soucis, ça ne vient pas de là puisque j’ai le même sur le code suivant par exemple (extrait de mon screener de marteaux)
1MVert1 = close > open AND (high - close ) <= ( LongueurMaxiMecheHaute / 10 ) * (close - open) AND (open - low ) >= ( LongueurMiniMecheBasse / 10 ) * (close - open ) AND close <= Pmax1dans ce cas là, mes variables "LongueurMaxiMecheHaute" et "LongueurMiniMecheBasse" rencontrent le même soucis.
Si je les mets en variables décimales, ben le calcul ne prend pas les décimales en compte. Par exemple si je veux une mèche basse de 1,5 fois le corps à minima et que je rentre 1.5 dans la variable "LongueurMiniMecheBasse", alors les calculs sont fait avec 1 tout court.
Si je mets 1.8 là aussi ça prend 1 comme valeur pour le calcul.Ca tronque les décimales en fait.
c'est pour ça que dans le code tu peux voir "LongueurMiniMecheBasse / 10"
car pour contourner le problème, je rentre la valeur "LongueurMiniMecheBasse" en décimale, donc 15 lorsque je veux 1.5 dans le calcul.Je sais pas si je suis super clair 😅
-
AuthorPosts
Find exclusive trading pro-tools on