Historique des prix, combien de fois le prix a t’il coupé un niveau ?

Viewing 15 posts - 1 through 15 (of 21 total)
  • Author
    Posts
  • #183243 quote
    BenCD
    Participant
    Average

    Bonjour à tous,

    Je cherche à connaitre combien de fois une valeur de prix est “coupée” par le cours.

    Je m’explique, je travaille sur les indices, en chandelier et j’aimerai réussir à créer un indicateur qui sur la droite (barindex + 50 par exemple) me dise combien de fois le cours a coupé ou été égal à ce niveau.

    J’y arrive correctement avec 1 niveau à tester.

    Donc pour le niveau tester ‘16390’ le cour le coupe ou est égal 108 fois !
    (La ligne visuelle n’est pas nécessaire, c’était uniquement pour ‘illustrer’ l’exemple).

    Maintenant j’aimerai arriver à trouver comment faire pour tester toutes les valeurs entre le plus bas et le plus haut affiché.

    Je n’arrive pas à utiliser correctement la fonction “For” ou “While”, et surtout comment faire pour connaitre pour chaque niveau le nombre de “coupe”.

    Faut il passer par “array” car quand je demande “drawtext” j’ai la même valeur à chaque niveau.

    Voici mon début de code :

    defparam drawonlastbaronly = true
    
    ///////////////////////////
    
    t = time[0]
    
    if t > t[1] then
    Chandelles = 1
    endif
    
    if Chandelles > Chandelles[1] then
    NombreChandelles = 2
    endif
    
    if Chandelles = Chandelles[1] then
    NombreChandelles = NombreChandelles[1]+1
    endif
    
    if NombreChandelles > 3 then
    MaxHisto = highest[NombreChandelles](high)
    MinHisto = lowest[NombreChandelles](low)
    endif
    
    Diff = MaxHisto - MinHisto
    
    LigneBasse = MinHisto - 10
    LigneHaute = MaxHisto + 10
    
    ///////////////////////////
    
    if SignalTouche <> 0 then
    SommeSignalTouche = SommeSignalTouche[1] + 1
    endif
    
    ///////////////////////////
    
    a = 16390
    if ((high >= a or close >= a) and (low <= a or open <= a)) or ((high >= a or open >= a) and (low <= a or close <= a)) then
    //backgroundcolor (0,180, 70)
    SignalTouche = 1
    else
    SignalTouche = 0
    endif
    
    if SignalTouche <> 0 then
    SommeSignalTouche = SommeSignalTouche[1] + 1
    endif
    drawtext ("#SommeSignalTouche#", barindex+30, a, dialog, bold, 10) coloured (255, 255, 255)
    drawsegment (barindex+60, a, barindex+3500, a)
    
    return a as "Ligne Test"

    Merci d’avance,

    N’hésitez pas à me demander plus de précisions.

    Benjamin

    Capture-decran-2021-12-13-a-13.14.27.png Capture-decran-2021-12-13-a-13.14.27.png
    #183959 quote
    Nicolas
    Keymaster
    Master

    Il n’y aurait qu’1 seul niveau à tester ? Et cela pour toutes les bougies de l’historique affichée ?

    Si oui comment cela devrait ensuite s’afficher ? le compte écrite sur chaque bougie ?

    #184048 quote
    BenCD
    Participant
    Average

    Bonsoir Nicolas!

    Merci pour ton retour!

    Alors je vais essayer d’être le plus clair possible.

    Il y aurait plusieurs niveaux à tester ! Idéalement de 0,25 en 0,25 d’une valeur X a une valeur X+50 (par exemple).

    Et cela sur un nombre choisi de chandelles, les 100 dernières par exemple.

    Pour l’affichage.

    J’imaginais, en gros, une sorte de heatmap sur le côté (dans le futur) au niveau des valeurs du cours.

    Je m’explique, pour la valeur testée “16400”

    Le cours “crosses over” ou “crosses under” “16400”, 9 fois sur les 100 dernières chandelles. Donc idéalement au niveau de “16400” un petit carré d’une certaine couleur, si 9 fois c’est beaucoup.

    Cela se mettrait à jour à chaque chandelle clôturée.

    Je suis compréhensible?

    Encore merci à toi Nicolas, je reste à ta disposition pour tous éclaircissements nécessaires!

    #184103 quote
    Nicolas
    Keymaster
    Master
    Ci-joint un premier essai, mais le code ne fonctionne pas 🙁 j’ai une erreur de ‘positive integer’ pour le tableau $level, alors que non il ne devrait pas y en avoir à priori..
    defparam drawonlastbaronly=true
    
    x1 = 15840
    x2 = 16000
    step = 0.25
    MaxBars = 200
    Size = 20 //heat map size in candlesticks 
    //---------------
    
    //make the count of close crosses
    if islastbarupdate then 
    x = x1
    while x<=x2 do 
     for i = maxbars downto 1 do 
      if close[i] crosses over x then 
       $level[x] = $level[x]+1
      endif
     next
     x = x+step*pointsize
    wend
    
    //plot the levels
    imax = arraymax($level)
    while x>=x1 do
     if ($level[x]>0) and x>0 and isset($level[x]) then
      levelsize = 100*round($level[x]/imax)
      drawsegment(barindex,$level[x]+size,barindex,$level[x]+size+levelsize)
     endif
     x = x-step*pointsize
    wend
    endif
    
    return 
    
    Je vais voir qui pourrait m’aider et je reviens vers toi .. ! 😉
    #184128 quote
    BenCD
    Participant
    Average
    Merci beaucoup pour ton retour Nicolas! J’attends de tes nouvelles dès que tu auras quelque chose! Encore merci pour tout!
    #184150 quote
    Nicolas
    Keymaster
    Master
    Le problème du code posté ci-dessus vient du fait que j’ai référencé les colonnes du tableau avec des Double puisque j’utilisais x comme valeur avec des pointsize, donc avec des décimales pour résumé, hors ce doit être des integer bien entendu.. bref, je suis reparti de plus simple, d’autant plus qu’on excède facilement les capacités mémoire avec ce genre de boucle, voici autre chose :
    defparam drawonlastbaronly=true
    defparam calculateonlastbars=1000
    drawvline(barindex[1000])
    
    // ------------------------
    x1 = 46700
    x2 = 47150
    step = 2.5
    Size = 5 //heat map size in candlesticks
    //---------------
    
    inbetween = close>=x1 and close<=x2
    
    x = x1
    y=0
    if inbetween then 
    while x<=x2 do
    if close crosses over x or close crosses under x then
    if isset($levelc[y]) then
    $levelp[y] = x
    $levelc[y] = $levelc[y]+1
    else
    $levelp[y] = x
    $levelc[y] = 1
    endif
    y=y+1
    endif
    x = (x+(step*pointsize))
    wend
    endif 
    
    //make the count of close crosses
    if islastbarupdate then
    //plot the levels
    imax = arraymax($levelc)
    
    for i = 0 to y do
    if isset($levelp[i]) then
    levelsize = ($levelc[i]/imax)*100
    //drawtext(levelsize,barindex,$levelp[i])
    drawsegment(barindex+size,$levelp[i],barindex+size+levelsize,$levelp[i]) style(line,2)
    endif
    next
    
    endif
    
    return y coloured(100,100,0),lastset($levelc) coloured(0,0,200),arraymax($levelc)
    
    #184418 quote
    BenCD
    Participant
    Average
    Bonjour Nicolas! Navré de ne pas avoir pu te répondre avant! Un immense merci à toi pour avoir prit le temps de m’aider! Je vais tout de suite regarder cela et reviens vers toi au besoin! Merci beaucoup!
    #193753 quote
    BenCD
    Participant
    Average

    Bonjour à tous,

    Bonjour Nicolas,

    Une nouvelle fois merci pour tes précédents retours,

    Je me permets de répondre ici, afin d’éviter de faire un doublon de topic.

    Car en effet, les limites de mes connaissances en codage m’empêche d’utiliser / torturer le code que tu as eu la gentillesse de me faire.

    Et je n’arrive pas à l’exploiter comme je l’aimerai.

    Je me permets de nouveau d’expliquer ce que j’aimerai réussir à faire.

    L’idée principale et de visualiser les niveaux de prix les plus “touchés”, sur une période donnée.

    Dans mon exemple, je travaille sur le S&P en 30s.

    Donc une période de 120 barindex pour avoir la dernière heure.

    Tester chaque valeur de prix entre le plus haut de la dernière heure et le plus bas de la dernière heure.

    Dans l’optique final d’avoir sur le côté du graphique (barindex + 5) une heat map des niveaux les plus fréquents, juste un petit carré variant du blanc (touché 1 fois) au rouge (touché le plus de fois) pour chaque valeur de prix.

    Donc j’ai créé un petit code très simple, qui me donne pour une ligne test le nombre de fois où cette dernière est touchée par le cours.

     
    Periode = 120
    
    PlusHautPeriode = Highest[Periode](High)
    PlusBasPeriode = Lowest[Periode](Low)
    
    LigneTest = 3960
    
    if High >= LigneTest and Low <= LigneTest then
    ToucheLigneTest = 1
    else
    ToucheLigneTest = 0
    endif
    
    NombreToucheLigneTest  = Summation[Periode](ToucheLigneTest)
    
    return PlusHautPeriode as "PlusHautPeriode", PlusBasPeriode as "PlusBasPeriode", ToucheLigneTest as "ToucheLigneTest", LigneTest as "LigneTest", NombreToucheLigneTest as "NombreToucheLigneTest"
     

    Maintenant je bloque sur le fait de tester chaque valeur de prix (de 0,25 en 0,25, entre le plus bas et le plus haut).

    Pour ensuite créer la heat map.

    Aurais tu une idée de comment je pourrai faire?

    Je reste à votre entière disponibilité si vous avez la moindre question.

    Merci beaucoup!

    #193758 quote
    Nicolas
    Keymaster
    Master
    Voilà une version rapide, la couleur varie du noir au rouge :
    defparam drawonlastbaronly=true
    
    Period = 120
    step = 0.25
    // ---------
    
    hh = Highest[Period](High)
    ll = Lowest[Period](Low)
    
    checkprice = ll
    
    if islastbarupdate then 
     ind=0 //reset index of array
     //get the price touch occurences for each level
     while checkprice<=hh do 
      touch=0 //reset price touch for this price level 
      for i = 0 to period-1 do 
       if high[i]>=checkprice and low[i]<=checkprice then 
        touch=touch+1
        $hm[ind] = touch
       endif 
      next
    
      //define color
      r = min($hm[ind]*10,255)
      //plot the result
      //drawtext($hm[ind],barindex+5,checkprice) coloured(r,0,0)
      drawtext("█",barindex+5,checkprice) coloured(r,0,0)
      checkprice=checkprice+step //increase price check for next round 
      ind=ind+1 //increase array index
     wend
    endif
    
    
    return hh,ll
    BenCD thanked this post
    heatmap-prix.png heatmap-prix.png
    #193784 quote
    BenCD
    Participant
    Average
    Merci beaucoup Nicolas, c’est exactement ce que je cherchais à faire! Merci à toi!
    #193787 quote
    BenCD
    Participant
    Average
    Rebonjour Nicolas, Petite question bonus, il y aurait il un moyen de faire une drawhline au niveau du “touch” le plus élevé? Même s’il y a plusieurs “touch” qui ont la même valeur. Comme il y a du array, je n’arrive pas à l’isoler.
    #193792 quote
    fifi743
    Participant
    Master
    regarde ce que a fait cventurer. avec le volume profil c’est le poc que tu cherche
    #193793 quote
    fifi743
    Participant
    Master
    voici le lien
    Indicatore Volume Profile diviso per sessione
    BenCD thanked this post
    #193799 quote
    BenCD
    Participant
    Average
    Bonjour Fifi, Merci beaucoup pour ton retour, Effectivement, ce qu’à construit Cventurer est très intéressant, Néanmoins je ne trouve toujours pas l’astuce pour ressortir le plus grand ‘touch’. Merci de ton aide, Si jamais une autre technique est possible!
    #193803 quote
    BenCD
    Participant
    Average
    Bonsoir, J’ai un début d’ébauche de commencement d’idée, ////////// defparam drawonlastbaronly=true Period = 120 step = 0.25 // ——— hh = Highest[Period](High) ll = Lowest[Period](Low) checkprice = ll MaxTouch1 = 0 if IsLastBarUpdate then ind=0 //reset index of array //get the price touch occurences for each level while checkprice<=hh do touch=0 //reset price touch for this price level for i = 0 to period-1 do if high[i]>=checkprice and low[i]<=checkprice then touch=touch+1 $hm[ind] = touch endif next if $hm[ind] > MaxTouch1 then MaxTouch1 = $hm[ind] MaxTouch2 = checkprice endif //define color r = min($hm[ind]*10,255) //plot the result drawtext(“█”,barindex+5,checkprice) coloured(r,0,0) drawtext(“#touch#”,barindex+8,checkprice) coloured(r,0,0) checkprice=checkprice+step //increase price check for next round ind=ind+1 //increase array index wend endif return hh,ll, touch as “touch”, MaxTouch2 as “MaxTouch2″ ////////// (Désolé je n’ai plus la fonction ‘insert PRT code”) Première remarque, en faisant un return de “MaxTouch2” j’arrive à avoir le niveau (prix) du ‘touch’ le plus grand, mais uniquement à partir du moment ou je ‘valide’ le code. Je n’ai pas ‘avant’, est se lié à “IsLastBarUpdate”? Deuxièmement, comme je le présentais, si plusieurs ‘touch’ on le même nombre ‘MaxTouch2’ se fixe sur le niveau du ‘premier’. Comment pourrais je faire pour pour que si il y a un seul ‘touch’ à 25 alors ‘MaxTouch2’ = le niveau du touch à 25. Mais s’ił y a 2 touch à 25 alors avoir un nouveau ‘MaxTouch2’ qui s’aligne au niveau du deuxième touch à 25. Merci à vous!
Viewing 15 posts - 1 through 15 (of 21 total)
  • You must be logged in to reply to this topic.

Historique des prix, combien de fois le prix a t’il coupé un niveau ?


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
BenCD @bencd Participant
Summary

This topic contains 20 replies,
has 4 voices, and was last updated by sharteel
3 years, 2 months ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 12/13/2021
Status: Active
Attachments: 3 files
Logo Logo
Loading...