Allmänt meddelande

Collapse
No announcement yet.

Idiom för statefulla script

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

  • Idiom för statefulla script

    Hur är det tänkt att man skall behålla värden mellan script exikveringar? Som jag har testat två varianter men osäker vad som är att föredra.

    Första varianten sparar ner värdena i en extern cell mellan varje exikvering. Problemet här är på rad 8 där jag måste använda SetGVarIf för jag är beroende på en villkorlig skrivning. Jag är osäker om RetVal och SetGVarIf skriver till samma fält och om ens detta då funkar.
    HTML-kod:
    Nivå:=50
    
    Senaste=GetVal(2)
    sPos=Mx(0,Add(Senaste,Sub(C,Ref(C,1))))
    RetVal(sPos,2)
    Draw(sPos,4,DGQB)
    Signal=Gt(sPos,Nivå)
    SetGVarIf(0,2,Signal) {Om vi får signal resetta accumelerade värdet}
    Add(0,Signal)
    Nästa alternativ och det alternativ jag tycker känns mest naturligt är att skapa en dataserie av mina uträknade värden och sedan komma åt det historiska värdet med Aref(d,p). Problemet jag stöter på här är att referera sPos på rad 3 inte syntax checkar ok eftersom jag inte skapar objektet försän senare.
    HTML-kod:
    Nivå:=50
    
    sPos1=Mx(0,Add(Aref(sPos,1),Sub(C,Ref(C,1))))
    Draw(sPos,4,dgqb)
    Signal=Gt(sPos,Nivå)
    sPos=If(Signal,0,sPos1)
    Add(0,Signal)
    Är detta de två alternativ som används i Autotrader för att komma åt historiska värden eller finns det bättre sätt?

  • #2
    Retval/Getval skriver och läser till "lokala" celler inom en och samma scriptkörning.
    Varje script har en egen uppsättning av dessa celler, och de är även kontounika och instrumentunika.

    SetGvarIf däremot skriver till globala celler som sparas på disk. Dessa har ingen koppling till instrument eller konton, så här måste man tänka på vilka celler man använder till vad. Det är dessa celler som även kan användas för att flytta info mellan olika script.

    Comment


    • #3
      Du skall inte ha ett parameternamnen som ingår i ett annat parameternamn, sPos är ju ett delnamn av sPos1. Kalla lämpligen sPos för sPos0 istället.

      Sedan måste du som du själv säger skapa parametrarna i tur och ordning.

      mvh
      Bertil

      Comment


      • #4
        Om man tittar på ovanstående kod snuttar vad skulle jag behöva ändra för att få det funka? Båda snuttarna leder in mig i hörn som ej funkar och jag förstår inte hur jag ska få det funka.

        Comment


        • #5
          Du frågar om att spara värden mellan exekveringar.
          Exekveringarna sker var 5:e sekund så det är väldigt sällan intressant att spara värdena så tätt.
          Man väljer ju i scriptet med vilken stapelbredd beräkningarna skall göras. Om man tex använder minutstaplar i1) så bildar alla parametrar i scriptet dataserier med stapelbreddens upplösning. Dessa dataserier lagras automatiskt men existerar bara i varje script för sig. Globala variabler använder man då man vill överföra data mellan olika script.

          Allmänt då man skall lära sig att koda i NAT så kan man ju göra på två olika sätt.

          1) Hitta en strategi i någon bok och försöka koda ner den. Detta gör du och det är mycket svårt som du ju insett. Man skall både försöka tolka vad författaren menar samtidigt som man måste överför det till NAT som man ännu inte behärskar fullt ut.

          2) Man utgår från script som antingen finns med i NAT eller som finns publicerade på detta forum och utgående från dessa försöker man förstå vad som händer. Man ändrar lite och ser vad skillnaden blir osv. Jag rekommenderar approach nr 2.

          mvh
          Bertil
          Last edited by Bertil; 2018-10-05, 09:03.

          Comment


          • #6
            Ursprungligen postat av favetelinguis Visa inlägg
            Om man tittar på ovanstående kod snuttar vad skulle jag behöva ändra för att få det funka? Båda snuttarna leder in mig i hörn som ej funkar och jag förstår inte hur jag ska få det funka.
            Nivå:=50

            sPos=mx(0,add(GetGvar(20),sub(c,aref(c,1))))
            Draw(sPos,4,DGQB)
            SetGvarIf(if(gt(sPos,Nivå),0,sPos),20,1)
            gt(sPos,Nivå)

            Detta kanske löser ditt problem.

            Generellt är alla script egentligen en lång dataserie, vilket kan var ovant om man kodat i ett annat språk. Scripten läser uppifrån och ner. Minnesreferenser kan bara refereras efter namnet. Det gör koden väldigt effektiv och det går snabbt att referera och använda historiska värden.

            Jag tror inte cell nr. 1-10 går att använda. Åtminstone var det så förut.

            Edit: Jag hann inte skriva klart då det blev orderskurar på en maskin. Det Bertil beskriver ovan är viktigt att tänka på. Live och i simulatorn körs scripten varje insamling(animering) och inte bara när stapeln är fullbordad. I diagram visas värden endast när stapeln är fullbordad. Detta kan påverkar vissa saker som tex värden som skrivs till celler. Det kan lösas genom att tex endast skriva när stapeln är fullbordad eller när ett värde nått min/max hittills, osv. Oftast kan man referera till värden,avslut, etc och behöver inte logga värden på detta sättet, men jag vet ej vad du försöker uppnå.
            Last edited by Henric; 2018-10-05, 09:56.

            Comment


            • #7
              Ursprungligen postat av Bertil Visa inlägg
              Du frågar om att spara värden mellan exekveringar.
              Exekveringarna sker var 5:e sekund så det är väldigt sällan intressant att spara värdena så tätt.
              Man väljer ju i scriptet med vilken stapelbredd beräkningarna skall göras. Om man tex använder minutstaplar i1) så bildar alla parametrar i scriptet dataserier med stapelbreddens upplösning. Dessa dataserier lagras automatiskt men existerar bara i varje script för sig. Globala variabler använder man då man vill överföra data mellan olika script.

              Allmänt då man skall lära sig att koda i NAT så kan man ju göra på två olika sätt.

              1) Hitta en strategi i någon bok och försöka koda ner den. Detta gör du och det är mycket svårt som du ju insett. Man skall både försöka tolka vad författaren menar samtidigt som man måste överför det till NAT som man ännu inte behärskar fullt ut.

              2) Man utgår från script som antingen finns med i NAT eller som finns publicerade på detta forum och utgående från dessa försöker man förstå vad som händer. Man ändrar lite och ser vad skillnaden blir osv. Jag rekommenderar approach nr 2.

              mvh
              Bertil
              Tackar för det förtydligandet. Kanske borde manualerna för nat utökas för att minska förvirringen hos nyanlända. När man läser här på forumet verkar det vara samma typ av frågor som kommer upp flera ggr.

              Håller inte med om att det ena utesluter det andra. Jag föredrar att starta med nr1 och köra fast. Sedan använda nr2 för att ta mig vidare på nr1. Tycker det är viktigt med stora långsiktiga mål.

              Comment


              • #8
                Det viktiga är ju att man jobbar med en strategi/approach som man är intresserad av, det är ju det som ger motivationen att fortsätta. Är man extremt intresserad av approach nr1 så skall man fortsätta så klart.

                Är man däremot ny och funderar på hur man bäst skall lära sig koda i NAT rekommenderar jag som sagt approach nr 2.

                mvh
                Bertil


                Edit: Själv hade jag inte läst någon litteratur om strategier då jag började med NAT, utan jag studerade kursrörelserna i realtid hos terminen, labbade med egna script som innehöll diverse medelvärdesbildningar, plottade dessa, kollade hur man kunde koda en stoploss genom att studera stoplossmini. Hur kunde man förbättra denna genom att ta in fler parametrar mm mm. Sedan kommer man ju till triggerscripten. Hade de strategier som beskrivs i diverse böcker verkligen fungerat över tid och för olika marknader, så skulle ju alla köra dem, vilket inte är fallet.
                Last edited by Bertil; 2018-10-05, 11:08.

                Comment


                • #9
                  Ursprungligen postat av Henric Visa inlägg
                  Nivå:=50

                  sPos=mx(0,add(GetGvar(20),sub(c,aref(c,1))))
                  Draw(sPos,4,DGQB)
                  SetGvarIf(if(gt(sPos,Nivå),0,sPos),20,1)
                  gt(sPos,Nivå)

                  Detta kanske löser ditt problem.

                  Generellt är alla script egentligen en lång dataserie, vilket kan var ovant om man kodat i ett annat språk. Scripten läser uppifrån och ner. Minnesreferenser kan bara refereras efter namnet. Det gör koden väldigt effektiv och det går snabbt att referera och använda historiska värden.

                  Jag tror inte cell nr. 1-10 går att använda. Åtminstone var det så förut.

                  Edit: Jag hann inte skriva klart då det blev orderskurar på en maskin. Det Bertil beskriver ovan är viktigt att tänka på. Live och i simulatorn körs scripten varje insamling(animering) och inte bara när stapeln är fullbordad. I diagram visas värden endast när stapeln är fullbordad. Detta kan påverkar vissa saker som tex värden som skrivs till celler. Det kan lösas genom att tex endast skriva när stapeln är fullbordad eller när ett värde nått min/max hittills, osv. Oftast kan man referera till värden,avslut, etc och behöver inte logga värden på detta sättet, men jag vet ej vad du försöker uppnå.
                  Det jag försöker uppnå är egentligen trivialt i andra språk. Jag försöker göra ett CUSUM filter. Om du tittar på formeln på den sidan är det en cumulativ summa jag vill beräkna och när denna summa uppnår ett visst värde skall den sättas tillbaka till 0. Det som gör det komplicerat i NAT är att jag som du säger inte kan referera till ännu ej deklarerade variabler.

                  Din lösning borde funka det som jag inte gillar dock är att Get/SetGVar använder disk läsningar. Känns långsamt att behöva förlita sig på detta för varje uppdatering men om det inte finns något annat sätt är det helt ok.
                  Last edited by favetelinguis; 2018-10-05, 11:10.

                  Comment


                  • #10
                    Appropå CUSUM.
                    Först måste man ju bestämma med vilken upplösning man skall göra observationerna och sätta detta i realtion till vilken handelsfrekvens man önskar att använda.

                    Själv jobbar jag med rullande medelvärden vilket är extremt lätt att applicera i kod.
                    Ofta tar jag sedan derivatan på medelvärdet för att detektera break out. Detta går utmärkt att plotta.

                    mvh
                    Bertil

                    Comment


                    • #11
                      Ursprungligen postat av favetelinguis Visa inlägg
                      Det jag försöker uppnå är egentligen trivialt i andra språk. Jag försöker göra ett CUSUM filter. Om du tittar på formeln på den sidan är det en cumulativ summa jag vill beräkna och när denna summa uppnår ett visst värde skall den sättas tillbaka till 0. Det som gör det komplicerat i NAT är att jag som du säger inte kan referera till ännu ej deklarerade variabler.

                      Din lösning borde funka det som jag inte gillar dock är att Get/SetGVar använder disk läsningar. Känns långsamt att behöva förlita sig på detta för varje uppdatering men om det inte finns något annat sätt är det helt ok.
                      Cellerna är en variabel. Bara att den inte går att läsa i en dataserie, utan är momentana. Det skulle även gälla en vanlig variabel.
                      Värdena i cellerna ligger även i minnet så det går snabbt att referera till dessa. Dessutom behöver man inte skriva i varje insamling.

                      Vill du rita i diagrammet kan du använda SetGvarGui som är till för just diagramritning. Värdena nås med GetGvar,dvs samma som för SetGvarIF.

                      Edit: Däremot skulle det vara super om även cellvärden kunde ingå i dataserier. Något för framtiden, skulle nog vara mycket resurskrävande i drift om många användes.
                      Last edited by Henric; 2018-10-05, 11:34.

                      Comment


                      • #12
                        Ursprungligen postat av Rikard Autostock Visa inlägg
                        Retval/Getval skriver och läser till "lokala" celler inom en och samma scriptkörning.
                        Varje script har en egen uppsättning av dessa celler, och de är även kontounika och instrumentunika.

                        SetGvarIf däremot skriver till globala celler som sparas på disk. Dessa har ingen koppling till instrument eller konton, så här måste man tänka på vilka celler man använder till vad. Det är dessa celler som även kan användas för att flytta info mellan olika script.
                        Vad menar du Henric när du säger att de ej skrivs till disk? Det är ju vad Rikard säger här att de gör, nu är jag förvirrad

                        Eftersom jag inte vill skicka värdena mellan script varför är det då inte bättre att använda Retval/Getval och varför finns inte dessa villkorade med if satser?

                        Comment


                        • #13
                          De sparas till disk. Värdena ligger i minnet och skrivning sker till disk i intervall. Generellt går det fort att använda celler. Ska du köra mycket snabba modeller kanske det påverkar? För djupare beskrivningar hänvisar jag till Rikard.

                          Comment


                          • #14
                            Ursprungligen postat av Bertil Visa inlägg
                            Appropå CUSUM.
                            Först måste man ju bestämma med vilken upplösning man skall göra observationerna och sätta detta i realtion till vilken handelsfrekvens man önskar att använda.

                            Själv jobbar jag med rullande medelvärden vilket är extremt lätt att applicera i kod.
                            Ofta tar jag sedan derivatan på medelvärdet för att detektera break out. Detta går utmärkt att plotta.

                            mvh
                            Bertil
                            Dina poänger börjar sjunka in så sakta men det bildas bara mer frågor ist Låt oss säga att vi har följande kod snutt:

                            HTML-kod:
                            i10(
                            MinSerie=Add(1,C)
                            Aref(MinSerie,1)
                            )
                            I en simulering väljer vi sedan 5sek som animerings hastighet. Frågan är då vad Aref(MinSerie,1) kommer returnera och hur ofta scriptet kommer köras.

                            Mitt resonemang är att scriptet kommer köras var 5e sekund och att MinSerie då kommer innehålla uppdatering med 5sek intervall vilket ju borde vara fel givet i10. Om det ist är så att scriptet körs var 5e sekund men att MinSerie innehåller 10 minuters referenser blir det då så att alla körningar av scriptet utom det sista i varje 10minuters period. Detta betyder då att scriptet kommer köras var 5e sekund men det kommer inte finnas något returvärde förrän efter 10 minuter?

                            Sista funderingen som jag är osäker på är hur "animerings hastigheten" i live trading avgörs? Körs script med tick upplösning alltid live?

                            Comment


                            • #15
                              Kör du 5sek animering så är det bara innevarande stapel påverkar. Tidigare staplars värden är alltid de samma eftersom staplarna är fullbordade. En fullbordad stapel innehåller alltså de sista värdet i perioden. Det fungerar precis som att titta i diagrammet. Tidigare perioders värden ändras inte, medan stapeln som håller på och byggas rör sig upp och ner.

                              Live körs scripten i intervall om ca 5 sek. Det går att ändra, men kommer då att gälla för alla modeller på den maskinen.


                              Edit: Det enklaste är nog att labba runt i diagram, testmodeller på testkonto och simuleringar.
                              Last edited by Henric; 2018-10-05, 12:37.

                              Comment

                              Working...
                              X