Cálculo del ángulo de inclinación de la línea de tendencia. - página 15

 
Daniil Kurmyshev:

Ah, bueno, entonces veo)) Entonces devuelvo el código, tal vez alguien que no seaRenat Akhtyamov lo necesite, por cierto no me siento mucho en los foros)))

//-----------------------------------------------------------------------------------

// xAngle ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(double x1,double y1,double x2,double y2) // x1,x2 Tiempo[] - y1,y2 Precio

{

if(x1==0 || x2==0 | y1==y2){return(0);}

if(y1==y2) {return(0);}

//---

double PriceMAX=ChartGetDouble(0,CHART_PRICE_MAX,0);

double PriceMIN=ChartGetDouble(0,CHART_PRICE_MIN,0);

double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60)/100;

double Precio1proc=((PrecioMAX-PrecioMIN)/_Punto)/100;

x1=iBarShift(NULL,0,(datetime)x1);

x2=iBarShift(NULL,0,(datetime)x2);

double x1x2=MathAbs(x1-x2)*_Period*60;

double y1y2=MathAbs(y1-y2)/_Point;

double x1x2_proc=x1x2/Bar1proc;

double y1y2_proc=y1y2/Price1proc;

//---

double theta=MathArctan(y1y2_proc/x1x2_proc)*(180/3.1415926535);

if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}

return(theta);

}

//+------------------------------------------------------------------+

Función pura, para calcular el ángulo, en modo automático, con corrección por escala del gráfico, la uso yo mismo, funciona perfectamente) En cuanto a la estrategia de tendencia, por el ángulo se puede estimar la fuerza, y la duración aproximada de la tendencia.

Aquí:

double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60)/100;

double Precio1proc=((PrecioMAX-PrecioMIN)/_Punto)/100;

La división por 100 es redundante. En la fórmula final, se colocan (100) en el numerador y el denominador al calcular el theta. Y son abreviados.


Aquí:

double Precio1proc=((PrecioMAX-PrecioMIN)/_Punto)/100;

double y1y2=MathAbs(y1-y2)/_Point;

La división por _Punto es redundante. Lo mismo ocurre con la división por 100.

En la fórmula final doble y1y2_proc=y1y2/Precio1proc;

Se reducen los puntos del numerador y del denominador.

Estas simplificaciones, en primer lugar, reducen los cálculos (carga de la CPU) y, en segundo lugar, posiblemente aumentan la precisión del resultado final.


===============================

O tal vez debería intentar utilizar la función ChartTimePriceToXY para determinar los valores de los píxeles en los puntos de anclaje de la herramienta gráfica.

Es más fácil calcular las funciones trigonométricas utilizando el número de píxeles horizontales y verticales. Sin la conversión de barras y puntos.

Debería ser mucho más sencillo.


//-----------------------------------------------------------------------------------

// xAngle ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2 Price

{

if(x1==0 || x2==0 | y1==y2){return(0);}

int _x1, _y1, _x2, _y2;

ChartTimePriceToXY(0,0,x1,y1,_x1, _y1);

ChartTimePriceToXY(0,0,x2,y2,_x2, _y2);

double theta=MathArctan((double)MathAbs(_y1-_y2)/(double)MathAbs(_x1-_x2))*(180/3,1415926535);

if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}

return(theta);

}

Aquí if(y2<y1){theta=NormalizeDouble(theta*(-1),2);} ajusta el signo por el resultado
 
Eugeni Neumoin:

Aquí:

.........

Debería ser mucho más sencillo.

Sí, todo esto es completamente inútil, ya que depende de la escala establecida por el usuario, que puede ser diferente en diferentes gráficos.

La única solución correcta es medir la tendencia del precio por unidad de tiempo.

Una tendencia de "0,0001 eurodólares por hora" será dibujada exactamente de la misma manera por cualquier persona, independientemente de cualquier escala, o incluso plataformas.

 
George Merts:

Todo esto es completamente inútil, ya que depende de la escala establecida por el usuario, que puede ser diferente en distintos gráficos.

La única solución correcta es medir la tendencia del precio por unidad de tiempo.

Una tendencia de "0,0001 eurodólares por hora" será dibujada exactamente de la misma manera por cualquiera, independientemente de cualquier escala, o incluso plataformas.

No estaba prestando atención al tema del hilo. Fue interesante calcular el ángulo para hacer inscripciones inclinadas paralelas a la tendencia. Escribí una función simplificada para calcular el ángulo anterior. No depende en absoluto de la escala. Para evitar la distorsión de la inscripción al cambiar la escala y otras propiedades del gráfico, puede utilizar CHARTEVENT_CHART_CHANGE

=========

Quería mostrar una leyenda cerca de las líneas, como en la imagen. Con la función cambiada arriba, esto es como resultó:


 
Eugeni Neumoin:

