Renvoi d’information inexacte

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #249875 quote
    Pascal 44
    Participant
    New
    Bonjour,
    J’ai deux scripts identiques :
    • l’un cherche un “Plus haut” et retourne des résultats exacts… avec l’instruction “HAUTindex = BarsSince(High=HAUTcours)”
    • l’autre cherche un “plus bas” et renvoie des résultats erronés… avec l’instruction “BASindex = BarsSince(Low=BAScours)”
    Après avoir lu beaucoup de posts sur le forum, je ne n’ai pas trouvé comment corriger cette erreur.
    Merci pour votre aide éventuelle.
    XXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX
    Voici le script…
    #249877 quote
    robertogozzi
    Moderator
    Master
    Comme indiqué dans l’encadré JAUNE ci-dessous :

    N’incluez pas d’informations personnelles telles que des adresses e-mail ou des numéros de téléphone dans vos messages.

    Merci 🙂
    #249881 quote
    robertogozzi
    Moderator
    Master
    J’ai également remarqué des données incorrectes. Je vais essayer d’en savoir plus et je vous tiendrai au courant.
    #249886 quote
    Pascal 44
    Participant
    New
    Merci pour votre réactivité À bientôt
    #249895 quote
    Iván González
    Moderator
    Master
    Bonjour. Je trouve ton code correct. Si je ne me trompe pas, ce que tu cherches, c’est la valeur la plus basse des 60 dernières bougies et quand elle s’est produite, n’est-ce pas ? Dans ce cas, tu devrais utiliser une boucle plus appropriée. Avec ton code actuel, tu demandes à localiser la bougie où low = lowest[60](low). Comme tu peux le voir sur la capture d’écran, cela a pu se produire il y a plus de 60 périodes, même si ta ligne des plus bas est bien sur 60 périodes. Pour les plus hauts, c’est exactement la même chose, sauf qu’il faut chercher une configuration baissière pour le remarquer. Je te mets un exemple avec TSLA pour que tu voies que cela ne correspond pas non plus. Si ce que tu cherches, ce sont les bougies qui ont donné les valeurs maximales et minimales des 60 dernières bougies, alors tu devrais utiliser le code suivant pour ne pas te tromper.
    DefParam DrawOnLastBarOnly = true
    
    Periode = 60
    atr = AverageTrueRange[14](close)
    
    // +Haut
    HAUTcours = Highest[Periode](High)
    HAUTindex = 0
    FOR i = 0 TO Periode - 1 DO
       IF High[i] = HAUTcours THEN
          HAUTindex = i
          BREAK
       ENDIF
    NEXT
    
    IF HAUTindex > 0 THEN
       DrawText("#HAUTcours#", BarIndex[HAUTindex], HAUTcours + 3*atr) Coloured(255, 0, 0)
       DrawText("#HAUTindex#", BarIndex[HAUTindex], HAUTcours + 2*atr) Coloured(255, 0, 0)
       DrawArrowDown(BarIndex[HAUTindex], HAUTcours + 0.15 * atr) Coloured(255, 0, 0)
    ENDIF
    
    // +Bas
    BAScours = Lowest[Periode](Low)
    BASindex = 0
    FOR i = 0 TO Periode - 1 DO
       IF Low[i] = BAScours THEN
          BASindex = i
          BREAK
       ENDIF
    NEXT
    
    IF BASindex > 0 THEN
       DrawText("#BAScours#", BarIndex[BASindex], BAScours - 3*atr) Coloured(0, 128, 0)
       DrawText("#BASindex#", BarIndex[BASindex], BAScours - 2*atr) Coloured(0, 128, 0)
       DrawArrowUp(BarIndex[BASindex], BAScours - 0.15*atr) Coloured(0, 128, 0)
    ENDIF
    
    
    RETURN close
    
    #249902 quote
    Nicolas
    Keymaster
    Master
    Voici une autre version qui n’utilise ni Barssince, ni de boucles:
    DefParam DrawOnLastBarOnly = true
    
    Periode = 60
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // Le +HAUT sur une période (par exemple 2h)...
    
    HAUTcours = Highest[Periode](High) 
    if HAUTcours<>Hautcours[1] or HAUTcours=Hautcours[1] then 
    hautindex=barindex  
    endif                                                    
    If HAUTindex > 0 then                                                                     
    DrawText("#HAUTcours#", HAUTindex,HAUTcours+3) Coloured(255,0,0)              // • Ecrire le cours de ce +Haut
    DrawText("#HAUTindex#", HAUTindex,HAUTcours+2) Coloured(255,0,0)              // • Ecrire le cours de ce +Haut
    DrawArrowDown(HAUTindex, HAUTcours+1) Coloured(255,0,0)                       // • Dessiner une flèche ROUGE au DESSUS
    Endif
    
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // Le +BAS sur une période (par exemple 2h)...
    
    BAScours = Lowest[Periode](Low) 
    if bascours<>bascours[1] or bascours=bascours[1] then    
    basindex=barindex                                                        
    endif                                                         
    If BASindex > 0 then                                                                
    DrawText("#BAScours#", BASindex,BAScours-3) Coloured(0,128,0)                    // • Ecrire le cours de ce +Bas
    DrawText("#BASindex#", BASindex,BAScours-2) Coloured(0,128,0)                   // • Ecrire le cours de ce +Bas
    DrawArrowUp(BASindex, BAScours-1) Coloured(0,128,0)                             // • Dessiner une flèche VERTE au DESSOUS
    Endif
    // =================================================================================================================================================================
    
    RETURN
    #249906 quote
    Nicolas
    Keymaster
    Master
    Après une analyse plus approfondie 🙂 voir mon image jointe pour commencer !

    BarsSince ne répond pas à la question “où se trouve l’extrême dans ma fenêtre de 60 bougies ?”, mais à “à quand remonte la dernière fois où ce prix précis est apparu”.
    Du coup, quand le nouveau Lowest des 60 dernières bougies est égal à un creux plus ancien, BarsSince peut retourner 93 (ou tout autre nombre > 60), alors que l’extrême de la fenêtre courante est… dans la fenêtre !

    Ton premier code est donc correct pour dater la dernière occurrence d’un prix, mais pas adapté à ce que tu veux faire ici (pointer l’extrême dans la période).
    Pour ça, il faut utiliser HighestBars / LowestBars qui renvoient l’offset (0…Période-1) de l’extrême à l’intérieur de la fenêtre.

    Voir: https://www.prorealcode.com/documentation/highestbars/

    Selon moi, voici le code adapté :

    DefParam DrawOnLastBarOnly = true
    
    Periode = 60
    
    if barindex>periode then 
    // +HAUT sur la période
    hautBars  = HighestBars[Periode](High)        // offset de l'extrême dans la fenêtre (0..Periode-1)
    hautPrix  = High[hautBars]
    
    if hautBars >= 0 then
    DrawText("#HAUTprix#", BarIndex[hautBars], hautPrix+3) Coloured(255,0,0)
    DrawText("#hautBars#", BarIndex[hautBars], hautPrix+2) Coloured(255,0,0)
    DrawArrowDown(BarIndex[hautBars], hautPrix+1) Coloured(255,0,0)
    endif
    
    // +BAS sur la période
    basBars   = LowestBars[Periode](Low)          // offset de l'extrême dans la fenêtre (0..Periode-1)
    basPrix   = Low[basBars]
    
    if basBars >= 0 then
    DrawText("#BASprix#", BarIndex[basBars], basPrix-3) Coloured(0,128,0)
    DrawText("#basBars#", BarIndex[basBars], basPrix-2) Coloured(0,128,0)
    DrawArrowUp(BarIndex[basBars], basPrix-1) Coloured(0,128,0)
    endif
    endif 
    
    RETURN
    Iván González and robertogozzi thanked this post
    #249908 quote
    Pascal 44
    Participant
    New
    Bonjour Nicolas, Ce matin, le code fonctionne, avec effectivement une bougie de plus haut au delà des 60 . Toutes tes informations apportent de l’eau à mon moulin. Comme je ne suis pas informaticien… Je vais les étudier pas à pas pour une bonne compréhension. Et je vais donc pouvoir améliorer et poursuivre mon idée de trading. Je te remercie pour ton aide et ta rapidité de réponse. Pascal
    #249909 quote
    Pascal 44
    Participant
    New
    Merci également à Ivan et Roberto
    robertogozzi and Iván González thanked this post
    #249931 quote
    Pascal 44
    Participant
    New
    Bonjour messieurs, J’ai bien étudié vos propositions et je vous remercie de m’avoir fait progresser. Une question à Nicolas : L’instruction conditionnelle  “if barindex>periode then” qui encadre tout le code m’interpelle. C’est une condition qui me semblait sans intérêt, puisqu’elle est toujours vraie. Pourtant, si je la supprime,  j’ai un message  d’erreur. Cette instruction est magique, elle évite le message  d’erreur… Je n’ai pas compris pourquoi ce miracle ? Si tu as une minute, pourrais-tu me donner une idée de ce qui se passe avec ce test “if barindex>periode then” ? Je t’en remercie d’avance Pascal
Viewing 10 posts - 1 through 10 (of 10 total)
  • You must be logged in to reply to this topic.

Renvoi d’information inexacte


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Pascal 44 @pascal-gayet Participant
Summary

This topic contains 9 replies,
has 4 voices, and was last updated by Pascal 44
5 months, 2 weeks ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 08/19/2025
Status: Active
Attachments: 5 files
Logo Logo
Loading...