Allmänt meddelande

Collapse
No announcement yet.

backtesta vinst/förlust

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

  • backtesta vinst/förlust

    Tjena! Hoppas du kryar på dig Lasse!
    Tänkte kolla lite på det här med att backtesta script som inehåller vinsttest. Du lade ut ett skelett för en tid sen med lite teorier hur man kan göra med RetVal tex.
    Har försökt få till det men har inte riktigt lyckats.

    Var det tänkt att det skulle funka enbart i backtesten, eller syns flaggorna korrekt oxå?
    Eller så har jag missat nåt....


    Tänkte mig nåt sånt här:


    sl) Köp

    i30(
    del1sälj=--säljscriptets signal--
    lasttrades=Retval(if(And(del1sälj,gt(getval(3),getval(4))),D,Getval(4)),4)
    del1sedansälj=hhvbars(And(ge(d,getval(4)),lt(ref(d,1),getval(4))),bakåt1)
    stoppok=hhv(And(ge(d,getval(4)),lt(ref(d,1),getval(4))),bakåt1)
    säljpris=aref(b,del1sedansälj:bakåt1)
    vinst=And(Lt(c,säljpris),stoppok)
    köpsignal=And(vinst,resten köpscriptets signal här)
    )



    sl) Sälj

    i30(
    del1köp=--köpscriptets signal här--
    lasttradek=Retval(if(And(del1köp,or(ge(getval(4),getval(3)),eqv(getval(4),0))),D,Getval(3)),3)
    del1sedanköp=hhvbars(And(ge(d,getval(3)),lt(ref(d,1),getval(3))),bakåt1)
    stoppok=hhv(And(ge(d,getval(3)),lt(ref(d,1),getval(3))),bakåt1)
    köppris=aref(s,del1sedanköp:bakåt1)
    vinst=And(Gt(c,köppris),stoppok)
    säljsignal=And(vinst,resten av säljscriptets signal här)
    )

  • #2
    Det saknas en sak bara.

    Köpscriptet behöver någonstans en uppdatering med retval(d,3) om det är köpsignal, annars blir aldrig första satsen sann om att cell 3 har senare tidpunkt än cell 4.

    Så början ser helt korrekt ut men en sats som lagrar nytt värde i cell 3 om köpsignal behövs. Samma princip med if-sats där du hämtar gamla värdet och lagrar det igen om inte signal, eller uppdaterar cell 3 med nytt värde D om köpsignal.

    Så lasttradek-raden skall finnas i köpscriptet på slutet också.

    Du har både köp och säljscript i samma script, och uppdaterar cell 3 med D(periodens tidstämpel) bara om ny köpsignal efter senaste sälj, och cell 4 bara om ny säljsignal efter senaste köp. Så de falska signalerna emellan filtreras därmed bort.

    Den korsbefruktningen måste finnas att cell 3 har senaste köptidpunkt och cell 4 senaste säljtidpunkt.

    Comment


    • #3
      TIPS

      Som det är skrivet så får du en tidpunkt att kolla stoppen mot när du scannar efter köpkursen.

      Då kan du i skarpa fallet använda lasttrade(b,d) och lasttrade(s,d) istället för getval(3) och getval(4) respektive.

      Det är inget som hindrar att du för backtesting lagrar undan köp-säljkursen direkt heller i cell 5 o 6 t.ex.

      Då slipper du hela backscannern med del1sedansälj och säljpris-raderna, och bara koncentrera dig på avslutande testen för vinst och signal. Ett getval(5) ger dig t.ex köppriset direkt, och ett getval(6) säljpriset.

      Och skarpa fallet lasttrade(b,p) och lasttrade(s,p) kan användas istället.

      Comment


      • #4
        Hiitade mitt skelett från förut...

        http://www.frndsw.com/vbulletin/show...hlight=getval4

        Comment


        • #5
          Grundtanken i mitt fall är att ta fram en modell för lite mer aggressiv daytrading, tex med studs i bollinger i EricB eller likn. Då är det extra viktigt att kolla att det finns vinst innan man vänder en position. Om det inte finns vinst så kan man kolla mot ett kort medelvärde och se om det pekar åt "rätt" håll, i så fall väntar man lite. Om det pekar fel, så får man ta förlusten.

          Men det blir ju livsviktigt att kunna backtesta om det finns vinst eller inte, och även att kunna se direkt på flaggorna om de hamnar rätt. Fungerar lagringen av inköpsvärden i cellerna även vid uppritningen av flaggorna i diagram?

          Comment


          • #6
            Borde bli nåt sånt här om jag tror rätt, problemet är bara att jag inte får igenom scriptet genom syntaxkontrollen....och kan inte hitta felet. har provat att isolera bort rad för rad, men det lyckas inte.
            Obs, detta är inte nåt färdigutvecklat script, utan bara en ide jag testar. Kör INTE skarpt på detta, om nu någon skulle få för sig att prova...



            sl) Köp

            rgln1:=Linreg(c,2)
            bbl1:=Lt(rgln1,BolBands(20,1.2,l))
            bbl2:=Lt(rgln1,BolBands(20,1.9,l))
            bbl3:=Lt(c,BolBands(20,0.9,u))
            bbu1:=Gt(rgln1,BolBands(20,1.2,u))
            bbu2:=Gt(rgln1,BolBands(20,1.9,u))
            bbu3:=Gt(c,BolBands(20,0.9,l))
            kurva:=Mov(c,40,e)
            ner:=Lt(LlvBars(kurva,2),1)
            upp:=Lt(HhvBars(kurva,2),1)
            oktrendköp:=Not(Hhv(ner,12))
            oktrendsälj:=Not(Hhv(upp,12))
            bakåt1:=200
            i10(
            switchner=Lt(LlvBars(kurva,2),1)
            spärrasälj=Not(Hhv(switchner,20))
            säljsignal1=If(And(Not(spärrasälj),switchner),bbu1,bbu2)
            säljsignal2=Or(säljsignal1,And(bbu3,oktrendsälj))
            lasttrades=Retval(if(And(säljsignal2,gt(getval(3),getval(4))),D,Getval(4)),4)
            del1sedansälj=hhvbars(And(ge(d,getval(4)),lt(ref(d,1),getval(4))),bakåt1)
            stoppok=hhv(And(ge(d,getval(4)),lt(ref(d,1),getval(4))),bakåt1)
            säljpris=aref(b,del1sedansälj:bakåt1)
            vinst=And(Lt(c,säljpris),1)
            switchupp=Lt(HhvBars(kurva,2),1)
            spärraköp=Not(Hhv(switchupp,20))
            köpsignal1=If(And(Not(spärraköp),switchupp),bbl1,bbl2)
            köpsignal2=And(vinst,Or(köpsignal1,And(bbl3,oktrendköp)))
            köpsignal3=Retval(if(And(köpsignal2,or(ge(getval(4),getval(3)),eqv(getval(4),0))),D,Getval(3)),3)
            )

            Comment


            • #7
              Mer ang. backtest

              Retval och getval är mycket intressanta funktioner men ack så svåra att få full kontroll över! Jag väljer som vanligt ett mycket enkelt exempel för att det skall bli glasklart vad som egentligen görs. Vi krånglar inte till det för mycket i första rundan.

              signal:=gt(c,mov(c,10,s))
              {Denna signal råder ofta flera perioder iföljd.}

              köpsig1:=and(signal,NOT(aref(signal,1)))
              {Enast första perioden får giltig köpsignal.}

              Nu vill jag lagra undan c-värdet till cell 1 för backtest av köpsig1. Hur skriver jag då?
              Kan ”lagra:=retval(c,1)” duga att ha med i köpscriptet?
              Min teori är då att c lagras i cell 1 vid varje kursinsamling och det slutliga c för perioden finns sedan i cell 1?

              Om jag nu i ett annat säljscript vill sälja 2 pkt över vad som nu finns lagrat i cell 1. Hur skriver jag då? Och kan jag få flagga vid dessa punkter?
              hämta:=getval(?,1)
              säljnivå:=add(hämta,2)
              säljsig1:=gt(h,säljnivå)

              Sedan skulle jag kunna backtesta mellan köpsig1 och säljsig1. Alltså några verkliga affärer har ju inte ägt rum.

              Comment


              • #8
                Åke...

                Cellerna för hantering med retval() och getval() har bara livslängd över en omritning i diagram eller körning av ett script.

                Undantaget är när verkliga ordertransar sker så lagras cellerna 0-4 undan också som man kan hämta med lasttrade(,01234).

                Så retval() getval() fungerar t.ex bra för att överföra info från ritning av script i en graf, från period till period. Du kan t.ex administrera egen hantering av både köp och säljsignal i samma script enligt mallen jag visade ovan.

                Så om du i ett script lagras C i cell 1 så förvänta dig inte att det finns där nästa gång scriptet körs, dvs en omritning i diagrammet eller en körning i bevakningen när kursinsamlingen går.

                Detta gäller också Analysbänken och körning där. Du startar alltid med noll i alla celler vid allra första stapelns körning, men kan sedan använda det för resterande staplar som man kör.

                Vill du använda det succesivt för att backtesta och hålla reda på en kursnivå eller när en köpsignal var senast går det bra(t.ex med tekniken visat i mallen ovan).

                Eftersom alla scriptfunktioner i Friendly alltid körs måste du använda en vattendelar i en if()-sats.

                if(vill ha nytt värde, nytt värde här, annars gamla värdet här)

                Därav ett exempel med cell 3 som får periodens starttidpunkt uppdaterad om 'signal'

                retval(if(signal,D,getval(3),3)


                Detta plockar med sig gamla värdet i cellen och återlagrar det om det inte är signal, men om signal läggs nytt värde.

                Dina skrivsätt är ok men använd

                lagra=retval(c,1)

                OBS! Undvik använda cell 0 och cell 1 ifall för backtesting. Analysbänken tar värden i cell 0 som den kursnivå man vill returnera för en trans, och cell 1 med värde skiljt från noll markerar Entry i marknaden och får bara användas vid strategin innehav-cash-blankning-cash. Så retursignal från script och ett värde i cell 1 anger entry, och retursignal och noll i cell 1 anger exit

                Så i backtesting situationen kan du mycket väl använda både köp och sälj i samma script, och lagra dessa enligt egna idéer i cellerna 0-9 för att flytta med info från en stapel till en annan när scriptet körs.

                Scriptet skulle då kunna se ut som

                signal:=gt(c,mov(c,10,s))
                köpsig1:=and(signal,NOT(aref(signal,1)))
                lagra=retval(if(köpsig1,C,getval(3),3)

                ---andra delar i scriptet---

                hämta=getval(3)
                säljnivå=add(hämta,2)
                säljsig1=gt(h,säljnivå)

                'hämta' får close från senaste köpsignal ovan.

                OBS! eftersom jag använd minnesreferens i lagra så blir resten också minnesreferenser på slutet.

                Comment


                • #9
                  Intressant med varaktigheten, det var nytt.

                  lagra=retval(if(köpsig1,C,getval(3),3)

                  Före någon köpsig1 inträffat finns inget i cell 3 att flytta. Blir värdet i cell 3 ”0” då?

                  Måste allt detta finnas i samma script?

                  Det som jag skissat tidigare gällde ju två olika script. Är enda möjligheten att hämta cell 3 till ett annat script att en ordertrans finns och att använda LastTrade(3) (Skrivs det så då?)

                  Hur skall man kunna vinsttesta om både köp och sälj finns i samma script?

                  Comment


                  • #10
                    Ja, det är noll initialt i varje cell när scriptet kompileras och görs redo för körning. Detta görs så fort man skall ritas om en graf, eller att bevakning är påkopplad och nya kurser kommer in.

                    Undantaget är när man använder Frys Alla Scriptpå högerklick-menyn i graf, då scripten är körda och resultatet lagrat i minnet, och man ritar alltid från en sådan lagrad datamängd i minnet tills scriptet uppdateras eller frysfunktionen tas bort.

                    Noll i initialt värde hanteras t.ex av denna scriptraden så att man undersöker om det fortfarande är noll i cellen, och i så fall lägger man alltid dit nytt värde, och man går förbi kontrollen att värdet skall vara senare i tid.

                    lasttradek=Retval(if(And(del1köp,or(ge(getval(4),getval(3)),eqv(getval(4),0))),D,Getval(3)),3)

                    eqv(getval(4),0) gör detta i en OR()-funktion.

                    Detta måste finnas i samma script. Du kan inte byta värden mellan script annat än i fallet som du nämner med ordertransar.

                    I de fall när man gör script som är beroende av andra typen t.ex du gör ett säljscript som behöver veta när det var köp senast, då kan du behöva lägga både köp och säljscripten i samma script för backtesting. Exempel är ju flytande stoppar då du vill veta vilken köpnivå du hade, eller vilken tidpunkt köp skedde så du kan ta reda på köpnivån.

                    Det avslutande returvärdet i varje script avgör om det är köpscript eller säljscript.

                    LastTrade() prototyp är LastTrade(BS,VPD01234) vilket betyder att du har ett värde för köpsidan och ett för säljsidan.

                    Om man är osäker vilken som varit senast kan man undersöka med bara LastTrade() utan parametrar och du får noll om köp är senast, och 1 om sälj är senaste trans.

                    Du kan förståss också köra en test Gt(LastTrade(s,d),LastTrade(b,d)) för att se vilken som är senast.

                    För att göra de mer avancerade testerna i Analysbänken där köp-sidan är beroende av vad som skett på säljsidan tidigare, och tvärtom, så gör du två script som vanligt där stommen i både köp och sälj-sidan finns i båda scripten och sedan är utformade så respektive returnerar värde från rätt sida s a s.

                    Comment


                    • #11
                      Rikard..

                      Lägg märke till avslutningen i min mall

                      lasttrades=Retval(if(And(del1sälj,gt(getval(3),getval(4))),D,Getval(4)),4)
                      and(del1sälj,1)

                      Jag låter snurran som uppdaterar säljtidpunkten komma näst sist, och ser till att scriptet får en avslutande rad där man säkrar vad som scriptet returnerar för signal eller inte signal.

                      Det du skrev blir på slutet blir hela scriptets returvärde.

                      Lägg till en rad

                      and(köpsignal2,1)

                      så säkrar du att du får sant/falskt i retur på rätt ställen från scriptet som helhet.

                      Comment


                      • #12
                        Du menar ungefär så här?

                        rgln1:=Linreg(c,2)
                        bbl1:=Lt(rgln1,BolBands(20,1.2,l))
                        bbl2:=Lt(rgln1,BolBands(20,1.9,l))
                        bbl3:=Lt(c,BolBands(20,0.9,u))
                        bbu1:=Gt(rgln1,BolBands(20,1.2,u))
                        bbu2:=Gt(rgln1,BolBands(20,1.9,u))
                        bbu3:=Gt(c,BolBands(20,0.9,l))
                        kurva:=Mov(c,40,e)
                        ner:=Lt(LlvBars(kurva,2),1)
                        upp:=Lt(HhvBars(kurva,2),1)
                        oktrendköp:=Not(Hhv(ner,12))
                        oktrendsälj:=Not(Hhv(upp,12))
                        bakåt1:=200
                        i10(
                        switchner=Lt(LlvBars(kurva,2),1)
                        spärrasälj=Not(Hhv(switchner,20))
                        säljsignal1=If(And(Not(spärrasälj),switchner),bbu1,bbu2)
                        säljsignal2=Or(säljsignal1,And(bbu3,oktrendsälj))
                        lasttrades=Retval(if(And(säljsignal2,gt(getval(3),getval(4))),D,Getval(4)),4)
                        del1sedansälj=hhvbars(And(ge(d,getval(4)),lt(ref(d,1),getval(4))),bakåt1)
                        stoppok=hhv(And(ge(d,getval(4)),lt(ref(d,1),getval(4))),bakåt1)
                        säljpris=aref(b,del1sedansälj:bakåt1)
                        vinst=And(Lt(c,säljpris),1)
                        switchupp=Lt(HhvBars(kurva,2),1)
                        spärraköp=Not(Hhv(switchupp,20))
                        köpsignal1=If(And(Not(spärraköp),switchupp),bbl1,bbl2)
                        köpsignal2=And(vinst,Or(köpsignal1,And(bbl3,oktrendköp)))
                        köpsignal3=Retval(if(And(köpsignal2,or(ge(getval(4),getval(3)),eqv(getval(4),0))),D,Getval(3)),3)
                        And(köpsignal2,1)
                        )


                        Det tråkiga är att jag får inte igenom det i syntaxen i alla fall....har inte överskridit parentesdjupet utan det är nåt annat fel som jag inte hittar.

                        Comment


                        • #13
                          Det är bara

                          ner:=

                          som är delnamn av switchner, så det uttrycket infogas i minnesreferensens namn och blir knas.

                          Döp om till ner1 och ändra på de ställen där det förekommer bara.

                          Samma sak gäller för

                          upp:=

                          så ändra det också.

                          Comment


                          • #14
                            Aaahhhhh.....att man aldrig lär sig! Tackar!

                            Comment


                            • #15
                              Rikard...

                              Nu har du gått i samma fälla som jag gjorde för ett antal dagar sedan med problemet "kurva".

                              Jag visste inte ens att fällan fanns förrän den slog igen. Det mest förrädiska med detta är att det inte alltid märks att något är fel. Så det gäller att se upp med hur man namnge minnesreferen-serna. Men det är erfarenheterna som räknas, det andra är bara teori.

                              Lasse...
                              Tack för undervisningen! Det kommer troligen ut något possitivt ur detta. Behöver nog helgen för studie. Problemet kan dock bli att minnesreferenserna (32) har svårt att räcka till om så mycket skall läggas i samma script. Får se hur jag löser det.

                              Comment

                              Working...
                              X