Distancia a una recta
Forums › ProRealTime foro Español › Soporte ProBuilder › Distancia a una recta
- This topic has 8 replies, 2 voices, and was last updated 9 months ago by JMF.
-
-
02/20/2024 at 4:16 PM #228464
Buenas, soy nuevo en el foro y quería hacer una consulta. Si ya se hubiese planteado, por favor redirigirme.
Necesito calcular la distancia de un punto (ej close) a una recta (ej la recta entre dos máximos). Si dibujo la recta con drawline, ¿se puede calcular esa distancia?
Si la respuesta es no, otra opción es intentar meter la ecuación de una recta del tipo y=p*x+ b , donde si los puntos que definen la recta son (barindex[x],close[x]) y (barindex[y], close[y]) entonces la pendiente sería : p= (close[y]-close[x])/(barindex[y]-barindex[x]). y el coeficiente sería: b=close[y]-p*barindex[y].
Pero como se mete en el código del indicador para que aparezca la recta pintada como una función y a partir de ahí poder calcular cortes con otras funciones, distancias, etc..?
Muchas gracias
02/21/2024 at 6:45 PM #228525Si dibujas una línea con DrawLine, DrawHline o DrawVline no es posible saber dónde comienza o termina.
Sin embargo, si usa DRAWSEGMENT, entonces usted decide el principio y el final, por lo que ya conoce los dos puntos.
Pero no estoy seguro de entender completamente lo que quieres. Si desea calcular la pendiente, ni parece que su código sea correcto.02/21/2024 at 9:39 PM #228529Muchas gracias por tu respuesta.
Lo que pretendo es poder utilizar soportes y resistencias dentro del código. Como no se pueden utilizar las lineas de ProRealtrend, quiero calcular mis propios soportes/resistencias a partir de determinados máximos y mínimos y cuando el precio toque dichas líneas o las cruce, generar señales de compra o venta.
Si no puedo utilizar drawline para calcular cuando un precio esta a menos de un x% de la línea o la cruza, la única opción que queda es meter la ecuación de la recta que pasa por dos puntos y a partir de ahí calcularlo. La pregunta es como se puede meter la ecuación de una recta que pasa por dos puntos en el código para utilizarla como soporte o resistencia y hacer los cálculos de cercanía o cruce para generar las señales de compra/venta.
Espero haberme explicado mejor ahora.
02/22/2024 at 9:30 AM #228542Este indicador imprime una línea entre los dos valores MÁXIMOS de las últimas 100 barras.
Usando el bucle FOR…NEXT se obtienen los valores BarIndex de las dos velas.
Con ellos podrás saber el precio de los dos puntos y la distancia entre los dos puntos.
¿Era esto lo que querías?12345678910111213141516171819202122232425DefParam DrawOnLastBarOnly = TrueN = 50HH1 = highest[N](high[N])HH2 = highest[N](high)Disp = average[N*2,0](range) //DisplacementBar1 = 0Bar2 = 0FOR i = 0 TO (N * 2)IF Bar2 = 0 THENIF high[i] = HH2 THENBar2 = BarIndex[i] //Bar2 = ending pointENDIFELSEIF high[i] = HH1 THEN //Bar1 = starting pointBar1 = BarIndex[i]breakENDIFENDIFNEXTIF Bar1 <> 0 AND Bar2 <> 0 THENDrawSegment(Bar1,HH1,Bar2,HH2)DrawText("Bar #Bar1#",Bar1,HH1+Disp)DrawText("Bar #Bar2#",Bar2,HH2+Disp)ENDIFRETURN02/22/2024 at 11:18 AM #228554Muchas gracias de nuevo.
Lo que estoy buscando es mas parecido a esto, pero solo funciona cuando el eje de cotizaciones está en escala Lineal. No se como hacerlo para escala Logarítmica. (perdón pero no se como copiarlo con estilos):
DefParam DrawOnLastBarOnly = True
N = 50
HH1 = highest[N](high[N])
HH2 = highest[N](high)
Disp = average[N*2,0](range) //Displacement
Bar1 = 0
Bar2 = 0
FOR i = 0 TO (N * 2)
IF Bar2 = 0 THEN
IF high[i] = HH2 THEN
Bar2 = BarIndex[i] //Bar2 = ending point
ENDIF
ELSE
IF high[i] = HH1 THEN //Bar1 = starting point
Bar1 = BarIndex[i]
break
ENDIF
ENDIF
NEXT
IF Bar1 <> 0 AND Bar2 <> 0 AND Date=Today THEN
// Calculo de la recta entre el maximo1 y el maximo2
Pend=(HH2-HH1)/(Bar2-Bar1)
B=HH2-Pend*Bar2// Condición para dibujar la recta que pase a menos de un 5% del último cierre
Dist= abs(Close-(Pend*BarIndex+B))*100/min(Close, Pend*BarIndex+B)DrawLine(Bar1,HH1,Bar2,HH2)
DrawPoint (barindex, Pend*BarIndex+B, 3) coloured(255,0,255)
Drawsegment (BarIndex, Close, BarIndex, Pend*BarIndex+B) Style(DottedLine,1) Coloured (“Red”)
Drawtext (“Distancia #Dist#”, BarIndex, Pend*BarIndex+B+Disp)
DrawText(“Bar #Bar1#”,Bar1,HH1+Disp)
DrawText(“Bar #Bar2#”,Bar2,HH2+Disp)ENDIF
RETURN02/22/2024 at 7:34 PM #228595No se puede hacer con la máxima precisión, porque son escalas diferentes.
02/23/2024 at 11:51 AM #22862402/23/2024 at 12:02 PM #228627Si publica el cálculo, puede ser útil para otros usuarios.
Gracias 🙂
02/23/2024 at 12:05 PM #228628Perdón, estaba tan emocionado que se me pasó.
Ahí va por si le sirve a alguien
DefParam DrawOnLastBarOnly = True
N = 50
HH1 = highest[N](high[N])
HH2 = highest[N](high)
Disp = average[N*2,0](range) //Displacement
Bar1 = 0
Bar2 = 0
FOR i = 0 TO (N * 2)
IF Bar2 = 0 THEN
IF high[i] = HH2 THEN
Bar2 = BarIndex[i] //Bar2 = ending point
ENDIF
ELSE
IF high[i] = HH1 THEN //Bar1 = starting point
Bar1 = BarIndex[i]
break
ENDIF
ENDIF
NEXT
IF Bar1 <> 0 AND Bar2 <> 0 AND Date=Today THEN
// Calculo de la recta entre el maximo1 y el maximo2 y=Pend*x+B
Pend=(HH2-HH1)/(Bar2-Bar1)
B=HH2-Pend*Bar2// Calculo de la recta en escala SemiLogaritmica entre el maximo1 y el maximo2 y=B2*e^(Pend2*x)
Pend2=(log(HH2)-log(HH1))/(Bar2-Bar1)
B2=exp(log(HH2)-Pend2*Bar2)// Condición para dibujar la recta que pase a menos de un 5% del último cierre
Dist= abs(Close-(Pend*BarIndex+B))*100/min(Close, Pend*BarIndex+B)
Dist2= abs(Close-B2*exp(Pend2*BarIndex))*100/min(Close, B2*exp(Pend2*BarIndex))
DrawLine(Bar1,HH1,Bar2,HH2)
DrawPoint (barindex, Pend*BarIndex+B, 3) coloured(255,0,255)
DrawPoint (barindex, B2*exp(Pend2*BarIndex), 3) coloured(0,255,255)
Drawsegment (BarIndex, Close, BarIndex, Pend*BarIndex+B) Style(DottedLine,1) Coloured (“Red”)
Drawtext (“Distancia Esc Lineal #Dist#”, BarIndex, Pend*BarIndex+B+Disp)
Drawtext (“Distancia Esc Log #Dist2#”, BarIndex, B2*exp(Pend2*BarIndex)+Disp)
DrawText(“Bar #Bar1#”,Bar1,HH1+Disp)
DrawText(“Bar #Bar2#”,Bar2,HH2+Disp)ENDIF
RETURN1 user thanked author for this post.
-
AuthorPosts