Allmänt meddelande

Collapse
No announcement yet.

ATR-baserad stoploss

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

  • ATR-baserad stoploss

    Vi har fått önskemål om en ATR-baserad stopp som utgår ifrån värdet av ATR(10) den dagen köpet gjordes. Dvs, inte en kontinuerligt föränderlig ATR-kurva utan fast.

    De flesta skulle nog fundera på att lagra värdet i en global cell, men vi försöker promota användandet av dataserier istället för att få enklare programmering.

    Om vi antar att man köper en aktie manuellt och därefter vill ansluta en stoploss vars gräns går 3 x ATR(10) från inköpsnivån, så kan vi använda Find() för att hitta den dagen då köpet gjordes. Finessen med Find() är att kommandot kan leta efter ställen då ett visst villkor var uppfyllt, men returnera värdet från en helt annan dataserie.


    För att hitta köpdagen kan vi testa om D (databastid ) är mindre än LastTrade(b,d) som returnerar tidstämpel för senaste köp:


    köpdag=le(d,lasttrade(b,d))

    uttrycket blir sant så länge D är mindre än köpdagen, dvs tidigare än köpdagen.


    För att hitta vad ATR(10) hade för värde den dagen använder vi Find:

    at_värde=find(köpdag,250,atr(10),1)


    Här testas om "köpdag" är sant någon gång inom 250 dagar, och i så fall returneras värdet av atr(10) från den dagen.



    För att beräkna vår stoppgräns behöver vi även veta vilket pris inköpet gjordes på, och subtrahera ifrån värdet av 3 x ATR(10):

    stoppgräns=sub(lasttrade(b,p),mult(3,at_värde))


    Slutligen kopplar vi ihoop de logiska besluten att C (senast betalt) ska vara lägre än köppriset - 3 * atr(10):

    sälj1=lt(c,stoppgräns)


    Dessutom ska vi ju bara sälja om det finns något innehav att sälja:

    innehav=gt(portfolio(v),0)
    sälj1=lt(c,stoppgräns)
    sälj2=and(sälj1,innehav)


    Sammantaget blir hela scriptet:

    köpdag=le(d,lasttrade(b,d))
    at_värde=find(köpdag,250,atr(10),1)
    stoppgräns=sub(lasttrade(b,p),mult(3,at_värde))
    draw(stoppgräns,2,rqb)
    innehav=gt(portfolio(v),0)
    sälj1=lt(c,stoppgräns)
    sälj2=and(sälj1,innehav)
    mult(sälj2,10)


    Notera hur den röda stoppgränsen uppdateras kontinuerligt fram till den dagen då köpet skedde (markerat med gult i diagrammet) och därefter ligger fast.
    Attached Files

  • #2
    Kanon, precis detta som jag har försökt med själv, med lite blandad framgång.
    Detta script verkar helt klart mycket bättre.

    Sedan tycker jag man kan använda ATR-värdet även för targetnivå, men det borde vara lätt att ändra lite i scriptet.
    MadMax

    Comment


    • #3
      En liten fundering; blir inte koden långsammare när du måste loopa tillbaka 250 steg i dataserien flera gånger i sekunden?
      Borde inte denna kod vara mkt effektivare, men ändå inte så svårläst?

      GVAR_AT:=800
      ...
      setgvarif(atr(10),GVAR_AT,le(d,lasttrade(b,d)))
      stoppgräns=sub(lasttrade(b,p),mult(3,getgvar(GVAR_AT)))
      draw(stoppgräns,2,rqb)
      innehav=gt(portfolio(v),0)
      sälj1=lt(c,stoppgräns)
      sälj2=and(sälj1,innehav)
      mult(sälj2,10)

      Ursprungligen postat av Rikard Nilsson Visa inlägg
      Vi har fått önskemål om en ATR-baserad stopp som utgår ifrån värdet av ATR(10) den dagen köpet gjordes. Dvs, inte en kontinuerligt föränderlig ATR-kurva utan fast.

      De flesta skulle nog fundera på att lagra värdet i en global cell, men vi försöker promota användandet av dataserier istället för att få enklare programmering.

      Om vi antar att man köper en aktie manuellt och därefter vill ansluta en stoploss vars gräns går 3 x ATR(10) från inköpsnivån, så kan vi använda Find() för att hitta den dagen då köpet gjordes. Finessen med Find() är att kommandot kan leta efter ställen då ett visst villkor var uppfyllt, men returnera värdet från en helt annan dataserie.


      För att hitta köpdagen kan vi testa om D (databastid ) är mindre än LastTrade(b,d) som returnerar tidstämpel för senaste köp:


      köpdag=le(d,lasttrade(b,d))

      uttrycket blir sant så länge D är mindre än köpdagen, dvs tidigare än köpdagen.


      För att hitta vad ATR(10) hade för värde den dagen använder vi Find:

      at_värde=find(köpdag,250,atr(10),1)


      Här testas om "köpdag" är sant någon gång inom 250 dagar, och i så fall returneras värdet av atr(10) från den dagen.



      För att beräkna vår stoppgräns behöver vi även veta vilket pris inköpet gjordes på, och subtrahera ifrån värdet av 3 x ATR(10):

      stoppgräns=sub(lasttrade(b,p),mult(3,at_värde))


      Slutligen kopplar vi ihoop de logiska besluten att C (senast betalt) ska vara lägre än köppriset - 3 * atr(10):

      sälj1=lt(c,stoppgräns)


      Dessutom ska vi ju bara sälja om det finns något innehav att sälja:

      innehav=gt(portfolio(v),0)
      sälj1=lt(c,stoppgräns)
      sälj2=and(sälj1,innehav)


      Sammantaget blir hela scriptet:

      köpdag=le(d,lasttrade(b,d))
      at_värde=find(köpdag,250,atr(10),1)
      stoppgräns=sub(lasttrade(b,p),mult(3,at_värde))
      draw(stoppgräns,2,rqb)
      innehav=gt(portfolio(v),0)
      sälj1=lt(c,stoppgräns)
      sälj2=and(sälj1,innehav)
      mult(sälj2,10)


      Notera hur den röda stoppgränsen uppdateras kontinuerligt fram till den dagen då köpet skedde (markerat med gult i diagrammet) och därefter ligger fast.

      Comment


      • #4
        Det blir ingen större skillnad, LastTrade kollar ändå tillbaka genom ett antal perioder för att hitta köpdagen. Globala celler gör att scriptet bara kan användas på ett enda instrument, så jag skulle byta ut den mot en "lokal" cell, 0-9.

        Då kan man köra samma kod oavsett antal instrument. Alternativt kan man spara ned ATR-värdet vid köptillfället i en av de fem cellerna som lagras med transaktionen, med RetVal(ATR(10),0) i slutet av köptriggern.

        Därefter går det att läsa av från säljsidan med LastTrade(b,0) och göra beräkningar osv.

        Exemplet ovan var dels svar på en fråga vi fått om stoploss, och dels ett exempel på hur man kan göra för att inte måla in sig i hörnet med globala celler.

        Comment

        Working...
        X