Allmänt meddelande

Collapse
No announcement yet.

Scripthjälp sökes.

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

  • Scripthjälp sökes.

    Jag har en ide på en handelsstrategi. Jag har nu i ett par dagar finputsat på ett excel-dokument innehållande en hög med formler och liknande för att till slut ha åstadkommit någon som kan liknas med backtesting och resultaten ser riktigt lovande ut.


    Frågan är nu bara om det går att göra ett skript till NAT av detta...


    Eftersom jag ännu inte lärt mig hur scriptningen i NAT fungerar så hoppas jag att någon kunnigare kan ge mig en liten knuff i rätt riktning, eller i alla fall något jag kan börja jobba runt


    GROVT förenklat ser det ut ungefär så här (det ska in ett helt gäng parametrar till, men jag försöker ta det enkelt från början så jag lär mig något).

    Jag har 3 aktier (eller annat valfritt antal).

    Varje dag mellan 12 och 14 kontrolleras aktiekursen, om kursens medelvärde mellan kl 12.00 och 14:00 är minst 5% högre än vad jag senast betalade för denna aktie, ska 5% av innehavet i just den aktien säljas.


    Har någon av aktierna sjunkit med minst 5% vill jag köpa ytterligare aktier till ett värde motsvarande 5% i mitt innehav i just den aktien.


    Jag vill kunna justera hur mycket kursen ska gå upp/ner innan sälj/köp, samt hur stor del som ska säljas/köpas. I detta exempel var det köp och sälj vid 5% upp och 5% av innehavet ska köpas eller säljas , men dessa parametrar vill jag kunna justera individuellt.


    Jag antar att detta borde gå lösa någorlunda enkelt, men hur?

  • #2
    Det går att lösa på flera sätt. Ett alternativ är att använda indata script. Dessa värden kan sättas individuellt för varje instrument och nås genom att öppna instrumentets digagram och tryck Enter. Går även bra att trycka enter på instrumentet i listfönstret.

    Exempel på enkelt script som köper om kursen är lägre 5% från senaste köp.
    Bara ett köp per dag. Antalet aktier sker i antalscriptet kopplat till modellen.
    Scriptet är inte komplett på något sätt, men kan få dig i rullning.
    ====================================================

    time1:=gt(frac(date()),div(12,24)) {starttid kl 12}
    time2:=lt(frac(date()),div(14,24)) {starttid kl 14}

    {lasttrade innehåller tid eller pris för senaste köp- resp. säljorder}
    ejidag:=not(eqv(int(lasttrade(b,d)),int(date()))) {ingen köporder lagd idag}

    köp1:=and(time1,time2)
    köp2:=and(ejidag,köp1)

    { I ScrPar lagras tal för %-nedgång i just det instrument som scriptet körs på nu}
    köp3:=lt(div(sub(c,lasttrade(b,p)),lasttrade(b,p)),div(ScrPar(24),-100))

    köp4=and(köp2,köp3)
    Last edited by Henric; 2013-01-08, 04:56.

    Comment


    • #3
      Tack! Jag börjar peta med det och återkommer när jag kört fast

      Comment


      • #4
        Jag börjar förstå hur saker och ting fungerar nu! Har fått till ett par enkla köp, sälj och antalscript nu och har dessutom fått dem att fungera i analyzern!

        Nu är det ju "bara" att hänga dit alla mina andra ideér också.

        Jag har dock ett problem för tillfället. Köpscriptet jag har baserar sina köp på skillnaden mellan aktuell kurs och kurs för senaste köp. Men eftersom jag inte har något "första" köp kan scriptet aldrig bli sant. I verkligheten kan jag kanske göra det första köpet manuellt, men hur gör jag i analyzern?

        Comment


        • #5
          Ett sätt är att kolla om det finns ett innehav eller ej.

          eqv(portfolio(v),0) {inget innehav}

          Comment


          • #6
            Snabbt svar! Men jag vet inte om det hjälper mig så mycket, jag förstår åtminstone inte hur.

            Om vi tar scriptet du skrev ovan som exempel, hur ska jag använda mig av "eqv(portfolio(v),0)" i det för att det ska fungera i analyzern?

            Comment


            • #7
              Måste ha någon form av trigger för första köp, tex om parameter x `= sant och innehavet =0. Du kan t.o.m. välja dag och klockslag.
              Kan ligga i separat script/ordermodell eller att antaletscriptet känner av att inget innehav finns.

              Tex.
              ..........
              första=and(1,1) {lägg in villkor för initialt köp}
              nopos=eqv(portfolio(v),0)
              köp4=and(and(köp2,köp3),not(nopos))
              köp5=and(nopos,första)
              or(köp4,köp5)

              På väg till Bangkok och flyget hem.
              Last edited by Henric; 2013-01-08, 17:54.

              Comment


              • #8
                Tack för det, gjorde ett nytt testscript och fick det att fungera,

                inget_innehav:=eqv(portfolio(v),0)
                time1:=gt(frac(date()),div(12,24)) {starttid kl 12}
                time2:=lt(frac(date()),div(14,24)) {stopptid kl 14}
                nobuytoday:=not(eqv(int(lasttrade(b,d)),int(date())))
                buy1:=and(time1,time2)
                buy2:=and(nobuytoday,buy1)
                buy3:=gt(div(sub(c,lasttrade(b,p)),lasttrade(b,p)),div(ScrPar(29),100))
                buy4:=gt(div(sub(c,lasttrade(s,p)),lasttrade(s,p)),div(ScrPar(29),100))
                buy5:=or(buy3,buy4)
                buy6:=and(buy2,buy5)
                buy7=or(buy6,inget_innehav)

                Ser ni några direkta konstigheter eller felaktigheter som jag kan ändra och lära mig något av?



                Sen har jag en annan fråga, jag försöker att göra ett antalscript som ska sälja en viss procent av innehavet. Jag tycker att nedanstående borde fungera, men det verkar inte göra det. Tips?

                Int(Abs(mult(Portfolio(v),div(ScrPar(32),100))))

                Comment


                • #9
                  Jag passar på att slänga in en annan fråga som har en viss liknelse som Pontus script.

                  När det gäller att man vill ha en signal/villkor uppfyllt en viss tid, ska man då ha tidsfönstret först i ordningen (köp1) eller spelar det ingen roll?
                  Jag vill kolla ett visst villkor i slutet av dagen och har ett tidsfönster för det (enligt en modell från Henric ) men jag vill inte ha signal bara för att villkoret varit sant tidigare på dagen men sedan försvunnit, den ska alltså inte ligga kvar till tidsfönstret öppnar.

                  Jag har skrivit:
                  köp1 "trigger"
                  köp2 "tidsfönster, innehav osv"

                  Comment


                  • #10
                    Säljantalscriptet verkade visst fungera när jag i analyzern valde "styrs helt av valda modeller" istället för "köp-kontant-köp".

                    Däremot försöker jag nu få till ett script som köper för en viss procent av det tillgängliga kapitalet, men det får jag inte att fungera.

                    Int(Div(Mult(Cash(T),div(ScrPar(30),100)),c))

                    Ideér?

                    Comment


                    • #11
                      Jag behöver fortfarande hjälp med min föregående fråga om varför följande inte fungerar,

                      Int(Div(Mult(Cash(T),div(ScrPar(30),100)),c))


                      Men jag kastar in ytterligare en fråga ang TakeProfit. Scriptet nedan är lite väl stort för mig att lyckas överblicka och förstå med min än så länge måttliga kunskap inom detta ämne.

                      Som jag förstår det så genereras en signal när vinsten når det värde man skrivit in i ScrPar(12) och samtliga innehav som överskrider värdet i ScrPar(13) säljs. Korrekt?

                      Kan jag ändra detta på något enkelt sätt så att man endast säljer det antal som motsvarar vinsten?

                      Exempel, Jag har 100 aktier inköpta för 1 kr st, totalt värde 100kr. Aktierna går upp 5% och innehavet är då värt 105kr. Nu vill jag sälja aktier till ett värde av just 5 kr, i det här fallet 4,76 aktier, då självklart avrundat nedåt till 4 aktier.



                      { Take Profit Long}
                      { 120209 }
                      tid_innan_stäng:=6 {minuter innan stängning}
                      { }
                      stängning1:=ge(mult(1440,sub(market(c),frac(date()))),tid_innan_stäng)
                      tp:=ScrPar(12)
                      målantal:=ScrPar(13)
                      innehav:=Gt(Portfolio(v),målantal)
                      inköp:=Portfolio(P)
                      inpris_ok:=Gt(inköp,0)
                      vinst:=Gt(b,Add(inköp,Mult(inköp,Div(tp,100))))
                      tidspärr1:=1
                      lt1:=LastTrade(B,D)
                      lt2:=Portfolio(D)
                      i1(
                      takeprofit=And(And(And(vinst,innehav),Gt(tp,0)),inpris_ok)
                      draw(inköp,2,rqb2)
                      draw(add(inköp,mult(inköp,Div(tp,100))),3,dgqb2)
                      minSedanLong=Mult(Sub(Date(),lt1),1440)
                      minSedanTrans=Mult(Sub(Date(),lt2),1440)
                      delay_ok=gt(minSedanLong,tidspärr1)
                      trans_ok=gt(minSedanTrans,tidspärr1)
                      account_ok=not(eqv(cash(d),0))
                      inpådagen=gt(frac(date()),0.377)
                      signal1=and(and(account_ok,and(takeprofit,trans_ok)),delay_ok)
                      signal2=and(and(signal1,inpådagen),stängning1)
                      mult(signal2,20)
                      )
                      Last edited by Pontus; 2013-01-09, 11:06. Anledning: Stavfel

                      Comment


                      • #12
                        Ytterligare en fråga (glöm nu inte mina tidigare om ni svarar på denna )

                        Jag tycker att följande script borde köpa när kursen minskat med tex 3% (som sätts i ScrPar(29)), men när jag testat i analysbänken blir det inte så...


                        inget_innehav:=eqv(portfolio(v),0)
                        time1:=gt(frac(date()),div(12,24)) {starttid kl 12}
                        time2:=lt(frac(date()),div(14,24)) {stopptid kl 14}
                        nobuytoday:=not(eqv(int(lasttrade(b,d)),int(date())))
                        buy1:=and(time1,time2)
                        buy2:=and(nobuytoday,buy1)
                        buy3:=gt(div(sub(c,lasttrade(b,p)),lasttrade(b,p)),div(ScrPar(29),-100))
                        buy4:=gt(div(sub(c,lasttrade(s,p)),lasttrade(s,p)),div(ScrPar(29),-100))
                        buy5:=or(buy3,buy4)
                        buy6:=and(buy2,buy5)
                        buy7=or(buy6,inget_innehav)


                        Resultatet blir följande,

                        Typ Antal Pris
                        Köp 128,00 78,09
                        Köp 99,00 90,95
                        Köp 86,00 93,45
                        Köp 88,00 82,55
                        Köp 71,00 92,45


                        I min värld borde det inte bli något köp när priset gått upp från föregående köp, tex mellan första och andra köpet. Vad gör jag för fel?

                        Comment


                        • #13
                          buy i "nobuytoday" kanske krockar med namnen i buy1, buy2, osv.

                          Vänd på villkoret i buy4 eller kolla om det skett en försäljning. Annars kanske villkoret
                          blir noll(även om det egentligen skulle bli error)?

                          Kör först med hårdkodade värden och byt sedan till ScrPar när du fått det att fungera.
                          Enklare att se då vi inte ser vilket värde du stoppar in.

                          Jag har aldrig simmulerat med Cash-funktionen så någon annan kan kanske svara.

                          Comment


                          • #14
                            Nja, jag är tveksam till att Cash() går att simulera fullt ut ännu. Villkoren tror jag nog funkar, det blir ingen krock med buy.

                            Comment


                            • #15
                              Okej, jag får återkomma till Cash-frågan senare.

                              Har tagit mig en bit på vägen när det gäller det andra. Dessa två script fungerar fint när man kör dem var för sig, kör jag bara köp-scriptet får jag 4-5 köp och kör jag bara säljscriptet får jag 4-5 sälj. Men när jag kopplar in båda scripten samtidigt får jag först ett köp sedan ett sälj varje dag 12:00.59 på just den kurs som är då.

                              Vad är det som stör mellan dem?

                              inget_innehav:=eqv(portfolio(v),0)
                              time1:=gt(frac(date()),div(12,24)) {starttid kl 12}
                              time2:=lt(frac(date()),div(14,24)) {stopptid kl 14}
                              noselltoday:=not(eqv(int(lasttrade(s,d)),int(date())))
                              sell1:=and(time1,time2)
                              sell2:=and(noselltoday,sell1)
                              sell3:=gt(div(sub(c,lasttrade(s,p)),lasttrade(s,p)),0.04)
                              sell4:=gt(div(sub(c,lasttrade(b,p)),lasttrade(b,p)),0.04)
                              sell5:=or(sell3,sell4)
                              sell6:=and(sell2,sell5)
                              sell7=or(inget_innehav,sell6)



                              inget_innehav:=eqv(portfolio(v),0)
                              time1:=gt(frac(date()),div(12,24)) {starttid kl 12}
                              time2:=lt(frac(date()),div(14,24)) {stopptid kl 14}
                              nobuytoday:=not(eqv(int(lasttrade(b,d)),int(date())))
                              buy1:=and(time1,time2)
                              buy2:=and(nobuytoday,buy1)
                              buy3:=lt(div(sub(c,lasttrade(b,p)),lasttrade(b,p)),-0.04)
                              buy4:=lt(div(sub(c,lasttrade(s,p)),lasttrade(s,p)),-0.04)
                              buy5:=or(buy3,buy4)
                              buy6=and(buy2,buy5)
                              buy7=or(inget_innehav,buy6)

                              Comment

                              Working...
                              X