Allmänt meddelande

Collapse
No announcement yet.

For och while loopar

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

  • For och while loopar

    Fråga, går det att köra loopar generellt, och är det då bara att initiera variabeln till ett 0-värde?

    Jag ser att bl.a. många kör loopar i ordersekvenserna, var lägger man in den logiken?
    gbd

  • #2
    Nej det finns inte vad man menar med loopar i scripten i sig.

    Dock styr du enkelt allt byte av sekvens bland ordermodellerna med stega-scripten.

    Om du på 3e sidan för en sekvens inte ser stega och synkascript av välja in så gå till Preferenser och Handel och kryssa för detta.

    Man måste inte använda stega och synkascripten för att det är tillåtna, utan du väljer för varje ordermodell hur du vill göra. Dock alla sekvenser i en ordermodell måste använda stega-script, om någon sekvens i modellen gör det.

    Principen är enkel. Returnera ett värde från 1 - 10 för att bestämma vilken sekvens som skall bli nästa efter denna är avklarad order på. Det är ett absolut värde. Man kan göra förflyttningen relativ den man står på t.ex returnera 2 för att flytta två sekvenser vidare.
    Sätt cell 0 med värde skiljt från noll så betraktas returvärdet som relativ förflyttning istället för absolut.

    Synka-scripten är samma princip, men dessa körs bara då du ansluter modellen, och du kan då bestämma vilken sekvens modellen nu skall stå på enligt din analys av marknaden i scriptet.

    Sedan finns ett tillval i Preferenser att även köra synka-script varje gång triggerscript är falskt, dvs du har möjlighet att modellen flyttar aktiv sekvens utan att exevkera order först.

    Comment


    • #3
      Tilldela variabel initialt värde

      Är inte Friendly känsligt för en variabels initiala värde som kan vara vad som helst innan den utfört en logisk beräkning?
      Vissa system kan ju få fnatt om den inte har ett initialt värde (oftast 0) när den börjar på första "baren"(stapeln).

      Ex. i Metastock finns ett uttryck som heter prev , som kan användas för att referera till en variabels föregående värde.

      I en if sats kan den användas så här:
      If((C*0.97>Prev , C*0.97 , If((C*1.03<Prev, C*1.03, Prev))

      Hur skulle det se ut i Friendly?
      gbd

      Comment


      • #4
        If((C*0.97>Prev , C*0.97 , If((C*1.03<Prev, C*1.03, Prev))

        retval(if(gt(mult(c,0.97),getval(2)),mult(c,0.97),if(lt(mult(c,1.03),getval(2)),mult(c,1.03),getval(2))),2)

        på Metastocks läsvänliga syntax.

        3up:=mult(c,1.03)
        3ner:=mult(c,0.97)
        if1:=if(lt(3up,getval(2)),3up,getval(2))
        if2:=if(gt(3ner,getval(2)),3ner,if1)
        retval(if2,2)

        Detta upplägget kommer ju att fylla cell 2 i första vändan då det värdet alltid är initierat till noll vid kompileringen. Så första perioden får 3ner alltid.

        Celler 0-9 kan användas för att flytta värden mellan perioder i en graf eller för körning i analysbänken för samma sak.

        Comment


        • #5
          mer 0-värden i logik

          Betyder det att i första perioden så jämförs uttrycket if1 så jämförs 3up med värdet 0 och returnerar falskt d.v.s 0 och if2
          jämför 3ner med 0 och returnerar 3ner?

          Om man jag hängde med ovanstående logik hur agerar då
          LT(LLVBARS(L,10),1), får uttrycket LLVBARS 0 om det inträffar i senaste period eller?
          gbd

          Comment


          • #6
            Ja, det stämmer.

            Alla rader med := är definitioner och körs inte i det skicket. Det är rader utan := som blir körbar kod i detta fallet retval().

            Så if2:s test med gt(3ner,getval(2)) blir alltid sann i första perioden, eftersom cell 2 är noll då. Så första cellen får alltid 3ner som värde.

            Så resultatet av detta blir detsamma som med prev.

            När man översätter Metastock script får man dock se upp för prev-funktionen härrör från den specifika radens resultat som prev står på, inte hela scriptets resultats förgående värde. Varje rad i Metastock är ju ett statement som avslutas med semikolon. Har gjort den tabben när jag översatt någon gång.

            Sedan stämmer det också att llvbars() ger 0 om det är innevarande period som har det första lägsta värdet. Det kan ju finnas ett lika lågt värde längre bak också, men den första perioden som har lägstavärdet returneras avståndet till.

            Comment


            • #7
              Fråga 1
              Om man har behov av minnescellerna för andra variabler,
              vad händer om man inte lägger undan i minnesceller utan använder AREF istället:

              3up:=mult(c,1.03)
              3ner:=mult(c,0.97)
              if1:=if(lt(3up,AREF(3up,1) ),3up,AREF(3up,1))
              if2:=if(gt(3ner,AREF(3ner,1) ),3ner,if1)


              Fråga 2
              Hittade inget dokumenterat om date och frac-funktionen,
              vad skiljer melllan frac(d) och frac(date())?
              gbd

              Comment


              • #8
                #1. Aref() tar ju förra värdet av det man matar det med i dataserien(1:a parametern). Du tittar ju en period bakåt, men du får inte med dig förra värdet av hela uttrycket, som MS-scriptet gör via prev.

                Sedan finns ett generellt problem med metoder som bygger på prev alls, och det är att en viss periods värde på uttrycket blir olika beroende på var en graf börjar. MS arbetar ju från grafens början.

                Och det gör ju det jag visade som det översatta scriptet också.

                Men i en graf beräknas ju scriptet gång på gång i varje period genom hela grafen.

                När du sedan vill göra en test av något för bevakning så körs enbart allra sista perioden i scriptet. Skall man göra saker som skall kunna bevaka något så måste all info kunna samlas från den perioden.

                Så man måste göra en del speciallösningar för att bevaka med metoder som bygger på förgående periods resultat. Man måste skaffa en fixpunkt som man scannar bak till, och genomför alla beräkningar för att se vad det är i innevarande period.

                #2. Date() skapar ett flyttal som är uppbyggt på ungefär samma sätt som datum+tid i Excel. Dvs heltalsdelen är ett löpnummer enligt julianska datumkalendern, och decimaldelen är hur långt från midnatt man är på dygnet för att bestämma klockslaget.

                På så sätt kan man göra aritmetik på datum också. Konstanden D var som helst i script ger dig tidstämpeln(starttidpunkten) för innevarande period och kan behandlas på samma sätt.

                Det gäller för intraday. Per dagskurser så ger D dig tidpunkten för senaste kurs.

                Så frac(date()) ser till att du bara får klockslaget och filtrerar bort datumbiten.

                Comment


                • #9
                  Ja precis som du säger ett generellt problem med metoder som bygger på prev alls, och det är att en viss periods värde på uttrycket blir olika beroende på var en graf börjar.

                  Fråga1
                  Lösningen kan ju vara att tilldela värdet 0 för första perioden
                  men variabeln måste ju ändå lagras av Friendly även om skriptet kör enbart sista perioden eller?

                  Jag har en hel del modeller som bygger på att man tar hänsyn till signaler både föregående dagar men även veckosignaler.
                  En enkel sak brukar ju vara breakouts t.ex. över föregående motstånd eller under stöd.
                  Se t.ex. http://www.decisionbar.com/html/screen.html#
                  (klicka på charten)
                  Då vill man lagra undan t.ex. motståndsnivåer.

                  Fråga 2
                  Det finns 8 lediga cellreferenser eler hur så risk är att de tar slut,
                  men visst kan man nå tilldelade variabler ändå?

                  Eller?
                  gbd

                  Comment


                  • #10
                    #1. Så länge du kan beräkna från nu och bakåt så är det inga problem alls.

                    Det är vanligen bara att göra

                    avstånd=hhvbars(signaleravadsomhelst,tillräcklig period)

                    så kan du hitta avståndet i perioder till senaste signal.

                    Sedan göra en aref(v,avstånd) för att hämta close därifrån.

                    Och det går annars också att skapa en fixpunkt

                    bakåt1:=100
                    i30(
                    fixpunkt=date(20060403.5)
                    psedanfix=hhvbars(and(ge(d,fixpunkt),lt(ref(d,1),fixpunkt)),bakåt1)
                    rsi(psedanfix:bakåt1)
                    )

                    Här ett rsi som utgår från i måndags kl 12.00. Bara att se till att bakåt1 är tillräckligt stort för att nå förbi fixpunkten.

                    OBS! Syntax med kolon där du måste ange vilket maxvärdet som kan dyka upp där som periodvärde.

                    #2. Cellreferenserna behövs egentligen bara när du måste överföra info i scriptet som inte kan beräknas framifrån och bakåt.

                    Och vid backtesting kan du tjäna mycket prestanda på att nyttja det för att lagra undan tidpunkten för senaste signal, istället för att varje period skall scanna bakåt massa veckor. Bättre att lagra undan när scriptet passerar en viss stapel som har signal.

                    Dock kommer jag snart att införa globala variabler som har livslängd t.o.m förbi att scriptet körs. Kanske blir det så att retval(d,10-99) adresserar sådana globala celler. Eller så blir det en separat funktion för det.

                    Comment


                    • #11
                      Vad händer med följande:

                      Prev:=0
                      i30(
                      Prev=if(gt(mult(c , 0.97), Aref(prev,1)), mult(c,0.97),if(lt(mult(c,1.03), Aref(Prev,1)),mult(c, 1.03), Aref(Prev,1))
                      Prev
                      )
                      gbd

                      Comment


                      • #12
                        #1. Överallt där texten Prev förekommer placeras text 0 istället. Alltså en ren sök-ersätt- historia.

                        Så dels blir det en variabel med namnet noll på raden prev= blir 0=, och sedan värdet noll på övriga ställen.

                        #2. Även om du skulle ge namn och en initiering så effekten inte blir som i #1, överförs inte info från en period till en annan.

                        Prev får alltså aldrig längre array än scriptet behöver längre ned. Dvs i detta fallet längden 1 värde returneras där dvs senaste.

                        Man kan förståss luras på lite olika sätt om man sjunker in i hur kompilatorn arbetar.

                        En rad efter

                        prev=
                        mov(prev,3,s)

                        skulle se till att prev har minst 3 st värden av något slag. Men då måste man se vad som händer med vad som skapar värden i prev.

                        C för close tittar förståss lätt 3 perioder bakåt. Sedan är jag osäker vad som blir fallet med prev självt.

                        Kompilatorn blir förvirrad för du hänvisar till ej deklarerad variabel(även om jag förstod att din första rad skulle göra detta) och i första passet så byggs en tabell med vilka variabler som finns, och de bildas av förekomst av

                        prev=

                        så bildas prev. Men referensen på samma rad vill länk till ett ställe som inte finns ännu, eftersom kompilatorn länkar varje funktion direkt när man träffar på den.

                        Luras lite kan man göra genom att göra initiering först

                        i30(
                        prev=add(0,0)
                        Prev=if(gt(mult(c,0.97),Aref(prev,1)),mult(c,0.97),if(lt(mult(c,1.03),Aref(Prev,1)),mult(c,1.03),Aref(Prev,1)))
                        mov(prev,3,s)
                        )
                        Det funkar. Då länkas dessa samman korrekt och blir samma plats i minnet. Men det blir 4 celler som initieras(3+1) med noll varje periods inledning. Så för att överföra från en period till en annan funkar det inte.

                        Minns att jag vid tillfälle lekte med rev(d,p) för att reversera dataserien.

                        Har inte tid nu att sjunka in i det, men den fasta referenspunkten enligt tidigare förslag, och sedan rev() på samma antalperioder man fanns med hhvbars() gör att man från en period skannar bakåt på en reverserad dataserie, vilket ju blir framåt i praktiken.

                        Så om du hinner för mig så lek runt lite med

                        avstånd=hhvbars(signaleravadsomhelst,tillräcklig period)
                        nubakvänt=rev(signaleravadsomhelst,avstånd)

                        signaleravadsomhelst kan vara dina dubbla if()-satser då.

                        Måste gå nu.

                        Comment


                        • #13
                          Har haft en hektisk period så jag har inte hunnit prova skriptet
                          vi diskuterade ovan:
                          3up:=mult(c,1.03)
                          3ner:=mult(c,0.97)
                          if1:=if(lt(3up,getval(2)),3up,getval(2))
                          if2:=if(gt(3ner,getval(2)),3ner,if1)
                          retval(if2,2)

                          Men nu när jag provar det så tänkte jag bara rita en graf på värden i cell2 med hjälp av
                          getval(2)
                          Men det bidde inte mycket till graf, visst borde det returnera värdet, eller är jag ute och cyklar?
                          gbd

                          Comment


                          • #14
                            Det verkar som om datainsamlingen hade stannat på Nasdaq,
                            är det därför som den inte returnerar ett värde i cell2?
                            Det borde väl fungera även på dagsdata?
                            gbd

                            Comment


                            • #15
                              Scriptet i sig returnerar det från sista raden, vilket är samma som cell 2, så att rita grafen behöver du egentligen bara ansluta scriptet.

                              Märk att cell 2 lever bara för det innevarande scriptets livslängd när det körs. Getval() från annat script returnerar ingenting.

                              Vet inte hur det gjort?

                              Comment

                              Working...
                              X