ROUNDEDUP
ROUNDEDUP in ProBacktest e ProOrder arrotonda un valore per eccesso al numero intero successivo, usato quando le quantità degli ordini devono essere arrotondate verso l'alto. Sintassi, esempi e insidie.
Sintassi
ROUNDEDUP(value)Parametri
| Nome | Tipo | Predefinito | Descrizione |
|---|---|---|---|
value | numero | nessuno | Valore da arrotondare. Qualsiasi letterale, variabile o espressione aritmetica che restituisce un numero. |
Come funziona
ROUNDEDUP prende un valore numerico e restituisce il numero intero superiore successivo ogni volta che il valore ha una parte frazionaria. Un valore che è già intero viene restituito invariato. Poiché le istruzioni di ordine in ProBacktest e ProOrder lavorano con quantità intere di azioni, contratti o lotti, qualsiasi formula di dimensionamento che comporti una divisione richiede un passaggio di arrotondamento prima che il suo risultato possa essere immesso come ordine.
Arrotondare per eccesso è la direzione giusta quando il valore calcolato rappresenta un minimo che deve essere raggiunto, per esempio il numero di azioni necessarie perché una posizione raggiunga un'esposizione obiettivo, o la quantità richiesta per coprire completamente un'altra posizione. In quei casi arrotondare per difetto lascerebbe la posizione sottodimensionata.
Il compromesso è il costo: arrotondare per eccesso significa che l'ordine può richiedere poco più liquidità di quanto suggerisse il calcolo grezzo. Quando il calcolo rappresenta un budget che non deve essere superato, ROUNDEDDOWN è la controparte corretta.
Esempi
Esempio 1, Azioni intere da un importo di liquidità (ProBacktest)
// Convert a cash amount into a whole number of shares
myCash = 1000
stockPrice = 123.45
maxShares = ROUNDEDUP(myCash / stockPrice)La divisione dà circa 8.1 e ROUNDEDUP la porta a 9. Nota che acquistare 9 azioni costa poco più dei 1000 di liquidità; vedi le insidie qui sotto. Questo è l'esempio tratto dal riferimento ufficiale.
Esempio 2, Raggiungere un'esposizione minima (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
ENDIFPoiché la quantità è arrotondata per eccesso, il valore nominale della posizione raggiunge sempre l'obiettivo di 10000 anziché fermarsi appena sotto.
Esempio 3, Adeguare una copertura short a una posizione long (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
ENDIFUn rapporto di copertura frazionario viene arrotondato per eccesso alla quantità intera successiva, così la gamba short copre interamente l'esposizione prevista.
Errori e insidie comuni
- Arrotondare per eccesso può superare il budget. Applicato a una divisione liquidità per prezzo, ROUNDEDUP produce una quantità che costa più della liquidità disponibile, 9 azioni a 123.45 fanno 1111.05 contro un budget di 1000. Per un dimensionamento limitato dal budget usa invece ROUNDEDDOWN.
- Non disponibile negli indicatori. ROUNDEDUP appartiene ai linguaggi delle strategie. Nel codice di indicatori o screener l'equivalente è CEIL; usare ROUNDEDUP in quel contesto non compila.
- I valori interi restano invariati. ROUNDEDUP(8) è 8, non 9. Una logica che si aspetta che la funzione aggiunga sempre uno si comporta in modo errato sui numeri interi esatti.
- Arrotonda una sola volta, alla fine. Arrotondare i valori intermedi, come il prezzo o il rapporto, prima della divisione finale aggrava l'errore di arrotondamento. Applica ROUNDEDUP solo alla quantità finale.
Istruzioni correlate
ROUNDEDDOWN, arrotonda un valore per difetto al numero intero più vicino.ROUND, arrotonda al numero intero più vicino.CEIL, arrotonda per eccesso, disponibile in tutti i sottolinguaggi.FLOOR, arrotonda per difetto, disponibile in tutti i sottolinguaggi.SHARES, parola chiave dell'unità di quantità per gli ordini su azioni.CASH, parola chiave per il dimensionamento della posizione basato sul contante.BUY, apre una posizione long con la quantità calcolata.SELLSHORT, apre una posizione short con la quantità calcolata.