Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 480

 
¡Hola queridos amigos!

Por favor, ayuda a traducir el algoritmo para encontrar las coordenadas del punto de intersección de dos segmentos

Del artículo:

Es muy sencillo.
x1,y1 y x2,y2 son las coordenadas de los vértices del primer segmento;
x3,y3 y x4,y4 son las coordenadas de los vértices del segundo segmento;

para encontrar la intersección hacemos las ecuaciones de las rectas:
primera ecuación:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
segunda ecuación
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
estas ecuaciones definen una recta que pasa por dos puntos, que es lo que necesitamos.
A partir de estas ecuaciones encontramos x e y mediante las siguientes fórmulas:
x:=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
como nuestras líneas se cruzan, tienen un punto de intersección común con las coordenadas (x,y), que necesitamos encontrar.
Para que la intersección pertenezca a nuestros segmentos de línea, tenemos que restringirla, es decir, comprobar la condición:
si
(((x1<=x)y(x2>=x)y(x3<=x)y(x4 >=x))o((y1<=y)y(y2>=y)y(y3<=y) y(y4>=y))
entonces hay un punto de intersección de estos segmentos, y si no lo hay, no hay punto de intersección.
También debes comprobar el paralelismo de estos segmentos mediante los coeficientes de ángulo:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
donde k1 y k2 son las tangentes de los ángulos de los segmentos a la dirección positiva del eje OX, si k1=k2, entonces los segmentos son paralelos y por tanto no tienen puntos de intersección.

Готовая функция.
Код:

POINT Point_X(POINT a1,POINT a2,POINT a3,POINT a4){
        POINT T;
        if(((a1.x<=T.x)&&(a2.x>=T.x)&&(a3.x<=T.x)&&(a4.x >=T.x))||((a1.y<=T.y)&&(a2.y>=T.y)&&(a3.y<=T.y)&&(a4.y>=T.y))){
                float x1=a1.x,x2=a2.x,x3=a3.x,x4=a4.x,y1=a1.y,y2=a2.y,y3=a3.y,y4=a4.y;
                float k1,k2;
                if(y2-y1!=0){
                        k1=(x2-x1)/(y2-y1);
                        if(y4-y3!=0){
                                k2=(x4-x3)/(y4-y3);
                                if(k1!=k2){
                                        T.x=((a1.x*a2.y-a2.x*a1.y)*(a4.x-a3.x)-(a3.x*a4.y-a4.x*a3.y)*(a2.x-a1.x))/((a1.y-a2.y)*(a4.x-a3.x)-(a3.y-a4.y)*(a2.x-a1.x));
                                        T.y=((a3.y-a4.y)*T.x-(a3.x*a4.y-a4.x*a3.y))/(a4.x-a3.x);
                                        T.x*=-1;
                                        return T;
                                }else{
                                        T.x=969; T.y=969;
                                        //text2("Паралельны");
                                }
                        }else{
                                T.x=969; T.y=969;
                                //text2("Паралельны");
                        }
                }else{
                        T.x=969; T.y=969;
                        //text2("Паралельны");
                }
        }else{
                //text2("Пересечение вне отрезка");
                T.x=979; T.y=979;
                return T;
        }

}

¿Quizás alguien tenga uno ya hecho en los archivos?
 
Leo59:
¡Hola queridos amigos!

Por favor, ayuda a traducir el algoritmo para encontrar las coordenadas del punto de intersección de dos segmentos de línea

Del artículo:

Es muy sencillo.
x1,y1 y x2,y2 son las coordenadas de los vértices del primer segmento;
x3,y3 y x4,y4 son las coordenadas de los vértices del segundo segmento;

para encontrar la intersección hacemos las ecuaciones de las rectas:
primera ecuación:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
segunda ecuación
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
estas ecuaciones definen una recta que pasa por dos puntos, que es lo que necesitamos.
A partir de estas ecuaciones encontramos x e y mediante las siguientes fórmulas:
x:=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
como nuestras líneas se cruzan, tienen un punto de intersección común con las coordenadas (x,y), que necesitamos encontrar.
Para que la intersección pertenezca a nuestros segmentos de línea, tenemos que restringirla, es decir, comprobar la condición:
si
(((x1<=x)y(x2>=x)y(x3<=x)y(x4 >=x))o((y1<=y)y(y2>=y)y(y3<=y) y(y4>=y))
entonces hay un punto de intersección de estos segmentos, y si no lo hay, no hay punto de intersección.
También debes comprobar el paralelismo de estos segmentos mediante los coeficientes de ángulo:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
donde k1 y k2 son las tangentes de los ángulos de los segmentos a la dirección positiva del eje OX, si k1=k2, entonces los segmentos son paralelos y por tanto no tienen puntos de intersección.

¿Tal vez alguien tenga uno listo en los archivos?

Es un poco complicado... Escribí la definición de la intersección de las líneas, una en máximos de 2m y la otra en mínimos de 2m, más allá de la siguiente barra o no. Lo escribí usando la tangente, la relación entre la diferencia de precios en pips y el número de barras entre los Haijs en los que se dibuja la línea. Correspondientemente, es la tangente del ángulo de la segunda línea en lowes. Y luego uso la tangente para encontrar el número de puntos de la siguiente barra, es decir, uso la fórmula inversa con el valor cambiado de un cateto (el número de barras). Obtenemos el valor del precio en el punto probado de estas líneas. Y en consecuencia, si el valor del precio de la barra recta es menor, el cruce se ha producido.

Pero hasta ahora no puedo encontrar este indicador.

 
Leo59:

...

¿O tal vez alguien tiene uno ya hecho en los archivos?

Kim publicó una función. La función devuelve el precio del punto de la semirrecta trazada desde la línea hacia la derecha.

//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  return((x2==x1)?y1:(y2-y1)/(x2-x1)*(x-x1)+y1);
}
//+----------------------------------------------------------------------------+

x1 - barra de la primera coordenada de la línea, y1 - precio de la primera coordenada de la línea. x2 - barra de la segunda coordenada de la línea, y2 - precio de la segunda coordenada de la línea, x - la barra para la que se devuelve el precio.

Puedes encontrar los precios de cada una de las dos líneas y ver si se solapan...

 
Muchas gracias Alexey y Artem por su atención a mi pregunta.

He escrito aquí más o menos..., algo cuenta y se dibuja, pero no en todas las intersecciones. Hay algo que no funciona en mi escritura. No entiendo lo que es.



#property indicator_separate_window
#property indicator_buffers 4

#property indicator_color1  Aqua                 // Массив 
#property indicator_width1  1
#property indicator_color2  Blue                 // Массив 
#property indicator_width2  1

#property indicator_color3  Lime                 // 
#property indicator_color4  Red                  // 


double   Buf0[];                                 // Массив
double   Buf1[];                                 // Массив

double   y1=0;                                   // Координата Значения буфера Buf0[] на баре с индексом i=2
double   y2=0;                                   // Координата Значения буфера Buf0[] на баре с индексом i=1
double   y3=0;                                   // Координата Значения буфера Buf1[] на баре с индексом i=2
double   y4=0;                                   // Координата Значения буфера Buf1[] на баре с индексом i=1

double   x1=2;                                   // Координата Времени Buf0[] на баре с индексом i=2
double   x2=1;                                   // Координата Времени Buf0[] на баре с индексом i=1
double   x3=2;                                   // Координата Времени Buf1[] на баре с индексом i=2
double   x4=1;                                   // Координата Времени Buf1[] на баре с индексом i=1

double   X=0;                                    // Точка пересечения. Координата по оси Времени
double   Y=0;                                    // Точка пересечения. Координата по оси Значения

double   k1=0;                                   // Тангенс угла наклона 1-первого отрезка
double   k2=0;                                   // Тангенс угла наклона 2-второго отрезка

double   PointX=0;                               // Значение индикатора в точке пересечения отрезков

double   UpArrow[];                              // Зелёные стрелки внизу индикаторного окна
double   DnArrow[];                              // Красные стрелки вверху индикаторного окна

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
   {
    SetIndexBuffer(0,Buf0);       
    SetIndexStyle(0,DRAW_LINE);

    SetIndexBuffer(1,Buf1); 
    SetIndexStyle(1,DRAW_LINE);
   
    SetIndexBuffer(2,UpArrow);                   // Зелёные стрелки внизу индикаторного окна
    SetIndexStyle(2,DRAW_ARROW);
    SetIndexArrow(2,233);

    SetIndexBuffer(3,DnArrow);                   // Красные стрелки вверху индикаторного окна
    SetIndexStyle(3,DRAW_ARROW);
    SetIndexArrow(3,234);
  
    return(0);
   }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
   {
    int i; 
    int limit;
    int counted_bars=IndicatorCounted();
    if(counted_bars<0) return(-1);
    if(counted_bars>0) counted_bars--;
    limit=Bars-counted_bars;

    for(i=limit; i>=0; i--)
         Buf0[i] = ....;

    for(i=limit; i>=0; i--)
         Buf1[i] = ....;

    Fun_New_Bar();
    if (New_Bar==true)
        {
         y1=Buf0_[2];
         y2=Buf0_[1];
         y3=Buf1_[2];
         y4=Buf1_[1];
         
         X=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
         Y=((y3-y4)*X-(x3*y4-x4*y3))/(x4-x3);

         if( ((x1<=X)&&(x2>=X)&&(x3<=X)&&(x4 >=X)) || ((y1<=Y)&&(y2>=Y)&&(y3<=Y)&&(y4>=Y)) )       // Проверка на "Пересечение линий вне отрезков"
             {
              if(y2-y1 != 0)                                                                       // Проверка 1-первого отрезка на вырождение в точку
                  {
                   k1=(x2-x1)/(y2-y1);                                                             // Тангенс угла наклона 1-первого отрезка
                   if(y4-y3 != 0)                                                                  // Проверка 2-второго отрезка на вырождение в точку
                       {
                        k2=(x4-x3)/(y4-y3);                                                        // Тангенс угла наклона 2-второго отрезка
                        if(k1 != k2)                                                               // Проверка прямых(отрезков) на параллельность
                            {
                             PointX=Y;                                                             // Значение индикатора в точке пересечения отрезков
                             if(PointX>=0) UpArrow[1]=-0.001;
                             if(PointX< 0) DnArrow[1]= 0.001;
                            }
                        //else              // Alert("Прямые(отрезки) параллельны");
                       }
                   //else              // Alert("2-второй отрезок выродился в точку");
                  }
              //else              // Alert("1-первый отрезок выродился в точку");
             }
         //else              // Alert("Пересечение вне, хотя бы одного, отрезка");
        }
    return(0);
   }
//+------------------------------------------------------------------+
void Fun_New_Bar()
   { 
    static datetime New_Time=0;
    New_Bar=false;
    if(New_Time!=Time[0])
        {
         New_Time=Time[0];
         New_Bar=true;
        }
   }
 
Leo59:
Muchas gracias Alexey y Artem por su atención a mi pregunta.

He escrito aquí más o menos..., algo cuenta y se dibuja, pero no en todas las intersecciones. Hay algo que no funciona en mi escritura. No sé lo que es.

De momento, no soy capaz de entender nada en programación, hoy es el cumpleaños de mi querida esposa. Tiene 18 años y 384 meses.

Pero... Tenga en cuenta que el cruce de las líneas puede producirse DENTRO o FUERA de las barras, y el precio (coordenada Y) sólo puede obtenerse en la barra. Ya sea antes o después, pero no siempre se puede determinar el punto de cruce. Yo diría que eso es raro. Teniendo en cuenta lo anterior, revisa tu código teniendo en cuenta esto, quizás funcione.

 

Alexey Viktorov 2015.12.12 17:33 RU

Ha cumplido 18 años.

Alexei, ¡así que ahora puedes hacer cualquier cosa! Felizmente .... Enhorabuena.
 
TanFX:
Por favor, indique qué tipo de comandos se deben insertar en el Asesor Experto para que corrija automáticamente los takeprofits ya establecidos en las posiciones abiertas al recalcularlas. ¿O tal vez haya un script que corrija todos los topes del último conjunto?
sobre el mantenimiento de la posición aquí https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Por favor, aconsejar cómo añadir código para que en el probador de la estrategia puede cambiar los pesos de ajuste de los patrones. m_pattern_0(90) sustituir las variables de entrada

No soy muy bueno con la POO, me salen errores" funciónmiembro no definida" o simplemente el código no funciona.

Pregunta similar sin respuesta aquí https://www.mql5.com/ru/forum/13484

p.d.: Con CiCustom puedo cambiar los pesos de los modelos, pero con los indicadores estándar que tienen clases estándar (como CSignalEnvelopes, etc.) ¿dónde están los métodos para establecer los valores de cada modelo, pero aún no están disponibles enel Asistente?
¿O tal vez ya fue sugerido en algún lugar?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
Quiero guardar un archivo de cotizaciones más largo que el predeterminado (2048 velas) en MT4 (Alpari-Demo). Borro lo que había y pulso "Cargar".
Algo se cargará desde el sitio MetaQuotes y obtengo la siguiente imagen:

Inicio : Base de datos 2049/12358 registros.
La penúltima es del 17.10.2014, la última es del 14.07.1993.
¿Dónde están los que faltan?
 
Pulse "Cargar". Sólo se cargan automáticamente los últimos 2048 compases, el resto debe ser pateado.