Allmänt meddelande

Collapse
No announcement yet.

"Äkta" Stop Loss för långsiktigare innehav.

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

  • "Äkta" Stop Loss för långsiktigare innehav.

    Lasse!

    Bif stop loss, som är en variant av vad som diskuterats de sista dagarna har den nackdelen (som de andra) att när innehavet har passerat värdet(tiden) för "titta bakåt" följer stop nivån med ner med kursen. Jag har fösökt laborera med antalet perioder men programmet meddelar otillåten åtgärd och stänger om man går längre tillbaka än ca 600 perioder. Slut på minnet? Det är ju ändå bara att tidsförskjuta problemet.

    Hur kan man låsa stopp värdet till högsta nivån fram till fsg oberoende av tid för innehavet? Man kan ju använda NN:s stop loss- funktion men då riskerar man i onödan att åka ut på spikar.

    flytnivå:=0.85
    {dvs % ner från högsta MV punkt}
    bakåt:=600
    kortMA:=mov(c,2,s)
    {elastisk stoppnivå 2 per}
    start:=if(ge(d,LastTrade(b,d)),kortMA,0)
    max:=hhv(start,bakåt)
    mingräns:=mult(max,flytnivå)
    medv:=mov(c,2,s)

    innehav:=GT(portfolio(V),0)
    i1(mult(innehav,mingräns))

    För länge sedan fick jag:

    nivå:=0.95
    bakåt:=600
    start:=if(ge(d,LastTrade(b,d)),h,0)
    max:=hhv(start,bakåt)
    mingräns:=mult(max,nivå)
    innehav:=GT(portfolio(V),0)
    undergräns:=le(c,mingräns)
    del1:=mult(innehav, undergräns)
    i1(multdel1)

    men det har jag labbat sönder tydligen.
    HMS

  • #2
    Undre scriptet får syntaxfel och bör se ut som detta:

    nivå:=0.95
    bakåt:=600
    start:=if(ge(d,LastTrade(b,d)),h,0)
    max:=hhv(start,bakåt)
    mingräns:=mult(max,nivå)
    innehav:=GT(portfolio(V),0)
    undergräns:=le(c,mingräns)
    del1:=mult(innehav,undergräns)
    i1(del1)

    Ett mellanslag i 'del1' och en ofullständig 'mult' på slutet.

    Om något kraschar så kontrollera i syntaxkontrollen hur mycket datastack du har.

    Vid test gav dina script 2500 och 3000 minnesplatser. Se till att siffran inom parentes är högre än detta.

    En del script som vi svänger oss med kan kräva uppåt 30 000 platser.

    Varje minnesplats är ett flyttal och tar 8 bytes.

    Så att köra ett script vilket som helst med värdet 30 000 i datastack kräver 240 kb. Då får man ha väldigt lite minne i sin maskin om man inte klarar det.

    Hur som helst, om du t.ex kör i intraday 10-minuters istället, så kan du minska värdet i 'bakåt' till 60 istället för 600 med samma resultat för undre scriptet.

    När du kör ren stoploss och inga andra metoder som är periodberoende så är det exakt samma funktion, men med mycket mindre last på systemet.

    Övre scriptet har du ju medelvärde där och det kan ju påverka när det löser ut.

    Comment


    • #3
      Tack Lasse, nu funkar det.
      Måhända är det som Räven sa till Lille Prinsen: "Det är bara med hjärtat man kan se ordentligt, det viktigaste är osynligt för ögonen."

      Men det rättade scriptet funkar bara som flagga, ej som kurva. Det enda som skiljer är ju raden: undergräns:=le(c,mingräns). Jag är inte kropp att föstå varför man ej kan skriva detta script också som kurva.
      HMS

      Comment


      • #4
        Det går ju bra att modifera för kurva

        ....
        undergräns:=le(c,mingräns)
        del1:=mult(innehav,mingräns)
        i1(del1)

        Vill du har kurva hela tiden oberoende av om du har innehav eller inte:

        undergräns:=le(c,mingräns)
        del1:=mult(innehav,undergräns)
        i1(mingräns)

        Raden
        undergräns:=le(c,mingräns)

        är ju den som ser till att det antingen kommer ut noll eller ett hela tiden. Du gör en logisk test och ut från den kommer enbart dessa värden.

        Så plockar du in kurvan du testar mot där istället som slutgiltiga utvärdet, så blir det kurvan du får.

        Comment


        • #5
          Hej!
          Nu vet jag inte om Per Wahlin är med oss här längre , men är det så här han tänkt att det ska se ut.
          Om köp sker på 687 så löser nödstoppen ut på ca670?

          {signaler bara vid innehav}
          innehav0:=1 {---------------för produktion----------------------}
          bxakåt1:=300
          exfterköp:=ge(d,LastTrade(b,d))
          kxöpkurs:=LastTrade(b,p)
          {-------------------för test---------------}
          bakåt1:=60
          efterköp:=1
          köpkurs:=687
          {---------------------------------------------}
          {-- Absolut stoploss 2 % av köpkurs --}
          {-- eller flytande stoploss 4 % --}
          absolutStoploss0:=0.98
          flytandeStoploss0:=0.96
          jfrlevel0:=if(efterköp,h,0)
          max0:=hhv(jfrlevel0,bakåt1)
          stoplevel0:=mx(mult(köpkurs,absolutStoploss0),mult(max0,flytandeStoploss0))
          {-- undvik tillfällig spik genom att testa mot de två senaste perioderna --}
          stabiltfall0:=2
          stoploss0:=llv(lt(l,stoplevel0),stabiltfall0)
          i10(mult(and(innehav0,stoploss0),30))

          Comment


          • #6
            Det ser riktigt ut.

            Din simulering bara innebär att du alltid får högsta inom 60 perioder som referens för beräkning av stoppnivån.

            Du kan göra så här om du vill


            efterköp:=ge(d,Date(20040519.5))

            Då får du idag klockslag 12.00 som tidpunkt för köpt. Modifiera till önskat datum+decimaltal för korrekt tidpunkt.

            Du kan också göra det lite enklare att byta tidpunkt:


            datum:=20040519
            hh:=12
            mm:=00
            tidpunkt:=div(add(mult(hh,60),mm),1440)
            efterköp:=ge(d,add(Date(datum),tidpunkt))

            Då kan du välja en dag och tidpunkt och kolla den dagen i alla fall.

            Comment

            Working...
            X