Allmänt meddelande

Collapse
No announcement yet.

Fladderfilter samt blockning av kontinuerlig signal.

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

  • Fladderfilter samt blockning av kontinuerlig signal.

    Jag har funderat lite på hur man skulle kunna konstruera ett filter mot:
    a)"fladdrande" falska signaler (särskilt för exit i snabba modeller) samt
    b) att kunna blockera att en signal "ligger på" ända till dess att en signal åt andra hållet triggas.

    Vi tar ett köpscript som exempel.
    Ett vanligt sätt att lösa a) på är att låta scriptet jobba på signalen en period bakåt exempelvis:
    i30(
    bla, bla
    buy7=and(.....)
    buy8=aref(buy7,1)
    mult(buy8,5)
    )

    Problemet med detta är att man måste vänta till hela innevarande period passerats och har man då 30min perioder och signalen kommer i början hinner mycket hända. Jag har istället tänkt mig att man ska kunna ställa en delay på exempelvis 5min från det att signalen ges till dess att signalen löser ut på riktigt.

    Vad gäller problemet med b) så innebär det att inga sopploss eller manuella positioner kan tas så länge signalen är på. Gör man det i alla fall tar modellen genast en ny position åt det håll man ville komma ur, vilket är mycket irriterande. Jag har här tänkt mig en ställbar blockering för hur lång tid signalen får vara aktiv.

    Nedanstående script-tillägg är tänkt att lösa ovanstående problem och är tänkt att kunna fungera med vilket script som helst.
    Exemplet gäller ett köpscript.


    OBSERVERA FÖLJANDE:

    Fladdervariabeln "signal_delay" anger den tid i minuter som skall förflyta från det att det ursprungliga scriptet signalerat till dess att order är tillåten att tas.
    Om denna variabel sätts till noll är fladderfiltret inaktiverat.

    Fladdervariabeln "signal_lock" anger den tid i minuter som ska förflyta från det att order är tillåten att tas till dess att signalen ej längre är aktiv.


    { Fladderfilter samt begränsad köpsignal }
    { köper endast inom intervallet: 5min< intervall <8min efter det att signal triggats, ställbart }

    { Vanliga villkor i de flesta script }

    { säkerställa att inga positioner tas vid dagens start innan start_delay passerats }
    start_delay:=2
    minut_nu:=mult(frac(date()),1440)
    inpådagen:=gt(minut_nu,add(540,start_delay)) { 540 är kl 9.00 }

    { säkerställ att databastid och systemtid är på samma dag }
    datum_ok:=eqv(int(d),int(date()))

    { nya tillägg innan intraday-parantesen}

    { Fladdervariabler }
    signal_delay:=5
    signal_lock:=3

    { Säkerställer blockering av cellskrivning under diagramkörningen }
    block_diag_skriv:=and(datum_ok,eqv(cum(1),1)) {Villkor för live-körning}
    {block_diag_skriv:=1} {Villkor för bänk-körning}

    { Tidslucka innan första positionen tas efter öppning}
    innan_position:=and(ge(minut_nu,540),le(minut_nu,add(540,start_delay)))

    { befintligt köpscript }
    i30(
    Bla, bla,
    buy7=and(......,inpådagen)
    )

    { tillägg att lägga inom intraday-parantesen sist i scriptet (efter buy7) }

    { Nolla cell innan handel }
    nollvillkor1=and(innan_position,gt(Getgvar(500,N),0))
    SetGvarIf(0,500,and(nollvillkor1,block_diag_skriv),T) { Nollställer cell 500 innan handeln börjar }

    { Skriv tid i cell }
    nysignal=and(buy7,eqv(GetGvar(500,N),0))
    SetGvarIf(minut_nu,500,and(nysignal,block_diag_skriv),T)

    minsedan_signal=if(gt(GetGvar(500,N),0),sub(minut_nu,GetGvar(500,N)),0)
    tid_ok=if(and(ge(minsedan_signal,signal_delay),le(minsedan_signal,add(signal_delay,signal_lock))),1,0) { tiden är inom intervallet }

    buy8=and(buy7,tid_ok)

    { Nolla cell }
    nollvillkor2=and(not(buy7),gt(GetGvar(500,N),0))
    SetGvarIf(0,500,and(nollvillkor2,block_diag_skriv),T) { nollställer cell 500 om ej signal }

    mult(buy8,1)
    )




    EDIT1:
    Har uppdaterat scriptet med en fungerande variant jag numera själv kör. Det hela grundar sig på av vad som kommit fram ur denna tråd:
    http://www.autostock.se/vbulletin/showthread.php?t=2729
    Läs framför allt de avlutande inläggen.
    Sriptet fungerar oavsett om man har diagramritningen påslagen eller inte.



    EDIT2:
    Jag har kört detta ett tag nu och kan meddela att det fungerar väldigt bra.
    Emellertid jag har två kompletterande kommentarer att göra.

    1) Om det i slutet av originalscriptet finns ett villkor som heter ”innehav_ok” eller något liknande, måste det flyttas till buy8, annars nollställs timern vid ett skarpt köp, och därmed förstörs hela funktionen.
    Alltså, om ”innehav_ok” finns i slutet av scriptet, tag bort det och ändra buy8 till: buy8=and(and(buy7,tid_ok),innehav_ok)

    2) Det är ganska självklart, att man i snabba script förstör scriptet genom att sätta ”signal_delay” till för många minuter. I mina script räcker det med 1 min, men även detta kan ibland vara för mycket har jag upptäckt. Därför har jag i mina snabbaste script låtit ”signal_delay” gå ner på sekundnivå. Det genomsnittliga ”fladdret” i de scripten, har jag mätt upp, överskrider sällan 15sek. Därför har jag satt ”signal_delay” i dessa till 20sek.
    Ni andra som vill prova detta får lägga till raden: ”sekund_nu:=mult(frac(date()),86400)” samt ersätta ”minut_nu” med ”sekund_nu” i raderna nedanför { Skriv tid i cell }


    EDIT3
    Har lagt till ett villkor som man får klammra av och på när man växlar mellan körning i Live eller i Analyzbänken. Detta för att funktionen cum() inte fungerar i bänken.
    Som scriptet är skrivet ovan är det aktiverat för live. Vill man istället köra i Analyzbänken klammrar man om villkoren så här:
    { Säkerställer blockering av cellskrivning under diagramkörningen }
    {block_diag_skriv:=and(datum_ok,eqv(cum(1),1))} {Villkor för live-körning}
    block_diag_skriv:=1 {Villkor för bänk-körning}


    EDIT4
    Har lagt till ett OBSERVERA i grundtexten ovan




    Last edited by LillWicke; 2013-07-25, 18:11.

  • #2
    Kör du nattskiftet?
    Intressant. Du undviker situationer där signalen kan bli sann endast korta stunder och
    att signalen måste ha tillräcklig styrka för att bli bekräftad efter viss tid. Vissa
    modeller mår bra av detta. Andra vill ha signal direkt. Detta går ju ändå att styra
    med delay och lock. Dessutom undviks vissa situationer då konstiga kurser kommer in.

    Varför använder du nul= och inte endast SetGvarIf?
    Jag tror att du endast kan använda 3 parametrar i SetGvarIf och om L används måste vara det enda villkoret(enligt tidigare inlägg på forumet). Det går att lösa med en minnesref innan som bestämmer värdet som ska stoppas in.

    Comment


    • #3
      Ursprungligen postat av Henric Visa inlägg
      Kör du nattskiftet?


      Ursprungligen postat av Henric Visa inlägg
      Varför använder du nul= och inte endast SetGvarIf?
      SetGvarIf returnerar ju indatavärdet. Är osäker på om vissa funktioner verkligen kan stå fritt inne i ett script på grund av detta. Jag ställde en fråga om detta i tråden "Frågor om funktioner som returnerar 1 eller 0" men har inte fått något svar än. Funderade på om detta kunde vara en orsak till att de "globala" kan strula om de kopplas till diagram.

      Ursprungligen postat av Henric Visa inlägg
      Jag tror att du endast kan använda 3 parametrar i SetGvarIf och om L används måste vara det enda villkoret(enligt tidigare inlägg på forumet). Det går att lösa med en minnesref innan som bestämmer värdet som ska stoppas in.
      Jag använde 3 parametrar tidigare men det blev strul. Se tråden "Globala celler/variabler strular" Rikard föreslog då L-parametern men har inte testat det än. Vad menar du med minnesreferens innan?

      Comment


      • #4
        tex
        hållare=if(or(buy8,not(buy7)),0,GetGvar(500))
        SetGvarIf(hållare,500,L)

        Comment


        • #5
          Aha, du menar så.
          Men kan du utelämna villkoret i SetVarIf(), måste du inte skriva SetGvarIf(hållare,500,1,L)?

          Var i forumet läser jag om att det inte går att ha fler villkor i SetVarIf() om man använder parameter L?

          Comment


          • #6
            Diskussionen handlade om det gick att använda SetGvarIf med 4 parametrar. Använder man 3 parametrar hamnar L i tredje och då går det inte att kombinera L med andra villkor. Om första värdet har ett villkor måste värdet bestämmas innan. Det är ju bra om du fått det att fungera med 4.

            Comment


            • #7
              Jag har nu uppdaterat mitt första inlägg med ett fungerande fladderscript som kan köras oavsett om man har diagramritningen påslagen eller inte.

              Comment


              • #8
                Tack för dina superscript LillWicke!

                Testar nu ovan fladderscript men får larm på denna raden

                minut_nu:=mult(frac(date(),1440)


                Fattas en parantes, skall det vara följande?

                minut_nu:=mult(frac(date()),1440)

                Comment


                • #9
                  Ursprungligen postat av Wheelie Visa inlägg
                  Tack för dina superscript LillWicke!

                  Testar nu ovan fladderscript men får larm på denna raden

                  minut_nu:=mult(frac(date(),1440)


                  Fattas en parantes, skall det vara följande?

                  minut_nu:=mult(frac(date()),1440)
                  Tack för påpekandet, ska genast redigera detta.

                  EDIT: Passade också på att ändra lite i förklaringstexterna inom {}-parenteserna.

                  Last edited by LillWicke; 2012-06-14, 15:38.

                  Comment


                  • #10
                    Ursprungligen postat av Wheelie Visa inlägg
                    Testar nu ovan fladderscript men får larm på denna raden
                    minut_nu:=mult(frac(date(),1440)
                    Wheelie, det verkar vara en bra editerare du kör.
                    Får man fråga vad den heter?

                    Comment


                    • #11
                      Använder mej bara av uteslutningsmetoden , plockar bort rad för rad tills
                      larmet är borta.

                      Provar nu detta testscript men får inga signaler. Vad har jag missat?

                      { Raptor med filter long }
                      { 120523, 120615 }

                      mval:=mov(mfi(3),3,e)
                      mmv_kort:=add(mult(llv(aref(mval,1),3),0.90),5)
                      mmv_long:=add(mult(hhv(aref(mval,1),3),0.90),5)


                      condition1:=lt(mval,101)
                      innehav_ok:=eqv(portfolio(v),0)

                      öppet:=gt(mult(1440,sub(market(c),frac(date()))),6)

                      { säkerställa att inga positioner tas innan start_delay passerats }
                      start_delay:=6
                      minut_nu:=mult(frac(date()),1440)

                      inpådagen:=gt(minut_nu,add(540,start_delay)) { 540 är kl 9.00 }

                      datum_ok:=eqv(int(d),int(date()))

                      { Fladdervariabler }
                      signal_delay:=5
                      signal_lock:=3

                      { Säkerställer blockering av cellskrivning under diagramkörningen }
                      block_diag_skriv:=and(datum_ok,eqv(cum(1),1))

                      överexponerad_short:=lt(portfolio(v),scrpar(23))

                      timelock:=30
                      lt1:=LastTrade(B,D)
                      lt2:=LastTrade(S,D)
                      minSedanKöp:=mult(sub(date(),lt1),1440)
                      minSedanSälj:=mult(sub(date(),lt2),1440)

                      i5( {30}

                      orderdelay_ok=and(gt(minSedanKöp,timelock),gt(minSedanSälj,timelock))

                      draw(mval,2,yse)
                      draw(mmv_long,3,gse)
                      draw(mmv_kort,4,rse)

                      buy0=and(condition1,gt(mval,mmv_kort))
                      buy1=and(condition1,gt(mval,mmv_long))
                      buy2=or(buy0,buy1)
                      buy3=and(buy2,innehav_ok)
                      buy4=and(and(or(överexponerad_short,buy3),öppet),orderdelay_ok)
                      buy5=and(and(buy4,datum_ok),inpådagen)

                      { Tidslucka innan första positionen tas efter öppning}
                      innan_position=and(ge(minut_nu,540),le(minut_nu,add(540,start_delay)))
                      nollvillkor1=and(innan_position,gt(Getgvar(500,N),0))
                      SetGvarIf(0,500,and(nollvillkor1,block_diag_skriv),T) { Nollställer cell 500 innan handeln börjar }

                      { Skriv tid i cell }
                      nysignal=and(buy5,eqv(GetGvar(500,N),0))
                      SetGvarIf(minut_nu,500,and(nysignal,block_diag_skrivn),T)

                      minsedan_signal=if(gt(GetGvar(500,N),0),sub(minut_nu,GetGvar(500,N)),0)
                      tid_ok=if(and(ge(minsedan_signal,signal_delay),le(minsedan_signal,add(signal_delay,signal_lock))),1,0) { tiden är inom intervallet }

                      buy8=and(buy5,tid_ok)

                      { Nolla cell }
                      nollvillkor2=and(not(buy5),gt(GetGvar(500,N),0))
                      SetGvarIf(0,500,and(nollvillkor2,block_diag_skriv),T) { nollställer cell 500 om ej signal }

                      mult(buy8,10)
                      )

                      Comment


                      • #12
                        Wheelie,
                        Jag såg att det smugit sig in ett fel parameternamn när jag uppdaterade texten, det är nu rättat.

                        Den här delen:
                        { Skriv tid i cell }
                        nysignal=and(buy5,eqv(GetGvar(500,N),0))
                        SetGvarIf(minut_nu,500,and(nysignal,block_diag_skrivn),T)

                        Ska du ändra till det här:
                        { Skriv tid i cell }
                        nysignal=and(buy5,eqv(GetGvar(500,N),0))
                        SetGvarIf(minut_nu,500,and(nysignal,block_diag_skriv),T)

                        Last edited by LillWicke; 2012-06-15, 12:29.

                        Comment


                        • #13
                          LillWicke, är det så här man ska tolka ditt fladderscript:

                          Då signal (buy7) ges för första gången i en period så startas en timer. Då timern gått 5 minuter men mindre än 8 minuter så ges skarp utsignal (buy8) direkt om/så fort som signal (buy7) ligger kvar/ges igen. Då utsignal (buy8) givits så ges ingen annan signal ges under samma period utan buy8=True under hela den återstående delen av perioden?

                          Comment


                          • #14
                            Ursprungligen postat av Christer Visa inlägg
                            LillWicke, är det så här man ska tolka ditt fladderscript:

                            Då signal (buy7) ges för första gången i en period så startas en timer. Då timern gått 5 minuter men mindre än 8 minuter så ges skarp utsignal (buy8) direkt om/så fort som signal (buy7) ligger kvar/ges igen. Då utsignal (buy8) givits så ges ingen annan signal ges under samma period utan buy8=True under hela den återstående delen av perioden?
                            Du är på rätt väg. Perioder har ingenting med det hela att göra utan det kan bli fler signaler under samma period. Scriptet består dessutom av två delar som löser två olika problem.

                            Del A
                            Vad scriptet gör, som du så riktigt påpekar, är att en timer startar så fort en signal ges, (oavsett period). Är signalen fortfarande giltig efter 5min (ställbart)så tas en position. Blir signalen under de 5 minuterna ogiltig (i det här fallet att en köpsignal slår om till sälj) nollas timern. Blir det därefter en ny köpsignal sätts timern på igen.

                            Den här delen av filtret är bra om scriptet skulle böja "fladdra" och ge falska köp och säljsiganler. Dessa filtreras då bort. (Det finns sedan tidigare ett liknande filter för köp och säljscripten "timelock" men för exitscripten som det här främst är tänkt för har det inte funnits något lösning mig veterligen)

                            Del B
                            Timern tickar på så länge köpsignalen är aktiv, och detta kan den vara under flera timmar eller dagar beroende på hur orginalscriptet ser ut, men det här filtret ser till att köpsignalen bara är giltig under 8 minuter (ställbart) trots att ursprungsscripet fortsätter att signalera köp.

                            Dethär är bra om man vill kunna koppla på en stopploss till modellen. I så fall måste den här delen av filtret ligga i köp- och säljscripten, annars tas genast en ny position åt fel håll så fort stoppen löst ut.

                            Summa summarum:
                            Scriptet består av två delar, den ena delen är bra för exitscripten medan den andra är bra för enterscripten. Genom att kombinera båda funktionerna i ett och samma "fladderscript" behöver man inte bry sig vad som är vad, utan man lägger helt enkelt in scriptet i alla fyra orginalscripten.

                            Därefter kan man om man vill trimma signal_delay och signal_lock. Köpscriptet kanske inte skall ha någon signal_delay alls, medan exitscriptet kanske skall ha 7min det men avgör man själv.

                            Comment


                            • #15
                              Jag har uppdaterat första inlägget med nya komentarer i "EDIT2"

                              Comment

                              Working...
                              X