Ajouter une moyenne à un indicateur

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • #252988 quote
    finplus
    Participant
    Master

    Bonsoir,

    voici l’indicateur

    /////////////////////////////////////KAMA 150

    Period = 150
    FastPeriod = 2
    SlowPeriod = 50

    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 = average[550]((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)/3
    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)/3
    endif

     

    for i=0 to 49
    $montab[i]=distance[i]
    Next

    arraysort($montab,ascend)
    moy3plusBas = ($montab[0] + $montab[1] + $montab[2]) / 3
    moy3plusHauts = ($montab[49] + $montab[48] + $montab[47]) / 3

     

    if (distance > moy) and (distance > moy3plushauts) and (distance > 0) then
    drawcandle (0,0, distance, distance) COLOURED (0,0,255)
    endif

    if (distance < moy) and (distance < moy3plusbas) and (distance < 0) then
    drawcandle (0,0, distance, distance) COLOURED (255,0,0)
    endif

     

    Return distance as “Distance”, moy as “Distance Moy”, RetBmoy as “Bande Haute”, RetHmoy as “Bande Basse”, moy3plusHauts as “FilterUp”, moy3plusBas as “FilterDn”

     

    je souhaiterai ajouter à l’indicateur ci-dessous une moyenne des 3 “FilterUp” les plus hauts calculés sur les 50 dernières barres et la moyenne des 3 “FilterDn” les plus bas calculés sur les 50 dernières barres, puis d’en tirer deux lignes horizontales pour matérialiser cette moyenne, cette ligne s’étalant sur les 50 dernières barres.

    Cette ligne devra laisser place à une nouvelle si le calcul de la moyenne change.

    j’espère avoir été clair.

    Merci.

    Je mets ci-dessous une capture écran de l’indicateur.

    #253072 quote
    Iván González
    Moderator
    Master

    voici:

    // KAMA 150
    Period = 150
    FastPeriod = 2
    SlowPeriod = 50
    
    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]))
       IF Den <> 0 THEN
          ER = Num / Den
       ELSE
          ER = 0
       ENDIF
       Alpha = SQUARE(ER * (Fastest - Slowest) + Slowest)
       Kama = (Alpha * Close) + ((1 - Alpha) * Kama[1])
    ENDIF
    
    xClose = (Open + High + Low + Close) / 4
    Distance = (xClose - Kama)
    moy = Average[550](Distance)
    
    IF Moy < Moy[1] AND Moy[1] > Moy[2] AND Moy[1] > 0 THEN
       RetB3 = RetB2
       RetB2 = RetB1
       RetB1 = Moy[1]
       RetBmoy = (RetB1 + RetB2 + RetB3) / 3
    ENDIF
    
    IF Moy > Moy[1] AND Moy[1] < Moy[2] AND Moy[1] < 0 THEN
       RetH3 = RetH2
       RetH2 = RetH1
       RetH1 = Moy[1]
       RetHmoy = (RetH1 + RetH2 + RetH3) / 3
    ENDIF
    
    historyLength = 50
    IF BarIndex >= historyLength -1 THEN
       FOR i = 0 TO historyLength - 1 DO
          $montab[i] = Distance[i]
       NEXT
       ArraySort($montab, ascend)
       moy3plusbas = ($montab[0] + $montab[1] + $montab[2]) / 3
       moy3plushauts = ($montab[historyLength - 1] + $montab[historyLength - 2] + $montab[historyLength - 3]) / 3
    ELSE
       moy3plusbas = Undefined
       moy3plushauts = Undefined
    ENDIF
    
    FOR i = historyLength - 1 DOWNTO 1 DO
       $histHauts[i] = $histHauts[i-1]
       $histBas[i] = $histBas[i-1]
    NEXT
    
    $histHauts[0] = moy3plushauts
    $histBas[0] = moy3plusbas
    
    ONCE finalLineHaut = Undefined
    ONCE finalLineBas = Undefined
    
    IF BarIndex >= historyLength - 1 THEN
       
       FOR i = 0 TO historyLength - 1 DO
          $tempHauts[i] = $histHauts[i]
          $tempBas[i] = $histBas[i]
       NEXT
       
       ArraySort($tempHauts, descend)
       ArraySort($tempBas, ascend)
       
       avgTop3Hauts = Undefined
       avgBottom3Bas = Undefined
       IF IsSet($tempHauts[0]) AND IsSet($tempHauts[1]) AND IsSet($tempHauts[2]) THEN
          avgTop3Hauts = ($tempHauts[0] + $tempHauts[1] + $tempHauts[2]) / 3
       ENDIF
       IF IsSet($tempBas[0]) AND IsSet($tempBas[1]) AND IsSet($tempBas[2]) THEN
          avgBottom3Bas = ($tempBas[0] + $tempBas[1] + $tempBas[2]) / 3
       ENDIF
       
       IF finalLineHaut <> avgTop3Hauts AND avgTop3Hauts <> Undefined THEN
          finalLineHaut = avgTop3Hauts
       ENDIF
       IF finalLineBas <> avgBottom3Bas AND avgBottom3Bas <> Undefined THEN
          finalLineBas = avgBottom3Bas
       ENDIF
       
       IF BarIndex = historyLength - 1 THEN
          finalLineHaut = avgTop3Hauts
          finalLineBas = avgBottom3Bas
       ENDIF
       
    ELSE
       finalLineHaut = Undefined
       finalLineBas = Undefined
    ENDIF
    
    
    IF (Distance > moy) AND (Distance > moy3plushauts) AND (Distance > 0) THEN
       DRAWSEGMENT(BarIndex, 0, BarIndex, Distance) coloured(0, 0, 255) style(line)
    ENDIF
    
    IF (Distance < moy) AND (Distance < moy3plusbas) AND (Distance < 0) THEN
       DRAWSEGMENT(BarIndex, 0, BarIndex, Distance) coloured(255, 0, 0) style(line)
    ENDIF
    
    RETURN Distance AS "Distance" coloured("blue"), moy AS "Distance Moy", RetBmoy AS "Bande Haute", RetHmoy AS "Bande Basse", moy3plusHauts AS "FilterUp", moy3plusbas AS "FilterDn", finalLineHaut AS "Avg Top3 Hist" coloured(0, 255, 0) style(line, 2), finalLineBas AS "Avg Bot3 Hist" coloured(255, 165, 0) style(line, 2)
    
    robertogozzi and finplus thanked this post
    #253102 quote
    finplus
    Participant
    Master

    Bonsoir,

    merci, je vais le tester.

    Bonne soirée.

    #253132 quote
    finplus
    Participant
    Master

    Bonsoir,

    je vous fait un retour sur l’indicateur demandé.  J’ai fait une capture écran du CAC CHF en UT 1h. Ce qui me gêne est que la ligne verte qui représente la moyenne des 3 FilterUP les plus hauts constatés sur les 50 dernières barres colle en réalité aux évolutions des barres. Or s’il s’agit d’une moyenne, la ligne verte ne devrait pas se comporter ainsi.

    Mais peut-être que ma demande est mal rédigée.

    Merci pour votre attention.

    #253440 quote
    finplus
    Participant
    Master

    Bonsoir,

    je me permet de remonter ma demande.

    Merci.

    #253444 quote
    JS
    Participant
    Senior

    L’indicateur ci-dessous affiche également les lignes moyennes (verte et orange), ce qui permet de visualiser l’évolution des moyennes…

    Les valeurs sont correctes…

    /// ------------------------------------------------------------
    /// KAMA
    /// ------------------------------------------------------------
    Period = 150
    FastPeriod = 2
    SlowPeriod = 50
    
    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 price - KAMA
    /// ------------------------------------------------------------
    xClose   = (open + high + low + close) / 4
    Distance = (xClose - KAMA)
    
    moy = average[550](distance)
    
    if moy < moy[1] and moy[1] > moy[2] and moy[1] > 0 then
    RetB3 = RetB2
    RetB2 = RetB1
    RetB1 = moy[1]
    RetBmoy = (RetB1 + RetB2 + RetB3) / 3
    endif
    
    if moy > moy[1] and moy[1] < moy[2] and moy[1] < 0 then
    RetH3 = RetH2
    RetH2 = RetH1
    RetH1 = moy[1]
    RetHmoy = (RetH1 + RetH2 + RetH3) / 3
    endif
    
    /// ------------------------------------------------------------
    /// 3 lowest and 3 highest distances over last 50 bars
    /// ------------------------------------------------------------
    for i = 0 to 49
    $montab[i] = distance[i]
    next
    
    arraysort($montab, ascend)
    moy3plusBas   = ($montab[0] + $montab[1] + $montab[2]) / 3
    moy3plusHauts = ($montab[49] + $montab[48] + $montab[47]) / 3
    
    if (distance > moy) and (distance > moy3plusHauts) and (distance > 0) then
    drawcandle(0, 0, distance, distance) coloured(0, 0, 255)
    endif
    
    if (distance < moy) and (distance < moy3plusBas) and (distance < 0) then
    drawcandle(0, 0, distance, distance) coloured(255, 0, 0)
    endif
    
    /// ------------------------------------------------------------
    /// NEW PART - averages of FilterUp / FilterDn
    /// ------------------------------------------------------------
    for i = 0 to 49
    $tabUp[i] = moy3plusHauts[i]
    $tabDn[i] = moy3plusBas[i]
    next
    
    arraysort($tabUp, ascend)
    arraysort($tabDn, ascend)
    
    AvgTop3FilterUp = ($tabUp[49] + $tabUp[48] + $tabUp[47]) / 3
    AvgBot3FilterDn = ($tabDn[0] + $tabDn[1] + $tabDn[2]) / 3
    
    if barindex > 50 then
    // Groen = FilterUp (gemiddelde 3 hoogste)
    drawsegment(barindex - 49, AvgTop3FilterUp, barindex, AvgTop3FilterUp) coloured(0,255,0)
    // Oranje = FilterDn (gemiddelde 3 laagste)
    drawsegment(barindex - 49, AvgBot3FilterDn, barindex, AvgBot3FilterDn) coloured(255,165,0)
    endif
    
    /// ------------------------------------------------------------
    /// RETURN (single line)
    /// ------------------------------------------------------------
    RETURN distance AS "Distance", moy AS "Distance Moy", RetBmoy AS "Bande Haute", RetHmoy AS "Bande Basse", moy3plusHauts AS "FilterUp", moy3plusBas AS "FilterDn", AvgTop3FilterUp AS "AvgTop3 FilterUp", AvgBot3FilterDn AS "Avg3 FilterDn"
    #253482 quote
    finplus
    Participant
    Master

    Bonjour,

    merci.

    Je vais le tester et vous fais un retour.

    #253483 quote
    finplus
    Participant
    Master

    j’ai fait une capture écran de la paire USD/JPY en UT 1 heure.

    J’ai affiché le rendu de l’indicateur. Et j’ai rajouté une ligne horizontale noire épaisse pour symboliser ce que selon moi l’indicateur demandé devrait restituer :

    • un premier plus haut entre le 8 et le 10 octobre
    • un deuxième plus haut entre le 24 et 28 octobre
    • un troisième haut entre le 1er novembre et le 4 novembre

    donc la moyenne des 3 derniers FilterUP plus hauts devrait se situer entre ces 3 plus hauts selon moi.

    Merci.

    #253484 quote
    finplus
    Participant
    Master

    voilà la capture écran

    #253486 quote
    JS
    Participant
    Senior

    Tes “FilterUp” et “FilterDn” sont déjà basés sur les 3 distances les plus hautes et les 3 distances les plus basses sur 50 barres…

    À partir de ces valeurs extrêmes, tu reprends encore une fois uniquement les plus hautes ou les plus basses via la fonction “ArraySort”…

    Ainsi, ta moyenne, composée de seulement trois valeurs, sera (presque) identique aux valeurs de “FilterUp” et “FilterDn”…

    Si tu veux une moyenne plus lissée, différente de FilterUp/FilterDn, tu peux plutôt utiliser une moyenne simple calculée sur les séries FilterUp/FilterDn…

    finplus thanked this post
    #253488 quote
    finplus
    Participant
    Master

    Merci.

    JS thanked this post
    #253505 quote
    finplus
    Participant
    Master

    Une dernière chose parce que cet indicateur m’intéresse énormément.

    En pratique, je vous utilisai cette moyenne comme un filtre d’entrée en position :

    1 – si distance < “filtremoyhaut”, alors possibilité d’entrée long

    2 – si distance > “filtremoybas” alors possibilité d’entrée court

     

    Donc j’utilise cet indicateur comme un sorte de filtre pour détecter les surcachats ou les surventes.

    Merci et bonne soirée.

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

Ajouter une moyenne à un indicateur


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
finplus @finplus Participant
Summary

This topic contains 11 replies,
has 3 voices, and was last updated by finplus
2 months, 3 weeks ago.

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