Identification du plus haut et du plus bas

Viewing 15 posts - 1 through 15 (of 22 total)
  • Author
    Posts
  • #213626 quote
    finplus
    Participant
    Master

    Bonjour, je reviens de nouveau sur mon problème d’identifier certaines situations.

    /////////////////////////////////////KAMA 150
    
    Period = 150
    FastPeriod = 2
    SlowPeriod = 30
     
    Fastest = 2 / (FastPeriod + 1)
    Slowest = 2 / (SlowPeriod + 1)
    if barindex < Period+1 then
    Kama=close
    else
    Num = abs(close-close[Period])
    Den = summation[Period](abs(close-close[1]))
    ER = Num / Den
    Alpha = SQUARE(ER *(Fastest - Slowest )+ Slowest)
    KAMA = (Alpha * Close) + ((1 -Alpha)* Kama[1])
    endif
     
    
    ///////////////////////////////////////////////////////////////////: Distance Cours KAMA
     
    xClose = (Open+High+Low+Close)/4
    Distance = (xclose- kama)

    Voici donc la formule de base qui intègre la moyenne à partir de la KAMA et le cours de clôture du sous jacent. La distance peut être soit positive soit négative.

    Je vais prendre un exemple simple pour formuler ma demande : je souhaiterai identifier l’écart positif le plus élevé (par exemple) sur un historique de 3 périodes. Dans le tableau joint, si je suis en UT 15min et que je me place à 9h45, l’écart le plus élevé sera 8 qui est la période 1. Puis si je me place à 10 heures, l’écart le plus élevé sera 6 qui correspond à la période 4 (la période 1 disparaissant puisque je calcule sur un historique de 3 périodes en arrière.

    Donc comment faire pour identifier ce plus haut ? La question se posera pour l’écart négatif.

    Merci.

    #213691 quote
    JC_Bywan
    Moderator
    Master

    Bjr,

    Tu peux utiliser highest[3](distance)

    finplus thanked this post
    #213692 quote
    finplus
    Participant
    Master

    Merci; Oui et ça fonctionne.

    une deuxième question : et si je veux “toper” non le plus haut (ou le plus bas) mais par exemple les deux plus hauts sur l’historique des 3 dernières périodes et ensuite en faire une moyenne ?

    Merci.

    #213695 quote
    JC_Bywan
    Moderator
    Master

    Pour faire la moyenne des 2 plus grandes valeurs sur une série de 3, au lieu de chercher qui est “deuxième plus grand”, on peut plus simplement chercher la plus petite valeur et la soustraire de la somme des 3, il ne reste ainsi que la somme des 2 plus grandes, qu’on divise par 2 pour en faire la moyenne:

    moy2plusgrands = (summation[3](distance) – lowest[3](distance))/2

    #213696 quote
    finplus
    Participant
    Master

    Merci. Un historique de 3 périodes était un exemple pour simplifier ma demande. Si je prends un historique de 50 périodes, comment faire alors ?

    Merci.

    #213698 quote
    JC_Bywan
    Moderator
    Master

    Avec 50, on peut par exemple faire comme ceci:

    G1=highest[50](distance)
    for i=0 to 49
     $montab[i]=distance[i]
     if distance[i]=G1 then
      i1=i
     endif
    next
    for i=0 to 49
     if i=i1 then
      $montab[i]=0
     endif
    next
    G2=ArrayMax($montab)
    moy2plusgrands=(G1+G2)/2
    finplus thanked this post
    #213699 quote
    finplus
    Participant
    Master

    Merci. Je vais essayer.

    #213714 quote
    finplus
    Participant
    Master
    /////////////////////////////////////KAMA 150
    
    Period = 150
    FastPeriod = 2
    SlowPeriod = 30
     
    Fastest = 2 / (FastPeriod + 1)
    Slowest = 2 / (SlowPeriod + 1)
    if barindex < Period+1 then
    Kama=close
    else
    Num = abs(close-close[Period])
    Den = summation[Period](abs(close-close[1]))
    ER = Num / Den
    Alpha = SQUARE(ER *(Fastest - Slowest )+ Slowest)
    KAMA = (Alpha * Close) + ((1 -Alpha)* Kama[1])
    endif
     
    
    ///////////////////////////////////////////////////////////////////: Distance Cours KAMA
     
    xClose = (Open+High+Low+Close)/4
    Distance = (xclose- kama)
     
    
    
    if ((xclose - kama) > 0) then
    distplus = distance
    else
    distminus =-distance
    endif
    
    MaxHigh = Highest[350](distplus)
    Maxlow = -Highest[350](distminus)
    
    Return distance as "Distance", Maxhigh as "Maxhigh", MaxLow as "MaxLox"

    Bonjour,

    suite aux échanges précédents, je voulais vous demander si le code vous paraît correct. Il s’agit de mesurer l’écart entre la KAMA 150 et la clôture du cours. Quand la clôture est au-dessus de la KAMA, le code est “distplus” = distance et quand la clôture est au dessous de la kama; me code est “distminus” = – distance. Est-ce que cela vous paraît correct ?

    et même question pour les MaxHigh et les maxLow.

    En fait, je recherche à identifier les distances kama / clôture les plus importantes de façon à ne pas entrer dans le marché lorsque cette distance est atteinte. Et j’ai donc fait une mesure sur un historique de 350 (au pif). L’essentiel étant que ma formule de calcul est correct. Je verrai ensuite à “fignoler” mon indicateur.

    Merci.

    #213730 quote
    JC_Bywan
    Moderator
    Master

    Cela semble correct, j’aurais juste rajouté au début une initialisation:

    distplus=0
    distminus=0

    pour éviter d’avoir l’un ou l’autre restant égal à sa valeur précédente au lieu de passer à zéro quand xclose croise kama (même si cette valeur précédente est probablement petite et que cela a peu de chance d’affecter son highest sur 350)

    finplus thanked this post
    #213734 quote
    finplus
    Participant
    Master

    Merci. je vais rajouter l’initialisation. Et je vais regarder comme cela se passe.

    #217680 quote
    finplus
    Participant
    Master
    G1=highest[50](distance)
    for i=0 to 49
     $montab[i]=distance[i]
     if distance[i]=G1 then
      i1=i
     endif
    next
    for i=0 to 49
     if i=i1 then
      $montab[i]=0
     endif
    next
    G2=ArrayMax($montab)
    moy2plusgrands=(G1+G2)/2

    Bonjour,

    je reviens sur cette formule qui identifie les plus hauts sur un certain historique.

    Serait il possible de coder la formule qui identifie les plus bas  (j’ai essayé de remplacer highest par lowest mais bon ce n’est pas ça.

    Merci.

    #217732 quote
    Nicolas
    Keymaster
    Master

    Essayons en remplacent aussi ArrayMax par ArrayMin, pour obtenir la valeur la plus basse du tableau où on a stocker les valeurs.

    #217736 quote
    finplus
    Participant
    Master

    Merci.

    parce que dans mon code, je fais référence à une donnée intitulée “distance” qui est l’écart entre la clôture et la kama 150. Cette distance peut être positive ou négative (si la clôture est en-dessous de la KAMA).

    Je me demande donc comment différencier une distance positive et une distance négative car cela doit avoir un impact sur ma recherche des plus grandes distances positives et négatives.

    Si je fais comme ça par exemple :

    if distance > 0 then EcartUp = Distance   OU     if distance > 0 then distance = ecartUp

    if distance < 0 then EcartDn = Distance    OU     if distance < 0 then distance = ecartDn

    Je sais que je patauge depuis plusieurs semaines sur cet indicateur et je dois sûrement mal exprimer mon besoin.

    Merci pour votre compréhension.

    #217886 quote
    finplus
    Participant
    Master
    /////////////////////////////////////KAMA 150
    
    Period = 150
    FastPeriod = 2
    SlowPeriod = 30
     
    Fastest = 2 / (FastPeriod + 1)
    Slowest = 2 / (SlowPeriod + 1)
    if barindex < Period+1 then
    Kama=close
    else
    Num = abs(close-close[Period])
    Den = summation[Period](abs(close-close[1]))
    ER = Num / Den
    Alpha = SQUARE(ER *(Fastest - Slowest )+ Slowest)
    KAMA = (Alpha * Close) + ((1 -Alpha)* Kama[1])
    endif
     
    
    ///////////////////////////////////////////////////////////////////: Distance Cours KAMA
     
    xClose = (Open+High+Low+Close)/4
    Distance = (xclose- kama)
     
    
    moy = exponentialaverage[period]((distance))
    
    
    if Moy<Moy[1] and Moy[1]>Moy[2] and Moy[1]>0 then
    RetB5=RetB4
    RetB4=RetB3
    RetB3=RetB2
    RetB2=RetB1
    RetB1=Moy[1]
    RetBmoy=(RetB1+RetB2+RetB3+RetB4+RetB5)/5
    endif
    
    if Moy>Moy[1] and Moy[1]<Moy[2] and Moy[1]<0 then
    RetH5=RetH4
    RetH4=RetH3
    RetH3=RetH2
    RetH2=RetH1
    RetH1=Moy[1]
    RetHmoy=(RetH1+RetH2+RetH3+RetH4+RetH5)/5
    endif
    
    if abs(retBmoy-0) > abs(retHmoy-0) then
    limitUP = retBmoy
    elsif abs(retBmoy-0) < abs(retHmoy-0) then
    LimitUp = -RetHmoy
    endif
    
    if abs(RetHmoy-0) > abs(RetBmoy-0) then
    limitDn = RetHmoy
    elsif abs(RetHmoy-0) < abs(RetBmoy-0) then
    LimitDn = - RetBmoy
    endif
    
    if ((xclose - kama) > 0) then
    distplus = distance
    else
    distminus =-distance
    endif
    
    
    
    distplus=0
    distminus=0
    
    if ((xclose - kama) > 0) then
    distplus = distance
    else
    distminus =-distance
    endif
     
    MaxDistHigh = Highest[150](distplus)/1.28
    MaxDistlow = -Highest[150](distminus)/1.28
     
    Plafond = Highest[150](limitUp)*1.28
    Plancher = Highest[150](limitdn)*1.28
    
    
    
    G1=highest[50](plafond)
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G1 then
    i1=i
    endif
    next
    for i=0 to 49
    if i=i1 then
    $montab[i]=0
    endif
    next
    G2=ArrayMax($montab)
    moy2plusgrands=(G1+G2)/2
    
    
    G11=lowest[50](plancher)
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G1 then
    i1=i
    endif
    next
    for i=0 to 49
    if i=i1 then
    $montab[i]=0
    endif
    next
    G12=ArrayMin($montab)
    moy2pluspetits=(G11+G12)/2
    
    
    
    
    Return distance as "Distance", moy as "DM Moy", RetBmoy as "Moyenne 5 derniers retournements baissiers", RetHmoy as "Moyenne 5 derniers retournements haussiers", MaxDistHigh as "MaxDistHigh", MaxDistLow as "MaxDistLow", Plafond as "Plafond", Plancher as "Plancher", moy2plusgrands as "FilterUp", moy2pluspetits as "FilterDn"
    

    Bonsoir,

    je reviens sur mon sujet. J’ai un peu modifié la proposition de correction donnée ci-avant (car la correction proposée ne me convenait pas).

    Pourriez-vous m’indiquer si donc ma correction à savoir :

    G11=lowest[50](plancher)
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G1 then
    i1=i
    endif
    next
    for i=0 to 49
    if i=i1 then
    $montab[i]=0
    endif
    next
    G12=ArrayMin($montab)
    moy2pluspetits=(G11+G12)/2

    est correcte : visuellement, elle semble faire le “job” = elle renvoie les deux retournements “haussiers” les plus bas si j’ai bien programmé.

    Ce que j’aimerai savoir (question s’adressant à un spécialiste du codage) c’est de me traduire en français compréhensible les lignes de code à partir de   G11=lowest[50](plancher) afin que je puisse comprendre la signification des termes et conditions utilisées dans les lignes de ce code.

    merci d’avance.

    #218681 quote
    JC_Bywan
    Moderator
    Master

    Bonjour, commençons par expliquer les lignes sur les plus hauts proposé dans :

    Identification du plus haut et du plus bas

    et au passage en proposer une meilleure version, et ensuite on verra pour obtenir l’équivalent pour les plus bas).

    G1=highest[50](distance)
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G1 then
    i1=i
    endif
    next
    for i=0 to 49
    if i=i1 then
    $montab[i]=0
    endif
    next
    G2=ArrayMax($montab)
    moy2plusgrands=(G1+G2)/2

    G1 à chaque bougie retient le plus haut de la variable “distance” parmi 50 (celle en cours et les 49 avant) de distance

    ensuite la boucle for va permettre d’indexer un tableau $montab et d’y stocker chaque “distance” en l’alignant sur 50 (bougie en cours [0] et les 49 avant)

    pendant que i parcours de 0 à 49, si on tombe sur distance[i]=G1, on met en mémoire l’index du moment via i1=i (il peut y en avoir plusieurs si G1 pas unique, on retiendra juste le dernier dans un seul i1)

    ensuite, pour trouver le 2e plus haut, on va supprimer le plus haut $montab[i1] de la série et utiliser arraymax où le 2e plus haut d’avant est devenu le plus haut pour trouver G2. Si je me souviens bien, j’étais d’abord parti sur une façon de faire à 2 boucles, puis j’ai changé en remplaçant le contenu des 2 boucles, mais en relisant je vois qu’avec cette façon de faire-ci il n’y a plus besoin de boucle pour réaliser la 2e étape, donc on va plutôt faire (même résultat mais plus léger en écriture):

    G1=highest[50](distance)
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G1 then
    i1=i
    endif
    next
    $montab[i1]=0
    G2=ArrayMax($montab)
    moy2plusgrands=(G1+G2)/2

    enfin, puisque tu précises en #217736 que “distance” peut être aussi bien positif que négatif, alors imaginons un jeu théorique de 50 “distance” tous négatif, remplacer G1 par 0 n’éliminerait pas la valeur en tant que 1er plus grand comme cela le ferait pour une série comportant des “distance” positif, on va donc plutôt faire sans 2e boucle, directement:

    $montab[i1]=arraymin($montab)

    Au final:

    G1=highest[50](distance)
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G1 then
    i1=i
    endif
    next
    $montab[i1]=ArrayMin($montab)
    G2=ArrayMax($montab)
    moy2plusgrands=(G1+G2)/2

     

    et donc, pour faire la moyenne des 2 plus petits “distance” (en réponse au post #217680, n’ayant pas regardé en détails les posts qui ont suivi où “plafond” et “plancher” semblent avoir remplacé “distance”), on adaptera ainsi:

    G11=lowest[50](distance) // je reprends ta notation G11,G12 à la place des G1,G2 du cas des 2 plus grands
    for i=0 to 49
    $montab[i]=distance[i]
    if distance[i]=G11 then // attention, tu avaiss oublié de transformer G1 en G11 ici
    i1=i
    endif
    next
    $montab[i1]=ArrayMax($montab)// on élimine le plus petit en i1 du tableau en en faisant un plus grand, pour qu'ensuite l'arraymin donne le 2e plus petit de la série de départ
    G12=ArrayMin($montab)
    moy2pluspetits=(G11+G12)/2
    finplus thanked this post
Viewing 15 posts - 1 through 15 (of 22 total)
  • You must be logged in to reply to this topic.

Identification du plus haut et du plus bas


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
finplus @finplus Participant
Summary

This topic contains 21 replies,
has 4 voices, and was last updated by finplus
2 years, 1 month ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 04/23/2023
Status: Active
Attachments: 1 files
Logo Logo
Loading...