Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 480

 
Olá queridos amigos!

Por favor ajude a traduzir o algoritmo para encontrar as coordenadas do ponto de intersecção de dois segmentos

Do artigo:

É muito simples!
x1,y1 e x2,y2 são coordenadas de vértices do primeiro segmento;
x3,y3 e x4,y4 são coordenadas dos vértices do segundo segmento;

para encontrar a intersecção, fazemos as equações das linhas:
primeira equação:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
segunda equação
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
estas equações definem uma linha que passa por dois pontos, que é o que precisamos.
A partir destas equações encontramos x e y através das seguintes 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);
uma vez que as nossas linhas se intersectam, têm um ponto de intersecção comum com as coordenadas (x,y), que precisamos de encontrar.
Para que o cruzamento pertença aos nossos segmentos de linha, precisamos de o restringir, ou seja, verificar a condição:
se
((((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<=y) and(y4>=y))
então há um ponto de intersecção destes segmentos, e se não houver, não há nenhum ponto de intersecção.
Deve também verificar o paralelismo destes segmentos utilizando coeficientes de ângulo:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
onde k1 e k2 são as tangentes dos ângulos dos segmentos no sentido positivo do eixo OX, se k1=k2, então os segmentos são paralelos e portanto não têm pontos de intersecção.

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

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;
        }

}

Talvez alguém tenha um já feito nos arquivos?
 
Leo59:
Olá queridos amigos!

Por favor ajude a traduzir o algoritmo para encontrar as coordenadas do ponto de intersecção de dois segmentos de linha

Do artigo:

É muito simples!
x1,y1 e x2,y2 são as coordenadas dos vértices do primeiro segmento;
x3,y3 e x4,y4 são coordenadas dos vértices do segundo segmento;

para encontrar a intersecção, fazemos as equações das linhas:
primeira equação:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
segunda equação
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
estas equações definem uma linha que passa por dois pontos, que é o que precisamos.
A partir destas equações encontramos x e y através das seguintes 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);
uma vez que as nossas linhas se intersectam, têm um ponto de intersecção comum com as coordenadas (x,y), que precisamos de encontrar.
Para que o cruzamento pertença aos nossos segmentos de linha, precisamos de o restringir, ou seja, verificar a condição:
se
((((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<=y) and(y4>=y))
então há um ponto de intersecção destes segmentos, e se não houver, não há nenhum ponto de intersecção.
Deve também verificar o paralelismo destes segmentos utilizando coeficientes de ângulo:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
onde k1 e k2 são as tangentes dos ângulos dos segmentos no sentido positivo do eixo OX, se k1=k2, então os segmentos são paralelos e portanto não têm pontos de intersecção.

Talvez alguém tenha um pronto nos arquivos?

É um pouco complicado... Escrevi a definição da intersecção das linhas, uma a 2m de altura e a outra a 2m de baixa, mais distante ou não da próxima barra. Escrevi-o utilizando a tangente, a relação da diferença de preço em pips para o número de barras entre os fenos sobre os quais a linha é traçada. Correspondentemente, é a tangente do ângulo da segunda linha em baixo. E depois uso a tangente para encontrar o número de pontos na barra seguinte, ou seja, uso a fórmula inversa com o valor alterado de um cathetus (o número de barras). Obtemos o valor do preço no ponto testado destas linhas. E, consequentemente, se o valor do preço da barra recta for inferior, a travessia ocorreu.

Mas até agora não consigo encontrar este indicador.

 
Leo59:

...

Ou talvez alguém tenha um pronto a fazer nos arquivos?

Kim afixou uma função. A função devolve o preço do ponto do raio traçado da linha à direita.

//+----------------------------------------------------------------------------+
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 da primeira coordenada de linha, y1 - preço da primeira coordenada de linha. x2 - barra da segunda coordenada de linha, y2 - preço da segunda coordenada de linha, x - barra para a qual o preço é devolvido.

Pode encontrar os preços para cada uma das duas linhas e ver se se sobrepõem...

 
Muito obrigado Alexey e Artem pela vossa atenção à minha pergunta!

Escrevi aqui uma espécie de..., algo conta e é desenhado, mas não em todos os cruzamentos. Há algo de errado com a minha escrita. Não compreendo o que é.



#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:
Muito obrigado Alexey e Artem pela vossa atenção à minha pergunta!

Escrevi aqui uma espécie de..., algo conta e é desenhado, mas não em todos os cruzamentos. Há algo de errado com a minha escrita. Não sei o que é.

Neste momento, não consigo compreender nada na programação, hoje é o aniversário da minha amada esposa. Tem 18 anos e 384 meses de idade.

Mas!!!! Note-se que o cruzamento das linhas pode acontecer IN ou OUT das barras, e o preço (coordenada Y) só pode ser obtido na barra. Antes ou depois, mas o ponto de cruzamento nem sempre pode ser determinado. Eu diria que isso é raro. Considerando o acima exposto, reveja o seu código com isto em mente, talvez funcione.

 

Alexey Viktorov 2015.12.12 17:33 RU

Ela fez 18 anos.

Alexei, agora podes fazer tudo! Happy you.... Parabéns!
 
TanFX:
Por favor, informe que tipo de comandos devem ser inseridos no Expert Advisor para que este corrija automaticamente os takeprofits já definidos nas posições em aberto quando os recalcular. Ou talvez haja um guião que corrige todas as paragens do último set?
sobre a manutenção da posição aqui https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Aconselhar como adicionar código para que no testador de estratégias se possa alterar os pesos dos padrões. m_pattern_0(90) substitui as variáveis de entrada

Não sou muito bom com o OOP, recebo erros" função demembro não definida" ou o código simplesmente não funciona.

Pergunta semelhante não respondida aqui https://www.mql5.com/ru/forum/13484

p.s.: Com o CiCustom posso mudar os pesos dos modelos, mas com indicadores padrão que têm classes padrão (como CSignalEnvelopes, etc.) onde estão os métodos para fixar valores para cada modelo, mas ainda não estão disponíveis noWizard?
Ou talvez já tenha sido sugerido algures?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
Quero guardar um arquivo de citações mais longo do que o por defeito (2048 candelabros) em MT4 (Alpari-Demo). Apago o que estava lá e carrego em "Load".
Alguma coisa será carregada a partir do site MetaQuotes e obtenho a seguinte imagem:

Início : Base de dados 2049/12358 registos.
A penúltima é de 17.10.2014, a última é de 14.07.1993.
Onde estão os que faltam?
 
Prima "Load". Apenas as últimas barras de 2048 são automaticamente carregadas, o resto deve ser chutado.
Razão: