ProRealTime
Pour discuter sur l’interface de ProRealTime Software, nos configurations graphiques...

Calcul RSI PRT

par pingoo67 » 12 Mar 2019 16:19

Bonjour,

Je sais que le sujet a été évoqué de nombreuses fois. Cependant malgré 2 jours de travail il m'est impossible de reproduire le RSI identique à celui sur PRT.

Le calcul est pourtant simple et se trouve un peu partout mais impossible de retrouvé la même valeur que PRT.

Quelqu'un pourrait me dire comment est calculé le RSI sur PRT.
Perso j'ai testé en 100T sur un RSI5 et j'ai un decalage de 30. PRT est à 60 alors que moi je suis à 90.
Je fais bien le calcul suivant : RSI = 100-(100/Calc_RSI_NB);

Calc_RSI_NB = Calc_RSI_NB+1;
Calc_RSI_NB = Moyenne_Hausse_RSI/Moyenne_Basse_RSI;

Je me demande si PRT n'utilise pas une moyenne exponentielle pour calculer la moyenne des Hausses/Baisses

Je sais pas si quelqu'un saura m'en dire plus.

En tout cas merci par avance

Re: Calcul RSI PRT

par BeerIsDead » 12 Mar 2019 16:22

Salut. Il me semble que la moyenne à utiliser c'est la moyenne de Wilder ? (du nom du créateur du RSI)

Re: Calcul RSI PRT

par pingoo67 » 12 Mar 2019 16:34

Du coup c'est bien la somme des "hausse/période total" soir dans mon test 5, c'est bien ce que j'ai essayé.

J'ai tenté via excel en prenant les valeurs direct sur le graph de PRT et impossible de retrouver les mêmes valeurs

Merci pour ton aide en tout cas

Re: Calcul RSI PRT

par BeerIsDead » 12 Mar 2019 16:56

En fait je te dis des bêtises : je ne sais plus quel type de moyenne utilise PRT. C'est peut-être une MM simple.

As-tu bien suivi cette procédure : https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi ?

Je pense que c'est la bonne.

Re: Calcul RSI PRT

par pingoo67 » 12 Mar 2019 18:51

Je ne connaissais pas la notion de lissage.
J'ai donc tenté d'ajuster sans résultat.

Mais une chose un peu plus folle m'interpelle, j'ai repris le tableau excel sur le lien et je n'arrive pas non plus au même résultat avec la formule donnée.. Mon "Avg Gain" n'est pas identique à la présentation.

Ce RSI me rend fou!!!

Re: Calcul RSI PRT

par BeerIsDead » 12 Mar 2019 19:26

:p j'ai le code Java mais ça risque de ne pas trop t'aider ?

Re: Calcul RSI PRT

par pingoo67 » 12 Mar 2019 19:27

alors la si justement je l'utilise en javascript ce serait top!!! :) :) :)

Juste pour partager voici mon code :

