Allmänt meddelande

Collapse
No announcement yet.

Stochastics bryt över/under Nixåx,y och pekar i "rätt" riktning

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

  • Stochastics bryt över/under Nixåx,y och pekar i "rätt" riktning

    Hej!
    Jag försöker formulera ett script som bygger på Stochastics indikatorn.

    Säljsignal ska uppstå då:
    1. Stoch Snabb och Trög varit ovanför nivå N1(sbus_nivå:=80)
    2. Stoch Snabb korsat Trög (kan ske både ovanför och nedanför N1)
    3. Stoch Snabb och Trög pekar nedåt (dvs båda har lägre värde jmf perioden innan)

    Köpsignal ska uppstå då:
    1. Stoch Snabb och Trög varit nedanför nivå N2 (sbuk_nivå:=20)
    2. Stoch Snabb korsat Trög (kan ske både nedanför och ovanför N2)
    3. Stoch Snabb och Trög pekar nedåt (dvs båda har lägre värde jmf perioden innan)

    Mitt problem/utmaning är att signalen kan inträda när Snabb eller Trög eller båda passerat Nivå 1(Sälj) eller Nivå 2 (köp) och att då stämmer inte villkorssatsen. Nedan har jag gjort ett försökt att uttrycka det hela begripligt.

    Vore väldigt tacksam om någon har en idé om hur detta kan lösas.

    Så här långt har jag kommit....


    Tack på förhand!
    Med vänlig hälsning
    Benjamin

    {Stochastics BULL KÖP SÄLJ Sign}

    sbu_p1:=14
    sbu_p2:=3
    sbu_p3:=3
    sbuk_nivå:=20
    sbus_nivå:=80
    typ:=s

    {trög stoch}
    StoS_S:=mov(stoch(sbu_p1),sbu_p2,typ)

    {snabb stoch}
    StoS_T:=mov(StoS_S,sbu_p3,typ)

    {Köp villkor}
    SKv1:=le(StoS_T,sbuk_nivå) {kollar att Trög ligger under nivå2}
    SKv2:=gt(StoS_S,StoS_T) {Kollar att Snabb har högre värde jmf Trög}
    {Skv1 och Skvv2 SANT => Snabb korsat Trög}

    {Här uppstår min utmaning. Med villkoret ovan så blir det inte sant ifall Trög hinner bryta genom Nivå 2 då perioden stänger. Jag har också provat med "Cross" funktionen och den blir tyvärr falsk i näst period då signalen ska inträda.}

    SKv3:=ge(StoS_T,aref(StoS_T,1)) {Kollar att Trög har högre värde jmf med perioden innan. dvs "pekar" upp}
    SKv4:=ge(StoS_S,aref(StoS_S,1)){Kollar att Snabb har högre värde jmf med perioden innan. dvs "pekar" upp}


    {Köpsignal}
    sbu_köp:=and(and(and(SKv1,SKv2),SKv3),SKv4)

    {Sälj villkor}
    SSv1:=ge(StoS_T,sbus_nivå) {Samma koll som Köp fast omvänt}
    SSv2:=gt(StoS_T,StoS_S)
    SSv3:=le(StoS_T,aref(StoS_T,1))
    SSv4:=le(StoS_S,aref(StoS_S,1))

    {Säljsignal}
    sbu_sälj:=and(and(and(SSv1,SSv2),SSv3),SSv4)

    i60(
    draw(StoS_S,3,rsE)
    draw(StoS_T,4,bsE)
    draw(mult(sbu_köp,100),5,gsEF)
    draw(mult(sbu_sälj,100),6,rsEF)
    )

  • #2
    Jag har inte gått igenom ditt script i detalj, men detta kanske hjälper.
    Du kan även kolla villkor inklusive förra perioden med hhv eller aref. Tex:
    kors1=and(gt(snabb,långsam),cross(snabb,långsam))
    kors2=hhv(kors1,2)

    Dessutom kan du använda retval och spara tiden för villkoret och kolla att det inte har gått för lång tid.

    Då kanske det även behövs tex en check att kursen inte stuckit iväg för långt. Tänk även på att villkoren kan ha varit sanna inne i en period fastän villkoret inte är sant vid utgången. Det får testas i bänken eller i larmfönstret.

    Comment


    • #3
      Eller kanske använda SetGVarIf() för att sätta ett värde i en global cell som "kommer ihåg" en viss status tills du ändrar på den. Tex, om både Skv1 och Skv2 blir sant kanske du vill spara det i en cell för "senare bruk":

      setgvarif(1,200,and(skv1,skv2))


      Du läser av cellen med getgvar(200) och ser då om villkoret är sant (=1).

      För att nollställa cellen senare i scriptet, tex när order går iväg eller liknande:

      setgvarif(0,200,order)

      Comment


      • #4
        Tack Henric och Rikard för snabb respons!

        Jag klurar vidare med er input och ser hur scriptet kan ta sin form.
        Återkommer.
        Trevlig kväll!
        //Benjamin

        Comment


        • #5
          Jag har plitat vidare men är inte säker på att det blivit rätt. Dessutom önskar jag tips om hur jag kan testa scriptet för att säkerställa att SetGVarif har rätt värde. Görs detta i Testbänken?

          {Köp villkor---------------------------------------------------------}
          {Testar att StochSnabb är under nivå köp}
          SetGVarif(1,201,le(Sto_S,sbuk_nivå))

          {Testar att StochSnabb korsat StochTrög}
          SetGVarif(1,202,cross(Sto_S,Sto_T))

          {Testar att StochTrög är under nivå köp}
          SetGVarif(1,203,le(Sto_T,sbuk_nivå))

          {Testar att Trög är stigande}
          SetGVarif(1,204,ge(Sto_T,aref(Sto_T,1)))

          {Testar att Snabb är Stigande}
          SetGVarif(1,205,ge(StoS_S,aref(StoS_S,1)))

          {Köpsignal------------------------------------------------------------}
          sbu_köp:=and(and(and(and(GetGvar(201),GetGvar(202)),GetGvar(203)),GetGvar(204)),GetGvar(205))

          i60(
          draw(Sto_S,4,rsE)
          draw(Sto_T,5,bsE)
          draw(mult(sbu_köp,100),6,gsEF)

          köp1=and(sbu_köp,1)
          setgvarif(köp1,300,1)
          setgvarif(0,301,köp1)
          mult(köp1,10)
          draw(mult(sbu_köp,100),6,dgsEF)
          )

          Comment


          • #6
            Tänk på att nollställning eller motsatt villkor måste sättas när villkoret inte sant. Annars ligger villkoren fast. Ett villkor är sant för alla värden utom noll. Kanske villkoren tex ska vara gt(GetGvar(x),0). Du kan verifiera genom att använda extrakolumner i bänken. Script för extrakolumnerna behöver endast skriva värdet av cellerna, tex GetGvar(x).

            Edit:
            SetGVarif(le(Sto_T,sbuk_nivå),203,1) {skriver hela tiden sant eller falskt, bra sätt att dynamiskt sätta utan att nollställa}
            Last edited by Henric; 2014-05-15, 14:20.

            Comment


            • #7
              Hej Henric och tack för ditt svar
              Tänker jag fel om jag...
              1. bevakar att Stochsnabb stänger under nivå 20 och lagrar en värde 1 i minnescell 201.
              SetGVarif(1,201,le(Sto_S,sbuk_nivå)).
              Även om StochSnabb skulle gå över nivå 20 så är värdet fortfarande 1 i mc 201, eller hur?

              2. samma bevakning med trög
              SetGVarif(1,203,le(Sto_T,sbuk_nivå))

              3. Korsning sker
              SetGVarif(1,202,cross(Sto_S,Sto_T)) Var linjerna korsar varandra är irrelevant bara att de gör det.
              Detta borde innebära att värde 1 finns i cell 201,202 och 203.
              Köpsignal erhålls när alla villkor är uppfyllda enlig:
              köp_signal:=and(and(GetGvar(201),GetGvar(202),GetGevar(203)) Rätt?

              När köp_signal är sann ska ett nytt script triggas. Är det lämpligt att jag i det efterföljande scriptet nollsäller cellen 201-203 med SetGVarif(0,201,1), osv?

              Stoch Säljscpriptet är omvänt och min tanke är att använda mc 301-303 och nollställa dem i det efterföljande scriptet (inte samma scriptet som vid köp). Är detta rätt tänkt?

              Comment


              • #8
                1. ja
                2. ja
                3. ja {om du inte spelar någon roll om skärning sker uppifrån eller nerifrån. Annars behövs två villkor}

                Nollställning måste göras efter affär för att cellerna inte ska vara sanna hela tiden. Du kan tex lagra triggersignalen i en egen cell och exekvering sker beroende på värde i cellen. Samitidigt nollställer du. Det går även att nollställa tex när innehavet=målantalet.

                Edit: Oavsett hur du löser nollställningen får bägge sidor aldrig vara sanna samtidigt. Risk för orderskurar.
                Last edited by Henric; 2014-05-15, 20:53.

                Comment


                • #9
                  Hej igen,
                  Ni får förlåta min okunnighet alt tröghet men kanske någon annan brottas med liknande scriptutmaningar varför detta inlägg kanske är till glädje för någon annan också?

                  Jag får inte detta att fungera

                  Vad jag gjort är följande:

                  Jag har ett stochastics script som ska uppfylla villkoren enligt ovan.
                  Dvs, Snabb och Trög kurva har stängt ovan (sälj) eller under(köp) gränsnivåer och senare korsar varandra. Eftersom det kan dröja flera perioder innan korsning sker och att korsningen också kan ske såväl över som under gränsnivåerna så behöver scriptet "komma ihåg" om kurvorna uppfyllt villkoren, varför jag använder globala minnesfunktionen. Villkoren enligt:

                  {Testar att Snabb Stoch är över nivå sälj och skriver 1 i cell 301 om villkoret är sant}
                  SetGVarif(1,301,gt(Sto_Sbus,sbus_nivå)) Har jag förstått funktionen rätt att om SANT så kommer värdet 1 finnas i cell 301 även om villkoret är FALSKT perioden efter?

                  {Testar att Trög stoch är över nivå sälj}
                  SetGVarif(1,302,gt(Sto_Tbus,sbus_nivå))


                  {Testar att Snabb korsat Trög}
                  SetGVarif(1,303,cross(Sto_Sbus,Sto_Tbus))


                  Dessa tre villkor ska alla vara SANT enl

                  sbus_sälj:=and(and(GetGvar(301),GetGvar(302)),GetGvar(303))
                  Denna rad ligger i samma script. Har jag förstått det rätt att om det finns värdet 1 i cell 301-303 så kommer sbus_sälj bli SANT, dvs värde 1?

                  Jag vill att scriptet ska komma ihåg att "sbus_sälj" är SANT och lagrar detta i global cell 350 enlig:

                  setgvarif(1,350,sbus_sälj) Är detta rätt tänkt?

                  Därefter och i samma script följer en test mot ny funktion som undersöker att ett gränsvärde blir SANT, dvs GRÄNS_Vbus:=and(MX_bus,div_bus).
                  Så fort denna gräns är sann ska säljsignal triggas.

                  För att säljsignal ska triggas gör jag enligt:

                  SÄLJ_SIGNAL:=and(GetGvar(350),GRÄNS_Vbus)
                  Dvs kollar att villkoren från stoch:en är uppfyllda och att detta GRÄNS_Vbus är Sant. Är detta rätt tänkt??

                  Jag vill också att denna signal ska ritas i kursdiagrammet.

                  i60(
                  draw(Mult(SÄLJ_SIGNAL,50),3,gaBF)
                  )

                  Scriptet som genererar Köp signal är en spegling av säljscriptet, dock med användning av minnescellerna 201, 202, osv (sbus_köp Sant i cell 250)

                  Slutligen så vill jag kunna testa dessa två script i Analysbänken varför jag antar att jag behöver som sista rader i vardera script lägga till enligt(kopierat från script exempel i NAT)

                  Sista raderna i säljscriptet

                  SÄLJ_SIGNAL:=and(1,0)
                  innehav:=Portfolio(v)
                  ok_att_handla:=gt(innehav,0)
                  säljsignal:=and(SÄLJ_SIGNAL,ok_att_handla)
                  Mult(säljsignal,10)

                  KÖP_SIGNAL:=and(1,0)
                  innehav:=Portfolio(v)
                  ok_att_handla:=lt(innehav,1)
                  köpsignal:=and(KÖP_SIGNAL,ok_att_handla)
                  Mult(köpsignal,10)


                  Jag har förstått att de de globala minnesceller som jag använder behöver nollställas enligt Rikards tips SetGVarif(0,301,order) osv. Var kommer begreppet "order" in i koden? Logiken förstår jag men inte hur de praktiskt ska omsättas i scriptet. Är det ett villkor som ska uppfyllas? Var i scriptet ska det anges/stå??

                  När jag syntax testar scriptet så är allt ok.

                  För att testa detta i Analysbänken så har jag lagt upp en test mellan två script (köp/sälj). Scripten verkar köras men jag får inte några signaler.

                  Skulle verkligen uppskatta guidning så att jag kan komma i mål med att kunna testa mina köp och säljscript.

                  Vänligen Benjamin

                  Comment


                  • #10
                    Du är väldigt nära nu! Det som fattas i slutet är som du säger nollställningen av värdena. Du kan skriva tex:


                    KÖP_SIGNAL:=and(1,0)
                    innehav:=Portfolio(v)
                    ok_att_handla:=lt(innehav,1)
                    köpsignal:=and(KÖP_SIGNAL,ok_att_handla)
                    setgvarif(0,301,köpsignal)
                    setgvarif(0,302,köpsignal)
                    setgvarif(0,303,köpsignal)
                    Mult(köpsignal,10)


                    så nollställs alla cellerna när köpsignal blir sant. Nästa "varv" när scriptet exekveras är cellerna noll och allt börjar om igen med test om villkoren är sanna etc.

                    För att simulera i bänken skulle jag bygga ordermodeller, en för köp och en för sälj med 1 sekvens i varje modell. Sekvensen loopar man till sig själv.

                    Det finns färdiga antalscript och prisscript att välja in så det blir enkelt. Och tänk på att du måste ha intradaydata för att få signaler med animering påkopplad.

                    Comment

                    Working...
                    X