Comparaison cours de clôture et moyennes EMA en code

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #260377 quote
    Deakkon
    Participant
    Junior

    Bonjour,

    Je suis completement perdu dans un essai de programation de “comparatif de prix et EMA”

    Pourrais-je avoir un script pour comparer une cloture de prix avec des EMA, je m’explique


    SI cloture de prix < EMA 10 et EMA 10 < EMA 20 et EMA20 < EMA 30,… then drowtext …

    mais aussi si cloture de prix > EMA10 et EMA 10 > EMA 20 et EMA 20 > EMA 30 … then drawtext …

    #260382 quote
    Nicolas
    Keymaster
    Master

    Un exemple, voici comment ça fonctionne :

    • Les trois EMA (10, 20 et 30) sont calculées sur le close et affichées sur le graphique via le RETURN.
    • condBaissiere est vraie quand le close est sous l’EMA10, elle-même sous l’EMA20, elle-même sous l’EMA30 — alignement baissier parfait. Le texte “BAISSIER” s’affiche en rouge sous le bas de la bougie.
    • condHaussiere est vraie quand le close est au-dessus de l’EMA10, elle-même au-dessus de l’EMA20, elle-même au-dessus de l’EMA30 — alignement haussier parfait. Le texte “HAUSSIER” s’affiche en vert au-dessus du haut de la bougie.
    • Les trois périodes (10, 20, 30) sont définies en haut du code, donc faciles à modifier selon tes besoins.
    • Le léger décalage low * 0.999 et high * 1.001 évite que le texte se superpose exactement à la bougie.

    Tu peux facilement étendre la logique à d’autres EMA (EMA50, EMA200, etc.) en ajoutant de la même façon une quatrième variable et en complétant les conditions AND.

    // Paramètres des EMA (modifiables)
    periodeEMA1 = 10
    periodeEMA2 = 20
    periodeEMA3 = 30
    
    
    // Calcul des EMA
    ema1 = ExponentialAverage[periodeEMA1](close)
    ema2 = ExponentialAverage[periodeEMA2](close)
    ema3 = ExponentialAverage[periodeEMA3](close)
    
    
    // Condition BAISSIERE : close < EMA10 < EMA20 < EMA30
    condBaissiere = close < ema1 AND ema1 < ema2 AND ema2 < ema3
    
    
    // Condition HAUSSIERE : close > EMA10 > EMA20 > EMA30
    condHaussiere = close > ema1 AND ema1 > ema2 AND ema2 > ema3
    
    
    IF condBaissiere THEN
      DRAWTEXT("BAISSIER", barindex, low * 0.999) COLOURED(255, 0, 0)
    ENDIF
    
    
    IF condHaussiere THEN
      DRAWTEXT("HAUSSIER", barindex, high * 1.001) COLOURED(0, 180, 0)
    ENDIF
    
    
    RETURN ema1 AS "EMA 10", ema2 AS "EMA 20", ema3 AS "EMA 30"
    
    Iván González thanked this post
    #260383 quote
    Deakkon
    Participant
    Junior

    ok. J’avais ça mais …. visiblement … marche pas …


    // Settings


    ema30 = average[30,1](close)

    ema20 = average[20,1](close)

    ema10 = average[10,1](close)




    Cond1 = close < ema10 AND ema10 < ema20 AND ema210 CROSSES UNDER ema30

    Cond2 = close > ema10 AND ema10 > ema20 AND ema20 CROSSES OVER ema30



    IF Cond1 THEN


    DRAWARROWUP(barindex, ema30 – ticksize * 0.35) COLOURED(0, 255, 0)


    ENDIF


    IF Cond2 THEN


    DRAWARROWDOWN(barindex, ema0 + ticksize * 0.35) COLOURED(255, 0, 0)


    ENDIF


    RETURN

    #260384 quote
    Deakkon
    Participant
    Junior

    Merci @Nicolas !

    #260385 quote
    Nicolas
    Keymaster
    Master

    Voici les erreurs que j’ai identifiées dans ton code original :

    • ema210 dans Cond1 : c’est une faute de frappe, tu as écrit ema210 au lieu de ema20.
    • ema0 dans le DRAWARROWDOWN : variable inexistante, tu voulais probablement ema30.
    • DRAWARROWUP et DRAWARROWDOWN sont inversés par rapport à la logique : DRAWARROWUP dessine une flèche vers le haut (signal haussier), mais tu l’as mis dans Cond1 qui est la condition baissière, et vice versa.
    • La logique de Cond1 mélange une comparaison statique (close < ema10) avec un CROSSES UNDER sur la même condition. CROSSES est un événement ponctuel (vrai une seule bougie), donc la combinaison avec des conditions permanentes peut ne jamais être vraie simultanément. J’ai séparé les deux logiques clairement.

    Voici le code corrigé :

    // Calcul des EMA
    ema10 = average[10,1](close)
    ema20 = average[20,1](close)
    ema30 = average[30,1](close)
    
    
    // Condition BAISSIERE : alignement baissier complet
    // close < EMA10 < EMA20, et EMA20 croise sous EMA30
    Cond1 = close < ema10 AND ema10 < ema20 AND ema20 CROSSES UNDER ema30
    
    
    // Condition HAUSSIERE : alignement haussier complet
    // close > EMA10 > EMA20, et EMA20 croise au-dessus de EMA30
    Cond2 = close > ema10 AND ema10 > ema20 AND ema20 CROSSES OVER ema30
    
    
    // Signal baissier : flèche vers le BAS au-dessus de la bougie
    IF Cond1 THEN
      DRAWARROWDOWN(barindex, ema30 + ticksize * 0.35) COLOURED(255, 0, 0)
    ENDIF
    
    
    // Signal haussier : flèche vers le HAUT sous la bougie
    IF Cond2 THEN
      DRAWARROWUP(barindex, ema30 - ticksize * 0.35) COLOURED(0, 255, 0)
    ENDIF
    
    
    RETURN 
    

    Deux remarques importantes sur la logique :

    • Avec CROSSES dans Cond1 et Cond2, les flèches n’apparaissent qu’au moment exact où l’EMA20 franchit l’EMA30, ce qui est très rare et très ponctuel. Si tu veux des flèches sur toutes les bougies où l’alignement est respecté, remplace CROSSES UNDER par < et CROSSES OVER par > simplement.
    • ticksize est une valeur très petite (le pas minimum du marché), donc le décalage 0.35 est minuscule. Si les flèches semblent collées aux EMA, remplace ticksize par low * 0.001 ou high * 0.001 pour un décalage proportionnel au prix.
    robertogozzi thanked this post
Viewing 5 posts - 1 through 5 (of 5 total)
  • You must be logged in to reply to this topic.

Comparaison cours de clôture et moyennes EMA en code


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Deakkon @deakkon Participant
Summary

This topic contains 4 replies,
has 2 voices, and was last updated by Nicolas
2 weeks ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 04/20/2026
Status: Active
Attachments: No files
Logo Logo
Loading...