Allmänt meddelande

Collapse
No announcement yet.

Globala variabler

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

  • Globala variabler

    Jag försöker skicka info mellan script och eftersom man inte kan anropa script på "vanligt sätt" t.ex. a=script01(param1,param2) bör man kunna skicka data i globala parametrar. Jag testar då:

    Script 1:
    setgvarif(33,111,1)
    setgvarif(67,222,1)
    getgvar(111)

    Script 2:
    setgvarif(67,222,1)
    setgvarif(33,111,1)
    getgvar(222)

    Diagrammet som scipten är anslutna till visar nu linjer på 33 och 67 som väntat. Men när jag tar bort första raden i båda scripten försvinner linjerna. En global variabel behåller alltså bara sitt värde inom scriptet, och kan inte läsas av andra script. Är det så hos er också, eller är det en bugg i min dator?

  • #2
    Värdet i en cell är globalt för hela programmet. Det är nog något med diagramritningen. Har inget program nu. Prova att först att tilldela värdet av getgvar till en minnesreferens, tex ritavärde=GetGvar(222) eller använd ritfunktonen, tex draw(GetGvar(222),4,bqb)

    Comment


    • #3
      Globala celler skrivs bara av larmbevakade script, dvs om man inte har Larmbevakat ikryssat utan bara kör scriptet för ritning i diagram skrivs inte värdet till cellen.

      Comment


      • #4
        För att få ritningen att fungera utan att scripten körs live är att skriva,läsa och rita värden i globala celler i ett script. Indikatorer, etc fungerar oavsett.

        Comment


        • #5
          Tack för hjälpen, men det verkar inte spela nån roll hur mycket tid jag lägger på detta. Det blir aldrig rätt. Tanken är att all logik ska ligga i ett script, och att det bara är i detta enda script jag ändrar. Det ser ut ungefär så här:

          i1(
          ...
          köpsignal=...
          säljsignal=...
          ...
          insats1=div(2,sp3)
          insats2=if(lt(insats1,2000),2000,insats1)
          innehav=mult(portfolio(v),b)

          setgvarif(0,500,1)
          setgvarif(1,500,köpsignal)
          setgvarif(2,500,säljsignal)
          setgvarif(insats2,550,1)

          or(köpsignal,säljsignal)
          )

          I gvar nummer 500 ligger alltså 1 för köp eller 2 för sälj. Sedan avgör två xk-script om signalen skickas vidare eller inte genom att läsa getgvar(500). Ett annat alternativ är att två sl-script läser in denna 500 och skickar köp- och säljsignaler. Mitt enda "krav" är alltså att alla beräkningar och allt jag vill ändra på ska ligga i ett enda script, som alltså skickar ut både köp- och säljsignal (och även antal) med t.ex. setgvarif.

          Det som händer är att många olika papper köps eller säljs samtidigt. ELLER så händer inget. Signalerna i sig är ok, "köpsignal" och "säljsignal" kommer enligt strategin ganska tätt, det händer något nästan varje minut. Men att koppla dessa till verkliga ordrar funkar inte alls lika bra.

          Sammanfattning: Signalerna i scriptet är korrekta, men någonstans på vägen genom ordermodellen blir det fel.

          Hur ska ett xk-script se ut, som filtrerar fram rätt signal? Eller är det inte möjligt att lägga köp- och säljlogik i samma script som jag försöker göra? Om ingen annan har testat, kanske det är bättre att jag ger upp...

          Jag undrar också vad man använder retval() till. Det finns ju en anledning till att det heter RETurn VALue. Hjälpen säger "Returnerar ett värde från scriptet till globalt minne". Hur globalt är detta? Kan man komma åt minnet bara inom samma script, eller inom samma värdepapper, eller inom hela programmet? På något sätt måste ju värdet komma ut ur scriptet, annars är funktionen helt meningslös.

          Comment


          • #6
            Svårt att se vad som är fel utan att ha sett hela installationen. Vi kör ju globala celler till en massa saker så det fungerar absolut att lägga all logik för både köp och sälj i ett enda script. Jag tittar gärna på det om du ringer in nästa vecka så kopplar vi upp fjärrsupporten.

            Comment


            • #7
              Ja gärna om du vill. Jag är nog på jobbet som vanligt, men du kan ju testa hur mycket du vill på mitt testkonto. Men du får gärna svara på min fråga om hur retval() används också. Är det retur till globalt minne som det står i hjälpen? Eller står det fel?

              Comment


              • #8
                Det är nog bäst att du tar kontakt med supporten. Eftersom att jag skrev tidigare att ritning av globala celler fungerar bäst om det görs i ett script vill jag bara förklara mig. Det jag syftade på är script för ritning. Eftersom värdena kanske inte är sparade på disk och endast finns i minnet. I så fall kan inte andra script hämta värdena vid ritning, men de finns i scriptet som skrev. Vid livekörning och i simulatorn hämtar alla script värden sparade i celler.

                Visst kan man lägga logiken i ett script. Det gör jag ibland. Däremot brukar jag lägga logiken i ett script och använda andra script som endast läser värden från celler. xk) brukar jag undvika utan lägger in det i sl)-scripten. Då slipper man fylla ut hela larmfönstret med meddelanden.

                {tex köpscript som innehåller logiken}
                i30(
                ....scriptlogik....
                villkorKöp=...
                villkorSälj=....
                SetGvarIf(1,500,villkorKöp)
                SetGvarIf(2,500,villkorSälj)
                and(eqv(GetGvar(500),1),le(portfolio(v),0))
                )

                {säljscript}
                i30(
                and(eqv(GetGvar(500),2),ge(portfolio(v),0))
                )
                Last edited by Henric; 2016-03-23, 19:30.

                Comment


                • #9
                  Ja det ser ju så enkelt ut, och jag har testat precis så (men att både köp och sälj ligger i andra script som hämtar med getgvar, alltså tre script totalt). Men med din lösning behöver man väl olika gvar-adress för olika papper? Om scripten är kopplade till många aktier, kommer väl alla att köpas samtidigt, när värde 500 blir ett (alla aktier med portfolio(v)=0). Så totalt sett (om man bevakar 10 olika papper) blir det många fler script...

                  Självklart kan man ha olika logik för olika papper, men att testa en perfekt formel för varje unikt papper tar väl hundratals timmar... (jag har inte AT Pro).

                  Hade du/ni något bra svar på min fråga om retval()?

                  Comment


                  • #10
                    Om du vill spara ett unikt värde för ett instrument som sker just vid order kan du använda retval. Tex i köpscriptet retval(xxx,1). Hämtas med lasttrade(b,1). Samma sak finns för säljscripetet.

                    Oh ja. det blir konflikt om du använder celler på detta sättet. Om du handlar många instrument och ska använda olika celler för varje instrument blir det väldigt omständigt. Inte att rekommendera. Du får lägga logiken i olika script och handla från scripten(dvs inte per instrument, utan för tex köp,blanka,exit). Sedan går det att använda celler i kombination med tex crcid(). Allt beror på upplägget.
                    Last edited by Henric; 2016-03-23, 20:17.

                    Comment


                    • #11
                      Ok. Jag är inte så intresserad av vinstrapporter och sånt. Jag tänkte mer på kombinationen

                      retval(köpsignal,9)
                      och
                      köp=getval(9)

                      I hjälpen står det om getval() att den "Hämtar ett värde från globalt minne till scriptet. Plats 0 och 1 används av vinstrapporten som limitnivå för affär som görs. Resten är fritt att använda för egen hantering."

                      Jag tolkar alltså det som att man kan spara ett värde (t.ex. en triggersignal) och hämta det värdet från ett annat script kopplat till samma papper. Det står inte att dessa funktioner ALLTID måste vara kopplade till order/avslut.

                      Jag kanske har missförstått, men jag läser bara det som står i hjälpfilerna.

                      Comment


                      • #12
                        Vi får nog uppdatera texten lite där, det är lite otydligt.

                        Retval() Getval() kan bara användas för celler 0-9 som är "flyktiga", dvs de har bara en livslängd på en scriptkörningscykel, eller en diagramritning. Man kan alltså spara värden i scriptet och läsa ut dem senare i samma script. Enda vägen att använda Retval() och läsa av från annat script är i triggerscript där man tex kan spara ned något i cellerna 0-4 som lagras i Loggade lokala ordertransaktioner. Dessa ligger kvar på disk och kan läsas senare, från vilket annat script som helst. Vi använder den tekniken i några standardmodeller, tex Double 7 som skriver ned sin unika kod i köptransaktionen. Den kan senare läsas av med LastTrade(b,0) som hämtar värdet i cell noll vid senaste köptransaktionen för det aktuella instrumentet.

                        Så, kortfattat:

                        Retval() Getval() används mest för diagramritning, eller spara värden från en punkt i scriptet till en annan punkt. Undantaget är Loggade lokala ordertransaktioner som sparar värdet i cellerna 0-4 vid transaktion.

                        SetGVarIF() och GetGVar() är globala celler som lagras på disk, de kan skrivas och läsas från vilka script som helst och är inte instrumentknutna på något sätt. För att kunna skriva ett värde till en cell med SetGVarIF() behöver scriptet antingen finnas med i en ansluten ordermodell, alternativt vara kopplad direkt till ett instrument med Larmbevakat ikryssat. Dvs, om det bara är anslutet för ritning i diagram skrivs inget till cellerna.




                        Comment


                        • #13
                          Det stämmer, men jag tror de är lokala per script. Jag själv använder inte dessa. Det är lite förvirrande då retval kan användas för att spara värden vid order och är individuella för varje instrument. Sök på lasttrade för att hitta mer info.

                          Edit: Hoppsan. Rikard svarade före mig. Ignorera och kolla ovan.
                          Edit: Vill bara tillägga att det fungerar att skriva och hämta värden med SetGvarIf/GetGvar i ett script för ritning utan att spara på disk med larmbevkat(dvs värdet ligger endast i minnet). Det går dock ej att hämta i andra script. Tex spara ett värde i diagrammet för att se hur de ändras efter hand när man gör en grafisk analys. Kanske överkurs.
                          Last edited by Henric; 2016-03-23, 21:23.

                          Comment


                          • #14
                            Det låter väldigt krångligt att flytta ett värde inom scriptet med retval() och getval() jämfört med att helt enkelt använda en variabel. :-)

                            Det skulle vara intressant att veta mer om hur ofta och i vilken ordning scripten körs. Om alla körs uppifrån och ner på ett instrument först, och SEDAN på nästa instrument o.s.v. skulle man ju kunna använda min gvar-metod. Då räcker det ju att man nollställer g-variablerna på slutet av det script som är anslutet "längst ner", så de alltid är noll när det är dags för nästa instrument att köra sina script. Då blir de lokala (men flyktiga) inom respektive instrument.

                            Men om scripten körs i en annan ordning finns ju risken för att "obehöriga gvar-värden" letar sig in på fel ställe.

                            Säg till om du behöver hjälp med korrekturläsning av de där hjälptexterna. :-)

                            Comment


                            • #15
                              Om du använder ett script för logiken kan två globala celler göra jobbet. Börja med att nollställa om crcId()=cellen, skriv värde om trigger, samt vänta tills scriptet kommer tillbaka till instrumentet. Sedan kan andra script i strategin kolla att crcid()=cellen och triggervärde. Givetvis beror allt på uppyggnad av din strategi.

                              .......
                              SetGvarIf(0,501,eqv(crcId(),GetGvar(501)))
                              köp=and(eqv(GetGvar(501),0),triggerK)
                              exit=and(eqv(GetGvar(501),0),triggerS)
                              SetGvarIf(1,500,köp)
                              SetGvarIf(0,500,exit)
                              SetGvarIf(crcId(),501,köp)
                              SetGvarIf(crcId(),501,exit)
                              .....
                              Last edited by Henric; 2016-03-23, 21:41.

                              Comment

                              Working...
                              X