Allmänt meddelande

Collapse
No announcement yet.

ALMoving Average

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

  • ALMoving Average

    Är det möjligt att skriva en script i NAT så att den skall göra exact som VBA kod nedan?
    Window, sigma, offset är variabla parametrar.

    VBA Excel specifika anrop som days, prisKolumn, Cells() är inte relevanta:
    Days anger i min VBA Excel hur mångar dagar bakåt vill jag se kurvan.
    prisKolumn anger i vilken kolumn finns CLOSE kurser.

    Hoppas någon kan klura ut koden. Detta 21-dagars medelvärde kurvan fäljer väldigt bra CLOSE kurvan och samtidigt är mycker smooth.
    Mvh
    Thomas
    *********************************************

    Window = 21
    sigma = 8
    offset = 1

    m = (offset * (Window - 1))
    s = Window / sigma


    prisKolumn = 1
    days = 400

    For i = 1 To days - Window
    WtdSum = 0
    CumWtd = 0
    Wtd = 0
    For k = 0 To Window - 1
    Price = Cells(i + k, prisKolumn)
    Wtd = Exp(-((k - m) * (k - m)) / (2 * s * s))
    WtdSum = WtdSum + Wtd * Price
    CumWtd = CumWtd + Wtd
    Next
    alAv = WtdSum / CumWtd
    Cells(i + Window - 1, 2).Value = alAv
    Next

    ************************************************

  • #2
    Den första lopen finns bara som data feed och behöver inte användas i AT. Det ser ut att fungera. Jag får samma som VBA ner till 7 decimaler. Du får själv kolla om det verkar ok.

    antalV:=21
    zigma:=8
    offset:=1
    mmm:=mult(offset,sub(antalV,1))
    sss1:=div(antalV,zigma)
    sss2:=mult(mult(sss1,sss1),2)

    retval(0,0)
    retval(0,1)
    retval(21,3)
    ack=cum(1,antalV)
    Wtd1=mult(div(mult(sub(sub(ack,1),mmm),sub(sub(ack,1),mmm)),sss2),-1)
    Wtd2=exp(Wtd1)
    Prize=aref(c,Getval(3))
    retval(add(getval(0),mult(Wtd2,Prize)),0)
    retval(add(Wtd2,Getval(1)),1)
    retval(sub(Getval(3),1),3)
    loop(ack,antalV)

    alAv=div(Getval(0),Getval(1))
    draw(alAv,3,bqb){rita kursstaplar}


    and(0,0)

    Comment


    • #3
      Tack för svaret, skall testa scriptet.
      Mvh
      Thomas

      Comment


      • #4
        Liten ändring. Vad är syftet med scriptet? Kurvan blir ganska lik ett kort ema eller mov(c,x,e)

        antalV:=21
        zigma:=8
        offset:=1
        mmm:=mult(offset,sub(antalV,1))
        sss1:=div(antalV,zigma)
        sss2:=mult(mult(sss1,sss1),2)

        retval(0,0)
        retval(0,1)
        ack=cum(1,antalV)
        Wtd1=mult(div(mult(sub(sub(ack,1),mmm),sub(sub(ack,1),mmm)),sss2),-1)
        Wtd2=exp(Wtd1)
        Prize=if(eqv(ack,21),c,aref(c,sub(21,ack):20))
        retval(add(getval(0),mult(Wtd2,Prize)),0)
        retval(add(Wtd2,Getval(1)),1)
        loop(ack,antalV)
        alAv=div(Getval(0),Getval(1))

        draw(alAv,3,bqb){rita kursstaplar}


        and(0,0)

        Comment


        • #5
          Nu har jag inte testat scriptet ännu men kurvan bör följa C-kurvan med ganska liten eftersläppning. Det är definitivt inte lik kort ema eller mov(c,x,e) om du skall ha de på 21 dagar.

          Comment


          • #6
            Oj, jag menar inte 21 dagar på medelvärdet, utan att använda ett kortare exponentiellt medelvärde för syftet med vad du vill göra. Jag ritade mov(c,9,e) och den kom ganska nära i stora drag. Givetvis skiljer det. Jag körde vba-koden i Excel och jämförde värdena med output från scipten och de blev samma på 2 decimaler.

            Comment


            • #7
              Hej Henric,
              Scriptet du skrivit ritar en ALMA kurva korrekt. Dock skapar scriptet inte en serie som man kan referera till bakåt. Jag får inget korrekt värde om jag vill t.ex. testa GT(aref(alAv,1),aref(alAv,2)). Det blit alltid sant. Det blir också så om jag vill jämföra alAv med en annan serie en eller flera dagar/perioder bakåt. Det fungerar dock alltid TEST(alAv,enAnnanSerie). Varför är det så?
              Mvh Thomas

              Comment


              • #8
                Det är som du skriver. Retval håller endast värden och skapar inte en dataserie. Uttryck som innehåller retval verkar automatiskt få nuvarande värde om det används med aref. Fråga mig inte varför det år så.

                Comment


                • #9
                  Tack för svaret.
                  Trodde att du kanske hade en fix för det.
                  Mvh
                  Thomas

                  Comment


                  • #10
                    Möjligt att man kan lagra senaste periodernas värden i separata globala celler med SetGVarIfGUI() som skriver till celler även när scriptet körs i diagram. Blir lite meckigt men går nog att lösa.

                    Comment


                    • #11
                      Här med två perioder bakåt. Vill man ha många perioder bakåt får celler användas. Detta är endast för diagramritning. Annars måste man kolla om det är en ny period när värdena läses över till perioder baktåt.

                      antalV:=21
                      zigma:=8
                      offset:=1
                      mmm:=mult(offset,sub(antalV,1))
                      sss1:=div(antalV,zigma)
                      sss2:=mult(mult(sss1,sss1),2)

                      retval(Getval(2),3) {aref-2}
                      retval(div(Getval(0),Getval(1)),2) {aref-1}
                      retval(0,0)
                      retval(0,1)
                      ack=cum(1,antalV)
                      Wtd1=mult(div(mult(sub(sub(ack,1),mmm),sub(sub(ack,1),mmm)),sss2),-1)
                      Wtd2=exp(Wtd1)
                      Prize=if(eqv(ack,21),c,aref(c,sub(21,ack):20))
                      retval(add(getval(0),mult(Wtd2,Prize)),0)
                      retval(add(Wtd2,Getval(1)),1)
                      loop(ack,antalV)
                      alAv=div(Getval(0),Getval(1))

                      draw(Getval(3),5,gqb)
                      draw(Getval(2),4,rqb)
                      draw(alAv,3,bqb){rita kursstaplar}

                      and(0,0)

                      Comment


                      • #12
                        Tack Henric,
                        Skall testa vad man kan gör med det.
                        @Rikard Autostock
                        Rikard, det borde väl vara en liten grej att lägga till AL MOV som en funtion i NAT?
                        I och med att AL MOV är beskriven i ett papper som är publikt så det är väl inte copyright skyddad, eller?
                        Mvh
                        Thomas

                        Comment

                        Working...
                        X