Vi får ofta frågor om parallella ordermodeller och hur man bäst bygger ett system som kan ta position åt vilket håll som helst när som helst. Man vill alltså inte ha någon begränsning om vilka positioner som kan tas i ett givet tillfälle.
Vår lösning är att använda 4 parallella ordermodeller med 1 sekvens i varje som är loopad tillbaka till sig själv. De 4 modellerna har följande uppgifter:
Modell 1: Köporder
Modell 2: Blankorder
Modell 3: Stäng köpt position
Modell 4: Stäng blankad position
Som exempel kan vi ta tex OMX Raptor, som är byggd med parallella modeller. Version 2.0 har fått en extra finess där vi lagt till en andra sekvens i köp- resp blankmodellen. De nya sekvensernas uppgift är att lägga ut en order i marknaden nästan direkt efter att position tagits, detta för att snabbt kamma hem vinst för hela eller delar av positionen. Kunden kan alltså bestämma hur många terminskontrakt som ska säljas vid en viss vinst.
Vi dissekerar Raptor 2.0:
Modell 1: Köp x antal kontrakt
Sekvens 1: Köp
Triggerscript: sl) Raptor Long (som får signal från vårt centrala signalsystem när Raptor larmar)
Antalscript: Raptor köpantal
målantal:=GetGVar(20) {hämtar önskat målantal från cell 20 som programmerats av konfigscriptet sl) Raptor konfig }
innehav:=Portfolio(v)
i1(
övermål=Ge(innehav,målantal)
slutantal1=If(övermål,0,SUB(målantal,innehav))
slutantal1)
Prisscript: vl) Aktuell säljkurs + 0,25 punkter
Extra kontrollscript: xk) Delay order
xk) tidspärr:=1
lt1:=LastTrade(B,D)
lt2:=LastTrade(S,D)
minSedanKöp:=Mult(Sub(Date(),lt1),1440)
minSedanSälj:=Mult(Sub(Date(),lt2),1440)
OkAttHandla:=And(Gt(minSedanKöp,tidspärr),Gt(minSedanSälj,tidspärr))
OkAttHandla
Scriptet kollar om det gått minst 1 minut sedan förra ordern postades och ledde till avslut. Scriptet kollar både köp- och säljorder. När minst 1 minut gått blir scriptet SANT och order tillåts att skickas om triggerscriptet löser ut.
Sekvens 2: Posta takeprofit-order efter viss fördröjning
Triggerscript: sl) Raptor place takeprofitorder
tidspärr:=1
lt1:=LastTrade(B,D)
lt2:=LastTrade(S,D)
minSedanKöp:=Mult(Sub(Date(),lt1),1440)
minSedanSälj:=Mult(Sub(Date(),lt2),1440)
delay_ok:=And(Gt(minSedanKöp,tidspärr),Gt(minSedanSälj,tidspärr))
Mult(delay_ok,1)
Scriptet ovan är i grund och botten exakt samma som xk)-scriptet men används här som trigger i stället. Den enda uppgiften är att mäta tiden sedan köpordern i sekvens 1 postades. När tiden gått (1 minut) skickas en säljorder med det antal kontrakt som användaren vill ska läggas ut i marknaden för sälj om kursen når takeprofit-nivån. Att skicka ordern direkt gör att vi hamnar först i orderkön.
Antalscript: va) OMX Raptor takeprofit
takeprofitantal:=GetGVar(23) {antal kontrakt som ska läggas ut i säljorder i marknaden hämtas från cell 23 som programmerats av konfig-scriptet}
innehav:=Abs(Portfolio(v))
i1(
orderantal=Mn(takeprofit,innehav) {kontroll görs att aktuellt innehav inte är mindre än det antal som angetts som takeprofit. Detta för att inte kunna få en oönskad position åt fel håll}
orderantal)
Prisscript: vl) OMX Raptor takeprofit long
takeprofitprice:=GetGvar(22) {önskad vinstnivå för takeprofit hämtas från cell 22 som programmerats av konfig-scriptet}
Add(LastTrade(B,P),takeprofitprice)
Scriptet adderar helt enkelt senaste inköpspris med önskad takeprofit-nivå och levererar därmed det pris som säljordern ska ha.
När denna order postats loopar hela ordermodellen tillbaka till sekvens 1. Eftersom vi nu har ett innehav och triggerscriptet OMX Raptor long känner det kommer inga fler order att skickas förrän nästa signal. I triggerscriptet finns en motsvarande fördröjning som gör att det inte larmar inom ett par minuter oavsett innehav, och därmed "räcker" signalsystemets duration inte till fler signaler. Vi har ett innehav på målantal, med en säljorder i marknaden på önskat antal kontrakt som ska säljas vid takeprofit.
Konfig-scriptet ser ut så här:
köpantal:=2
blankantal:=-2
takeprofit:=2.5
antaltp:=2
i1(
SetGVarIf(köpantal,20,1)
SetGVarIf(blankantal,21,1)
SetGVarIf(takeprofit,22,1)
SetGVarIf(antaltp,23,1)
)
Man kan alltså tex sätta köpantal:=4 och antaltp:=3 så kommer 4 kontrakt att köpas vid köpsignal och 3 av dessa läggs ut i en säljorder på 2,5 punkter högre pris. Det fina med antalscripten är att de beräkar rätt antal kontrakt som behöver köpas för att hamna på målantal - oavsett aktuellt innehav. Om man tex ligger blankad med -4 kontrakt när en köporder triggas med målantal 2 kontrakt så kommer scriptet själv att räkna ut att 6 kontrakt behöver köpas.
Vi nöjer oss med att beskriva den första av de 4 parallella ordermodellerna till att börja med, så utvecklar vi det hela i takt med att frågor och synpunkter kommer in.
Vår lösning är att använda 4 parallella ordermodeller med 1 sekvens i varje som är loopad tillbaka till sig själv. De 4 modellerna har följande uppgifter:
Modell 1: Köporder
Modell 2: Blankorder
Modell 3: Stäng köpt position
Modell 4: Stäng blankad position
Som exempel kan vi ta tex OMX Raptor, som är byggd med parallella modeller. Version 2.0 har fått en extra finess där vi lagt till en andra sekvens i köp- resp blankmodellen. De nya sekvensernas uppgift är att lägga ut en order i marknaden nästan direkt efter att position tagits, detta för att snabbt kamma hem vinst för hela eller delar av positionen. Kunden kan alltså bestämma hur många terminskontrakt som ska säljas vid en viss vinst.
Vi dissekerar Raptor 2.0:
Modell 1: Köp x antal kontrakt
Sekvens 1: Köp
Triggerscript: sl) Raptor Long (som får signal från vårt centrala signalsystem när Raptor larmar)
Antalscript: Raptor köpantal
målantal:=GetGVar(20) {hämtar önskat målantal från cell 20 som programmerats av konfigscriptet sl) Raptor konfig }
innehav:=Portfolio(v)
i1(
övermål=Ge(innehav,målantal)
slutantal1=If(övermål,0,SUB(målantal,innehav))
slutantal1)
Prisscript: vl) Aktuell säljkurs + 0,25 punkter
Extra kontrollscript: xk) Delay order
xk) tidspärr:=1
lt1:=LastTrade(B,D)
lt2:=LastTrade(S,D)
minSedanKöp:=Mult(Sub(Date(),lt1),1440)
minSedanSälj:=Mult(Sub(Date(),lt2),1440)
OkAttHandla:=And(Gt(minSedanKöp,tidspärr),Gt(minSedanSälj,tidspärr))
OkAttHandla
Scriptet kollar om det gått minst 1 minut sedan förra ordern postades och ledde till avslut. Scriptet kollar både köp- och säljorder. När minst 1 minut gått blir scriptet SANT och order tillåts att skickas om triggerscriptet löser ut.
Sekvens 2: Posta takeprofit-order efter viss fördröjning
Triggerscript: sl) Raptor place takeprofitorder
tidspärr:=1
lt1:=LastTrade(B,D)
lt2:=LastTrade(S,D)
minSedanKöp:=Mult(Sub(Date(),lt1),1440)
minSedanSälj:=Mult(Sub(Date(),lt2),1440)
delay_ok:=And(Gt(minSedanKöp,tidspärr),Gt(minSedanSälj,tidspärr))
Mult(delay_ok,1)
Scriptet ovan är i grund och botten exakt samma som xk)-scriptet men används här som trigger i stället. Den enda uppgiften är att mäta tiden sedan köpordern i sekvens 1 postades. När tiden gått (1 minut) skickas en säljorder med det antal kontrakt som användaren vill ska läggas ut i marknaden för sälj om kursen når takeprofit-nivån. Att skicka ordern direkt gör att vi hamnar först i orderkön.
Antalscript: va) OMX Raptor takeprofit
takeprofitantal:=GetGVar(23) {antal kontrakt som ska läggas ut i säljorder i marknaden hämtas från cell 23 som programmerats av konfig-scriptet}
innehav:=Abs(Portfolio(v))
i1(
orderantal=Mn(takeprofit,innehav) {kontroll görs att aktuellt innehav inte är mindre än det antal som angetts som takeprofit. Detta för att inte kunna få en oönskad position åt fel håll}
orderantal)
Prisscript: vl) OMX Raptor takeprofit long
takeprofitprice:=GetGvar(22) {önskad vinstnivå för takeprofit hämtas från cell 22 som programmerats av konfig-scriptet}
Add(LastTrade(B,P),takeprofitprice)
Scriptet adderar helt enkelt senaste inköpspris med önskad takeprofit-nivå och levererar därmed det pris som säljordern ska ha.
När denna order postats loopar hela ordermodellen tillbaka till sekvens 1. Eftersom vi nu har ett innehav och triggerscriptet OMX Raptor long känner det kommer inga fler order att skickas förrän nästa signal. I triggerscriptet finns en motsvarande fördröjning som gör att det inte larmar inom ett par minuter oavsett innehav, och därmed "räcker" signalsystemets duration inte till fler signaler. Vi har ett innehav på målantal, med en säljorder i marknaden på önskat antal kontrakt som ska säljas vid takeprofit.
Konfig-scriptet ser ut så här:
köpantal:=2
blankantal:=-2
takeprofit:=2.5
antaltp:=2
i1(
SetGVarIf(köpantal,20,1)
SetGVarIf(blankantal,21,1)
SetGVarIf(takeprofit,22,1)
SetGVarIf(antaltp,23,1)
)
Man kan alltså tex sätta köpantal:=4 och antaltp:=3 så kommer 4 kontrakt att köpas vid köpsignal och 3 av dessa läggs ut i en säljorder på 2,5 punkter högre pris. Det fina med antalscripten är att de beräkar rätt antal kontrakt som behöver köpas för att hamna på målantal - oavsett aktuellt innehav. Om man tex ligger blankad med -4 kontrakt när en köporder triggas med målantal 2 kontrakt så kommer scriptet själv att räkna ut att 6 kontrakt behöver köpas.
Vi nöjer oss med att beskriva den första av de 4 parallella ordermodellerna till att börja med, så utvecklar vi det hela i takt med att frågor och synpunkter kommer in.
Comment