Distancia a una recta

Viewing 9 posts - 1 through 9 (of 9 total)
  • Author
    Posts
  • #228464 quote
    JMF
    Participant
    New

    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

    #228525 quote
    robertogozzi
    Moderator
    Master

    Si 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.

    #228529 quote
    JMF
    Participant
    New

    Muchas 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.

    #228542 quote
    robertogozzi
    Moderator
    Master

    Este 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?

    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 THEN
       DrawSegment(Bar1,HH1,Bar2,HH2)
       DrawText("Bar #Bar1#",Bar1,HH1+Disp)
       DrawText("Bar #Bar2#",Bar2,HH2+Disp)
    ENDIF
    RETURN
    #228554 quote
    JMF
    Participant
    New

    Muchas 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
    RETURN

    #228595 quote
    robertogozzi
    Moderator
    Master

    No se puede hacer con la máxima precisión, porque son escalas diferentes.

    #228624 quote
    JMF
    Participant
    New

    Lo he conseguido, se puede calcular exactamente tanto en escala lineal como en escala logarítmica.

    Os paso gráfico del mismo valor con las dos escalas.

    Gracias por tu ayuda robertogozzi.

    #228627 quote
    robertogozzi
    Moderator
    Master

    Si publica el cálculo, puede ser útil para otros usuarios.

    Gracias 🙂

    #228628 quote
    JMF
    Participant
    New

    Perdó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
    RETURN

    robertogozzi thanked this post
Viewing 9 posts - 1 through 9 (of 9 total)
  • You must be logged in to reply to this topic.

Distancia a una recta


ProBuilder: Indicadores y Herramientas

New Reply
Author
author-avatar
JMF @jmf Participant
Summary

This topic contains 8 replies,
has 2 voices, and was last updated by JMF
1 year, 11 months ago.

Topic Details
Forum: ProBuilder: Indicadores y Herramientas
Language: Spanish
Started: 02/20/2024
Status: Active
Attachments: 4 files
Logo Logo
Loading...