Allmänt meddelande

Collapse
No announcement yet.

Stop loss i script och historiska test

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

  • Stop loss i script och historiska test

    Jag försöker göra något så enkelt som att lägga in en flytande stoploss efter varje köpsignal. Den skall baseras på köpsignalens triggerpris och ligga kvar tills en säljsignal genereras. Det borde vara busenkelt, men jag är ny på active trader och har inte lyckats. Jag ser att det är ganska lätt i en live trade, men jag vill ha det i scripten så att jag kan testa historiskt.

    Jag har provat att använda RETVAL och SETGVARIF. När en köpsignal genereras kan de skriva till de registren. Men efter en stunds experimenterande ser det ut som att hela köpscriptet exekveras först innan säljscriptet går igång - åtminstone när de skall ritas in i graferna. Det innebär att säljscriptet bara kan läsa det sista värdet som köpscriptet skrev in.

    Är det någon som vet vad jag har missat?

  • #2
    Jag har ett som du kan använda som mall:

    flytfaktorstd:=0.985
    flytfaktorvinst:=0.995
    flytfaktornedtrend:=0.99
    absfaktor:=0.985
    vinstfaktor:=1.02
    bakåt1:=480
    m5dgr:=mov(c,480,s)
    m5ok:=gt(m5dgr,aref(m5dgr,3))
    köpentry:=and(cross(c,m5dgr),m5ok)
    blankentry:=and(cross(c,m5dgr),not(m5ok))
    i5(
    lasttradek=Retval(if(And(köpentry,or(ge(getval(4),getval(3)),eqv(getval(4),0))),D,Getval(3)),3)
    efterinköp=if(ge(d,getval(3)),h,0)
    highlevelb=hhv(efterinköp,bakåt1)
    stoppok=gt(getval(3),getval(4))
    köppris=find(And(ge(d,getval(3)),lt(ref(d,1),getval(3))),bakåt1,c,1)
    vinst=gt(highlevelb,mult(köppris,vinstfaktor))
    badtrend=not(m5ok)
    flytnivå=if(vinst,flytfaktorvinst,if(badtrend,flytfaktornedtrend,flytfaktorstd))
    stoppkurva=mx(mult(highlevelb,flytnivå),mult(köppris,absfaktor))
    stoppsälj=and(stoppok,le(l,stoppkurva))
    lasttrades=Retval(if(And(stoppsälj,gt(getval(3),getval(4))),D,Getval(4)),4)
    draw(if(stoppok,stoppkurva,0),2,rqb)
    mult(stoppsälj,25)
    )

    Använd detta som säljscript i Analysbänken, och stoppa in köpentry enligt dina önskemål.

    Köpscriptet som genererar köpentry enligt samma villkor som ovan används som köpscript i analysbänken.

    Det är baserat på Per Wallins script som ligger här på forumet någonstans, men är utbyggt med lite flera tillval. Vid krav på vinst uppfyllt så snävas stoppen upp, och vid negativ trend på långt medel snävas den upp.

    Jag använder cell 3 och 4 via retval() och getval() för att hålla reda på senaste köpentryt.

    Comment


    • #3
      Tack för det.

      Jag har dissikerat det en smula - ganska lärorikt.

      Omedelbart ser det ut som om att den långa raden som börjar med "lasttradek=" som sätter tidspunkten för en köpsignal kommer att sätta tidpunken för varje "falsk" köpsignal också som inträffar före den första stop lossen. Vilket i sin tur innebär att köppris blir fel.

      Jag har dessvärre inte kunnat se hur det ser ut i grafen eftersom jag inte har fått någon intradagsdata ännu (CDn har fastnat i postväsendet). Och mitt försök att göra om scriptet till att köra på slutkurser skall nog göras på en gynnsammare tidpunkt på dagen :-)

      En annan juniorfråga: Är "=" ekvivalent med ":="?

      Comment


      • #4
        Nejdå, den kollar ifall det är säljsignal senast, bara då uppdaterar den köpsignalsidans snurra, och tvärtom. Så de falska signalerna skall elimineras. Scriptet ritar en kurva då stoppen är aktiv också.

        Har det inte kommit än med posten, då postar jag ett ny försändelse till dig. Väntade några dagar extra och tänkte att det kanske blev fördröjt bara.

        Då har du ingen utbildningscd, vilket är lite svårt att komma in i olika saker utan kanske.

        Via vanliga kundservicedialogen kan du hämta hem över två års kurser, så du är absolut inte utan kurser nu för att börja labba.

        Öppna dialogen, välj kanske 5 dagar eller så till att börja med, och verkställ de papper som är förvalda. När det gått igenom ta till lite mer och kör in några månader eller så. Så länge du inte kryssar för Ersätt befintligt, så tittar programmet individuellt vad som redan finns och läser bara det som behöver läsas. Ungefär 10 intradaydagar/sekund läses in, så då kan du uppskatta med antal papper och tidsrymd hur mycket tid det kommer att ta.

        = och := är inte samma sak.

        := är definition av ett kortare namn på en textmassa till höger. Den texten placeras in överallt där den används.

        När man skriver funkar de som variabler i princip, men man duplicerar kod på olika ställen.

        Fördelen med definitioner är att man kan lämna oanvända sådana rader utan att det blir belastande kod att köra för programmet. Så medan man labbar kanske man tidvis plockar in saker och ur saker längre ned, för det är först när det används på en rad utan := som det blir körbar kod av det.

        = är minnesreferenser/variabler och är alltid körbar kod, och intradayprefixet skall omsluta hela området med sådana på slutet.

        Sådan kod körs bara en gång per period som skall avverkas, och blir därför effektivare när man väl har ett script som skall köras i produktion.

        Comment


        • #5
          Tack för hjälpen igen.

          Men jag vill nog insistera lite till på scriptet. Enligt min mening skall OR-satsen bort tillsammans med EQV-satsen. När vi får en köpsignal sker följande:

          Före första köp:
          val(3)==0 : val(4)==0 -> GE-satsen sann, val(3) sätts

          Efter första köp, före stoploss löser ut:
          val(3)>0 : val(4)==0 -> OR-satsen sann, val(3) sätts igen

          Förutsatt förståss att alla getval-värden är noll i starten av scriptet. Men det kanske jag kan läsa om i utbildningsCDn när den dyker upp :-)

          Jag har fortfarande lite svårt att få grafiken att ritas ut som jag har tänkt mig, men det blir långsamt bättre allteftersom mina insikter i scriptspråket fördjupas.

          Allt hade varit enklare om scripten körts parallellt så att man hade kunnat kommunicera mellan scripten under tiden som de körs. Dvs för varje gång man stegar fram en period så kör man igenom alla script. Då skulle det bli så mycket enklare att bara slänga på ett dussin olika köpscript till ett dussin olika säljscript. Nu måste man skarva ihop alla tänkbara kombinationer i ett script. Kan man önska sig det i en framtida version? Fast det hör förståss hemma i en annan tråd...

          Comment


          • #6
            Du har en And() med köpsignalen också, så det är nog ok som det är. Det sätter första cellen när första köpsignal finns, om det är första värdet, oavsett övriga villkor.

            Cellerna är normalt initiera med noll som du antog.

            Vad är det du vill göra med så många parallella? Är det för att finna ut fler villkor du vill ha in, eller vad?

            För att köra i graf kan du ju köra 64 parallella script om så är, och varje script kan rita 11 kurvor/flaggor.

            Comment


            • #7
              Här är mitt bud på ett stoplosscript. Jag tänkte att det kanske kunde intressera någon. Den ligger på en fix nivå. Det är enkelt att byta ut köpsignalsenheten (köpsignalen i exemplet är tänkt för slutkurser). Och det hela är rikligt kommenterat.

              Det jag saknar nu är att utöka scriptet så att det också kan blanka en aktie på samma premisser och sedan köra en stoploss på blankningspositionen. Om någon har ett bud eller ett ett tips är jag intresserad.

              sl) Köp på volym- och prisökning med stoploss


              {---Stoplossnivå---}
              stoplossfaktor:=0.93

              {***************************KÖPSIGNAL****************************************}

              {---Volymökning som skall till för att utlösa köp----}
              volymökning:=1.50

              {---Volymökning uppnått?----}
              ökadvolym:=GT(MULT(v,volymökning),REF(v,1))

              {---Prisökning uppnådd?---}
              ökatpris:=GT(c,REF(c,1))

              {---Köpsignal----}
              köpsignal=AND(ökadvolym,ökatpris)

              {************************STOPLOSS*UPPDATERING**********************}

              {---Tidigare stoplossnivå---}
              stoplossnivådå=GETVAL(3)

              {---Stoploss baserat på dagens värde---}
              stoplossnivåidag=MULT(H,stoplossfaktor)

              {---Uppdatera stoploss---}
              stoplossnivånu=RETVAL(IF(OR(köpsignal,GT(stoplossnivådå,0)),MX(stoplossnivådå,stoplossnivåidag),0),3)

              {---Rita stoploss---}
              draw(stoplossnivånu,5,rqb)

              {****************************STOPPLOSS*UTLÖSER************************}

              {---Kontrollera om stoploss ger säljsignal---}
              sälj=LE(l,stoplossnivånu)

              {---Om säljsignal, så nollställs stoplossnivån---}
              stoplossnivånu=RETVAL(IF(sälj,0,GETVAL(3)),3)

              {****************************SÄLJSIGNAL************************************}

              MULT(sälj,50)

              Comment


              • #8
                Några kommentarer bara:

                1. Utan intradayprefix så är detta kopplat till bevakning eller i ordermodell kört på eod-kurser, inte intraday något.

                Det ser dock ut att vara tänkt för EOD, men jag nämnder det ändå.

                2. retval()-cellerna har livslängd bara för scriptets livslängd när det körs. Dvs det funkar för backtesting i en graf, men inte för bevakning online.

                Ändra om till användning av globala variabler cell 0-899 så skall det funka också.

                OBS en cell för globalt bruk har ingen koppling till papper, så varje script behöver vara unikt för varje papper man använder det på.

                Comment


                • #9
                  Tack för det. Bra att veta. Jag har inte kommit igång med orderläggningsscript ännu.

                  Jag såg också ditt inlägg om blankning i analysbänken i en annan tråd, men det ser omedelbart lite klurigt ut om man vill köra stoploss.

                  Comment


                  • #10
                    Jag lade några skelett att utgå från för att kunna köra både innehav, blankning och stoppar på respektive i avdelning Senaste Utgåvan.

                    Ett script kan signalera entry eller exit via retval(x,1) där x=0 betyder exit, och x=1 betyder entry.

                    Kör man då strategi Innehav-kontant-Blankning-kontant kan man styra precis hur man vill handla.

                    Köp-kontant-köp-vänd pos-kontant eller hur man vill.

                    När säljscriptet är beroende av köpsidan så har du också sett exempel på tidigare i denna tråden hur man bakar samman köp och säljscript i samma, och låter dem hålla reda på tidpunkter för köp och sälj.

                    Comment


                    • #11
                      Om entry för blankningar genereras från säljscriptet och vanliga långa entries från köpscriptet så blir köpscriptet beroende av säljscriptet och säljscriptet beroende av köpscriptet.

                      Så åter igen saknar jag att kunna exekvera scripten parallellt, stapel för stapel, så att de kan kommunicera sins emellan och att det ena scriptet kan se vad det andra hittar på - ungefär som vid riktig handel. Fast det går kanske i analysbänken med animering påslagen? Jag behöver läsa på lite till, tror jag.

                      Comment


                      • #12
                        Det går enbart enligt de principer jag nämnt, dvs att slå ihop köp och sälj i samma script och få dem att utbyta info i snurrorna i cell 3 o 4 som jag ofta använt.

                        I säljscriptet ligger köpdelen först. Sedan kommer säljdelen med stoppen som behöver info från köpsidan.

                        Sedan tvärtom i köpscriptet där säljdelen/blankentry ligger först och sedan köpdelens stopp.

                        Det funkar mycket bra, men håller med att det är inte det allra lättaste att starta karriären som backtestare med.

                        Comment

                        Working...
                        X