Hola buenos días.
Estoy construyendo un screener donde quiero obtener el máximo drawdown en las ultimas 300 sesiones.
El código sería el siguiente:
maxabs=highest[300](close)
minabs=lowest[300](close)
maxdrawdown=(maxabs-minabs)/maxabs*100
El problema veo que la secuencia temporal en esas últimas 300 sesiones puede no ser: máximo absoluto –> drawdown (mínimo) –>recuperación, por lo que si el “drawdown” es previo al máximo absoluto, tras dicho máximo la caida que pueda venir ya no la coge el indicador (que es justo lo que quiero).
No se si me he explicado…..
Saludos y gracias.
La verdad es que no me queda muy claro. ¿Podrías adjuntar un ejemplo o una foto con las líneas dibujadas de lo que quieres?
JSParticipant
Master
Hola, prueba este…
LookBack = 300
maxDD = 0
peak = High
For i= 0 to (LookBack-1) DO
peak = Max(peak, High[i])
DD= (peak - Low[i]) / peak * 100
maxDD=Max(maxDD,DD)
Next
Screener[maxDD](maxDD AS "Max Drawdown %")
Sí, te has explicado perfectamente. El problema es clásico: tu fórmula actual simplemente coge el máximo y el mínimo absolutos del período sin importar el orden temporal. Si el mínimo ocurrió antes que el máximo, no es un drawdown real desde ese máximo.
El drawdown máximo real requiere que para cada barra, busques el máximo que ocurrió antes (o en esa barra), y luego la caída desde ese máximo hasta el mínimo posterior.
Aquí tienes una solución: (sin probar)
// Max Drawdown en las últimas 300 sesiones
// Lógica: para cada barra dentro de la ventana, se rastrea el pico anterior
// y la mayor caída pico->valle respetando el orden temporal
NPeriods = 300
lastHigh = 0
lowestLow = 0
biggestDD = 0
FOR i = NPeriods - 1 DOWNTO 0 DO
currentHigh = high[i]
currentLow = low[i]
IF i = NPeriods - 1 THEN
lastHigh = currentHigh
lowestLow = currentLow
ELSE
IF currentHigh > lastHigh THEN
lastHigh = currentHigh
lowestLow = currentLow
ELSIF currentHigh < lastHigh THEN
lowestLow = Min(lowestLow, currentLow)
drawdown = (lastHigh - lowestLow) / lastHigh * 100
biggestDD = Max(biggestDD, drawdown)
ENDIF
ENDIF
NEXT
SCREENER[biggestDD > 0](biggestDD AS "Max DrawDown %")