Utiliser une variable dynamique comme période pour une SMA

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #241428 quote
    Bodaris
    Participant
    New

    Bonjour à tous,

    Je travaille actuellement sur un projet d’indicateur dans ProRealTime, et je rencontre une limite technique que je souhaiterais soumettre à vos expertises pour confirmer ou infirmer mes observations. Voici un résumé de la problématique, des tentatives effectuées, et de mes conclusions.

    ### **Ce Que Je Cherche à Faire**

    Je souhaite utiliser une période dynamique pour calculer une moyenne mobile simple (SMA) dans ProRealTime. L’idée est que la période de la SMA soit basée sur une variable calculée dynamiquement, appelée BestX. Cette variable est obtenue à partir d’une logique précise qui détecte les niveaux pertinents sur le graphique.

    Exemple simplifié :
    `prorealtime

    IF BestX > 1 THEN
    SMAPrice = Average[BestX](Close) // Calculer une SMA avec la période dynamique
    ELSE
    SMAPrice = 0
    ENDIF
    
    RETURN SMAPrice

     

    `
    Cependant, cette approche renvoie une erreur car ProRealTime exige que la période soit un entier positif **constant** et non une variable dynamique.

    ### **Tentatives et Expériences**

    Voici ce que j’ai testé pour contourner cette limitation :

    1. **Arrondi et Quantification de la Période Dynamique** :
    – J’ai essayé d’arrondir BestX à l’entier le plus proche et de le limiter à des plages fixes (5, 10, 20, 50).
    – Exemple :
    `prorealtime

    c2 = Average[20](BestX) // Moyenne glissante de BestX
    PeriodDynamic = ROUND(c2)
    IF PeriodDynamic <= 5 THEN
    PeriodDynamic = 5
    ELSEIF PeriodDynamic <= 10 THEN
    PeriodDynamic = 10
    ELSEIF PeriodDynamic <= 20 THEN
    PeriodDynamic = 20
    ELSE
    PeriodDynamic = 50
    ENDIF
    
    ResistanceDynamic = Average[PeriodDynamic](Close)
    RETURN ResistanceDynamic

     

    `
    **Résultat** : Cela fonctionne mais ne renvoie que la valeur de la SMA calculée (le prix moyen) et non la période dynamique elle-même.

    2. **Stockage dans un Array** :
    – J’ai pré-calculé plusieurs SMA fixes (SMA5, SMA10, etc.) et tenté de choisir dynamiquement celle qui correspond à BestX via un array.
    – Exemple :
    `prorealtime

    $SMA[5] = Average[5](Close)
    $SMA[10] = Average[10](Close)
    $SMA[20] = Average[20](Close)
    $SMA[50] = Average[50](Close)
    
    IF isset($SMA[PeriodDynamic]) THEN
    ResistanceDynamic = $SMA[PeriodDynamic]
    ELSE
    ResistanceDynamic = 0
    ENDIF

     

    `
    **Résultat** : ProRealTime demande toujours un entier constant pour l’indice de l’array, ce qui bloque l’utilisation de variables dynamiques comme PeriodDynamic.

    3. **Conditions Fixes** :
    – Plutôt que d’utiliser des arrays, j’ai créé des conditions explicites pour chaque SMA fixe.
    – Exemple :
    `prorealtime

    SMA5 = Average[5](Close)
    SMA10 = Average[10](Close)
    SMA20 = Average[20](Close)
    
    IF BestX > 1 THEN
    IF BestX <= 5 THEN
    SMAPrice = SMA5
    ELSEIF BestX <= 10 THEN
    SMAPrice = SMA10
    ELSE
    SMAPrice = SMA20
    ENDIF
    ELSE
    SMAPrice = 0
    ENDIF
    
    RETURN SMAPrice

     

    `
    **Résultat** : Cela fonctionne, mais encore une fois, la valeur retournée est celle de la SMA (le prix) et non la période dynamique utilisée.

    ### **Conclusions**

    1. **Blocage Principal :**
    – ProRealTime exige une période constante (entier fixe) dans les fonctions comme Average[x](Close).
    – Même les valeurs arrondies ou quantifiées ne sont pas acceptées si elles proviennent de variables dynamiques comme BestX.

    2. **Ce Qui Fonctionne :**
    – Les SMA fixes et leur sélection dynamique par conditions sont exploitables.
    – Cependant, elles ne permettent pas de refléter directement une logique totalement dynamique comme celle visée initialement.

    3. **Limitation Confirmée (?) :**
    – Il semble impossible d’utiliser une variable dynamique comme période pour une SMA dans PRT.
    – Avant d’abandonner cette piste, je souhaite valider cela avec vous.

    ### **Questions**
    1. **Est-ce Confirmé ?**
    – ProRealTime ne permet-il vraiment pas d’utiliser une variable dynamique comme période dans une fonction SMA (même après arrondi ou quantification) ?

    2. **Solutions Alternatives :**
    – Si vous avez rencontré ce type de problème, auriez-vous des idées ou des contournements qui pourraient fonctionner dans ce cas ?

    Merci d’avance pour vos réponses et vos conseils. 😊

     

    Je rajoute le code d’origine que j’utilise pour calculer la variable dynamique Bestx  sachant que je veux l’utiliser comme cela  : MySMABESTX=Average[Bestx](close)

    N = 100 // Maximum Period
    CloseTarget = High // Le plus haut de la bougie courante
    BestX = 0 // Période de la SMA la plus proche
    BestSMAX = 0 // Valeur de la SMA la plus proche
    MinDifference = 1000000 // Différence minimale initialisée à une grande valeur
    
    // Parcourir les périodes pour calculer les SMA
    FOR x = 2 TO N DO
    IF BarIndex >= x THEN // Vérifier qu'il y a assez de données pour calculer la SMA
    SMAX = Average[x](Close) // Calculer la SMA pour x périodes
    Difference = ABS(SMAX - CloseTarget) // Calculer la différence avec le plus haut
            
    // Si cette SMA est plus proche du plus haut, la sauvegarder
    IF Difference < MinDifference THEN
    MinDifference = Difference
    BestX = x
    BestSMAX = SMAX
    ENDIF
    ENDIF
    NEXT
    
    // Afficher les résultats pour la bougie courante
    //DrawText("Période SMA", BarIndex, High + 5) COLOURED("blue")
    DrawText(BestX, BarIndex, High + 10) COLOURED("green") // Afficher la période
    //DrawText("Valeur SMA", BarIndex, High + 15) COLOURED("blue")
    //DrawText(BestSMAX, BarIndex, High + 20) COLOURED("green") // Afficher la valeur de la SMA
    
    // Retourner la meilleure SMA trouvée
    RETURN BestSMAX
    #241442 quote
    LucasBest
    Participant
    Junior

    J’ai l’impression que tu compliques ton problème de base qui m’a l’air très simple…

    Exemple : https://www.tradingview.com/script/oejqyqHP-Adaptive-Moving-Average-AMA/

    A chaque bougie tu calcules ton bestX

    La valeur de la SMA à “barindex-n” est :
    Average[BestX[n]](Close[n])

    Tu peux aussi stocker la valeur de la SMA dans un tableau à la barindex pour chaque nouvelle bougie.

    Bodaris thanked this post
    #241443 quote
    LucasBest
    Participant
    Junior

    https://www.tradingview.com/script/ZSyG0zv6-Adaptive-Moving-Average-AMA-Signals-Zeiierman/

    C’est ça que tu cherches à faire ? 🙂

    Bodaris thanked this post
    #241447 quote
    Bodaris
    Participant
    New

    Bonjour Lucas,

     

    Je te vous  remercie beaucoup pour votre réponse et votre intérêt. Effectivement, j’aurais pu y pensé. Mais ce n’est pas tout à fait pareil dans la finalité.

    • AMA est une moyenne mobile avancée, qui lisse les mouvements en fonction de la volatilité.
    • BestX, en revanche, calcule une valeur optimale pour aligner une SMA sur des niveaux stratégiques, comme un plus haut ou un plus bas. Cette approche n’est pas lissée, elle est ciblée.   Mon idée est de trouver la valeur de la période de la moyenne mobile dynamique qui fait support ou résistance.

    Je cherche à identifier des niveaux de résistances ou supports dynamiques.

    j’ai contourné mon problème avec ce code, le résultat est un peu différent, mais cela marche.

    // Initialisation des SMA fixes
    SMA1 = Average[1](Close)
    SMA2 = Average[2](Close)
    SMA3 = Average[3](Close)
    // ... Jusqu'à SMA100
    SMA100 = Average[10](Close)
    
    // Initialisation des variables
    HighestPeriod = 0
    
    // Comparer le prix à chaque SMA
    FOR Period = 1 TO 100 DO
    IF high <= Average[Period](Close) THEN
    HighestPeriod = Period
    ELSE
    //BREAK // Arrêter si le prix dépasse une SMA
    ENDIF
    NEXT
    
    c1=Average[highestperiod](close)
    c2=close>highest[50](c1)[1]
    
    // Retourner la période correspondante
    
    // Initialisation des SMA fixes
    SMA11 = Average[1](Close)
    SMA21 = Average[2](Close)
    SMA31 = Average[3](Close)
    // ... Jusqu'à SMA100
    SMA1001 = Average[10](Close)
    
    // Initialisation des variables
    HigestPeriod1 = 0
    
    // Comparer le prix à chaque SMA
    FOR Period1 = 1 TO 100 DO
    IF low <= Average[Period1](Close) THEN
    HighestPeriod1 = Period1
    ELSE
    //BREAK // Arrêter si le prix dépasse une SMA
    ENDIF
    NEXT
    
    c11=Average[highestperiod1](close)
    c21=close>highest[50](c11)[1]
    
    // Retourner la période correspondante
    RETURN c11//HighestPeriod, HighestPeriod1// AS "Période Supérieure"
    //RETURN HighestPeriod AS "Période Supérieure"
    

    Visuellement la différence avec l’AMA en capture d’écran 1

    La capture 2 c’est ma variable affichée avec proorder au lieu de probuilder pour contourner l’impossiblité d’utiliser une variable dynamique comme période de moyenne mobile sur probuilder. j’ai une légère différence sur le comportement

     

    Mon idée et but de départ ressemble à la capture 3

     

    Je vous remercie pour votre solution proposée, elle est très intéressante. Mais elle ne répond pas à ce que cherche exactement. Mais vous avez peut-être raison, je me complique éventuellement trop la vie :p

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

Utiliser une variable dynamique comme période pour une SMA


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Bodaris @bodaris Participant
Summary

This topic contains 3 replies,
has 2 voices, and was last updated by Bodaris
1 year, 1 month ago.

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