Allmänt meddelande

Collapse
No announcement yet.

Hur fungerar AREF

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

  • Hur fungerar AREF

    Jag har uppmärksammat konstiga buggar i mina script när jag använder AREF().

    Målet är att räkna ut RSI för 2-perioder.
    Betrakta de rödmarkerade partierna nedan.

    Exempel:
    mRelativeStrengthIndexGain4=DIV(ADD(mRelativeStrengthIndexGain3,AREF(mRelativeStrengthIndexGain3,1)),2)

    Detta borde entligt mig räkna ut dagens "mRelativeStrengthIndexGain3", gårdagens "mRelativeStrengthIndexGain3" och dela med två.

    dag 0
    mRelativeStrengthIndexGain3 = 100
    mRelativeStrengthIndexGain4 = N/A

    dag1
    mRelativeStrengthIndexGain3 = 0
    mRelativeStrengthIndexGain4 = 50

    dag2
    mRelativeStrengthIndexGain3 = 0
    mRelativeStrengthIndexGain4 = 25

    dag2
    mRelativeStrengthIndexGain3 = 0
    mRelativeStrengthIndexGain4 = 12.5

    osv...

    mRelativeStrengthIndexGain4 kan således aldrig bli noll, eftersom man delar ett positivt tal med 2, blir det fortfarande större än noll.

    Dock har jag uppmärksammat att ofta så blir just
    mRelativeStrengthIndexGain4 noll,trots att den var positiv dagen före.
    Hur funkar AREF() egentligen?
    Jag förstår ju att tidsserien måste börja någonstans. Hur sker detta? RSI brukar definieras som "Ta första x dagarnas medelvärde, ta därefter gårdagens medelvärde, vikta med x-1, addera dagens medelvärde och dela med x".






    Kod:
    mRSPeriods:=2
    
    
    i5(
    
    xStockDailyClose=cmpref(C,0,A)
    xStockDailyOpen=cmpref(O,0,A)
    xStockDailyHigh=cmpref(H,0,A)
    xStockDailyLow=cmpref(L,0,A)
    
    
    {Calculate the 2 period RSI}
    mRelativeStrengthIndexDelta=SUB(xStockDailyClose,AREF(xStockDailyClose,1)) {Delta close sedan igår}
    mRelativeStrengthIndexGain1=IF(GT(mRelativeStrengthIndexDelta,0),mRelativeStrengthIndexDelta,0) {Om delta är positivt, sätt delta, annars noll}
    mRelativeStrengthIndexGain2=SUM(mRelativeStrengthIndexGain1,mRSPeriods) {Summera gain över antal perioder}
    mRelativeStrengthIndexGain3=DIV(mRelativeStrengthIndexGain2,mRSPeriods) {Räkna ut medelvärdet}
    [COLOR="Red"]mRelativeStrengthIndexGain4=DIV(ADD(mRelativeStrengthIndexGain3,AREF(mRelativeStrengthIndexGain3,1)),2) {släta ut medelvärdet}[/COLOR]
    mRelativeStrengthIndexLoss1=IF(LT(mRelativeStrengthIndexDelta,0),ABS(mRelativeStrengthIndexDelta),0) {Om delta är negativt, sätt abs av delta, annars noll}
    mRelativeStrengthIndexLoss2=SUM(mRelativeStrengthIndexLoss1,mRSPeriods) {Summera loss över antal perioder}
    mRelativeStrengthIndexLoss3=DIV(mRelativeStrengthIndexLoss2,mRSPeriods) {Räkna ut medelvärdet}
    [COLOR="Red"]mRelativeStrengthIndexLoss4=DIV(ADD(mRelativeStrengthIndexLoss3,AREF(mRelativeStrengthIndexLoss3,1)),2) {släta ut medelvärdet}[/COLOR]
    mRelativeStringthIndex1=DIV(mRelativeStrengthIndexGain4,mRelativeStrengthIndexLoss4) {Räkna ut kvoten}
    mRelativeStringthIndex2=ADD(1,mRelativeStringthIndex1) {1+RS}
    mRelativeStringthIndex3=DIV(100,mRelativeStringthIndex2) {100/(1+RS)}
    mRelativeStringthIndex4=SUB(100,mRelativeStringthIndex3) {100-100/(1+RS)}
    mRelativeStringthIndex5=IF(GT(mRelativeStrengthIndexLoss4,0),mRelativeStringthIndex4,100) {If we div by zero, rsi is 100 by def}
    
    draw(mRelativeStringthIndex5,1,bsd)
    draw(MULT(mRelativeStrengthIndexGain4,10),2,gse)
    draw(MULT(mRelativeStrengthIndexLoss4,10),3,rse)
    
    AND(1,0)
    )
    
    {@A(0,OMX Stock )}

  • #2
    Ingen som vet?

    Comment


    • #3
      Enligt script referensen:

      A, B eller C refererar till de extra objekt du valt för scriptet. Dessa väljer du valfritt bland alla instrument i systemet och i valfri upplösning per intraday eller dagskurser. Till standardobjektet i scriptet som pappret är anslutet till används ju REF(d,p) eller AREF() för samma sak.

      Du kan alltså välja period i parameter två för cmpref.

      Comment


      • #4
        Hmm, det var många bokstäver här.
        Men vad jag kan se har du aref() innanför intradayparanteser i5(). Det innebär att 2 perioder bakåt blir 10 min bakåt.

        Comment


        • #5
          Mycket möjligt, men kan scriptet läsa extra objekt med Aref ?

          Comment


          • #6
            Henric, jag har för mig att vi har haft upp den frågan tidigare i någon tråd. Om jag inte missminner mig blev svaret då negativt.

            Comment


            • #7
              ja, kanske.

              cerion kanske kan lösa detta genom att kolla perioder bakåt i dagsupplösning.

              cmpref(o,0,A)
              cmpref(o,1,A)

              Comment


              • #8
                Ni missförstår mig nog lite båda två.

                Ursprungligen postat av LillWicke Visa inlägg
                Hmm, det var många bokstäver här.
                Men vad jag kan se har du aref() innanför intradayparanteser i5(). Det innebär att 2 perioder bakåt blir 10 min bakåt.
                LillWicke:
                i5() betyder att scriptet kör i 5-min-upplösning. Jag läser dock in externa objektet i dagsupplösning. Om man då tar AREF(x,1) på detta objekt innebär det att man tittar en handelsdag tillbaka, inte 5 minuter.



                Ursprungligen postat av Henric Visa inlägg
                ja, kanske.

                cerion kanske kan lösa detta genom att kolla perioder bakåt i dagsupplösning.

                cmpref(o,0,A)
                cmpref(o,1,A)
                Henric:
                Det är inte "rådatan" av OMXS30 från igår jag vill läsa in, utan den bearbetade versionen efter att mina script räknat ut totalGain och totalLoss.

                Så ett förtydligande av vad jag är ute efter:
                1) Du läser in OMXS30 i dagsupplösning.
                2) Utför beräkningar på detta = X
                3) Använder den beräkningen från igår Y=AREF(X,1)
                4) Använd Z=AREF(Y,1), dvs gårdagens Y
                5) Z blir fel

                Ett bevis på detta är att min gain (grön) eller loss (röd) som mitt script ovan ritar ut, kan bli noll. Det är omöjligt om NAT räknat rätt.

                Betakta denna kodraden:
                mRelativeStrengthIndexGain4=DIV(ADD(mRelativeStrengthIndexGain3,AREF(mRelativeStrengthIndexGain3,1)),2) {släta ut medelvärdet}

                Den adderar dagens "Gain3" med gårdagens "Gain3", och delar med två. Om "Gain3" någon gång någonsin blivit större än noll, kommer den aldrig att kunna bli 0.0.

                Right?

                Comment


                • #9
                  Om du skriver xStockDailyClose=cmpref(C,0,A) och stopper in det i ett script som kör i 5-minutersupplösning läser du in omx i 5-minutersupplösning för innevarande period.

                  Comment


                  • #10
                    Nej, det blir faktiskt inte det.

                    Testa detta tex:

                    i5(
                    xStockDailyClose=cmpref(C,0,A)

                    draw(xStockDailyClose,1,gqb)
                    draw(AREF(xStockDailyClose,1),2,rqb)
                    draw(AREF(xStockDailyClose,2),3,kqb)
                    )

                    {@A(0,OMX Stock )}

                    Comment


                    • #11
                      Ok, du använder {@A(0,OMX Stock )} i slutet av scriptet. (0=dagskurser).

                      Orkar inte tänka nu, får återkomma senare och se om jag upptäcker något.

                      Comment


                      • #12
                        Japp, jag läser in dagskurserna direkt.
                        Fundera gärna vidare ang Aref()

                        Rikard kanske kan kasta en strimma ljus över det hela?

                        Comment


                        • #13
                          Vad jag kan tänka mig är att aref() inte klarar av att beräkna sig själv som en funktion av sig själv och att det är där det blir fel.

                          Dvs. y=aref(aref(x,1),1) går inte att exekvera korrekt.
                          Detta är en gissning från min sida bara, men det är säkert något som Rikard kan dementera eller bekräfta.

                          Comment


                          • #14
                            Det verkar funka:
                            y=aref(aref(x,1),1)
                            z=aref(x,2) {blir samma}


                            i5(
                            xStockDailyClose=cmpref(C,0,A)

                            draw(AREF(AREF(xStockDailyClose,1),1),3,rqb)
                            draw(AREF(xStockDailyClose,2),4,bqb1)
                            )

                            {@A(0,OMX Stock )}


                            Men det är nog här någonstans NAT buggen ligger.

                            Comment


                            • #15
                              Om vi skriker BUGG tillräckligt högt så kommer nog Rikard farande snart.

                              Comment

                              Working...
                              X