Allmänt meddelande

Collapse
No announcement yet.

Hur skriva tid i global cell?

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

  • Hur skriva tid i global cell?

    Hej, jag tänkte ha en kontroll i Entry-script så att inte entry görs förrän efter en viss tid efter det att en stop-loss löst ut en positionen (t.ex. ej göra köp direkt efter det att en lång position stoppats ut). Nedanstående kod kommer finnas i entry-scriptet:


    stoplosstid:=GETGVAR(111)
    minsedan:=MULT(SUB(DATE(),stoplosstid),1440)
    ejstoploss:=GT(minsedan,11)

    i5(
    bla. bla.
    köp4=.... bla. bla.
    köp5=AND(köp4,ejstopploss)
    MULT(köp5,10)
    )


    Min fråga: Hur ska tidpunkten för stop-loss skrivas i den globala cellen 111 i exit-scriptet?

    Jag tänkte dessutom ha en rad som nollställer global cell 111 om klockan är mindre än 08.57 - för säkerhets skull - SETGVARIF(0,111,1).

  • #2
    Du skull kunna använda Lasttrade(s,d)
    Eventuellt behöver du då ingen global cell.

    Comment


    • #3
      Precis, om du använder följande i stoplosscriptet:

      retval(D,0)

      så sparas tidstämpeln för senaste transen när stoppen löser ut.


      I ditt triggerscript kan man då läsa av den tidpunkten med

      LastTrade(S,0)





      PS. Du har celler 0-4 att leka med för varje trans, och det är dessa som listas i Starta > Loggade lokala ordertransaktioner.

      Comment


      • #4
        I Exit-scriptet kommer en exit kunna triggas av flera olika orsaker, men det är bara exit pga stop-loss som ska förhindra entry i samma riktning (som positionen som stoppades ut) under 11 minuter. Av den anledningen så tror jag inte LastTrade(B/S,d) kommer fungera. Denna skiljer ju inte på orsaken till exit:en.

        Något åt det här hållet hade jag tänkt mig (lite förenklat).


        I Exit-scriptet:

        stoploss=...om -6 punkters avkastning eller mer i innehavd position...
        sälj6=OR(sälj5,stoploss)
        SETGVARIF(DATE(),111,stoploss)


        I Entry-scriptet:

        stoplosstid:=GETGVAR(111)
        minsedan:=MULT(SUB(DATE(),stoplosstid),1440)
        ejstoploss:=GT(minsedan,11)

        i5(
        bla. bla.
        köp4=.... bla. bla.
        köp5=AND(köp4,ejstopploss)
        MULT(köp5,10)
        )


        Min fråga är, kan man skriva såhär: SETGVARIF(DATE(),111,stoploss)?
        Last edited by Christer; 2012-06-29, 14:55.

        Comment


        • #5
          Hm, ok. men då skulle du kunna skriva

          typ:=if(stoploss,1,2)
          retval(add(typ,D),0)

          så läggs 1 eller 2 till datum beroende på vilken signal det var som löste ut.

          Comment


          • #6
            Rikard, rätta mig om jag har fel, men du har tidigare sagt att Retval() endast håller värden inom intraday-periodens längd.

            Comment


            • #7
              Ursprungligen postat av Rikard Nilsson Visa inlägg
              typ:=if(stoploss,1,2)
              retval(add(typ,D),0)

              så läggs 1 eller 2 till datum beroende på vilken signal det var som löste ut.

              Det där är jag inte riktigt helt med på - jag är nybörjare inom NAT-scriptande. Kan man inte bara skriva tiden, t.ex. 0.5 (för kl 12.00) i cell 111 genom SETGVARIF(DATE(),111,stoploss)?

              Comment


              • #8
                Som ett svar på din fråga, och användande av din egen terminologi, ska du skriva enligt nedan.
                Jag har här också antagit att du vill kunna köra scripten även om de är kopplade till diagram.

                Varför du skall skriva på detta sättet framgår av denna tråd:
                http://www.autostock.se/vbulletin/sh...?t=2729&page=5
                Läs framförallt inlägg #73, där ett försök till förklaring finns.




                I Exit-scriptet:

                minut_nu:=mult(frac(date()),1440)
                datum_ok:=eqv(int(d),int(date()))
                block_diag_skriv:=and(datum_ok,eqv(cum(1),1))

                stoploss=...om -6 punkters avkastning eller mer i innehavd position...
                sälj6=OR(sälj5,stoploss)
                SETGVARIF(minut_nu,111,and(block_diag_skriv,stoploss),T)


                I Entry-scriptet:

                minut_nu:=mult(frac(date()),1440)
                stoplosstid:=GETGVAR(111,N)
                minsedan:=sub(minut_nu,stopplosstid)
                ejstoploss:=GT(minsedan,11)

                i5(
                bla. bla.
                köp4=.... bla. bla.
                köp5=AND(köp4,ejstopploss)
                MULT(köp5,10)
                )

                Comment


                • #9
                  Stort tack, LillWicke! Om jag ska vara helt ärlig så har jag lite svårt att förstå exakt vad "block_diag_skriv:=and(datum_ok,eqv(cum(1),1))" gör, men jag ska prova att bygga in det du föreslagit i forumpost 8 i mina script. Tack än en gång.

                  Comment


                  • #10
                    Jag misstänker att jag behöver nollställa globala variabel 111 innan börsen öppnar så att inte något gammalt minutvärde ligger kvar från föregående dag i 111 och stör tidiga affärer. Fungerar nedanstående rad?

                    SETGVARIF(0,111,LT(minut_nu,537))

                    Comment


                    • #11
                      Ursprungligen postat av Christer Visa inlägg
                      Jag misstänker att jag behöver nollställa globala variabel 111 innan börsen öppnar så att inte något gammalt minutvärde ligger kvar från föregående dag i 111 och stör tidiga affärer. Fungerar nedanstående rad?

                      SETGVARIF(0,111,LT(minut_nu,537))
                      Rätt tänkt.

                      Men 540 är kl 9.00, och 537 är kl 8:57. Kursinsamlingen och scripten startar normalt 8:59 om du inte har ändrat det i programinställningarna. 541 kommer helt säkert fungera och troligen 540 också.

                      Sedan undrar jag om du läst inlägget #73 i länken jag postade ovan? Du måste skriva:

                      SETGVARIF(0,111,and(block_diag_skriv,LT(minut_nu,540)),T)

                      Om du vill kunna koppla scripten till ett diagram vill säga.

                      Comment


                      • #12
                        Tack för redogörelsen, LillWicke. Vad gäller post #73 så har jag noga följt hela den strängen. Jag tror jag förstår frågeställningen och problemet som du identifierade, men just radern datum_ok:=eqv(int(d),int(date())) samt block_diag_skriv:=and(datum_ok,eqv(cum(1),1)) är jag inte helt med på.

                        Comment


                        • #13
                          Ok, jag provar med en nyskrivning.

                          Som du säkert redan vet så kör scripten normalt en gång var 5:e sek, men när man har ett diagram kopplat så kör scripten istället två gånger var 5:sek dvs. en gång i ”normalläget” och en i ”diagramläget” . När scriptet kör i ”diagramläget” används ett annat tidsformat än i ”normalläget” vilket i sin tur kan göra att villkor som är falska i ”normalläget” blir sanna i ”diagramläget”. Detta förhållande att falskt=sant ställer naturligtvis till stora problem och lösningen är att hitta ett ”trix” som gör att SetGvarIf() inte kan skriva något över huvud taget i ”diagramläget” - en blockning.
                          Trixet som fungerar och som blockar skrivning i ”diagramläget” är ”block_diag_skriv”, som man lägger till i en And()-sats tillsammans med det vanliga villkoret.

                          Vad gör då "eqv(cum(1),1)"?
                          Cum(d) är en funktion som är verksam i diagram och som summerar dataserien d med början i första perioden i diagrammet. Skriver man då cum(1) blir resultatet att en 1:a läggs till för varje period i diagrammet och man får summeringen 1,2,3 osv upp till sista perioden, eller kort och gott en siffra på hur många staplar diagrammet består av.

                          Eftersom cum(1) alltid startar med en 1:a får man att villkoret eqv(cum(1),1)) alltid är sant om man inte har med ett diagram att göra, dvs när scriptet kör i ”normalläget”.
                          I ett diagram däremot blir villkoret falskt för varje stapel utom för den första, dvs villkoret blir falskt när scriptet kör i ”diagramläget” utom för stapel nr ett.

                          Vad gör "datum_ok:=eqv(int(d),int(date()))"?
                          Villkoret kollar att dagens datum på din armbandsklocka [date()] är samma dag som den som visas i databasen [ d ]. Dvs om du har ett diagram uppe som sträcker sig över igår och idag är villkoret falskt för de staplar som visar hur kurvan gick igår men sant för de staplar som visar hur kurvan går idag.
                          Det i sin tur innebär att om diagrammets första stapel ligger igår när börsen startar (vilket alltid sker) och man skriver: block_diag_skriv=and(datum_ok,eqv(cum(1),1)) kan det villkoret aldrig bli sant (ej heller för stapel nr 1) när scriptet kör i ”diagramläget” .

                          Summa summarum:
                          om man lägger till villkoret: ”block_diag_skriv=and(datum_ok,eqv(cum(1),1))” och diagrammet sträcker sig över två dagar kan detta villkor aldrig bli sant när scriptet kör i ”diagramläget” men blir alltid sant när scriptet kör i ”normalläget”. Därmed har man åstakommit ett ”trix” som blockar skrivning i ”diagramläget” och som löser ovanstående problem med att falska villkor kan bli sanna, om man har ett diagram anslutet.

                          Last edited by LillWicke; 2012-07-01, 00:26.

                          Comment


                          • #14
                            Lite förtydliganden är på sin plats för att undvika att krångla till saker onödigt mycket:

                            Ursprungligen postat av LillWicke Visa inlägg
                            Ok, jag provar med en nyskrivning.

                            Som du säkert redan vet så kör scripten normalt en gång var 5:e sek, men när man har ett diagram kopplat så kör scripten istället två gånger var 5:sek dvs. en gång i ”normalläget” och en i ”diagramläget” . När scriptet kör i ”diagramläget” används ett annat tidsformat än i ”normalläget” vilket i sin tur kan göra att villkor som är falska i ”normalläget” blir sanna i ”diagramläget”. Detta förhållande att falskt=sant ställer naturligtvis till stora problem och lösningen är att hitta ett ”trix” som gör att SetGvarIf() inte kan skriva något över huvud taget i ”diagramläget” - en blockning.
                            Trixet som fungerar och som blockar skrivning i ”diagramläget” är ”block_diag_skriv”, som man lägger till i en And()-sats tillsammans med det vanliga villkoret.

                            Ovanstående stämmer helt enkelt inte: Script körs var 5:e sekund, samt under den tid en diagramritning sker. Det kan ske tex när omskalning är nödvändigt för att alla kursstaplarna ska synas osv, eller när man själv zoomar in/ut etc.

                            Samma tidsformat används hela tiden, och det stämmer inte alls att det skulle vara olika format när script körs löpande eller vid diagramritning. Att SANT=FALSKT är helt fel.


                            Vad gör då "eqv(cum(1),1)"?
                            Cum(d) är en funktion som är verksam i diagram och som summerar dataserien d med början i första perioden i diagrammet. Skriver man då cum(1) blir resultatet att en 1:a läggs till för varje period i diagrammet och man får summeringen 1,2,3 osv upp till sista perioden, eller kort och gott en siffra på hur många staplar diagrammet består av.

                            Eftersom cum(1) alltid startar med en 1:a får man att villkoret eqv(cum(1),1)) alltid är sant om man inte har med ett diagram att göra, dvs när scriptet kör i ”normalläget”.
                            I ett diagram däremot blir villkoret falskt för varje stapel utom för den första, dvs villkoret blir falskt när scriptet kör i ”diagramläget” utom för stapel nr ett.

                            Vad gör "datum_ok:=eqv(int(d),int(date()))"?
                            Villkoret kollar att dagens datum på din armbandsklocka [date()] är samma dag som den som visas i databasen [ d ]. Dvs om du har ett diagram uppe som sträcker sig över igår och idag är villkoret falskt för de staplar som visar hur kurvan gick igår men sant för de staplar som visar hur kurvan går idag.
                            Det i sin tur innebär att om diagrammets första stapel ligger igår när börsen startar (vilket alltid sker) och man skriver: block_diag_skriv=and(datum_ok,eqv(cum(1),1)) kan det villkoret aldrig bli sant (ej heller för stapel nr 1) när scriptet kör i ”diagramläget” .

                            Summa summarum:
                            om man lägger till villkoret: ”block_diag_skriv=and(datum_ok,eqv(cum(1),1))” och diagrammet sträcker sig över två dagar kan detta villkor aldrig bli sant när scriptet kör i ”diagramläget” men blir alltid sant när scriptet kör i ”normalläget”. Därmed har man åstakommit ett ”trix” som blockar skrivning i ”diagramläget” och som löser ovanstående problem med att falska villkor kan bli sanna, om man har ett diagram anslutet.


                            Annars är det bra förklarat hur Cum(1) fungerar, och även testet om databastid och systemtid är på samma dag.

                            Lydelsen "block_diag_skriv" kan jag iofs tycka är motsägelsefull eftersom den är sann när skrivning är tillåten. Namnet antyder ju tvärtom.

                            Jag skulle nog skriva:

                            tillåt_skriv=and(datum_ok,eqv(cum(1),1))

                            vilket helt enkelt bara tillåter skrivning när cum(1) = 1 och databastid och systemtid är på samma dag, eller enklare uttryckt: Script körs löpande. Resultat från diagramritning är bortisolerat.

                            Comment


                            • #15
                              Genialiskt, killar! Tack för redogörelsen och allt tänk bakom funktionen. Och om jag inte sagt det förr, tack för all support - dag som natt - av personer som Rikard och LilllWicke.

                              Jag ska nu testa min nya handelsmodell med "block_diag_skriv" mm. inkorporerat i morgon. Låt oss hålla tummarna!

                              Comment

                              Working...
                              X