Allmänt meddelande

Collapse
No announcement yet.

Dubbelköp

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

  • Dubbelköp

    Igår köpte en av mina modeller dubbelt och på samma signal 16 som först kollar att inget innehav finns. När jag tittar i loggarna ser det ut som om autotrader köper först och sedan skickar en cancellering av första ordern som går genom, sedan skickar order två som också går genom.
    Frågorna är:
    - varför skickar den order två?
    - hur kan den cancellera en order som gått genom?
    - fungerar inte kontrollen om man ligger i trade redan eller inte? (se kodutdrag)

    Modellen är en countertrend modell enligt en kraftigt modifierad Martingale algoritm. När den köper dubbelt så här förstörs hela tanken med algoritmen.

    Detta är ett exempel, det har hänt vid ett flertal ytterligare tillfällen, i två olika molnmiljöer.

    Version: 2.9.0.19
    Dll: 10.9.0.19
    Körs på molnserver

    Lokala ordertransaktioner
    -------------------------
    BULL DAX X15 VON8(35 2016-06-09 09:01:03 S 13619291 93 Köp 204,24 16 10*172,93750 204,24 204,24 171*731,00000

    BULL DAX X15 VON8(35 2016-06-09 09:01:10 T 13619291 93 Köp 202,76 0 0 0 0 0

    BULL DAX X15 VON8(35 2016-06-09 09:01:11 S 13619291 94 Köp 202,76 16 10*178,79250 202,76 202,76 171*731,00000

    BULL DAX X15 VON8(35 2016-06-09 09:01:12 T 13619291 94 Köp 202,71 0 0 0 0 0


    TRADELOG.TXT
    --------------
    *-->20160609 09:01:03 ---
    Attempting checking to cancel active orders
    *-->20160609 09:01:03 ---
    No orders to cancel
    *-->20160609 09:01:03 Sent order ---
    identifier=364E&market_id=35&price=204.2400&volume=93&side=buy&currency=SEK

    *-->20160609 09:01:03 Order response ---
    sent orderid=90224999,res=OK,ostate=LOCAL,astate=INS_PEND,accnt=13619291
    *-->20160609 09:01:03 Order requested ---
    4248 BULL DAX X15 VON8(35) 13619291 90224999 93.0000 0.0000 204.2400 0 2457549.3757337965 ON_MARKET INS_CONF

    *-->20160609 09:01:05 Order requested ---
    4248 BULL DAX X15 VON8(35) 13619291 90224999 93.0000 0.0000 204.2400 0 2457549.3757365393 ON_MARKET INS_CONF

    *-->20160609 09:01:10 Trade ---
    4248 BULL DAX X15 VON8(35) 13619291 90224999 93.0000 202.7600 0 2457549.3758080322

    *-->20160609 09:01:10 ---
    Attempting checking to cancel active orders
    *-->20160609 09:01:10 Deleting order ---
    90224999
    *-->20160609 09:01:10 Order deleted response ---
    deleted orderid=90224999,res=OK,ostate=DELETED,astate=DEL_CONF,accnt=13619291
    *-->20160609 09:01:10 ---
    162618497 Orders canceled
    *-->20160609 09:01:11 Sent order ---
    identifier=364E&market_id=35&price=202.7600&volume=94&side=buy&currency=SEK

    *-->20160609 09:01:11 Order response ---
    sent orderid=90225089,res=OK,ostate=LOCAL,astate=INS_PEND,accnt=13619291
    *-->20160609 09:01:12 Trade ---
    4248 BULL DAX X15 VON8(35) 13619291 90225089 94.0000 202.7100 0 2457549.3758253125

    *-->20160609 09:01:15 Position ---
    4248 BULL DAX X15 VON8(35) 13619291 187.0000 202.7349 37906.7700

    *-->20160609 09:05:40 ---
    Attempting checking to cancel active orders
    *-->20160609 09:05:40 ---
    No orders to cancel

    -----------------------------------------------------------

    DEBLOG.TXT
    ------------
    2016-06-09 09:00:59.600 Private feed - Is Alive
    2016-06-09 09:01:03.881 - from 13619291 - UpdateAccountDetails - Reading ActiveOrders
    2016-06-09 09:01:03.975 - from 13619291 - UpdateAccountDetails - Reading ActiveOrders - content read
    2016-06-09 09:01:03.975 [{"volume":93.0,"price":{"currency":"SEK","value":204.24},"accno":13619291,"traded_volume":0.0,"side":"BUY","order_id":90224999,"modified":146545566340 0,"order_type":"LIMIT","tradable":{"identifier":"364E","market_id":35},"validity":{"type":"DAY","valid_until":1465486500000},"price_condition":"LIMIT" ,"volume_condition":"NORMAL","activation_condition":{"type":"NONE"},"order_state":"ON_MARKET","action_state":"INS_CONF"}]
    2016-06-09 09:01:03.975 - from 13619291 - ParseJsonActiveOrdersArray - clearing old content
    2016-06-09 09:01:03.975 - from 13619291 - UpdateAccountDetails - Reading Cash
    2016-06-09 09:01:04.412 - from 13619291 - UpdateAccountDetails - Reading Cash - content read
    2016-06-09 09:01:04.412 - from 13619291 - UpdateAccountDetails - Updating account GUI
    2016-06-09 09:01:04.412 - from 13619291 - UpdateAccountDetails - Updating account GUI - sending content
    2016-06-09 09:01:04.444 Private feed - Is Alive
    2016-06-09 09:01:05.194 - from 13619291 - UpdateAccountDetails - Reading ActiveOrders
    2016-06-09 09:01:05.647 - from 13619291 - UpdateAccountDetails - Reading ActiveOrders - content read
    2016-06-09 09:01:05.647 [{"volume":93.0,"price":{"currency":"SEK","value":204.24},"accno":13619291,"traded_volume":0.0,"side":"BUY","order_id":90224999,"modified":146545566363 7,"order_type":"LIMIT","tradable":{"identifier":"364E","market_id":35},"validity":{"type":"DAY","valid_until":1465486500000},"price_condition":"LIMIT" ,"volume_condition":"NORMAL","activation_condition":{"type":"NONE"},"order_state":"ON_MARKET","action_state":"INS_CONF"}]
    2016-06-09 09:01:05.647 - from 13619291 - ParseJsonActiveOrdersArray - clearing old content
    2016-06-09 09:01:05.647 - from 13619291 - UpdateAccountDetails - Reading Cash
    2016-06-09 09:01:06.084 - from 13619291 - UpdateAccountDetails - Reading Cash - content read
    2016-06-09 09:01:06.084 - from 13619291 - UpdateAccountDetails - Updating account GUI
    2016-06-09 09:01:06.084 - from 13619291 - UpdateAccountDetails - Updating account GUI - sending content
    2016-06-09 09:01:08.350 Doing KeepAlive of session
    2016-06-09 09:01:09.256 Private feed - Is Alive


    Köpscript (sektioner markerade med ... är borttagna)
    --------------------------------------------------
    (... borttaget ...)

    i1(
    inTrade=and(gt(cash(a),0),gt(portfolio(v),0))

    (... borttaget ...)

    { Delay orders with five seconds }
    okTimeBetweenBuy=gt(mult(86400,sub(date(),lasttrade(b,d))),5)

    (... borttaget ...)

    firstPreReq=and(not(inTrade),and(okTimeToBuy,and(okBuySpread,and(okTimeBetweenBuy,okTrendFilter))))

    (... borttaget ...)

    { Buysignal 16 }
    buy16a=and(USE16,firstPreReq)
    buy16b=and(...,buy16a)
    buy16signal=and(...,buy16b)

    (... borttaget ...)

    firstSignal=or(buy11signal,or(buy12signal,or(buy13signal,or(buy14signal,or(buy15signal,buy16signal)))))
    nextSignal=and(1,buy21signal)

    buySignal=or(firstSignal,nextSignal)

    (... borttaget ...)

    { Return values for lasttrade }
    retval(if(buy21signal,21,if(buy12signal,12,if(buy13signal,13,if(buy14signal,14,if(buy15signal,15,if(buy16signal,16,11)))))),0)
    retval(...,1)
    retval(...,2)
    retval(...,3)
    retval(...,4)

    mult(20,buySignal)
    )
    Last edited by matsarvendal; 2016-06-10, 15:17.

  • #2
    Räcker 5 sekunder för delay? Kan det finnas risk att depån inte hinner blir läst på nytt.
    Om det finns utställt pris och att du inte har för snävt prisscript blir det avslut på ETN:er, dvs en delay kan då tex ligga på 20sek. Har inte läst textfilerna.

    Comment


    • #3
      Om alternativet "Makulera befintligt" är ikryssat i ordersekvensen försöker AT makulera ev order i marknaden innan den nya läggs. Det loggas i Tradelog. Om ingen order finns blir det ingen makulering. Och 5 sek mellan orderförsök är för lite för att vara säker på att allt hunnit uppdateras. Om order tex hamnar i marknaden och en ny läggs om 5 sek kan mycket väl båda gå till avslut.

      Comment


      • #4
        Ursprungligen postat av Rikard Autostock Visa inlägg
        Om alternativet "Makulera befintligt" är ikryssat i ordersekvensen försöker AT makulera ev order i marknaden innan den nya läggs. Det loggas i Tradelog. Om ingen order finns blir det ingen makulering. Och 5 sek mellan orderförsök är för lite för att vara säker på att allt hunnit uppdateras. Om order tex hamnar i marknaden och en ny läggs om 5 sek kan mycket väl båda gå till avslut.
        Hur många sekunder skall man då ha? 30? 60?

        Hur många sekunder tar det från att ni får en bekräftelse på köp från Nordnet till portfolio() respektive lasttrade() är uppdaterad?

        Om det tar ett antal sekunder finns ju alltid risken till att den dubbelköper eller?

        Mats

        Comment


        • #5
          20 sek. Om inte någon ny mätning har gjorts. Normalt går det fortare, men för att vara säker. Handlar du ETN:er och lägger pris som går igenom brukar det lösa sig själv.

          Comment


          • #6
            Ursprungligen postat av Rikard Autostock Visa inlägg
            Om alternativet "Makulera befintligt" är ikryssat i ordersekvensen försöker AT makulera ev order i marknaden innan den nya läggs. Det loggas i Tradelog. Om ingen order finns blir det ingen makulering. Och 5 sek mellan orderförsök är för lite för att vara säker på att allt hunnit uppdateras. Om order tex hamnar i marknaden och en ny läggs om 5 sek kan mycket väl båda gå till avslut.
            I TRADELOG.TXT ser man att första ordern gått genom:

            *-->20160609 09:01:10 Trade ---
            4248 BULL DAX X15 VON8(35) 13619291 90224999 93.0000 202.7600 0 2457549.3758080322


            Och i samma sekund påbörjas andra ordern (med att ta bort utestående ordrar)

            *-->20160609 09:01:10 ---
            Attempting checking to cancel active orders

            Den andra ordern skall inte påbörjas eftersom köpscriptet skall blocka ordrar om man redan har innehav.

            Uppdateras "lasttrade" info direkt när "Trade" kommer in?

            Sedan en annan konstig sak - i andra traden så försöker den ta bort första ordern (som gått igenom) - och lyckas att ta bort den:

            *-->20160609 09:01:10 Deleting order ---
            90224999
            *-->20160609 09:01:10 Order deleted response ---
            deleted orderid=90224999,res=OK,ostate=DELETED,astate=DEL_CONF,accnt=13619291

            Hur kan det gå till - ordern har ju gått igenom?

            Återigen - jag måste ha ett sätt att hindra dubbelköp. Att använda lasttrade och fördröja köp i t.ex. 20 sek kommer ju inte att vara 100% säkert. Eftersom det verkar som om "lasttrade" informationen inte uppdateras direkt när köpet gått genom.

            Rickard - stämmer det?

            Comment


            • #7
              Eftersom ordrarna skickats så snabbt hinner inte Nordnets system uppdatera att den redan gått till avslut, och därför får man status Ok på makuleringen. LastTrade uppdateras så fort "Trade" kommer in och kontosynk gjorts. 20 sek är i min mening helt säkert. Bästa sättet att hindra dubbelköp är xk)-scriptet ställt på tex 0.33 minuter. Det blir 20 sek. Det ska extremt mycket till att få dubbla order då. Vill man ha ännu mer säkerhet kan man ju alltid mäta positionsstorleken och sälja av överskott om den blir för stor. Då har man aktiv feedback som gör att hela systemet blir självreparerande.

              Comment


              • #8
                Ursprungligen postat av Rikard Autostock Visa inlägg
                Eftersom ordrarna skickats så snabbt hinner inte Nordnets system uppdatera att den redan gått till avslut, och därför får man status Ok på makuleringen. LastTrade uppdateras så fort "Trade" kommer in och kontosynk gjorts. 20 sek är i min mening helt säkert. Bästa sättet att hindra dubbelköp är xk)-scriptet ställt på tex 0.33 minuter. Det blir 20 sek. Det ska extremt mycket till att få dubbla order då. Vill man ha ännu mer säkerhet kan man ju alltid mäta positionsstorleken och sälja av överskott om den blir för stor. Då har man aktiv feedback som gör att hela systemet blir självreparerande.

                Hej igen,
                jag har motsvarande kontroll i köpscriptet som att använda sig av "xk) Delay köp":

                Kod:
                okTimeBetweenBuy=gt(mult(86400,sub(date(),lasttrade(b,d))),5)
                Men det är inte där problemet ligger.

                Scriptet köper ju på första signalen ÄVEN om jag har innehav:
                Dvs koden:
                Kod:
                inTrade=and(gt(cash(a),0),gt(portfolio(v),0))
                som skall se till att köpsignal 16 bara aktiveras vid inget innehav - fungerar inte.

                I loggarna ser man att det första köpet går genom.

                Du skriver att LastTrade uppdateras så fort "Trade" kommer in och kontosynk gjorts. Den här kontosynken verkar ske var 8:e sekund.

                Det innebär att det finns ett tidsfönster på 8 sekunder där det kan bli dubbelorder efterom inte "portfolio" eller "lasttrade" informationen är uppdaterad.

                Eller har jag fel?

                Comment


                • #9
                  Kontosynk görs av samma programtråd som exekverar scripten, så det kan inte bli dubbla order innan en kontosynk gjorts. Men du skriver att köp bara ska kunna göras om inget innehav finns:

                  inTrade=and(gt(cash(a),0),gt(portfolio(v),0))

                  blir sant om innehav finns, dvs om du vill testa att inget innehav finns måste gt(portfoliov(),0) ändras till eqv(portfolio(v),0)


                  Comment


                  • #10
                    Ursprungligen postat av Rikard Autostock Visa inlägg
                    Kontosynk görs av samma programtråd som exekverar scripten, så det kan inte bli dubbla order innan en kontosynk gjorts. Men du skriver att köp bara ska kunna göras om inget innehav finns:

                    inTrade=and(gt(cash(a),0),gt(portfolio(v),0))

                    blir sant om innehav finns, dvs om du vill testa att inget innehav finns måste gt(portfoliov(),0) ändras till eqv(portfolio(v),0)

                    Japp vet det - när jag kollar om jag inte ligger i affär så använder jag "not(inTrade)". Så det är inte där problemet ligger.

                    Men om kontosynk görs av samma tråd - hur kan då koden köpa med köpsignal 16 - som kräver att den inte är i trade?

                    Koden har uppenbarligen köpt med samma signal trots att den signalen kräver att man inte är i trade redan (se loggarna).
                    Hur kan jag förhindra detta?
                    Räcker det inte med att kolla portfolio?

                    Comment


                    • #11
                      Problemet uppstår om man har en order i marknaden och postar en till. Det kan mycket väl bli så att den i marknaden går till avslut precis samtidigt, eller någon halvsekund innan osv. Då hinner inte systemet uppdatera all status. Det kan man förhindra med att ta till priset lite extra så att man får avslut direkt, och dessutom lägga xk)-script som hindrar ny order inom x sek efter den senaste.

                      Comment


                      • #12
                        Ursprungligen postat av Rikard Autostock Visa inlägg
                        Problemet uppstår om man har en order i marknaden och postar en till. Det kan mycket väl bli så att den i marknaden går till avslut precis samtidigt, eller någon halvsekund innan osv. Då hinner inte systemet uppdatera all status. Det kan man förhindra med att ta till priset lite extra så att man får avslut direkt, och dessutom lägga xk)-script som hindrar ny order inom x sek efter den senaste.
                        OK, om jag förstått dig rätt - från att köpscriptet ger köpsignal finns inget sätt att säkra upp att det inte blir dubbla köp.

                        Då är frågan - skulle man kunna blockera det redan in köpskriptet. T.ex. genom att spara undan en tidsstämpling vid köpsignalen.

                        t.ex. 16 är numret på köpsignalen, buySignal är sant om köpsignal:

                        Kod:
                        ...
                        delayOrder=gt(sub(date(),getgvar(500,D),20)
                        buySignal=and(buySignal16,delayOrder)
                        
                        ...
                        
                        setgetvarif(16,500,buySignal,D,L)
                        mult(20,buySignal)
                        )

                        Comment


                        • #13
                          Det behövs ingen cell. Ordern får en tidstämpel även om inget avslut skett. Ligger en order i marknaden och avslutet sker precis i glappet när nästa sänds spelar det ingen roll. Jag har aldrig fått problem med 20 sekunder delay vid marknadsorder.

                          1. 20 sekunder delay
                          2. Lägg pris så det blir avslut
                          3. Skicka en nollorder som makulerar mellan order + delay(om lägger limitorder som kanske inte går till avslut)
                          4. Dynamiskt justera antal om övermål.

                          Comment


                          • #14
                            Ursprungligen postat av Henric Visa inlägg
                            Det behövs ingen cell. Ordern får en tidstämpel även om inget avslut skett. Ligger en order i marknaden och avslutet sker precis i glappet när nästa sänds spelar det ingen roll. Jag har aldrig fått problem med 20 sekunder delay vid marknadsorder.

                            1. 20 sekunder delay
                            2. Lägg pris så det blir avslut
                            3. Skicka en nollorder som makulerar mellan order + delay(om lägger limitorder som kanske inte går till avslut)
                            4. Dynamiskt justera antal om övermål.
                            Tack Henric!

                            Comment

                            Working...
                            X