Allmänt meddelande

Collapse
No announcement yet.

Sortera värden till rankningsfunktion

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

  • Sortera värden till rankningsfunktion

    Hej,

    Jag skulle behöva lite hjälp med en funktion för att ranka aktier.
    Jag har ett tradingmodell som räknar ut ett värde som används för att ranka vilka aktier modellen ska köpa för tillfället.
    Antag att 40 aktier är anslutna och alla kan handlas, men bara top 10 kan handlas för tillfället baserat på ett rankingsvärde.

    Tanken är att spara rankningsvärdet i en global variabel för varje aktie, där heltalet är ett id på aktien och decimaldelen själva rankningsvärdet.
    T.ex. 101.2, där 101 är ett id och 0.2 ett rankningsvärde.
    Så för 40 aktier skulla variablerna 101 till 140 användas.
    Nu till mitt problem hur kan man sortera dessa värden och plocka fram det lägsta värdet på top 10.

    i variabelminnet kan det se något så här:

    minne 101 värde 101.2
    minne 102 värde 102.1
    minne 103 värde 103.5
    minne 104 värde 104.3
    minne 105 värde 105.7
    minne 106 värde 106.9
    ....
    ....
    minne 140 värde 140.8


    Tack på förhand!

  • #2
    Kolla i köpscriptet till MFI3-modellen, där ligger en rankingfunktion för 5 bästa aktierna, den går enkelt att bygga ut till 10.

    Comment


    • #3
      Tackar!!, ska kika på den

      Comment


      • #4
        Jag väcker den här tråden igen.. Jag är på jakt efter samma funktion som trådskaparen, men jag hittar inte MFI3-modellen.. Finns den kvar? Om ja, är det triggerskriptet ("sl)") du menar att man ska kika i? Vad heter detta i så fall?

        Comment


        • #5
          Vi tog bort MFI3-modellen från menyn nu för att göra plats för Fusion, ev lägger vi MFI 3 på is tills vi har vidareutvecklat den lite. Den presterar för dåligt just nu.

          Men scripten går fortfarande att ladda ner i Hjälp > Uppdatera aktiemodeller

          MFI3 använder en "snurra" med globala celler för att lagra de fem starkaste kandidaterna. Det finns ett annat enklare sätt också, och att helt enkelt bara lagra den starkaste hela tiden, men sätta innehavskontroll som ett villkor att den ska få poäng. Då kommer man få den starkaste kandidaten utom de man redan innehar, så om man tillåter tex max 5 positioner blir det per automatik de med bäst poäng.

          Ev bygger vi om MFI3 på det viset vilket skulle förenkla scripten en hel del.

          Comment


          • #6
            Tack. Har nu kollat lite på MFI3 och funderat på det du skrev.. Tror att jag kanske behöver beskriva vad jag vill uppnå lite tydligare..

            Detta behövs:
            - En custom lista (omxs30 minus atco-b) och sortera denna på en viss beräkning.
            - Ett antal olika varianter av rikochet-strategin.
            - Dstat exit.

            Detta är logiken i grova drag:
            1. Loopa igenom den sorterade listan från toppen och köp första aktien där köpsignal uppstår enligt "rikochet-strategi 1".

            - Om ingen köpsignal hittas:
            2. Loopa igenom den sorterade listan från toppen och köp första aktien där köpsignal uppstår enligt "rikochet-strategi 2".

            - Om ingen köpsignal hittas:
            3. Loopa igenom listan från toppen och köp första aktien där köpsignal uppstår enligt "rikochet-strategi 3".

            osv osv

            "Dstat exit" har jag sett beskrivas här på forumet, så den går ju att lösa. Mitt problem är att jag inte vet hur jag ska skapa den sorterade listan och sen loopa igenom denna med alla köpskript..

            Tips?

            Comment


            • #7
              Så vitt jag vet går det inte att använda någon lista typ query eller något. Det går att lösa med att låta skriptkörningen gå ett var, dvs 5 sekunder. Om en aktie triggar sparas rankningsvärde, värde på prioriterad strategi, och crcId(). Om en annan aktie triggar med högre rankningsvärde eller högre prioriterad strategi sparas istället dessa värden. Ligger crcid() kvar till nästa gång skricpten körs handlas aktien. Om det finns ett innehav nollställs cellerna.
              Last edited by Henric; 2016-05-08, 21:51.

              Comment


              • #8
                Just det.. Smart tanke med ett "rankningsvärde" som associeras med respektive strategi. På så vi kan man ju såklart säkerställa att de får rätt prio. Får kika vidare på det i veckan som kommer.

                Tack!

                Comment


                • #9
                  Det går också att lagra en sifferkod med köptransaktionen, så att man senare vet vilken strategi som köpte just den positionen, tex om man vill använda olika säljvillkor osv.

                  Comment


                  • #10
                    Ursprungligen postat av Henric Visa inlägg
                    Så vitt jag vet går det inte att använda någon lista typ query eller något. Det går att lösa med att låta skriptkörningen gå ett var, dvs 5 sekunder. Om en aktie triggar sparas rankningsvärde, värde på prioriterad strategi, och crcId(). Om en annan aktie triggar med högre rankningsvärde eller högre prioriterad strategi sparas istället dessa värden. Ligger crcid() kvar till nästa gång skricpten körs handlas aktien. Om det finns ett innehav nollställs cellerna.
                    Skulle man kunna få ett enkelt exempel på hur detta kan se ut i skriptform? Såhär ser min variant ut för tillfället:

                    { Detta står längst upp i skriptet }
                    CurrentBestChioceId := GetGvar(100)
                    CurrentBestChioceRank := GetGvar(101)

                    { Detta står längst ned i skriptet }
                    if(eqv(CurrentBestChioceId, crcid()), 1, SetGvarIf(crcid(), 100, and(IsBuySignal, gt(Rank, CurrentBestChioceRank))))
                    if(eqv(CurrentBestChioceId, crcid()), 1, SetGvarIf(Rank, 101, and(IsBuySignal, gt(Rank, CurrentBestChioceRank))))

                    De sista raderna är tänkta att göra följande:

                    1. Om nuvarande cell 100 (CurrentBestChioceId) är samma som aktuellt papper -> Köp (returnera 1)
                    2. Om nuvarande cell 100 (CurrentBestChioceId) INTE är samma som aktuellt papper -> Spara nuvarande papper i cell 100 och dessa rank i cell 101, men endast om rankvärdet är högre än vad som redan finns sparat.

                    Problemet är att jag i steg 2 ovan även vill returnera 0 för att INTE trigga köp.. Går det inte att köra flera kommandon i en IF-sats som man är van vid i andra skript- och programmeringsspråk? Man vill ju ofta exekvera ett helt block av kommandon om ett visst logiskt uttryck blir sant/falskt..

                    Frågetecken är även vad defaultvärdet är för GetVar()..? Vad returnerar denna om den inte är satt?

                    Comment


                    • #11
                      Om jag förstår det rätt hoppar du nu över vilket strategi/signal som har högsta prioritet.

                      trigger=xxxxx{sant eller falskt}
                      nollställ=xxxx {om behövs}
                      rankvärde=xxxx

                      SetGvarIf(0,100,nollställ)

                      handlaOK=and(trigger,eqv(crcId(),GetGvar(100)) {ordermodellen har passerat alla aktier och fortfarande rankad etta}
                      SetGvarIf(0,100,and(eqv(crcId(),GetGvar(100)),not(trigger)))
                      SetGvarIf(rankvärde,101,eqv(CrcId(),GetGvar(100)))
                      nyRank=and(trigger,or(eqv(GetGvar(100),0),gt(rankvärde,GetGvar(101)))
                      SetGvarIf(crcId(),100,nyrank)
                      SetGvarIf(rankvärde,101,nyrank)
                      and(handlaOK,1)

                      Vill du kunna returnera 0 för något villkor kan det stoppas in vid ettan i sista villkoret.

                      Det behövs mer, men principen borde fungera.

                      Default värde för globala celler är 0.

                      Det går att nästla if, vet ej om det går eller är rekommenderat att skriva till en cell inne i en if-sats.
                      Last edited by Henric; 2016-05-10, 23:54.

                      Comment


                      • #12
                        Man måste nog tidstyra själva köpet så att det inte triggar innan alla aktierna skannats igenom. Jag brukar lägga skanning en viss minut, och köp nästa minut tex. Då vet man att alla har hunnit köras igenom så att man verkligen har högsta värdet i cellen. Beror ju lite på själva modellen också hur den "tänker".

                        Tips, nya scriptkommandot XTIME() underlättar tidstyrning.

                        Comment


                        • #13
                          Som det är nu måste alla aktier har skannats igenom. Visst skulle tidsstyrning kunna säkerställa att villkoret varit sant viss tid. Dessutom finns nu inga handelstider, innehavkontroller, etc.

                          Comment


                          • #14
                            Ursprungligen postat av Henric Visa inlägg
                            Om jag förstår det rätt hoppar du nu över vilket strategi/signal som har högsta prioritet.

                            trigger=xxxxx{sant eller falskt}
                            nollställ=xxxx {om behövs}
                            rankvärde=xxxx

                            SetGvarIf(0,100,nollställ)

                            handlaOK=and(trigger,eqv(crcId(),GetGvar(100)) {ordermodellen har passerat alla aktier och fortfarande rankad etta}
                            SetGvarIf(0,100,and(eqv(crcId(),GetGvar(100)),not(trigger)))
                            SetGvarIf(rankvärde,101,eqv(CrcId(),GetGvar(100)))
                            nyRank=and(trigger,or(eqv(GetGvar(100),0),gt(rankvärde,GetGvar(101)))
                            SetGvarIf(crcId(),100,nyrank)
                            SetGvarIf(rankvärde,101,nyrank)
                            and(handlaOK,1)

                            Vill du kunna returnera 0 för något villkor kan det stoppas in vid ettan i sista villkoret.

                            Det behövs mer, men principen borde fungera.

                            Default värde för globala celler är 0.

                            Det går att nästla if, vet ej om det går eller är rekommenderat att skriva till en cell inne i en if-sats.
                            Tack! Hjälpen uppskattas verkligen. Jag knåpar vidare..

                            Comment


                            • #15
                              Ursprungligen postat av Rikard Autostock Visa inlägg
                              Man måste nog tidstyra själva köpet så att det inte triggar innan alla aktierna skannats igenom. Jag brukar lägga skanning en viss minut, och köp nästa minut tex. Då vet man att alla har hunnit köras igenom så att man verkligen har högsta värdet i cellen. Beror ju lite på själva modellen också hur den "tänker".

                              Tips, nya scriptkommandot XTIME() underlättar tidstyrning.

                              Japp, jag har planerat att ha med lite tidsstyrningsfunktioner.. Tack för tipset om XTIME


                              Två frågor till:
                              - Hur ofta körs skripten?
                              - Är nedanstående giltigt?

                              { Todays average value }
                              AverageValue = div(add(add(add(c, o), h), l), 4)

                              { Highest average value the past 22 days}
                              HighestAverageValue = HHV(AverageValue, 22)
                              Last edited by pgson; 2016-05-11, 19:28.

                              Comment

                              Working...
                              X