ROUNDEDUP
ROUNDEDUP i ProBacktest och ProOrder avrundar ett värde uppåt till nästa heltal, används när orderantal måste avrundas uppåt. Syntax, exempel och fallgropar.
Syntax
ROUNDEDUP(value)Parametrar
| Namn | Typ | Standard | Beskrivning |
|---|---|---|---|
value | tal | ingen | Värdet som ska avrundas. Vilken literal, variabel eller aritmetiskt uttryck som helst som utvärderas till ett tal. |
Så fungerar det
ROUNDEDUP tar ett numeriskt värde och returnerar nästa högre heltal när värdet har en decimaldel. Ett värde som redan är helt returneras oförändrat. Eftersom orderinstruktioner i ProBacktest och ProOrder arbetar med hela antal aktier, kontrakt eller lotter behöver varje formel för position size som innehåller division ett avrundningssteg innan dess resultat kan läggas som en order.
Avrundning uppåt är rätt riktning när det beräknade värdet representerar ett minimum som måste uppnås, till exempel antalet aktier som krävs för att en position ska nå en målexponering, eller det antal som krävs för att helt hedga en annan position. I de fallen skulle avrundning nedåt lämna positionen underdimensionerad.
Avvägningen är kostnad: avrundning uppåt innebär att ordern kan kräva något mer kontanter än den råa beräkningen antydde. När beräkningen representerar en budget som inte får överskridas är ROUNDEDDOWN den korrekta motsvarigheten.
Exempel
Exempel 1, Hela aktier från ett kontantbelopp (ProBacktest)
// Convert a cash amount into a whole number of shares
myCash = 1000
stockPrice = 123.45
maxShares = ROUNDEDUP(myCash / stockPrice)Divisionen ger ungefär 8.1 och ROUNDEDUP höjer det till 9. Observera att köp av 9 aktier kostar något mer än de 1000 i kontanter; se fallgroparna nedan. Detta är exemplet från den officiella referensen.
Exempel 2, Nå en minsta exponering (ProOrder)
DEFPARAM CumulateOrders = false
// Size the position so exposure is at least 10000 in notional value
targetExposure = 10000
qty = ROUNDEDUP(targetExposure / close)
IF NOT onmarket AND close CROSSES OVER Average[100](close) THEN
BUY qty SHARES AT MARKET
ENDIFEftersom antalet avrundas uppåt når positionens nominella värde alltid målet på 10000 i stället för att stanna strax under det.
Exempel 3, Matcha en short-hedge mot en long-position (ProOrder)
DEFPARAM CumulateOrders = false
// Hedge ratio derived from relative volatility
hedgeRatio = 1.6
IF NOT onmarket AND close CROSSES UNDER Average[50](close) THEN
// Round up so the hedge is never undersized
SELLSHORT ROUNDEDUP(hedgeRatio * 2) SHARES AT MARKET
ENDIFEn hedgekvot med decimaler avrundas uppåt till nästa hela antal, så att short-benet helt täcker den avsedda exponeringen.
Vanliga fel och fallgropar
- Avrundning uppåt kan överskrida budgeten. Tillämpad på en division av kontanter per pris ger ROUNDEDUP ett antal som kostar mer än de tillgängliga kontanterna, 9 aktier till 123.45 är 1111.05 mot en budget på 1000. För budgetbegränsad position size använd ROUNDEDDOWN i stället.
- Inte tillgänglig i indikatorer. ROUNDEDUP hör till strategispråken. I indikator- eller screenerkod är motsvarigheten CEIL; ROUNDEDUP där går inte att kompilera.
- Hela värden förblir oförändrade. ROUNDEDUP(8) är 8, inte 9. Logik som förväntar sig att funktionen alltid lägger till ett beter sig felaktigt på exakta heltal.
- Avrunda en gång, i slutet. Att avrunda mellanvärden, som priset eller kvoten, före den slutliga divisionen förvärrar avrundningsfelet. Tillämpa ROUNDEDUP endast på det slutliga antalet.
Relaterade instruktioner
ROUNDEDDOWN, avrundar ett värde nedåt till närmaste heltal.ROUND, avrundar till närmaste heltal.CEIL, avrundar uppåt, tillgänglig i alla underspråk.FLOOR, avrundar nedåt, tillgänglig i alla underspråk.SHARES, nyckelord för kvantitetsenhet vid aktieordrar.CASH, nyckelord för kontantbaserad position size.BUY, öppnar en long-position med den beräknade kvantiteten.SELLSHORT, öppnar en short-position med det beräknade antalet.