Únete hoy
ProBacktest/probacktest · proorder

ROUNDEDUP

ROUNDEDUP en ProBacktest y ProOrder redondea un valor hacia arriba al siguiente número entero, se usa cuando las cantidades de las órdenes deben redondearse hacia arriba. Sintaxis, ejemplos y trampas.

Sintaxis

probuilder
ROUNDEDUP(value)

Parámetros

NombreTipoPor defectoDescripción
valuenúmeroningunoValor a redondear. Cualquier literal, variable o expresión aritmética que se evalúe como un número.

Cómo funciona

ROUNDEDUP toma un valor numérico y devuelve el siguiente número entero superior siempre que el valor tenga parte fraccionaria. Un valor que ya es entero se devuelve sin cambios. Como las instrucciones de órdenes en ProBacktest y ProOrder trabajan con cantidades enteras de acciones, contratos o lotes, cualquier fórmula de dimensionamiento que implique una división necesita un paso de redondeo antes de que su resultado pueda enviarse como orden.

Redondear hacia arriba es la dirección correcta cuando el valor calculado representa un mínimo que hay que cumplir, por ejemplo el número de acciones necesarias para que una posición alcance una exposición objetivo, o la cantidad requerida para cubrir por completo otra posición. En esos casos redondear hacia abajo dejaría la posición infradimensionada.

La contrapartida es el coste: redondear hacia arriba significa que la orden puede requerir algo más de efectivo del que sugería el cálculo en bruto. Cuando el cálculo representa un presupuesto que no debe superarse, ROUNDEDDOWN es la contraparte correcta.

Ejemplos

Ejemplo 1, Acciones enteras a partir de un importe en efectivo (ProBacktest)

probuilder
// Convert a cash amount into a whole number of shares
myCash = 1000
stockPrice = 123.45
maxShares = ROUNDEDUP(myCash / stockPrice)

La división da aproximadamente 8.1 y ROUNDEDUP la eleva a 9. Ten en cuenta que comprar 9 acciones cuesta algo más que los 1000 en efectivo; consulta las trampas más abajo. Este es el ejemplo de la referencia oficial.

Ejemplo 2, Alcanzar una exposición mínima (ProOrder)

probuilder
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
ENDIF

Como la cantidad se redondea hacia arriba, el valor nominal de la posición siempre alcanza el objetivo de 10000 en lugar de quedarse justo por debajo.

Ejemplo 3, Ajustar una cobertura short a una posición long (ProOrder)

probuilder
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
ENDIF

Un ratio de cobertura fraccionario se redondea hacia arriba a la siguiente cantidad entera, de modo que la pata short cubre por completo la exposición prevista.

Errores y trampas habituales

  • Redondear hacia arriba puede superar el presupuesto. Aplicado a una división de efectivo entre precio, ROUNDEDUP produce una cantidad que cuesta más que el efectivo disponible, 9 acciones a 123.45 son 1111.05 frente a un presupuesto de 1000. Para un dimensionamiento limitado por el presupuesto usa ROUNDEDDOWN en su lugar.
  • No disponible en indicadores. ROUNDEDUP pertenece a los lenguajes de estrategia. En el código de indicador o de screener el equivalente es CEIL; usar ROUNDEDUP ahí no compila.
  • Los valores enteros permanecen sin cambios. ROUNDEDUP(8) es 8, no 9. La lógica que espera que la función siempre sume uno se comporta de forma incorrecta con números enteros exactos.
  • Redondea una sola vez, al final. Redondear valores intermedios, como el precio o el ratio, antes de la división final acumula el error de redondeo. Aplica ROUNDEDUP solo a la cantidad final.
  • ROUNDEDDOWN, redondea un valor hacia abajo al número entero más cercano.
  • ROUND, redondea al número entero más próximo.
  • CEIL, redondea al alza, disponible en todos los sublenguajes.
  • FLOOR, redondea a la baja, disponible en todos los sublenguajes.
  • SHARES, palabra clave de unidad de cantidad para órdenes de acciones.
  • CASH, palabra clave de dimensionamiento de posición basado en efectivo.
  • BUY, abre una posición long con la cantidad calculada.
  • SELLSHORT, abre una posición short con la cantidad calculada.