Code: Tout sélectionner
function Calc_RSI(close, heure, Periode_RSI, UT){
   compteur_RSI = compteur_RSI+1;
   Tab_RSI[compteur_RSI]=close;
   var longueur_Tab_RSI=Tab_RSI.length;
   var Debut_RSI = longueur_Tab_RSI-Periode_RSI;
   
   var Nb_Enregistrement = document.getElementById("Nb_Enregistrement_Tab_RSI");
   Nb_Enregistrement.value = longueur_Tab_RSI;
   
   if (longueur_Tab_RSI > Periode_RSI) { // Calcul RSI en cours
      var Activation_RSI = document.getElementById("Activation_RSI");
      Activation_RSI.value = "Active";
      
      var Compteur_RSI_deux = 0;
      var ecart_Hausse_RSI = 0;
      var ecart_Baisse_RSI = 0;
      var Hausse_RSI = 0;
      var Baisse_RSI = 0;
      var Close_der_barre_prec = 0;
      var Compteur_RSI_SURACHAT = 0;
      var Calc_RSI_NB = 0;
      var RSI = 0;
      var Compteur_RSI_Hausse = 0;
      var Compteur_RSI_Baisse = 0;
      
      for (var i=Debut_RSI; i<longueur_Tab_RSI; i++) { // Boucle recuperation valeurs dans un tableau
         Compteur_RSI_deux = Compteur_RSI_deux+1;
         Tab_RSI_PERIODE[Compteur_RSI_deux] = Tab_RSI[i];
         var Close_der_barre = Tab_RSI[i];
         if (Compteur_RSI_deux == 1) {
            Close_der_barre_prec = Close_der_barre;
         } else {   
            if (Close_der_barre > Close_der_barre_prec) {
               ecart_Hausse_RSI = Number(Close_der_barre)-Number(Close_der_barre_prec);
               Hausse_RSI = Number(Hausse_RSI)+Number(ecart_Hausse_RSI);
               Close_der_barre_prec = Close_der_barre;
               Compteur_RSI_Hausse = Compteur_RSI_Hausse+1;
            }
            // dans le cas d'une baisse
            if (Close_der_barre < Close_der_barre_prec) {
               ecart_Baisse_RSI = Number(Close_der_barre_prec)-Number(Close_der_barre);
               Baisse_RSI = Number(Baisse_RSI)+Number(ecart_Baisse_RSI);
               Close_der_barre_prec = Close_der_barre;
               Compteur_RSI_Baisse = Compteur_RSI_Baisse+1;
            }
         }
      }

      //------------
      if (Compteur_RSI_Hausse == 0) {
         Moyenne_Hausse_RSI = 0;
      } else {
         Moyenne_Hausse_RSI = Hausse_RSI/Periode_RSI;
      }
      
      if (Compteur_RSI_Baisse == 0) {
         Moyenne_Basse_RSI = 0;
      } else {
         Moyenne_Basse_RSI = Baisse_RSI/Periode_RSI;
      }
      
      Calc_RSI_NB = (Number(Moyenne_Hausse_RSI)/Number(Moyenne_Basse_RSI));
      Calc_RSI_NB = Calc_RSI_NB+1;
      RSI = 100-(100/Calc_RSI_NB);

      Tab_RSI_FIN[longueur_Tab_RSI] = Math.ceil(RSI*100)/100;   
      
      var Calcul_RSI = document.getElementById("Calcul_RSI");
      Calcul_RSI.value = Tab_RSI_FIN[longueur_Tab_RSI];
      var Tableau_RSI = document.getElementById("Tableau_RSI");
      Tableau_RSI.value = Tab_RSI_FIN;
      
      //------
      
      
      Tab_Heure_RSI[longueur_Tab_RSI] = heure;
      var Heure_RSI = document.getElementById("Heure_RSI");
      Heure_RSI.value = Tab_Heure_RSI;
      
   } else {
      // Profondeur pas sufisante
      var Activation_RSI = document.getElementById("Activation_RSI");
      Activation_RSI.value = "En cours de chargement";
   }
   var Valeur_Tab_RSI = document.getElementById("Valeur_Tab_RSI");
   Valeur_Tab_RSI.value = Tab_RSI_PERIODE;   
}

Re: Calcul RSI PRT

par BeerIsDead » 12 Mar 2019 19:42

Ah ok, mais toi c'est du javascript, pas du Java. Je te mets le code Java au cas où , mais c'est complètement différent. Longtemps que je n'y ai pas touché, mais il me semble me souvenir que ça donnait les mêmes résultats que PRT. :?:

Code: Tout sélectionner
public class RSIFunction implements IFunction {
    private static final Logger logger = LogManager.getLogger(RSIFunction.class);

    private int nbPeriods;
    private BigDecimal ATR;
    private List<BigDecimal> listSeedDown;
    private List<BigDecimal> listSeedUp;
    private BigDecimal averageUps;
    private BigDecimal averageDowns;
    private OHLC previousOHLC;
    private boolean isSeedInitialized;
    private boolean skipfirst = true;

