Filtre Hodrick-Prescott – Comment renvoyer les valeurs ?

Viewing 15 posts - 1 through 15 (of 17 total)
  • Author
    Posts
  • #204157 quote
    Denis
    Participant
    Senior

    Bonjour à tous,

    Nicolas a republié sur Twitter ce week-end un code qu’il avait élaboré sur la base du Filtre Hodrick–Prescott.

    https://www.prorealcode.com/prorealtime-indicators/hodrick-prescott-filter-hp/?utm_source=ReviveOldPost&utm_medium=social&utm_campaign=ReviveOldPost

    J’ai trouvé ce code intéressant et complémentaire aux indicateurs que j’utilise et j’ai voulu renvoyer les valeurs de traçage du drawsegment restitué par le code en insérant une instruction du type « return $output » comme le suggérait Nicolas dans les commentaires.

    Malheureusement, cela ne me renvoie une valeur qu’à partir de l’instant où j’ouvre un graphique et en plus un peu différente du drawsegment.

    Si quelqu’un a une suggestion pour renvoyer les valeurs de traçage du drawsegment, il m’aiderait grandement.

    En vous remerciant par avance, je vous souhaite un agréable après-midi.

    Denis

    
    defparam drawonlastbaronly=true
     
    //PRC_Hodrick-Prescott filter | indicator
    //28.09.2020
    //Nicolas @ www.prorealcode.com
    //Sharing ProRealTime knowledge
     
    // --- settings 
    nobs   =1000 //Number of bars to smooth
    lambda =1600 //Higher lambda leads to the smoother data
    // --- end of settings 
     
    if islastbarupdate and barindex>max(nobs,lambda) then 
     for i=0 to nobs-1
      $output[i]=Close[i] 
     next
     
     $a[0]=1.0+lambda
     $b[0]=-2.0*lambda
     $c[0]=lambda
     for i=1 to nobs-3 do 
      $a[i]=6.0*lambda+1.0
      $b[i]=-4.0*lambda
      $c[i]=lambda
     next
     
     $a[1]=5.0*lambda+1
     $a[nobs-1]=1.0+lambda
     $a[nobs-2]=5.0*lambda+1.0
     $b[nobs-2]=-2.0*lambda
     $b[nobs-1]=0.0
     $c[nobs-2]=0.0
     $c[nobs-1]=0.0
     
     //Forward
     for i=0 to nobs-1 do
      Z=$a[i]-H4*H1-HH5*HH2
      HB=$b[i]
      HH1=H1
      H1=(HB-H4*H2)/Z
      $b[i]=H1
      HC=$c[i]
      HH2=H2
      H2=HC/Z
      $c[i]=H2
      $a[i]=($output[i]-HH3*HH5-H3*H4)/Z
      HH3=H3
      H3=$a[i]
      H4=HB-H5*HH1
      HH5=H5
      H5=HC
     next
     
     //Backward
     H2=0
     H1=$a[nobs-1]
     $output[nobs-1]=H1
     for i=nobs-2 downto 0 do 
      $output[i]=$a[i]-$b[i]*H1-$c[i]*H2
      H2=H1
      H1=$output[i]
     //drawpoint(barindex[i],$output[i],1) coloured(255,255,0)
     drawsegment(barindex[i],$output[i],barindex[i+1],$output[i+1]) coloured(255,255,0) style(line,3)
     next
    endif
     
    return
    #204193 quote
    Nicolas
    Keymaster
    Master

    Attention, il faut bien comprendre qu’on trace les segments dans le passé et que ces valeurs (dans le passé) se modifieront à chaque nouvelle bougie pour coller parfaitement aux nouvelles données acquises (bref, ça repeint..). Donc même si on affiche les données vues dans chaque chandelier en temps réel, elles seront caduques (et donc fausse) à chaque nouvelle données (chandelier) reçues. Ai-je été clair ?

    Donc en gros, les données des segments telles que tu les visualise sur l’historique ne sont pas du tout les mêmes en temps réel.

    Denis thanked this post
    #204194 quote
    Denis
    Participant
    Senior

    Bonjour Nicolas,

    Merci pour ton retour.

    J’ai bien compris que cela repeint.

    Y a-t-il quand même moyen d’afficher cet historique des valeurs ?

    En te remerciant par avance.

    Denis

    #204378 quote
    Denis
    Participant
    Senior

    Bonjour Nicolas,

    Désolé de te déranger.

    Aurais-tu une idée pour afficher les données ?

    Merci par avance pour ton aide.

    Denis

    #204381 quote
    Nicolas
    Keymaster
    Master

    Oui c’est bien ce que fait l’indicateur actuellement 🙂

    Je crois que tu n’as pas bien compris. On peut afficher la valeur à l’instant T, le temps s’écoule, cette valeur se décale dans le passé à la bougie n-1, et on recommence. C’est ce que tu observes, cette valeur ne sera plus valable dès le prochain tick reçu car elle se verra modifié avec les nouvelles données disponibles. Rien qu’on ne calcule en temps réel ne sera valable hormis dans l’historique, donc purement visuel et c’est pour cela qu’on trace ces infos avec un dessin constitué de segments.

    Denis thanked this post
    #204382 quote
    Denis
    Participant
    Senior

    Tu as raison, je ne comprends pas bien, désolé.

    Pour l’indicateur ZigZag qui repeint lui aussi, on a quand même une valeur même si elle est amenée à être modifiée.

    Ce n’est pas possible de faire pareil ?

    #204626 quote
    Nicolas
    Keymaster
    Master

    Un zigzag pointe un plus haut et un plus bas du prix, il sera fixé après X bougies. Donc le principe est le même, l’information en temps réel est susceptible de changer durant X bougies, après ce laps de temps elle sera fixé, donc en temps réel on ne peut connaître la dernière valeur qu’aura le zigzag.

    Denis thanked this post
    #204646 quote
    Denis
    Participant
    Senior

    Bonjour Nicolas,

    Merci pour ton retour. Je me suis peut-être mal exprimé :

    Je ne discute pas le fait que les dernières valeurs changent jusqu’à être figées à un moment, que ce soit pour le ZigZag ou le Hodrick-Prescott.

    Mais même susceptible de bouger, c’est une valeur qui est renvoyée pour le ZigZag et pas un segment.

    J’ai essayé désespérément de rajouter une commande dans ton code Hodrick-Prescott pour renvoyer des valeurs plutôt qu’un segment mais sans succès.

    Toi qui es bien plus à même que moi de trouver une subtilité de code, aurais-tu une suggestion pour renvoyer l’historique des valeurs plutôt qu’un segment ?

    Même si les dernières changent et ne se figent qu’au bout de X bougies, cela importe peu.

    En te remerciant par avance pour ton aide.

    #204647 quote
    Nicolas
    Keymaster
    Master

    La valeur temps réel de l’indicateur c’est la première colonne du tableau $output, soit:

    return $output[0]

    Dans l’image jointe, c’est la ligne blanche.

    Denis thanked this post
    indicateur-repeint.png indicateur-repeint.png indicateur-repeint2.png indicateur-repeint2.png
    #204652 quote
    Denis
    Participant
    Senior

    Mille mercis Nicolas, je vais essayer cela et te tiens au courant. Bon apm

    #204654 quote
    Denis
    Participant
    Senior

    Sauf erreur de ma part, cela renvoie bien la dernière valeur à l’instant t (celui où on ouvre le graphique) et ensuite les suivantes (sous réserve de laisser le graphique ouvert) mais pas celles précédant la dernière valeur à l’instant où on ouvre le graphique.

    Cela donne le même résultat que de mettre dans la boucle “V=output[i]” et à la fin “return V”

    Faut-il en conclure que ce n’est pas possible d’avoir les valeurs historiques comme pour le ZigZag ?

    Ou faut-il que je fasse une demande spécifique de prestation payant ?

    Merci pour ton retour Nicolas

    #204656 quote
    Nicolas
    Keymaster
    Master

    Ces valeurs ont changées, peut être une centaine de fois, comme tu peux le voir sur les images que j’ai posté, la ligne jaune c’est la même valeur que la ligne blanche mais qui s’adapte à chaque nouvelle bougie.

    Avec le code ci-dessous, le calcule démarre dés la première barre de l’historique, donc tu auras les anciennes valeurs du tableau, plus gourmand en ressources par contre.

    defparam drawonlastbaronly=true
     
    //PRC_Hodrick-Prescott filter | indicator
    //28.09.2020
    //Nicolas @ www.prorealcode.com
    //Sharing ProRealTime knowledge
     
    // --- settings
    nobs   =1000 //Number of bars to smooth
    lambda =1600 //Higher lambda leads to the smoother data
    // --- end of settings
     
    if /*islastbarupdate and*/ barindex>max(nobs,lambda) then
    for i=0 to nobs-1
    $output[i]=Close[i]
    next
     
    $a[0]=1.0+lambda
    $b[0]=-2.0*lambda
    $c[0]=lambda
    for i=1 to nobs-3 do
    $a[i]=6.0*lambda+1.0
    $b[i]=-4.0*lambda
    $c[i]=lambda
    next
     
    $a[1]=5.0*lambda+1
    $a[nobs-1]=1.0+lambda
    $a[nobs-2]=5.0*lambda+1.0
    $b[nobs-2]=-2.0*lambda
    $b[nobs-1]=0.0
    $c[nobs-2]=0.0
    $c[nobs-1]=0.0
     
    //Forward
    for i=0 to nobs-1 do
    Z=$a[i]-H4*H1-HH5*HH2
    HB=$b[i]
    HH1=H1
    H1=(HB-H4*H2)/Z
    $b[i]=H1
    HC=$c[i]
    HH2=H2
    H2=HC/Z
    $c[i]=H2
    $a[i]=($output[i]-HH3*HH5-H3*H4)/Z
    HH3=H3
    H3=$a[i]
    H4=HB-H5*HH1
    HH5=H5
    H5=HC
    next
     
    //Backward
    H2=0
    H1=$a[nobs-1]
    $output[nobs-1]=H1
    for i=nobs-2 downto 0 do
    $output[i]=$a[i]-$b[i]*H1-$c[i]*H2
    H2=H1
    H1=$output[i]
    //drawpoint(barindex[i],$output[i],1) coloured(255,255,0)
    drawsegment(barindex[i],$output[i],barindex[i+1],$output[i+1]) coloured(255,255,0) style(line,3)
    next
    
    endif
    
    return $output[0]
    Denis thanked this post
    #204657 quote
    Denis
    Participant
    Senior

    Encore une fois merci pour ton aide précieuse Nicolas

    Je teste à la pause de mes cours cet apm

    A+

    #204659 quote
    Denis
    Participant
    Senior

    Cela fonctionne bien, même si gourmand en ressources en effet.
    Cf. graphique en exemple ; segment en noir et valeurs en rose.
    Encore un grand merci Nicolas.
    Bonne fin de journée à toi.

    Hodrick-Prescot.jpg Hodrick-Prescot.jpg
    #204797 quote
    Denis
    Participant
    Senior

    Bonjour Nicolas,

    Encore merci pour ton aide.

    Il y a quelque chose que je ne m’explique pas :

    Quelle que soit la valeur que je mette pour Lambda dans la version avec valeurs (Cf. image jointe, courbes rose et jaunes superposés et segments en noir), la courbe reste la même alors que dans la version avec segment, on a bien des courbes différentes selon la valeur de Lambda (courbes en rose et bleu dans la 2e image)?

    As-tu une idée d’où cela peut-il venir ?

    En te remerciant par avance.

    Version-avec-valeurs-lambda-1-en-rose-et-lambda-5000-en-jaune.jpg Version-avec-valeurs-lambda-1-en-rose-et-lambda-5000-en-jaune.jpg Version-avec-segment-lambda-100-en-rose-et-lambda-5000-en-bleu.jpg Version-avec-segment-lambda-100-en-rose-et-lambda-5000-en-bleu.jpg
Viewing 15 posts - 1 through 15 (of 17 total)
  • You must be logged in to reply to this topic.

Filtre Hodrick-Prescott – Comment renvoyer les valeurs ?


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Denis @desclos Participant
Summary

This topic contains 16 replies,
has 2 voices, and was last updated by Denis
3 years, 3 months ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 11/14/2022
Status: Active
Attachments: 5 files
Logo Logo
Loading...