Allmänt meddelande

Collapse
No announcement yet.

minnesreferenser

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

  • minnesreferenser

    Hej Rikard,
    Jag har skrivit ett enkelt script som beräknar indikator CCI.
    I det här fallet scriptet skulle visa två grafer (en av dem är förflyttat en dag tillbaka – märkt med ”d1”).

    TP:=DIV(ADD(ADD(H,L),C),3)
    TP_d1:=DIV(ADD(ADD(REF(H,1),REF(L,1)),REF(C,1)),3)

    MEANDEV:=MOV(ABS(SUBT),20,S)
    MEANDEV_d1:=MOV(ABS(SUBT_d1),20,S)

    SMTP:=MOV(TP,20,S)
    SMTP_d1:=MOV(TP_d1,20,S)

    SUBT:=SUB(TP,SMTP)
    SUBT_d1:=SUB(TP_d1,SMTP_d1)

    X:=SUB(TP,SMTP)
    Y:=MULT(0.015,MEANDEV)

    X_d1:=SUB(TP_d1,SMTP_d1)
    Y_d1:=MULT(0.015,MEANDEV_d1)

    CCI:=DIV(X,Y)
    CCI_d1:=DIV(X_d1,Y_d1)

    CROSS(CCI, CCI_d1)

    Tyvärr kan jag inte få CROSS(CCI, CCI_d1) då överskrider jag parentesdjup.
    _______________________________________________________________
    För att sänka parentesdjupet måste man använda minnesreferenser (börja använda ”=” likamed)

    CCI=DIV(X,Y)
    CCI_d1=DIV(X_d1,Y_d1)

    CROSS(CCI, CCI_d1)

    Kompilator accepterar scriptet men CROSS(CCI, CCI_d1) visar aldrig någonting därför att programet få alltid CCI=CC_d1
    _____________________________________________________________
    För att testa djupare använder jag CROSS(CCI,100) eller CROSS(CCI_d1,100)

    CCI=DIV(X,Y)
    CCI_d1=DIV(X_d1,Y_d1)

    CROSS(CCI, 100)

    I det här fallet för jag ”flaga” för CCI_d1. Från någon anledning programet hämtar bara det senaste värdet (CCI_d1) och lägger det i CROSS funktionen.
    _______________________________________________________________
    Om jag vänder ordning då CROSS(CCI,100) visar rätt ”flaga” – för CCI

    CCI_d1=DIV(X_d1,Y_d1)
    CCI=DIV(X,Y)

    CROSS(CCI, 100)
    ________________________________________________________________

    Om jag ändrar skriptet (denna gången i CROSS funktionen) får jag en rätt ”flaga” – för CCI_d1

    CCI_d1=DIV(X_d1,Y_d1)
    CCI=DIV(X,Y)

    CROSS(CCI_d1, 100)
    ________________________________________________________________
    I de två senaste fallen programet visar bådda värdena CCI_d1 och CCI korrekt.
    Därför förljande skript visar äntligen korsningsflaga mellan två diagramer (CCI och CCI_d1).

    CCI_d1=DIV(X_d1,Y_d1)
    CCI=DIV(X,Y)

    CROSS(CCI_d1, CCI)

    Rikard kan du förklara mig varför programet ville inte fungera tidigare. Jag skulle vilja ha bättre förståelse hur minnesreferenser fungerar och hur kan man använda dem på rätt sätt i skripter.

    Tack på förhand.
    Daniel
    //Daniel

  • #2
    Hej dw2002,

    Du har gjort ett klassiskt fel när det gäller kodning i AT:s scriptspråk.
    Namndefinitioner får ej skrivas så att de är del av annan namndefinition.

    Detta år fel:
    TP:=DIV(ADD(ADD(H,L),C),3)
    TP_d1:=DIV(ADD(ADD(REF(H,1),REF(L,1)),REF(C,1)),3)

    TP är del av TP_d1.

    Detta är rätt:
    TP_d0:=DIV(ADD(ADD(H,L),C),3)
    TP_d1:=DIV(ADD(ADD(REF(H,1),REF(L,1)),REF(C,1)),3)



    Sedan måste MEANDEV komma efter SUBT i koden eftersom SUBT användes
    i MEANDEV.


    Så här skall det se ut:
    TP_d0:=DIV(ADD(ADD(H,L),C),3)
    TP_d1:=DIV(ADD(ADD(REF(H,1),REF(L,1)),REF(C,1)),3)

    SMTP_d0:=MOV(TP_d0,20,S)
    SMTP_d1:=MOV(TP_d1,20,S)

    SUBT_d0:=SUB(TP_d0,SMTP_d0)
    SUBT_d1:=SUB(TP_d1,SMTP_d1)

    MEANDEV_d0:=MOV(ABS(SUBT_d0),20,S)
    MEANDEV_d1:=MOV(ABS(SUBT_d1),20,S)

    X_d0:=SUB(TP_d0,SMTP_d0)
    Y_d0:=MULT(0.015,MEANDEV_d0)

    X_d1:=SUB(TP_d1,SMTP_d1)
    Y_d1:=MULT(0.015,MEANDEV_d1)

    CCI_d0=DIV(X_d0,Y_d0)
    CCI_d1=DIV(X_d1,Y_d1)

    CROSS(CCI_d0, CCI_d1)

    Comment


    • #3
      Hej Daniel! Vilken script-rivstart du gjort!

      Det jag ser så där direkt som kan ställa till problem är att du har variabler som är delnamn av andra variabler, tex:

      MEANDEV:=MOV(ABS(SUBT),20,S)
      MEANDEV_d1:=MOV(ABS(SUBT_d1),20,S)


      där MEANDEV är delnamn av MEANDEV_d1. Det ställer oftast till problem för scriptkompilatorn som blandar ihop saker och ting. Alla variabler måste vara helt entydiga. Skriv hellre något i stil med:

      MEANDEV_d0:=MOV(ABS(SUBT_d0),20,S)
      MEANDEV_d1:=MOV(ABS(SUBT_d1),20,S)

      så kan det inte blandas ihop. Det gäller alla variabler.



      /Rikard

      Comment


      • #4
        Hej Nga och Rikard,
        Stort tack för hjälpen! Er erfarenhet är ovärderlig.

        Bifogad finns det en bild som visar två graffer och flagan CROSS(CCI_d0, CCI_d1)
        Tyvärr, linjerna finns inte exakt i korsningspunkter.
        Det vore interessant att höra era åsikter vad kan det beror på.

        Hälsningar Daniel
        Attached Files
        //Daniel

        Comment


        • #5
          Nästa sak som jag kan inte hitta i Autostock Trader är möjlighet att rita en vanlig horizontal linje med en definierad värde till ex. 100.
          Det kan bli interesant för att grafisk verifera om skripten fungerar som den ska.
          Det är särsilt användbart i Analys fältet då värderna från vertikal axel är svart att läsa.
          //Daniel
          //Daniel

          Comment


          • #6
            Ursprungligen postat av dw2002 Visa inlägg
            Hej Nga och Rikard,
            Stort tack för hjälpen! Er erfarenhet är ovärderlig.

            Bifogad finns det en bild som visar två graffer och flagan CROSS(CCI_d0, CCI_d1)
            Tyvärr, linjerna finns inte exakt i korsningspunkter.
            Det vore interessant att höra era åsikter vad kan det beror på.

            Hälsningar Daniel
            Det som ritas är slutvärdet från scriptet vid varje periods slut. Det betyder att korsningen flaggas i slutet av aktuell period i grafen, men värdena på de båda CCI-kurvorna kan ha korsat varandra rent grafiskt tidigare i perioden. I drift körs scriptet varje kursinsamling, och då får du signal exakt när kurvorna korsas.

            Ursprungligen postat av dw2002 Visa inlägg
            Nästa sak som jag kan inte hitta i Autostock Trader är möjlighet att rita en vanlig horizontal linje med en definierad värde till ex. 100.
            Det kan bli interesant för att grafisk verifera om skripten fungerar som den ska.
            Det är särsilt användbart i Analys fältet då värderna från vertikal axel är svart att läsa.
            //Daniel

            Det är inga problem att rita en horisontell linje i valfritt område, det kan ju vara bra att ha som referens tex. I scriptet nedan finns tre Draw-satser, två som ritar CCI-kurvorna, och en som ritar en röd referenslinje i område Analys 1 med värdet 0 som referens. Skalningen är satt till -100,0,100, alltså noll i mitten.

            Mult-satsen längst ner i scriptet är till för att rita flaggor när scriptet larmar, och jag valde 10% höjd i kursdiagrammet, men det kan man göra som man vill.



            TP_d0:=DIV(ADD(ADD(H,L),C),3)
            TP_d1:=DIV(ADD(ADD(REF(H,1),REF(L,1)),REF(C,1)),3)

            SMTP_d0:=MOV(TP_d0,20,S)
            SMTP_d1:=MOV(TP_d1,20,S)

            SUBT_d0:=SUB(TP_d0,SMTP_d0)
            SUBT_d1:=SUB(TP_d1,SMTP_d1)

            MEANDEV_d0:=MOV(ABS(SUBT_d0),20,S)
            MEANDEV_d1:=MOV(ABS(SUBT_d1),20,S)

            X_d0:=SUB(TP_d0,SMTP_d0)
            Y_d0:=MULT(0.015,MEANDEV_d0)

            X_d1:=SUB(TP_d1,SMTP_d1)
            Y_d1:=MULT(0.015,MEANDEV_d1)

            CCI_d0=DIV(X_d0,Y_d0)
            CCI_d1=DIV(X_d1,Y_d1)

            Draw(CCI_d0,2,yda)
            Draw(CCI_d1,3,bda)
            Draw(0,4,rda)

            Mult(CROSS(CCI_d0, CCI_d1),10)
            Attached Files

            Comment


            • #7
              Tack Rikard!
              Det var kanske enkla frågor, men utan att förstå grunden kan man inte gå vidare med script programmering.
              Den jätte bra support bekräftar en gång till att avtal med Autostock det var rätt val.
              Ha det gott!
              Daniel
              //Daniel

              Comment


              • #8
                Namngivning

                Hej,
                Gäller det fortfarande att variabelnamn inte kan vara delar av varandra? Använder ni en vanlig "search and replace" när ni kompilerar scripten, eller har ni kommit på något smartare? Det verkar ju inte klokt om det vore så, då har jag rätt många timmar av "rätta" kod att göra...

                Hur är begränsningarna isf?

                Om jag har en variabel som heter:
                AB=Funktion

                Är då detta giltligt:
                xAB=Funktion
                ABy=Funktion
                xABy=Funktion

                Comment


                • #9
                  Jo, det är fortfarande så att variabelnamn inte får vara delnamn av varandra.

                  Inget av exemplena är giltiga eftersom AB ingår i alla. Men om du skriver så här blir det korrekt:

                  AB1=Funktion


                  Då blir AB1 helt unikt och xAB och ABy fungerar, men däremot inte xABy eftersom både xAB och ABy är delnamn.

                  Comment


                  • #10
                    Ok då får jag tänka om lite.
                    Tack för ett snabbt svar. Uppskattar verkligen din support Rikard.

                    Comment

                    Working...
                    X