Quería que las etiquetas salieran cerca de las líneas, como en la imagen. Así es como resultó con la función anterior:

¡Bonito!
 
Eugeni Neumoin:

Estoy de acuerdo contigo, no me gusta, pero cuando creé inicialmente esta función, comprobé unas cuantas formas diferentes, y luego no la cambié) y sobre los píxeles, estoy completamente de acuerdo contigo, el cálculo más ideal del ángulo para mí personalmente es este, aquí está mi función:

//-----------------------------------------------------------------------------------

// xAnglePixels /////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAnglePixels(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2

{

if(x1==0 || x2==0 | y1==y2){return(0);}

//---

int x[2],y[2];

ChartTimePriceToXY(0,0,x1,y1,x[0],y[0]);

ChartTimePriceToXY(0,0,x2,y2,x[1],y[1]);

//---

if(x[1]<x[0]){return(-1000);}

//---

double x1x2=MathAbs(x[0]-x[1]);

double y1y2=MathAbs(y[0]-y[1]);

//---

doble theta;

if(x1x2!=0){theta=MathArctan(y1y2/x1x2)*(180/3.1415926535);}

si no{theta=90;}

if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}else{theta=NormalizeDouble(theta,2);}

return(theta);

}

//---------------------------------------------------------------------------------

p.s. en la funciónif(x[1]<x[0]){return(-1000);} se puede eliminar, ya que la usé para mí), y más concretamente se necesita si el usuario ha intercambiado dos puntos del objeto en lugares.

//-----------------

Por cierto, para las inscripciones en el gráfico, lo uso. Anteriormente en la rama he publicado ejemplos de trabajo de este indicador, allí se puede ver.

//-----------------

Un agradecimiento especial a usted y respeto)

 
Eugeni Neumoin:

Fue interesante calcular el ángulo para hacer inscripciones inclinadas paralelas a la tendencia. Arriba escribí una función simplificada para calcular el ángulo. No depende en absoluto de la escala.

Sí, es un caso bastante diferente. No se trata de determinar la tendencia, sino de determinar la pendiente de la línea trazada en el monitor. Y en este caso, es el camino correcto. Y todo es hermoso en la foto.
 
George Merts:
Sí, este es un asunto diferente. En este caso, la tarea no consiste en determinar la tendencia, sino en determinar la pendiente de la línea que aparece en el monitor. Y en este caso es el camino correcto. Y todo es hermoso en la foto.
Partiendo de sus palabras, podemos dibujar líneas de tendencia y éstas mostrarán la dirección de la tendencia y el ángulo correcto se mostrará relativamente a la línea dibujada sin jugar. He adjuntado un ejemplo en la imagen, mi robot construye según todas las reglas, pero la esencia es clara.
Archivos adjuntos:
 
Daniil Kurmyshev:
Si partimos de sus palabras, la idea es que podemos dibujar líneas de tendencia y éstas mostrarán la dirección de la tendencia, y el ángulo correcto se mostrará en relación con la línea dibujada sin ninguna pandereta. Adjunto un ejemplo en la imagen, mi robot construye según las reglas, pero la esencia es clara.
La imagen es una visualización de sus cálculos. Las proporciones de visualización pueden distorsionarse (cambiar la escala del gráfico) y la imagen cambiará significativamente: las líneas cambiarán sus ángulos de inclinación en grados. Pero los resultados de sus cálculos no cambiarán cuando cambie la escala. A menos que, por supuesto, se calculen las tendencias en píxeles
 
Alexander Puzanov:
La imagen es una visualización de sus cálculos. Puede distorsionar las proporciones de la visualización (cambiar la escala del gráfico) y la imagen cambiará significativamente: las líneas cambiarán sus ángulos de inclinación en grados. Pero los resultados de sus cálculos no cambiarán cuando cambie la escala. A no ser, por supuesto, que se calculen las tendencias en píxeles.
Estoy de acuerdo, pero te das cuenta de que en cada TF, las tendencias son diferentes; las que parecían grandes en uno pequeño se vuelven pequeñas en uno más grande y las pendientes cambiarán; esto cambia sólo la presentación de la tendencia, no el sistema de medición de ángulos; si el sistema de medición cambia, nada bueno saldrá de ello.
 
Daniil Kurmyshev:
Estoy de acuerdo contigo, pero entiende que en cada TF, las tendencias son diferentes, lo que parecía grande en uno pequeño, se convirtió en pequeño en uno más grande, y las pendientes cambiarán, sólo cambia la representación de la tendencia, no el sistema de medición del ángulo, si el sistema de medición cambiará, nada bueno saldrá de ello.
El cambio de la TF no tiene nada que ver: cuando se cambia la TF, los cálculos cambian. Y cuando cambias la escala (con los botones +/- o el botón del terminal, a veces simplemente desplazando el gráfico), no cambia nada en los cálculos, y el ° queda flotando en medio de la nada.
Razón de la queja: