Détermination de l'index de certaines bougies

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #39718 quote
    Ruddy
    Participant
    Senior

    Bonjour Nicolas,

    Tout d’abord, je me suis aperçu  assez récemment que le site proposait une traduction instantanée en diverses langues. Alors bravo pour cette amélioration. Mes mimines se fatigueront moins en évitant tout un tas de “control C et control V” et on gagne un temps fou à suivre les forums autres que ceux en français.

    Ensuite, je vous soumets deux bouts de code qui me laissent perplexe et depuis un bout de temps. Ils sont censés faire la même chose, c’est à dire déterminer les index des plus hauts et des plus bas de n périodes.

    Sauf que celui intitulé “RangH et RangL” calcule apparemment par boucle itérative correctement ces index. Mais il comporte un gros inconvénient : il est très long à s’exécuter (à cause des boucles donc) déjà comme indicateur et puis incorporé à un screener et ce d’autant plus qu’il doit être complété par la détermination d’un certain nombre d’autres index de bougies.

    Le bout de code “Rang H et L Barindex” est en accord sur les dernières bougies (36 périodes environ) avec le code précédent et dans les périodes plus anciennes, il ne détermine correctement les index que sur les plus bas.

    QUESTIONS

    1- Pouvez-vous m’éclairer en me donnant les raisons de ces distorsions ?

    2- Y aurait-il une autre méthode de calcul d’une succession d’index de bougies ?

     

    Par avance MERCI

     

    // Calcul par boucle itérative de l'index des bougies Plus Haut et Plus Bas des 200 derniers jours
    RangH1 = 0
    for i = 0 to 200 do
    if high[i] <> highest[200](high) then
    RangH1 = RangH1 + 1
    elsif high[i] = highest[200](high) then
    break
    endif
    next
    
    RangL1 = 0
    for i = 0 to 200 do
    if low[i] <> lowest[200](low) then
    RangL1 = RangL1 + 1
    elsif low[i] = lowest[200](low) then
    break
    endif
    next
    
    PlusHautHigh = highest[200](high)
    PlusBasLow = lowest[200](low)
    
    //RangL2 = 0
    //For i = 0 to RangH1 do
    //If Close[i] <> Lowest[RangH1](Close) Then
    //RangL2 = RangL2 + 1
    //Elsif Close[i] = Lowest[RangH1](Close) Then
    //Break
    //Endif
    //Next
    
    Return RangH1 coloured (0, 0, 255) as "Rang du Plus haut", RangL1 coloured (0, 0, 255) as "Rang du Plus bas",  PlusHautHigh as "Plus Haut des high 200", PlusBasLow as"Plus Bas des low 200" //, RangL2 as "Plus bas L2"
    
    // Calcul du rang des bougies Plus Haut et Plus Bas des 120 derniers jours méthode du Barindex
    
    //____________________________________________________________________
    // Détermination du Rang de la bougie du Plus Haut méthode du barindex
    PlusHautperiode = highest[200](high)
    If high = PlusHautperiode then
    Hautbarindex = barindex
    endif
    
    
    //Bougie0 = Barindex // Index de la bougie origine
    RangHautbarindex = barindex - Hautbarindex // Index de la bougie du plus haut sur 200 périodes
    
    //______________________________________________________________________
    //Détermination du Rang de la bougie du Plus Bas méthode barindex
    PlusBasperiode = lowest[200](low)
    If low =  PlusBasperiode then
    Basbarindex = barindex
    endif
    
    //Bougie0 = Barindex // Index de la bougie origine
    RangBasbarindex = barindex - Basbarindex // Index de la bougie du plus bas
    
    Return RangHautbarindex coloured(255, 0,0) as "Plus haut des high barindex", RangBasbarindex coloured(255,0, 0) as "Plus Bas des low barindex",  PlusHautperiode as "Plus Haut 200", PlusBasperiode as "Plus Bas 200"
    
    #39719 quote
    Ruddy
    Participant
    Senior

    Désolé, j’ai oublié de préciser que mon test des 2  bouts de code  porte sur l’action CRME Cardiome pharma   Nasdaq.

    Je pense que sur d’autres actions d’autres marchés on observera les mêmes distorsions (à moins que ce soit un coup des américains !!!)

    #39766 quote
    Nicolas
    Keymaster
    Master

    Le problème vient de ton premier code. Pour trouver le barindex que tu cherches, tu utilises une incrémentation “perso” entre 0 et 200, hors le barindex que tu trouveras sera nécessairement compris entre ces 2 bornes, ce qui n’est pas forcément le cas de la vrai valeur du barindex dans l’historique (il pourrait être bien supérieur).

    Si j’ai bien compris ce  que tu cherches à faire, tu devrais plutôt enregistrer le barindex de l’itération de ta boucle lorsque tu as trouvé que le High[i] = highest[200](high), comme dans ce code:

    // Calcul par boucle itérative de l'index des bougies Plus Haut et Plus Bas des 200 derniers jours
    RangH1 = 0
    hh = highest[200](high)
    for i = 0 to 200 do
    if high[i] <> hh then
    continue
    elsif high[i] = hh then
    RangH1 = barindex[i]
    break
    endif
    next
    
    RangL1 = 0
    ll = lowest[200](low)
    for i = 0 to 200 do
    if low[i] <> ll then
    continue
    elsif low[i] = ll then
    RangL1 = barindex[i]
    break
    endif
    next
    
    PlusHautHigh = hh
    PlusBasLow = ll
    
    Return RangH1 coloured (0, 0, 255) as "Rang du Plus haut", RangL1 coloured (0, 0, 255) as "Rang du Plus bas",  PlusHautHigh as "Plus Haut des high 200", PlusBasLow as"Plus Bas des low 200" //, RangL2 as "Plus bas L2"

    J’ai aussi allégé un peu le code pour les calculs. Je pense qu’on pourrait aussi faire mieux avec une seule boucle. Les boucles, c’est l’un des sujets principaux de la nouvelle formation sur la programmation prorealtime (niveau avancée). Une fois qu’on maîtrise les boucles, on peut vraiment faire presque tout ce que l’on souhaite 😉

    J’ai peut être mal interprété ta question, merci de m’indiquer si tout est ok 🙂

    boucle-for-next-prorealtime.png boucle-for-next-prorealtime.png
    #40280 quote
    Ruddy
    Participant
    Senior

    Bonjour Nicolas,

    Tout d’abord Merci pour tes rectifications. J’ai tardé à te répondre car j’ai essayé, sans succès, de ne faire qu’une seule boucle.

    Ceci dit, ce petit bout de code incorporé dans un screener est beaucoup plus rapide que celui que j’avais initialement commis alors que pour l’indicateur “es igual”.

    Par ailleurs, j’ai modifié le code de manière à obtenir par simple différence d’index ce que j’appelle le rang de la bougie déterminé à partir la dernière bougie. Mon but, en fait, est de déterminer à partir du highest200 le plus bas. Et là, le système n’aime pas du tout. Il produit une erreur “un paramètre de type entier positif est attendu avec lowest”. Pourtant Rangh1 contient bien un entier positif.

    Alors pourquoi cette erreur ?

    Dois-je abandonner cette piste ?

    Je joins 2 images.

    Merci anticipé.

    Ruddy

    Erreur-Indicateur-RangH1-et-L1-mod-PRC.jpg Erreur-Indicateur-RangH1-et-L1-mod-PRC.jpg RangH1-et-L1-mod-PRC.jpg RangH1-et-L1-mod-PRC.jpg
    #40283 quote
    Nicolas
    Keymaster
    Master

    Tu dois sans doute faire une soustraction qui résulte à une période égale ou inférieure à 0. Sans ton code, je vais avoir du mal à t’aider davantage.

    #40388 quote
    Ruddy
    Participant
    Senior

    J’étais persuadé de l’avoir joint par la méthode habituelle. Donc, au temps pour moi !

    Toutefois, ce code donne des résultats identiques à ceux du premier indicateur  que je t’ai soumis. Lequel indicateur développé un peu plus donnait exactement la même erreur.

    Dès que je peux, je te fais passer le code.

    Merci d’avance.

    Ruddy

    #40569 quote
    Ruddy
    Participant
    Senior

    Bonjour Nicolas,

    Voici le code manquant.

    A bientôt.

    // Calcul par boucle itérative de l'index des bougies Plus Haut et Plus Bas des 200 derniers jours
    IndexH1 = 0
    hh1 = highest[200](high)
    for i = 0 to 200 do
    if high[i] <> hh1 then
    continue
    elsif high[i] = hh1 then
    IndexH1 = barindex[i]
    break
    endif
    next
     
    IndexL1 = 0
    ll1 = lowest[200](low)
    for i = 0 to 200 do
    if low[i] <> ll1 then
    continue
    elsif low[i] = ll1 then
    IndexL1 = barindex[i]
    break
    endif
    next
    
    
    RangH1 = barindex[0] - IndexH1
    RangL1 = barindex[0] - IndexL1
    
    IndexL2 = 0
    ll2 = lowest[RangH1](low)
    for i = 0 to RangH1
    if low[i] <> ll2 then
    continue
    elsif low[i] = ll2 then
    IndexL2 = barindex[i]
    break
    endif
    next
    
    RangL2 = barindex[0] - IndexL2
    
    Return RangH1 coloured (0, 0, 255) as "Rang du Plus haut", RangL1 coloured (0, 0, 255) as "Rang du Plus bas", hh1 as "Plus Haut des high 200", ll1 as"Plus Bas des low 200", RangL2 coloured (0, 255, 0) as "Plus Bas L2", ll2 as "Plus bas L2"
    
    #40958 quote
    Nicolas
    Keymaster
    Master

    Voilà le code corrigé, j’ai ajouté une vérification pour adapter la période de ton instruction LOWEST pour la variable ll2, cette valeur ne pourra jamais être inférieure à 1 désormais, donc hop plus d’erreur ! 🙂

    // Calcul par boucle itérative de l'index des bougies Plus Haut et Plus Bas des 200 derniers jours
    IndexH1 = 0
    hh1 = highest[200](high)
    for i = 0 to 200 do
    if high[i] <> hh1 then
    continue
    elsif high[i] = hh1 then
    IndexH1 = barindex[i]
    break
    endif
    next
     
    IndexL1 = 0
    ll1 = lowest[200](low)
    for i = 0 to 200 do
    if low[i] <> ll1 then
    continue
    elsif low[i] = ll1 then
    IndexL1 = barindex[i]
    break
    endif
    next
    
    
    RangH1 = barindex[0] - IndexH1
    RangL1 = barindex[0] - IndexL1
    
    IndexL2 = 0
    ll2 = lowest[max(1,RangH1)](low)
    for i = 0 to RangH1
    if low[i] <> ll2 then
    continue
    elsif low[i] = ll2 then
    IndexL2 = barindex[i]
    break
    endif
    next
    
    RangL2 = barindex[0] - IndexL2
    
    Return RangH1 coloured (0, 0, 255) as "Rang du Plus haut", RangL1 coloured (0, 0, 255) as "Rang du Plus bas", hh1 as "Plus Haut des high 200", ll1 as"Plus Bas des low 200", RangL2 coloured (0, 255, 0) as "Plus Bas L2", ll2 as "Plus bas L2"
    lowest-highest-indicator.png lowest-highest-indicator.png
    #41037 quote
    Ruddy
    Participant
    Senior

    Bonsoir Nicolas.

    J’aurais encore pu chercher très longtemps et encore je ne suis pas sûr que j’eusse trouvé. Alors, respect. Ça fonctionne impec.

    Comme quoi, rien ne remplace la bouteille. Au sens informatique du terme bien sûr. Quoique…mais avec modération comme le veut maintenant l’usage sérieusement établi.

    Encore merci.

    Ruddy

    #41966 quote
    JC_Bywan
    Moderator
    Master

    Message modération:

    Avec retard (désolé) topic déplacé du forum “proscreener” (pour les screeners) au forum “probuilder” la demande semblant orientée “indicateur” seulement

Viewing 10 posts - 1 through 10 (of 10 total)
  • You must be logged in to reply to this topic.

Détermination de l'index de certaines bougies


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Ruddy @ruddy Participant
Summary

This topic contains 9 replies,
has 3 voices, and was last updated by JC_Bywan
8 years, 7 months ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 07/03/2017
Status: Active
Attachments: 4 files
Logo Logo
Loading...