Annonce
Réduire
Aucune annonce.
Ads
Réduire
[Graphe AT PRo : programmation]
Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Bonjour Smallcaps,

    entre 03/01/2000 et le 19/05/2011, j'ai 2910 cotations. Pour ce qui concerne la régression linaire, je ne conteste pas le fait que cela soit de l'algorithmique basique. Il se peut juste que l'implémentation faite sur WHS Nano FutureStation soit "spécifique", ce qui expliquerait les différences. Si je reprends ce calcul:

    for i = 0 to $N-1
    begin
    X = i;
    Y = CoursP;
    SumX = SumX + X;
    SumX2 = SumX2 + Power(X,2);
    SumXY = SumXY + X*Y;
    SumY = SumY + Y;
    end
    b = (SumXY - SumX*SumY/$N)/(SumX2 - (1/$N)*Power(SumX,2));
    a = (SumY - b*SumX)/$N;
    Z = a + b*X[0];

    on voit clairement qu'il diffère sensiblement de ton implémentation (division par $N alors que toi tu multiplies par $N ... utilisation de X[ 0 ] alors que toi tu utilises un $N (équivalent de X[$N-1]). Au final, le résultat est peut être le même mais mes connaissances dans le langage de programmation de Graphe-AT ne me permettent pas de le déduire.

    Amicalement

    Jean-Charles

    Commentaire


    • Re JCP,

      Il me manque donc 8 tics, mon historique est incomplet je vais le recharger.

      J'ai regardé ton code et il me semble que Tu fais une erreur en pensant que X[0] est toujours = 0.
      En effet, à chaque passage dans la boucle "For", X[0] est la valeur <u>actuelle</u> de l'indice i et tu dois donc calculer mogM comme le fait Eric avec sa variable Z et non pas en prenant seulement a.
      Avec GAP on écrit :
      MogM=a+b*P1
      car la boucle POUR y est parcourue en sens inverse du sens habituel donc du tic le plus éloigné au tic actuel et c'est bien la valeur de la droite de la reg. linéaire au tic actuel qui nous intéresse donc lorsque l'indice est au maxi.

      Maintenant pour ce qui concerne la valeur du paramètre b, Eric l'écrit effectivement sous la forme:

      <strong>b = (SumXY - SumX*SumY/$N)/(SumX2 - (1/$N)*Power(SumX,2));</strong>

      Mais il aurait tout aussi bien pu l'écrire :

      <strong>b=($N*SumXY - SumX*SumY)/($N*SumX2-Power(SumX,2))</strong>
      qui est équivalent non?...C'est ce que j'ai fait.

      Cordialement.


      Commentaire


      • Re JCP,


        J'ai rechargé les cotations du CAC40 à partir du site abcbourse, année par année. J'obtiens <strong>2909</strong> tics du 01/01/2000 au 19/05/2011 inclus.
        Je te donne le détail du nombre de tics par année. Si tu pouvais me dire où est la différence avec ton décompte ce serait sympa et je t'en remercie par avance.

        <center><img src='http://www.pro-at.com/forums-bourse/0511/3668_201311.png' alt='' /></center>

        Cordialement.

        Commentaire


        • Re (aussi),

          effectivement, les formules pour calculer "b" sont équivalentes (je dois avoir mon neurone "en panne"). Pour ce qui est de calculer X(0), j'ai pris une approche "inversée". Par rapport à la période courante, 0 représente la période courante, 1 représente la période précédente, etc ... j'ai donc posé x=0 pour la période courante, x==1 pour la période précédente, ... ce qui me fait donc calculer une droite de régression linéaire "inversée" ... mais qui me permet de m'affranchir d'une multiplication pour le calcule de la régression linéaire pour la période courante. Une autre formule de calcul que j'utilisais initialement était:

          sommeX = 0;
          sommeX2 = 0;
          sommeXY = 0;
          sommeY = 0;

          for i = 0 to PERIODES_F - 1
          begin
          sommeX = sommeX + i + 1;
          sommeX2 = sommeX2 + square( i + 1 );
          sommeXY = sommeXY + ( PERIODES_F - i ) * cours[ i ];
          sommeY = sommeY + cours[ i ];
          end;

          b = ( sommeXY - sommeX * sommeY / PERIODES_F ) /
          ( sommeX2 - sommeX * sommeX / PERIODES_F );
          a = ( sommeY - b * sommeX ) / PERIODES_F;

          mogRegLine = a + b * PERIODES_F;

          avec des résultats obtenus identiques. Pour ce qui est du nombre de périodes de cotation par année, j'obtiens:

          <ul><li>2000 : 253</li><li>2001 : 253</li><li>2002 : 255</li><li>2003 : 255</li><li>2004 : 259</li><li>2005 : 256</li><li>2006 : 256</li><li>2007 : 255</li><li>2008 : 256</li><li>2009 : 257</li><li>2010 : 258</li><li>2011 : 97</li></ul>

          Amicalement

          JCP

          Commentaire


          • Re JCP,

            Merci pour ta réponse et tes explications. C'est ok.
            J'ai rechargé les cours du CAC40 et les différences avec tes valeurs se maintiennent hormis pour l'année 2009 où je passe à 256 tics! Abcbourse ne donnerait donc pas le même nombre de tics que ta source. Bon les différences sont mineures et doivent sans doute être gommées au niveau des bandes ultérieures...

            Erreur de ma part :
            - pour les utilisateurs de GrapheAT Pro, j'ai modifié légèrement mon programme en écrivant le cours pondéré sous la forme <strong>CP(0)</strong> et non plus <strong>CP</strong> tout court de telle sorte qu'il devienne une variable historisée qui sera ainsi correctement lue dans la boucle POUR, ce qui n'était pas le cas auparavant.
            Le résultat cette fois se rapproche davantage du tien JCP en avril et mai 2011 mais toujours pas en février et mars...

            <center><img src='http://www.pro-at.com/forums-bourse/0511/3668_201557.jpg' alt='' /></center>

            <u>Nouveau programme :</u>

            //==============
            //Bandes_Mogalef
            //==============

            //d'après code communiqué par Anaphraïs
            //pour la WHS NANO FutureStation
            //
            //transcodé par smallcaps90
            //le 20/05/2011
            //v 0.2
            //==========================

            //1---- Cours pondéré "Mogalef"
            //
            CP(0)=(Haut+Bas+Ouverture+2*Cloture)/5

            //2---- Régression linéaire du cours pondéré sur P1 périodes
            //
            somx = 0
            somy = 0
            somxx = 0
            somxy = 0
            Pour P1 Cours
            somx = somx+RangPour
            somy = somy+CP
            somxx = somxx+RangPour*RangPour
            somxy = somxy+RangPour*CP
            FinPour
            a = (P1*somxy-somx*somy)/(P1*somxx-somx*somx)
            b = (somy-a*somx)/P1
            MogRegLin = a*P1+b

            Si RangHisto<=P2 Alors MogRegLin=Cloture

            //3---- Ecartype de la régression linéaire sur P2 périodes
            //
            ETyp(0)=Ecartype(MogRegLin,P2)

            //4---- Bandes "Mogalef"
            //
            Si MogRegLin<MogH(1) ET MogRegLin>MogB(1) //pas de décalage si Reg Lin intérieure aux bandes
            Alors
            ETyp=ETyp(1)
            MogM=MogM(1)
            MogH=MogH(1)
            MogB=MogB(1)
            Sinon //décalage calcul des nouvelles valeurs des bandes
            MogM=MogRegLin
            MogH=MogRegLin+P3*ETyp
            MogB=MogRegLin-P3*ETyp
            FinSi

            //fin du code

            Fenêtre <u>Propriétés</u> de la règle inchangée.

            Cordialement.

            Commentaire


            • Bonjour Smallcaps,

              on dirait l'ancienne version de ton code (celle qui est avec CP, pas CP(i), ...)

              Amicalement

              JCP

              Commentaire


              • Re JCP,

                Oui bien sûr, c'est globalement la même version au seul petit détail près (CP(0) au lieu de CP) qui a son importance.

                Cordialement.

                Commentaire


                • Bonsoir Smallcaps,

                  pourquoi n'écrit-on pas également:

                  somy = somy+CP( RangPour )
                  somxy = somxy+RangPour*CP(RangPour)

                  D'autre part, et par pure curiosité, peux-tu essayer de remplacer

                  MogRegLin = a*P1+b

                  par

                  MogRegLin = b

                  pour voir ce que cela donne pour Février et Mars ?

                  Amicalement

                  JCP

                  Commentaire


                  • Bonsoir JCP,


                    Dans le cas de la répétitive POUR, avec le langage de GrapheAT Pro il est inutile d'écrire :

                    somy = somy+CP(<strong>RangPour</strong>)
                    somxy = somxy+RangPour*CP(<strong>RangPour</strong>)

                    car, bien que la variable RangPour soit son indice de parcours, la boucle trouve la valeur de CP pour chaque valeur de l'indice automatiquement <u>à condition de déclarer CP comme variable historisée sous la forme : CP(0)=....</u>Il ne serait pas interdit d'écrire ces deux instructions comme tu le suggères, il est simplement inutile de le faire.

                    Pour ton info, il existe un deuxième type de répétitive dans GrapheAT Pro, du type "TantQue...Faire...FinTantQue" dans laquelle il faut impérativement gèrer l'indice.

                    Ensuite j'ai essayé, comme tu le demandes, de ne prendre que l'ordonnée à l'origine b pour calculer la régression linéaire. Evidemment la courbe obtenue est complètement décalée vers la droite et est inexploitable.

                    As-tu vu le code posté par chipeur59 sur la version Multicharts des bandes Mogalef?
                    <a href='/ref.php?uri=http%3A%2F%2Fwww.pro-at.com%2Fforums-bourse%2Fbourse-Day-Trading-Future-CAC-40-FCE-BANDES-MOGALEFF-ET-MULTICHARTS-5-33629.html%231249813' target="_blank">http://www.pro-at.com/forums-bourse/bourse-Day-Tra...</a>

                    Bonne soirée.
                    Cordialement.

                    Commentaire


                    • Bonsoir Smallcaps,

                      pour éviter de trop te solliciter, j'avais télécharger la version de GraphAT Pro pour expérimenter mes idées. J'arrive à la même conclusion que toi sur la simplification de mogRegLin: FBI (Fausse Bonne Idée <img src='http://www.pro-at.com/style/images/icones/icon_smile_cool.gif' border='0' alt='' title='' align='middle' />).

                      Je viens de jeter un oeil sur le code de Chipeur59: c'est court et élégant (mais le calcul de la régression linéaire et de l'écart type sont réalisés par des fonctions dédiées). Personnellement, j'aurais écrit "if currentBar = 10" (il faut 3 périodes pour avoir la première régression linéaire valide et, 7 périodes - y compris la 3ème période - pour calculer l'écart type sur ces régressions linéaires). Mais l'erreur au démarrage (en commençant à currentbar = 8) est rapidement gommée. A noter également que le code de Chipeur59 est un peu trop simple dans le sens où il ne traite pas les barres précédent la barre n°8 (la ou aucun calcul n'est encore possible).

                      Il est clair en tout cas que ce code est plus lisible que certains autres codes postés sur le site (dont le code Ninja Trader).

                      Amicalement

                      JCP

                      Commentaire


                      • Bonsoir Smallcaps,

                        Autre interrogation sur le code de Chipeur59: en temps réel,une barre de 5 minutes se construit au fur et à mesure de la disponibilité des nouveaux ticks, ce qui fait que les conditions conduisant au décalage des bandes peuvent être vraies en cours de construction d'une période ... mais ne plus l'être lorsque la période se termine. En conséquence, une écriture telle que:

                        if var0 < BandeBasse or var0 > BandeHaute then
                        begin
                        BandeHaute = var0 + 2*var1;
                        BandeBasse = var0 - 2*var1;
                        Mediane = var0;

                        me semble fausse car elle signifie que tout décalage peut être validé définitivement en cours de construction d'un période ... même s'il est invalidé en fin de période.

                        Si on utilise des données historiques, cela ne se voit pas car, selon les moteurs des langages, on dispose immédiatement des open,high,low,close de la période considérée (et donc: l'initialisation se passe bien). C'est ensuite que ça se gâte, quand on reçoit les données en temps réel. A mon avis, une écriture du style:

                        if var0 < BandeBasse(1) or var0 > BandeHaute(1) then
                        begin
                        BandeHaute = var0 + 2*var1;
                        BandeBasse = var0 - 2*var1;
                        Mediane = var0;
                        end
                        else
                        begin
                        BandeHaute = BandeHaute(1);
                        BandeBasse = BandeBasse(1);
                        Mediane = Mediane(1);
                        end

                        me semble beaucoup plus robuste (aux erreurs de syntaxe près ... je ne connais pas ce langage). Je me demande si les erreurs constatées par certains "en cours d'exécution" ne sont pas liées à ce problème.

                        Amicalement

                        JCP

                        Commentaire


                        • Bonjour à tous,

                          Commentaire de raptor90 <a href='/ref.php?uri=http%3A%2F%2Fwww.pro-at.com%2Fforums-bourse%2Fbourse-Analyse-Technique-Indicateurs-et-systemes-Code-MOGALEF-ProRealTime-5-33628.html' target="_blank">ICI</a>

                          <font color='#0000FF'>"avec coloriage déclenchement sur cp
                          sans coloriage déclenchement sur regression linéaire de CP

                          sur cette exemple on remarque des déclenchement intempestifs sans la régression linéaires

                          il y a bien une différence de comportement"</font>
                          le commentaire suivant Posté le : le 20-05-2011 14:15:31
                          est peut être la source de vos différences.
                          félicitations à smallcaps90 pour ce programme.

                          Cordialement.

                          <center><a href='http://www.pro-at.com/forums-bourse/0511/20168_210343.jpg' target='_blank' style='display:block; width:600px; border:2px dashed #888; padding:10px'><img src="http://www.pro-at.com/forums-bourse/0511/20168_210343.jpg" alt='' width='600' height='673' /><em style='display:block; text-align: right'>Cliquez pour agrandir</em></a></center>
                          Max imum de gains et Min imum de pertes

                          Commentaire


                          • Bonjour JCP,

                            Non non tu ne me sollicites pas trop, la discussion est intéressante. Tout à fait d'accord avec toi, le code de Chipeur59 pour Multicharts me semblait aussi un peu "léger" quand je t'ai proposé d'y jeter un coup d'oeil. Quid des périodes qui ne décalent pas entre autres, sans parler de l'initialisation qui devrait , en principe, attendreau moins 3+7-1 périodes pour que les résultats des calculs de la régression linéaire et de l'écart-type soient corrects?
                            Voici ce que cela donnerait avec un historique du CAC40 dont j’ai fixé arbitrairement le départ au 03/01/2000 :

                            <center><img src='http://www.pro-at.com/forums-bourse/0511/3668_210810.png' alt='' /></center>

                            <u>Code :</u>

                            //==============
                            //Bandes_Mogalef
                            //==============

                            //d'après code communiqué par Anaphraïs
                            //pour la WHS NANO FutureStation
                            //
                            //transcodé par smallcaps90
                            //le 20/05/2011
                            //v 0.3
                            //comporte l'initialisation des bandes
                            //=====================================

                            //1---- Cours pondéré "Mogalef"
                            //
                            CP(0)=(Haut+Bas+Ouverture+2*Cloture)/5

                            //2---- Régression linéaire du cours pondéré sur P1 périodes
                            //
                            <font color='#0000FF'>Si RangHisto>=P1 Alors</font>
                            somx = 0
                            somy = 0
                            somxx = 0
                            somxy = 0
                            Pour P1 Cours
                            somx = somx+RangPour
                            somy = somy+CP
                            somxx = somxx+RangPour*RangPour
                            somxy = somxy+RangPour*CP
                            FinPour
                            a = (P1*somxy-somx*somy)/(P1*somxx-somx*somx)
                            b = (somy-a*somx)/P1
                            MogRegLin = b + a*P1
                            <font color='#0000FF'>FinSi</font>

                            <font color='#0000FF'>Si RangHisto>=P1+P2-1 Alors</font>
                            //3---- Ecartype de la régression linéaire sur P2 périodes
                            //
                            ETyp(0)=Ecartype(MogRegLin,P2)

                            //4---- Bandes "Mogalef"
                            //
                            Si MogRegLin<MogH(1) ET MogRegLin>MogB(1) //pas de décalage si Reg Lin intérieure aux bandes
                            Alors
                            ETyp=ETyp(1)
                            MogM=MogM(1)
                            MogH=MogH(1)
                            MogB=MogB(1)
                            Sinon //décalage calcul des nouvelles valeurs des bandes
                            MogM=MogRegLin
                            MogH=MogRegLin+P3*ETyp
                            MogB=MogRegLin-P3*ETyp
                            FinSi
                            <font color='#0000FF'>FinSi</font>

                            //fin du code

                            Si on ne se préoccupe pas de l’initialisation des bandes au départ de l’historique, tout entrera dans l’ordre après une bonne vingtaine de périodes environ avec GrapheAT Pro comme avec d’autres systèmes sans doute.
                            Initialisation ou pas ? Ceci est tout de même un problème purement formel car ce qui importe est bien l’extrémité droite de l’historique non ?

                            Cordialement.

                            Commentaire


                            • Bonjour Smallcaps,

                              on est en phase ... une remarque "de puriste" cependant sur ton code: il faut attendre P1+P2 périodes pour pouvoir comparer MogRegLin à MogH(1) car la première valeur de MogH étant calculée à la période P1+P2-1, MogH(1) n'existe qu'à partir de la période P1+P2. Ceci étant, l'impact visible est nul si on dispose de suffisamment d'historique.

                              Amicalement

                              JCP

                              Commentaire


                              • Bonjour Didier,


                                Merci pour ton commentaire.
                                Oui Raptor avait comparé ce qui se passe suivant que l'on traite le décalage des bandes en tenant compte de leur position par rapport à CP ou à sa régression linéaire.
                                Mais comme le conseillait Eric, c'est bien la régression linéaire qu'il faut utiliser et c'est ce que nous faisons JCP et moi avec nos systèmes respectifs. Les différences de tracés constatées ne viennent donc pas de cela.
                                Perso je pencherais plutôt sur les nombres différents de tics que comportent nos historiques voire même, peut-être, sur des différences qui existeraient au niveau des bougies elles-mêmes. Suivant les sources de récupération des historiques on en voit parfois...

                                Cordialement.

                                Commentaire

                                Chargement...
                                X