ROUNDEDDOWN
ROUNDEDDOWN en ProBacktest y ProOrder redondea un valor hacia abajo al número entero más cercano, se usa para dimensionar cantidades de acciones a partir del efectivo disponible. Sintaxis y ejemplos.
Sintaxis
ROUNDEDDOWN(expression)Parámetros
| Nombre | Tipo | Por defecto | Descripción |
|---|---|---|---|
expression | número | ninguno | Valor a redondear. Cualquier literal, variable o expresión aritmética que se evalúe como un número. |
Cómo funciona
ROUNDEDDOWN descarta la parte fraccionaria de un valor y devuelve el número entero inmediatamente inferior. Dividir el efectivo disponible por el precio de una acción suele producir una fracción, y como la mayoría de los mercados solo aceptan cantidades enteras de acciones, el resultado debe redondearse antes de poder alimentar una instrucción de orden. Redondear hacia abajo es la dirección segura para el presupuesto: la cantidad resultante nunca cuesta más que el efectivo que estaba disponible.
El patrón habitual es un bloque de dimensionamiento de tres líneas, calcular la cantidad en bruto como una división, redondearla hacia abajo y después pasar el resultado como cantidad de una orden BUY o SELLSHORT. Como la función acepta expresiones completas, la división puede hacerse directamente dentro de la llamada.
Para la dirección opuesta, redondear una fracción hacia arriba al siguiente número entero, usa ROUNDEDUP. Para redondear al número entero más cercano en cualquiera de las dos direcciones, se aplica ROUND.
Ejemplos
Ejemplo 1, Acciones enteras a partir de un presupuesto fijo en efectivo (ProBacktest)
// How many whole shares does 1000 in cash buy at 123.45 per share
cash = 1000
pricePerShare = 123.45
maxShares = ROUNDEDDOWN(cash / pricePerShare)La división en bruto da aproximadamente 8.1, y ROUNDEDDOWN la reduce a 8, la mayor cantidad entera que encaja en el presupuesto. Este es el ejemplo de la referencia oficial.
Ejemplo 2, Dimensionar una orden a partir de una asignación fija (ProOrder)
DEFPARAM CumulateOrders = false
// Allocate 5000 in cash per trade, sized at the current close
allocation = 5000
qty = ROUNDEDDOWN(allocation / close)
IF NOT onmarket AND close CROSSES OVER Average[50](close) AND qty >= 1 THEN
BUY qty SHARES AT MARKET
ENDIFCada entrada convierte la misma asignación de efectivo en un número entero de acciones al precio actual. El qty >= 1 evita órdenes de cantidad cero en instrumentos caros.
Ejemplo 3, Dimensionamiento de contratos basado en el riesgo (ProOrder)
DEFPARAM CumulateOrders = false
// Risk at most 200 in account currency per trade
riskBudget = 200
stopPoints = 20
contracts = ROUNDEDDOWN(riskBudget / (stopPoints * PointValue))
IF NOT onmarket AND RSI[14](close) < 30 AND contracts >= 1 THEN
BUY contracts CONTRACT AT MARKET
SET STOP PLOSS stopPoints
ENDIFEl position size se deriva del presupuesto de riesgo dividido por el valor en efectivo de la distancia del stop, redondeado hacia abajo para que la pérdida en el peor caso se mantenga en el presupuesto o por debajo.
Errores y trampas habituales
- Un resultado de cero cancela la operación. Cuando el presupuesto es menor que una acción o un contrato de riesgo, ROUNDEDDOWN devuelve 0 y la instrucción de orden no hace nada. Protege las entradas con una
qty >= 1condición para hacer explícito el comportamiento. - No disponible en indicadores. ROUNDEDDOWN pertenece a los lenguajes de estrategia. El mismo redondeo en el código de indicador o de screener se escribe con FLOOR; usar ROUNDEDDOWN ahí no compila.
- Redondear hacia abajo no es truncar en el caso de los negativos. Los cálculos de dimensionamiento solo deberían producir cantidades positivas. Introducir un valor intermedio negativo en un bloque de dimensionamiento da una cantidad negativa o cero, que nunca coloca una orden; valida las entradas en lugar de confiar en el redondeo.
- No redondees el precio, redondea la cantidad. Aplicar ROUNDEDDOWN al precio de la acción antes de dividir distorsiona el cálculo. Redondea una sola vez, al final, sobre la propia cantidad.
Instrucciones relacionadas
ROUNDEDUP, redondea un valor hacia arriba al siguiente número entero.ROUND, redondea al número entero más próximo.FLOOR, redondea a la baja, disponible en todos los sublenguajes.CEIL, redondea al alza, 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.POINTVALUE, valor en efectivo de un punto, usado en el dimensionamiento del riesgo.