Allmänt meddelande

Collapse
No announcement yet.

CmpRef och MFI

Collapse
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • CmpRef och MFI

    Hej!

    Har ett script som jobbar med intradagsupplösning 1 min, och vill ha in mfi(5) från ett CmpRef-objekt i 15 minuters-upplösning? Går det?

    Vad blir syntaxen?

    Mvh

  • #2
    Försöker få ihop en formel för MFI till att börja med men ngt blir fel. Som jag förstått det lägger man ihop de dagar som tp1 ökat jmf med föregående dag samt lägger ihop de dagar som tp1 minskat jmf m föregående dag. Har jag förstått rätt är det inte skillnaden mellan dagarna utan hela summorna av TP1 som läggs ihop.
    Här är mitt felaktiga försök, ngn kanske kan komma på var jag tänker fel.
    För att göra fler perioder får man bygga på med a4,d4 o.s.v., lite klumpigt kanske men jag har inte kommit på ngt annat sätt

    Har vi bara formeln rätt så borde det vara lätt att lägga till CmpRef

    TP1:=mult(Div(Add(Add(High,Close),Low),3),V)

    a1=if(gt(tp1,aref(tp1,1)),tp1,0)
    d1=if(lt(tp1,aref(tp1,1)),tp1,0)

    a2=if(gt(aref(tp1,1),aref(tp1,2)),aref(tp1,1),0)
    d2=if(lt(aref(tp1,1),aref(tp1,2)),aref(tp1,1),0)

    a3=if(gt(aref(tp1,2),aref(tp1,3)),aref(tp1,2),0)
    d3=if(lt(aref(tp1,2),aref(tp1,3)),aref(tp1,2),0)

    ta1=add(add(a1,a2),a3)
    ts1=add(add(d1,d2),d3)

    mfi1=sub(100,div(100,add(div(ta1,ts1),1)))
    mfi1

    Comment


    • #3
      Snyggt! Jag tänkte det fanns trivialare sätt att få in CmpRef, men ditt sätt kanske är det enda rätta.
      Tänkte själv förut att det borde bli mängder av kod, men det ser ju rent och snyggt ut.

      Jag kan heller inte se något fel i scriptet, men får testa imorgon. Tack så länge!

      Länk till formel:
      http://stockcharts.com/school/doku.p...flow_index_mfi

      Mvh

      Comment


      • #4
        Nu har jag testat men får den inte heller att se lika dan ut som en standard MFI. Lite annat utseende på koden, men inget vidare resultat.

        i30(

        TP1=mult(Div(Add(Add(h,c),l),3),V)
        TP2=mult(Div(Add(Add(aref(h,1),aref(c,1)),aref(l,1)),3),aref(V,1))
        TP3=mult(Div(Add(Add(aref(h,2),aref(c,2)),aref(l,2)),3),aref(V,2))
        TP4=mult(Div(Add(Add(aref(h,3),aref(c,3)),aref(l,3)),3),aref(V,3))

        a1=if(gt(tp1,tp2),tp1,0)
        d1=if(lt(tp1,tp2),tp1,0)

        a2=if(gt(tp2,tp3),tp2,0)
        d2=if(lt(tp2,tp3),tp2,0)

        a3=if(gt(tp3,tp4),tp3,0)
        d3=if(lt(tp3,tp4),tp3,0)

        ta1=add(add(a1,a2),a3)
        ts1=add(add(d1,d2),d3)

        mi1=mult(100,div(ta1,add(ta1,ts1)))
        )

        Comment


        • #5
          Rikard, kan du se vad som är fel?

          Jag försöker skapa en eget backtestningsscript där jag kör grundupplösningen i 1-minuters och tar in MFI-datan som CmpRef 30-minuters.

          Men våra försök ovan ger inte alls samma kurva som original MFI i 30-minuters upplösning.

          Mvh

          Comment


          • #6
            Jag hann inte klart men har börjat titta på ett script som gör samma sak som original-MFI.

            Comment


            • #7
              Ursprungligen postat av Rikard Nilsson Visa inlägg
              Jag hann inte klart men har börjat titta på ett script som gör samma sak som original-MFI.
              Är det ngn som har koll på varför vi inte får våra MFI försök att fungera. Kan inte hitta vad som är fel o det retar mig lite plus att man lär sig mycket av att sina misstag om hur NAT funkar när man till slut hittar en lösning.

              Comment


              • #8
                Rikard, har du kommit vidare med ditt script?

                Comment


                • #9
                  Nja, jag hann inte klart riktigt, klart lurigt faktiskt! Men så fort jag är på benen igen ska jag se om vi kan få till scriptet.

                  Comment


                  • #10
                    Men ligger inte redan MFI som ett script i NAT så man kan utgå från det scriptet o anpassa till om man vill använda CmpRef?

                    Comment


                    • #11
                      Nja, MFI ligger som C++ enligt följande:


                      //=========================================================/
                      int MoneyFlow(double *pp1,double *pp2,double *pp3,double *pp4)
                      {
                      double **pdarr,*pdh,*pdl,*pdc,*pdv;
                      int i,j,a,p=0;
                      double dadv,ddec,dtmp,dtp,odtp,dflow;
                      pdarr=(double **)pp4;
                      pdc=pdarr[0];
                      pdv=pdarr[1];
                      pdh=pdarr[2];
                      pdl=pdarr[3];
                      p=(int)fabs(*pp1);
                      if(!p)
                      ++p;
                      //a=(int)fabs(pp1[1]);
                      a=(int)fabs(*pp3);
                      if(!a)
                      ++a;
                      j=i=0;
                      while(j<a)
                      {
                      #if COMPILERVERSION>3
                      p=(int)fabs(pp1[j]);
                      if(!p)
                      ++p;
                      #endif
                      i=0;
                      dadv=ddec=dtmp=0;
                      dtp=(pdc[i+j]+pdh[i+j]+pdl[i+j])/3;
                      dflow=dtp*pdv[i+j];
                      ++i;
                      while(i<p)
                      {
                      odtp=dtp;
                      dtp=(pdc[i+j]+pdh[i+j]+pdl[i+j])/3;
                      if(odtp>dtp)
                      dadv+=dflow;
                      else if(odtp<dtp)
                      ddec+=dflow;
                      dflow=dtp*pdv[i+j];
                      ++i;
                      }
                      if((ddec)>(double)0.0001)
                      dtmp=100-((double)100/(1+(dadv/ddec)));
                      else
                      dtmp=100;
                      *pp2++=dtmp;
                      ++j;
                      }
                      return 1;
                      }


                      Efter lite konsultation med vår ur-guru Lasse kom vi fram till följande kodsnutt nedan. Den ger identisk kurva med "original-MFI". H, L och C och V kan enkelt tas från cmpref() istället så får man MFI i annan upplösning eller från annat instrument osv. Vi upptäckte en sak, och att det blir fel på 1 period i originalkommandot. Det går enkelt att korrigera, men frågan är om det är en bra ide eftersom många kör strategier som i så fall måste få perioditeten för alla MFI-komponenter flyttade 1 steg. Vad tycker panelen?

                      period:=3
                      mfiper:=sub(period,1)
                      i30(
                      tp1=div(add(add(h,c),l),3)
                      tp2=mult(tp1,v)
                      pos_money=if(gt(tp1,aref(tp1,1)),tp2,0)
                      neg_money=if(lt(tp1,aref(tp1,1)),tp2,0)
                      acc_pos_flow=sum(pos_money,mfipereriod)
                      acc_neg_flow=sum(neg_money,mfipereriod)
                      ratio=if(gt(acc_neg_flow,0),div(acc_pos_flow,acc_neg_flow),100)
                      draw(mfi(3),2,rsa)
                      mi1=sub(100,div(100,add(1,ratio)))
                      draw(mi1,3,ksa)
                      add(mi1,0)
                      )

                      Comment


                      • #12
                        OK, fick för mig att du i ett tidigare svar ang RSI skrev att alla funktioner i NAT var skrivna i samma scriptform såsom vi jobbar i vårt gränssnitt.

                        1 Vad betyder ¨fel på 1 period' ?

                        2 Om man t,ex kör MFI(3) är alltid den 1 perioden då felaktig i den rullande uträkningen?

                        3 Hur stort är felet och beror felstorleken på situationen?

                        4 Är det andra funktioner i NAT som även drabbas av liknande feltyp?


                        5 Bästa sättet att avgöra är kanske att se en korrigerad kurva sen blir det lättare att svara.

                        6 Mitt o Nickos försök, ger det en felaktig kurva eller är den rätt?

                        Comment


                        • #13
                          Fasta analysmetoder är scriptbaserade, men scriptkommandon är genererade i scriptmotorn som är skriven i C++.

                          1. Det är egentligen inget fel utan en definitionsfråga, om tex 3 perioder ska avse from innevarande eller from förra perioden och bakåt.
                          2. Som scriptet ovan är skrivet drar vi av ett från periodvärdet för att få ut samma som C++ versionen MFI()
                          3. Se 2
                          4. Det kan ev finnas fler scriptkommandon som har samma definition, främst spelar det roll när man ska få samma kurvor som andra analysprogram osv. Oftast är det bara att prova att öka perioden med 1 och se om det stämmer.
                          5. Se 4
                          6. Om ni använder scriptet ovan blir det rätt. Allt som behövs är att ersätta C, L, H och V med cmpref()-satser.

                          Comment


                          • #14
                            Det är väl egentligen först när man jämför mot andra analysprogram som det är av betydelse, precis som du säger Rikard.

                            När jag kör med kodsnutten så verkar det visa rätt. Fattar dock inte vad och "mfipereriod" betyder. (kommer in en smiley här ser jag...)

                            Men tack för koden!

                            Comment


                            • #15
                              Ursprungligen postat av Rikard Nilsson Visa inlägg
                              Fasta analysmetoder är scriptbaserade, men scriptkommandon är genererade i scriptmotorn som är skriven i C++.

                              1. Det är egentligen inget fel utan en definitionsfråga, om tex 3 perioder ska avse from innevarande eller from förra perioden och bakåt.
                              2. Som scriptet ovan är skrivet drar vi av ett från periodvärdet för att få ut samma som C++ versionen MFI()
                              3. Se 2
                              4. Det kan ev finnas fler scriptkommandon som har samma definition, främst spelar det roll när man ska få samma kurvor som andra analysprogram osv. Oftast är det bara att prova att öka perioden med 1 och se om det stämmer.
                              5. Se 4
                              6. Om ni använder scriptet ovan blir det rätt. Allt som behövs är att ersätta C, L, H och V med cmpref()-satser.

                              From innevarande borde agera snabbare, fastän med risk för extremvärden som kan vara en kort stund. Särskilt i börja av perioden?

                              Ska man vara riktigt avancerad kör from förra tills tex halva perioden passerat och sedan innevarande tills nästa period börjar.

                              Comment

                              Working...
                              X