Condition et TimeFrame
Forums › ProRealTime forum Français › Support ProBuilder › Condition et TimeFrame
- This topic has 16 replies, 4 voices, and was last updated 1 year ago by Nicolas.
-
-
01/04/2023 at 3:37 PM #206784
Bonjour Nicolas, bonjour à tous,
Ccomment est-il possible d’écrire :
Si mon UT est de 1 mn, j’affiche :
TimeFrame (1 hour)
TimeFrame ( 10 minute)
TimeFrame ( 5 minute)
TimeFrame (1 minute)Si mon UT est de 10 mn, j’affiche uniquement :
TimeFrame (1 hour)
TimeFrame ( 10 minute)
TimeFrame ( 5 minute)
TimeFrame (1 minute)En gros, comment émettre une condition sur la variable TimeFrame à afficher en fonction de l’unité de temps ?
01/04/2023 at 4:12 PM #206788On ne peut pas conditionner l’instruction TIMEFRAME, c’est à dire l’inclure dans un bloc IF/ENDIF.
Par contre, pour ce que tu souhaites faire, tu peux conditionner ce qui se passe sous chaque instruction TIMEFRAME selon ce que l’instruction GetTimeframe te renvoi (la quantité de secondes du TF).
1 user thanked author for this post.
01/04/2023 at 4:39 PM #206790Merci Nicolas,
Seulement si je conditionne un GetTimeFrame sous une TimeFrame (10 minute) par exemple et que je souhaite passer le graph dans une UT 1H, celà ne risque t’il pas de faire planter l’indicateur ?
Le but est que le code s’adapte à mon UT.01/04/2023 at 10:31 PM #206804On ne peut pas conditionner l’instruction TIMEFRAME, c’est à dire l’inclure dans un bloc IF/ENDIF.
Par contre, pour ce que tu souhaites faire, tu peux conditionner ce qui se passe sous chaque instruction TIMEFRAME selon ce que l’instruction GetTimeframe te renvoi (la quantité de secondes du TF).
je bute, pourrais-tu me montrer un exemple concret stp ?
01/05/2023 at 11:56 AM #206822Seulement si je conditionne un GetTimeFrame sous une TimeFrame (10 minute) par exemple et que je souhaite passer le graph dans une UT 1H, celà ne risque t’il pas de faire planter l’indicateur ?
En effet, j’ai répondu trop vite, le fait d’utiliser l’indicateur sur un timeframe plus grand fera stopper l’indicateur avec la fenêtre d’erreur, même avec ma solution.
Toutefois, sauf erreur de ma part (à tester), on peut faire un CALL d’un indicateur “esclave” qui se calcule dans un autre timeframe (et donc avec son code dessous une instruction TIMEFRAME), tout en n’utilisant aucune instruction TIMEFRAME dans l’indicateur “maître”. Donc on pourrait conditionner ces CALL selon le résultat du GETTIMEFRAME, j’espère avoir été clair 🙂
01/05/2023 at 12:07 PM #206825La discussion porte sur la façon de créer un indicateur qui affiche des informations pour plusieurs unités de temps différentes, en fonction de l’unité de temps (UT) sélectionnée par l’utilisateur. La solution proposée consiste à utiliser l’instruction
GetTimeframe
pour récupérer la quantité de secondes de l’UT sélectionnée, puis à utiliser cette valeur dans des instructionsif
pour afficher les informations souhaitées pour chaque UT. Cependant, il a été noté que cela ne fonctionnera pas si l’UT sélectionnée est plus grande que celle pour laquelle l’indicateur a été conçu, car cela entraînera une erreur. Une autre solution proposée est de créer plusieurs indicateurs “esclaves”, chacun conçu pour fonctionner avec un UT différent, puis de les appeler à l’aide de l’instructionCALL
dans l’indicateur principal, en fonction de l’UT sélectionnée par l’utilisateur. Cela permettrait de s’assurer que l’indicateur fonctionne correctement pour chaque UT sélectionnée, mais nécessiterait la création de plusieurs indicateurs distincts.(résumé généré par ChatGPT).
01/05/2023 at 3:15 PM #206831Bonjour Nicolas (et ChatGPT 🙂 ),
J’ai anticipé hier la solution que tu propose par le biais d’un CALL depuis un autre indicateur.
Je n’ai pas d’erreur généré mais la donnée retourné ne correspond pas.Dans cet exemple je cherche à récuperer dans un tableau le nombre de minute en UT5 et UT1.
Voici une synthèse de mon code (le code est trop long sinon) pour illustrer ma tentative :Indicateur principal :
indicateur principal123456789101112131415161718192021222324252627282930313233UT = gettimeframe/60//TimeFrame (5 minute)IF UT<=5 thenmyVUT5M200,ignored = CALL "MonCallUTF"[1,1]//// ******* Colonne 12 *********//DrawRectangle(Dr+(BoxLarge*11)-AjustBox,Ha-BoxHaut,Dr+(BoxLarge*10)-AjustBox,Ha) anchor(TopLeft) coloured(400,200,200,100) borderColor(50,10,10,80) // Boîte 2DrawText("5 MN",Dr+(BoxLarge*10)+(BoxLarge/2)-AjustBox, Ha-(BoxHaut/2), dialog, standard,14)anchor(TopLeft)DrawRectangle(Dr+(BoxLarge*11)-AjustBox,Ha-(BoxHaut*2),Dr+(BoxLarge*10)-AjustBox,Ha-BoxHaut) anchor(TopLeft) coloured(400,200,200,100) borderColor(50,10,10,80) //DrawText("#myVUT5M200#",Dr+(BoxLarge*10)+(BoxLarge/2)-AjustBox, Ha-BoxHaut-(BoxHaut/2), dialog, standard,14)anchor(TopLeft)ELSEAjustBox = BoxLarge*11ENDIFIF UT<=1 thenignored,myVUT1M200 = CALL "MonCallUTF"[1,1]//// ******* Colonne 13 *********//DrawRectangle(Dr+(BoxLarge*12)-AjustBox,Ha-BoxHaut,Dr+(BoxLarge*11)-AjustBox,Ha) anchor(TopLeft) coloured(400,200,200,100) borderColor(50,10,10,80) // Boîte 2DrawText("1 MN",Dr+(BoxLarge*11)+(BoxLarge/2)-AjustBox, Ha-(BoxHaut/2), dialog, standard,14)anchor(TopLeft)DrawRectangle(Dr+(BoxLarge*12)-AjustBox,Ha-(BoxHaut*2),Dr+(BoxLarge*11)-AjustBox,Ha-BoxHaut) anchor(TopLeft) coloured(400,200,200,100) borderColor(50,10,10,80) //DrawText("#myVUT1M200#",Dr+(BoxLarge*11)+(BoxLarge/2)-AjustBox, Ha-BoxHaut-(BoxHaut/2), dialog, standard,14)anchor(TopLeft)ELSEAjustBox = BoxLarge*12ENDIFTIMEFRAME(default)ReturnIci mon indicateur appelé via CALL (MonCallUTF) :
12345678timeframe(5 minute)a = gettimeframe/60timeframe(1 minute)b = gettimeframe/60return a as "5SM200",b as "1SM200"Je devrais retourner les valeur “5” en UT5 et “1” en UT1 mais voici ce que j’obtiens dans mon tableau (les valeurs de l’unité par défaut soit 1 min) :
01/05/2023 at 4:40 PM #206837Ci-joint le résultat avec un code plus simple:
1234567891011UT = gettimeframe/60IF UT<=5 thena,ignored = CALL "#dev2"ENDIFIF UT<=1 thenignored,b = CALL "#dev2"ENDIFReturn a,bDans le cas du graphique courant en 5-minutes, le résultat est a=5 et b=0
hors dans un graphique 1-minutes, tes 2 conditions sont vrais, puisque UT est à la fois inférieur à 5 et égal à 1, donc tu as a=1 et b=1
Donc en résumé ça fonctionne, on peut conditionner les appels aux timeframes en utilisant des CALL qui eux comportent 1 ou plusieurs déclarations de timeframes, même inférieur à celui du graphique courant.
01/05/2023 at 7:55 PM #206851Nicolas,
Dans ton exemple, ne devrais-tu pas retourner :
a = 5 (normal tu es en UT5mn => OK)
b = 1 (et non pas 0 => NOK).Je suis en UT 1mn et j’ai repris ton exemple, j’obtiens de nouveau a = 1, b = 1 (au lieu du 5 désiré).
01/06/2023 at 9:27 AM #206869Dans ton exemple, ne devrais-tu pas retourner : a = 5 (normal tu es en UT5mn => OK) b = 1 (et non pas 0 => NOK).
Non puisque b n’est jamais renseigné à cause de ta condition: UT<=1, or ici UT = 5
Je suis en UT 1mn et j’ai repris ton exemple, j’obtiens de nouveau a = 1, b = 1 (au lieu du 5 désiré).
Tu as raison, je viens de reprendre mes notes de l’époque et je me souviens maintenant, que le conditionnement des timeframes ne fonctionnera pas non plus dans un CALL. MAIS, la bonne nouvelle c’est qu’on s’affranchit tout de même de l’erreur de la plateforme sur l’impossibilité d’obtenir les données d’une UT hors d’atteinte (le 1-min sur un graphique 10-minutes par exemple). Donc en résumé, les IF/ENDIF pour conditionner les CALL, on oublie, reste à gérer comment on tu organiseras les données retournées pour ton code maître. Il y a quelques indicateurs dans la marketeplace qui utilise ce principe, l’exemple le plus concret je pense est le suivant: https://market.prorealcode.com/product/graphic-patterns-scanner-v11/
Bonne continuation.
01/06/2023 at 1:45 PM #206898Merci Nicolas,
On retrouve également le même principe sur cet indicateur : https://market.prorealcode.com/product/ultimate-trend-dashboard/
Il est donc possible de conditionner les données de TimeFrame différente en fonction de l’UT dans laquelle on se trouve ! Mais comment ?
J’ai l’impression que la solution se touche du bout du doigt mais quel casse-tête…Reflexion : outre la fonction CALL et à l’instar de la fonction IMPORT en VBA, est-il possible d’importer un “code complet” ?
01/06/2023 at 5:29 PM #206911Dans ces indicateurs, je pense que l’auteur fait la même chose que dans mon dernier exemple, sauf que si la valeur appelé par le CALL retourne 0 et bien il affiche rien du tout, voilà.
Donc c’est cette solution qui fonctionne 🙂
01/06/2023 at 6:21 PM #206916Nicolas, ce n’est malheureusement pas la solution. Si je suis ton exemple et pour imager mon propos, j’ajoute une 3ème donnée à retourner :
123456789101112131415UT = gettimeframe/60IF UT<=10 thena,ignored,ignored = CALL "#dev2"ENDIFIF UT<=5 thenignored,b,ignored = CALL "#dev2"ENDIFIF UT<=1 thenignored, ignored,c = CALL "#dev2"ENDIFReturn a,b,cTu es en UT5min, tu devrais donc retourner :
a = 10
b= 5
c=0Or dans ton exemple, on retourne :
a=5
b=5
c=0Il ne génére pas d’erreur mais ne prend pas en compte le TimeFrame pour autant dans l’esclave, il génere la donnée via le Timeframe par défaut au final…
01/10/2023 at 11:28 AM #207162Il ne génére pas d’erreur mais ne prend pas en compte le TimeFrame pour autant dans l’esclave,
Oui j’ai répondu à cela dans mon dernier message:
que le conditionnement des timeframes ne fonctionnera pas non plus dans un CALL
Donc quoiqu’il arrive, pas de IF/ENDIF autour d’un CALL qui appelle un indicateur qui a dans code l’instruction TIMEFRAME.
10/14/2023 at 2:45 PM #222449 -
AuthorPosts
Find exclusive trading pro-tools on