JEAParticipant
New
Hola.
No tengo conocimientos suficientes para programar los códigos de un screener que estoy buscando y que consiste en lo siguiente: busco, en un horizonte semanal, un screener que me localice el primer máximo más alto que el máximo anterior, tras una caída del valor en las 40 a 48 semanas previas en las que haya marcado un mínimo anual entre la semana 40-48.
Si no se puede poner un rango (40-48 semanas para el mínimo anual) podemos dejarlo en 46 semanas.
Tras ese mínimo anual el valor tiene que recuperarse y marcar un máximo superior al máximo anterior que se produjo durante la fase de caída.
Espero haber sido suficientemente claro y agradezco cualquier ayuda.
Saludos
¿Puedes dar un ejemplo numérico de lo que quieres?
JEAParticipant
New
Hola.
Supongamos un valor que lleva 15 meses bajando en el gráfico semanal. Su último mínimo, en mayo de 2023, ha sido 8,59
A partir de ahí cambia de tendencia y a mediados de julio de 2023 la EMA13 cruza al alza la EMA26 y poco después el precio se coloca por encima de ambas EMAs.
En septiembre de 2023 registra un máximo de 13,08 valor que está por encima del último máximo que fue 11,84 alcanzado a mediados de abril de 2023. El periodo entre ambos máximos (abril y sept 2023) fue de unas 20 semanas.
Aunque difiere ligeramente de lo planteado inicialmente, el screener debería buscar el máximo de 13,08 (en plena recuperación o tendencia alcista) que está por encima del máximo marcado en la tendencia bajista y que está en un periodo de unas 20 semanas previas.
Espero haberme explicado mejor con los números. Gracias.
La descripción general es mejor, pero necesito saber números precisos, 15 meses está bien, pero no puedo tomar meses individuales como referencia, tienes que decirme cuántas semanas (o barras) tengo que retroceder para verificar el tendencia bajista y a partir de cuántas semanas la tendencia debe haberse vuelto alcista nuevamente.
Si indico SEPTIEMBRE y ABRIL de 2023, el screener solo funcionará ahora, no siempre.
JEAParticipant
New
Lo primero gracias por tu interés y esfuerzo.
Entiendo tu planteamiento y lo veo lógico. Vamos a ver si a la tercera va la vencida y soy capaz de precisar:
– Condición 1: que el gráfico lleve 40 semanas bajando en el gráfico semanal.
-Condición 2: que se produzca un mínimo, dentro de dicha tendencia bajista, hace al menos 24 semanas.
– Condición 3: cruce al de la EMA13 sobre la EMA26 al menos hace 20 semanas.
– Condición 4: Hace al menos 32 semanas tuvo lugar el último máximo (M1) dentro de la tendencia bajista.
– Condición 5: Hace 12 semanas, y ya dentro de la tendencia alcista, se produce un máximo (M2) más alto que M1.
– Condición 6: la diferencia de tiempo entre M1 y M2 debe ser al menos de 20 semanas.
Si alguna o varias condiciones no puede ser “al menos”, al indicar semanas, se sustituye por semanas sin más, eliminando “al menos”.
De nuevo gracias.
“Condición 5: Hace 12 semanas, y ya dentro de la tendencia alcista, se produce un máximo (M2) más alto que M1”
¿Cómo debo determinar el final de la tendencia bajista y el comienzo de la alcista, con el cruce alcista de las dos medias exponenciales?
JEAParticipant
New
Sí, creo que es una buena señal. Podría haber una falsa ruptura pero que sería una minoría de los casos.
Ahi esta:
N1 = 40
N2 = 12
N3 = 16
N4 = 20
P1 = 13
P2 = 26
LL = lowest[N1](low)
Ema13 = average[P1](close)
Ema26 = average[P2](close)
HH1 = highest[N1](high)
HH2 = highest[N2](high)
M1 = 0
M2 = 0
FOR i = 0 TO (N1 - 1)
IF (high[i] = HH2) AND M2 = 0 AND M1 = 0 THEN
M2 = i + 1
ENDIF
IF (high[i] = HH1) AND M2 > 0 AND M1 = 0 THEN
M1 = i + 1
break
ENDIF
NEXT
c1 = close < close[N1]
c2 = (LL = lowest[N3](low[N1 - N3])) AND (LL < lowest[N1 - N3 - 1](low))
c3 = (summation[N4](Ema13 > Ema26) = N4)
c4 = (HH1 >= highest[N1 - N2](high[N2]))
c5 = HH2 > HH1
c6 = (M1 - M2) >= N4
Cond = c1 AND c2 AND c3 AND c4 AND c5 AND c6
SCREENER[Cond]
Me gustaría señalar que no pude encontrar ninguna acción con los parámetros que indicaste.
JEAParticipant
New
Gracias por intentarlo.
Quizás era muy complejo. Un saludo.
JEAParticipant
New
Hola.
Estoy dándole vueltas a una variante que no sé si se podrá hacer.
Supongamos que tenemos un máximo/pico reciente (máximo1) y quisiera buscar valores con dicho máximo más alto que el último máximo (máximo2) en un periodo dado.
Así:
period=50
Maximo1=highest[period](close)
Maximo2=???
No sé cómo poner el máximo anterior al actual en dicho periodo.
Agradecería la ayuda. Un saludo.
Este es el código.
Al final Máximo1 tendrá el valor mayor y Máximo2 el menor de los dos:
Period = 50
Maximo1 = 0
Maximo2 = 0
FOR i = (Period - 1) DOWNTO 0
IF Maximo1 = 0 THEN
Maximo1 = high[i]
Maximo2 = high[i]
ENDIF
IF high[i] < high[i+1] THEN
IF high[i+1] > Maximo1 THEN
Maximo2 = Maximo1
Maximo1 = high[i+1]
ELSIF high[i+1] > Maximo2 THEN
Maximo2 = high[i+1]
ENDIF
ENDIF
IF i = 0 THEN
IF high[i] > Maximo1 THEN
Maximo2 = Maximo1
Maximo1 = high[i]
ELSIF high[i] > Maximo2 THEN
Maximo2 = high[i]
ENDIF
ENDIF
NEXT
Este es el mismo código colocado en un indicador, que imprime un segmento entre los dos valores:
DEFPARAM DrawOnLastBarOnly = true
Period = 50
Maximo1 = 0
Maximo2 = 0
FOR i = (Period - 1) DOWNTO 0
IF Maximo1 = 0 THEN
Maximo1 = high[i]
Maximo2 = high[i]
Bar1 = BarIndex[i]
Bar2 = BarIndex[i]
ENDIF
IF high[i] < high[i+1] THEN
IF high[i+1] > Maximo1 THEN
Bar2 = Bar1
Maximo2 = Maximo1
Maximo1 = high[i+1]
Bar1 = BarIndex[i+1]
ELSIF high[i+1] > Maximo2 THEN
Maximo2 = high[i+1]
Bar2 = BarIndex[i+1]
ENDIF
ENDIF
IF i = 0 THEN
IF high[i] > Maximo1 THEN
Bar2 = Bar1
Maximo2 = Maximo1
Maximo1 = high[i]
Bar1 = BarIndex[i]
ELSIF high[i] > Maximo2 THEN
Maximo2 = high[i]
Bar2 = BarIndex[i]
ENDIF
ENDIF
NEXT
DrawSegment(Bar1,Maximo1,Bar2,Maximo2) style(line,5) coloured("Fuchsia")
RETURN
JEAParticipant
New
Muchas gracias Roberto.
Le voy a dar una vuelta a ver qué tal sale.
Se podría hacer dicho segmento para mínimos.
Gracias,
Ahi esta:
DEFPARAM DrawOnLastBarOnly = true
Period = 50
Maximo1 = 0
Maximo2 = 0
Minimo1 = 0
Minimo2 = 0
// Maximo
FOR i = (Period - 1) DOWNTO 0
IF Maximo1 = 0 THEN
Maximo1 = high[i]
Maximo2 = high[i]
Bar1 = BarIndex[i]
Bar2 = BarIndex[i]
ENDIF
IF high[i] < high[i+1] THEN
IF high[i+1] > Maximo1 THEN
Bar2 = Bar1
Maximo2 = Maximo1
Maximo1 = high[i+1]
Bar1 = BarIndex[i+1]
ELSIF high[i+1] > Maximo2 THEN
Maximo2 = high[i+1]
Bar2 = BarIndex[i+1]
ENDIF
ENDIF
IF i = 0 THEN
IF high[i] > Maximo1 THEN
Bar2 = Bar1
Maximo2 = Maximo1
Maximo1 = high[i]
Bar1 = BarIndex[i]
ELSIF high[i] > Maximo2 THEN
Maximo2 = high[i]
Bar2 = BarIndex[i]
ENDIF
ENDIF
NEXT
difMax = (Maximo2 - Maximo1) / (max(1,Bar2 - Bar1))
FutBars = (Barindex + 1) - Bar2
FutMax = Maximo2 + (difMax * FutBars)
// Minimo
FOR i = (Period - 1) DOWNTO 0
IF Minimo1 = 0 THEN
Minimo1 = low[i]
Minimo2 = low[i]
BarX = BarIndex[i]
BarY = BarIndex[i]
ENDIF
IF low[i] > low[i+1] THEN
IF low[i+1] < Minimo1 THEN
BarY = BarX
Minimo2 = Minimo1
Minimo1 = low[i+1]
BarX = BarIndex[i+1]
ELSIF low[i+1] < Minimo2 THEN
Minimo2 = low[i+1]
BarY = BarIndex[i+1]
ENDIF
ENDIF
IF i = 0 THEN
IF low[i] < Minimo1 THEN
BarY = BarX
Minimo2 = Minimo1
Minimo1 = high[i]
BarX = BarIndex[i]
ELSIF low[i] < Minimo2 THEN
Minimo2 = low[i]
BarY = BarIndex[i]
ENDIF
ENDIF
NEXT
difMin = (Minimo2 - Minimo1) / (max(1,BarY - BarX))
FutBars = (Barindex + 1) - BarY
FutMin = Minimo2 + (difMin * FutBars)
//
//DrawSegment(Bar1,Maximo1,Bar2,Maximo2) style(line,5) coloured("Fuchsia")
//DrawSegment(BarX,Minimo1,BarY,Minimo2) style(line,5) coloured("Cyan")
DrawSegment(Bar1,Maximo1,BarIndex + 1,FutMax) style(line,5) coloured("Fuchsia")
DrawSegment(BarX,Minimo1,BarIndex + 1,FutMin) style(line,5) coloured("Cyan")
RETURN
Si no desea que los segmentos se extiendan, debe eliminar las dos barras de comentarios de las 2 primeras líneas de DRAWSEGMENT y colocarlas en las dos líneas siguientes.
Muchas gracias por tu respuesta tan rápida. Supera expectativas