    public RSIFunction(int nbPeriods) {
        this.nbPeriods = nbPeriods;
        listSeedDown = new ArrayList<>();
        listSeedUp = new ArrayList<>();
    }

    public boolean hasEnoughQuotes() {
        if (listSeedDown.size()  + listSeedUp.size() < nbPeriods) {
            return false;
        } else {
            return true;
        }
    }

    public BigDecimal computeNewValue(OHLC newOHLC) {
        BigDecimal delta = null;
      
        delta = newOHLC.getClose().subtract(previousOHLC.getClose());
        previousOHLC = newOHLC;

        if (!isSeedInitialized) {

            if (delta.compareTo(BigDecimal.ZERO) < 0) {
                listSeedDown.add(delta.abs());
            } else {
                listSeedUp.add(delta);
            }

            if (hasEnoughQuotes()) {
            // on a suffisamment de quotes pour initialiser le RSI
                isSeedInitialized = true;

                averageDowns = listSeedDown.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(nbPeriods), 20, RoundingMode.HALF_UP);
                averageUps = listSeedUp.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(nbPeriods), 20, RoundingMode.HALF_UP);

                BigDecimal RS;
                if (averageDowns.compareTo(BigDecimal.ZERO) != 0) {
                    RS = averageUps.divide(averageDowns, 20, RoundingMode.HALF_UP);
                } else {
                    RS = new BigDecimal(100);
                }

                BigDecimal RSI = new BigDecimal(100).subtract(
                        new BigDecimal(100).divide(BigDecimal.ONE.add(RS), 20, RoundingMode.HALF_UP));

                return RSI;
            }
        } else {
            BigDecimal upValue;
            BigDecimal downValue;

            if (delta.compareTo(BigDecimal.ZERO) < 0) {
                downValue = delta.abs();
                upValue = BigDecimal.ZERO;
            } else {
                upValue = delta;
                downValue = BigDecimal.ZERO;
            }

            averageDowns = averageDowns.multiply(
                    new BigDecimal(nbPeriods - 1)
                ).setScale(20, RoundingMode.HALF_UP)
                    .add(downValue)
                    .divide(new BigDecimal(nbPeriods), 20, RoundingMode.HALF_UP);
            averageUps = averageUps.multiply(new BigDecimal(nbPeriods - 1)).setScale(20, RoundingMode.HALF_UP).add(upValue).divide(new BigDecimal(nbPeriods), 20, RoundingMode.HALF_UP);

            BigDecimal RS;
            if (averageDowns.compareTo(BigDecimal.ZERO) != 0) {
                RS = averageUps.divide(averageDowns, 20, RoundingMode.HALF_UP);
            } else {
                RS = new BigDecimal(100);
            }

            BigDecimal RSI = new BigDecimal(100).subtract(
                    new BigDecimal(100).divide(BigDecimal.ONE.add(RS), 20, RoundingMode.HALF_UP));

            return RSI;
        }
        return null;
    }
}

Re: Calcul RSI PRT

par BeerIsDead » 12 Mar 2019 19:42

Sinon si ça t'aide pas, je regarderai ton code tout à l'heure. ;)

Re: Calcul RSI PRT

par pingoo67 » 12 Mar 2019 20:07

je vais éplucher ta fonction cette nuit merci beaucoup :)

Ben si tu as deux minutes pour vérifier la mienne ce serait top :)

merci

Articles en relation
Calcul de Range auto
par PalmierVener » 25 Mar 2018 01:06 (0 Réponses)
PRT : fonction ATAN (calcul d'angle)
par GOLDENBOY » 17 Aoû 2015 20:19 (6 Réponses)
Puissance de calcul ; Qui fait quoi ?
par Burzum » 18 Sep 2016 11:13 (14 Réponses)
PRT Soft a modifié sa méthode de calcul des PPJ Future DAX
Fichier(s) joint(s) par Nicola » 23 Oct 2016 21:26 (5 Réponses)

ProRealTime

Alors partagez-le 5 fois c'est bon pour la santé