Questions des débutants MQL5 MT5 MetaTrader 5 - page 480

 
Bonjour chers amis !

Veuillez traduire l'algorithme permettant de trouver les coordonnées du point d'intersection de deux segments.

Extrait de l'article :

C'est très simple !
x1,y1 et x2,y2 sont les coordonnées des sommets du premier segment ;
x3,y3 et x4,y4 sont les coordonnées des sommets du deuxième segment ;

pour trouver l'intersection, on fait les équations des lignes :
première équation :
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
deuxième équation
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
ces équations définissent une ligne passant par deux points, ce qui est ce dont nous avons besoin.
A partir de ces équations, on trouve x et y par les formules suivantes :
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);
Puisque nos lignes se croisent, elles ont un point d'intersection commun avec les coordonnées (x,y), que nous devons trouver.
Pour que l'intersection appartienne à nos segments de ligne, nous devons la contraindre, c'est-à-dire vérifier la condition :
si
(((x1<=x)et(x2>=x)et(x3<=x)et(x4 >=x))ou((y1<=y)et(y2>=y)et(y3<=y) et(y4>=y))
alors il y a un point d'intersection de ces segments, et s'il n'y a pas de point d'intersection, alors il n'y a pas de point d'intersection.
Vous devez également vérifier le parallélisme de ces segments à l'aide de coefficients d'angle :
k1:=(x2-x1)/(y2-y1) ;
k2:=(x4-x3)/(y4-y3) ;
où k1 et k2 sont les tangentes des angles des segments par rapport à la direction positive de l'axe OX, si k1=k2, alors les segments sont parallèles et n'ont donc aucun point d'intersection.

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

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

}

Peut-être que quelqu'un en a une toute prête dans les archives ?
 
Leo59:
Bonjour chers amis !

Veuillez traduire l'algorithme permettant de trouver les coordonnées du point d'intersection de deux segments de droite.

Extrait de l'article :

C'est très simple !
x1,y1 et x2,y2 sont les coordonnées des sommets du premier segment ;
x3,y3 et x4,y4 sont les coordonnées des sommets du deuxième segment ;

pour trouver l'intersection, on fait les équations des lignes :
première équation :
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
deuxième équation
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
ces équations définissent une ligne passant par deux points, ce qui est ce dont nous avons besoin.
A partir de ces équations, on trouve x et y par les formules suivantes :
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);
Puisque nos lignes se croisent, elles ont un point d'intersection commun avec les coordonnées (x,y), que nous devons trouver.
Pour que l'intersection appartienne à nos segments de ligne, nous devons la contraindre, c'est-à-dire vérifier la condition :
si
(((x1<=x)et(x2>=x)et(x3<=x)et(x4 >=x))ou((y1<=y)et(y2>=y)et(y3<=y) et(y4>=y))
alors il existe un point d'intersection de ces segments, et si ce n'est pas le cas, il n'y a pas de point d'intersection.
Vous devez également vérifier le parallélisme de ces segments à l'aide de coefficients d'angle :
k1:=(x2-x1)/(y2-y1) ;
k2:=(x4-x3)/(y4-y3) ;
où k1 et k2 sont les tangentes des angles des segments par rapport à la direction positive de l'axe OX, si k1=k2, alors les segments sont parallèles et n'ont donc aucun point d'intersection.

Peut-être que quelqu'un en a un prêt dans les archives ?

C'est un peu compliqué... J'ai écrit la définition de l'intersection des lignes, l'une aux hauts de 2m et l'autre aux bas de 2m, plus loin que la prochaine barre ou pas. Je l'ai écrit en utilisant la tangente, le rapport entre la différence de prix en pips et le nombre de barres entre les Haijs sur lesquelles la ligne est tracée. Par conséquent, c'est la tangente de l'angle de la deuxième ligne à Lowes. Puis j'utilise la tangente pour trouver le nombre de points sur la barre suivante, c'est-à-dire que j'utilise la formule inverse avec la valeur modifiée d'un cathetus (le nombre de barres). Nous obtenons la valeur du prix au point testé de ces lignes. Et par conséquent, si la valeur du prix de la barre droite est inférieure, le croisement a eu lieu.

Mais jusqu'à présent, je n'ai pas trouvé cet indicateur.

 
Leo59:

...

Ou peut-être que quelqu'un en a une toute prête dans les archives ?

Kim a posté une fonction. La fonction renvoie le prix du point du rayon tiré de la ligne vers la droite.

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

x1 - barre de la première coordonnée de ligne, y1 - prix de la première coordonnée de ligne. x2 - barre de la deuxième coordonnée de ligne, y2 - prix de la deuxième coordonnée de ligne, x - la barre pour laquelle le prix est renvoyé.

Vous pouvez trouver les prix de chacune des deux lignes et voir si elles se chevauchent...

 
Merci beaucoup Alexey et Artem pour votre attention à ma question !

J'ai écrit ici une sorte de..., quelque chose compte et est dessiné, mais pas à chaque intersection. Il y a un problème avec mon écriture. Je ne comprends pas ce que c'est.



#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:
Merci beaucoup Alexey et Artem pour votre attention à ma question !

J'ai écrit ici une sorte de..., quelque chose compte et est dessiné, mais pas à chaque intersection. Il y a un problème avec mon écriture. Je ne sais pas ce que c'est.

En ce moment, je ne suis pas capable de comprendre quoi que ce soit en programmation, c'est l'anniversaire de ma femme bien-aimée aujourd'hui. Elle est âgée de 18 ans et 384 mois.

Mais ! !! Notez que le croisement des lignes peut se produire DANS ou HORS des barres, et que le prix (coordonnée Y) ne peut être obtenu que sur la barre. Soit avant, soit après, mais le point de croisement ne peut pas toujours être déterminé. Je dirais que c'est rare. Compte tenu de ce qui précède, révisez votre code en gardant cela à l'esprit, peut-être cela fonctionnera-t-il.

 

Alexey Viktorov 2015.12.12 17:33 RU

Elle a eu 18 ans.

Alexei, alors maintenant tu peux tout faire ! Heureux vous.... Félicitations !
 
TanFX:
Veuillez me conseiller sur le type de commandes à insérer dans l'Expert Advisor pour qu'il corrige automatiquement les takeprofits déjà définis dans les positions ouvertes lorsqu'il les recalcule. Ou peut-être existe-t-il un script qui corrige tous les arrêts du dernier jeu ?
sur le maintien de la position ici https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Veuillez me conseiller sur la manière d'ajouter un code permettant de modifier le poids des modèles dans le testeur de stratégie. m_pattern_0(90) remplacer les variables d'entrée

Je ne suis pas très doué pour la POO, j'obtiens des erreurs" fonctionmembre non définie" ou le code ne fonctionne tout simplement pas.

Question similaire sans réponse ici https://www.mql5.com/ru/forum/13484

p.s. : Avec CiCustom je peux changer les poids pour les modèles, mais avec les indicateurs standards qui ont des classes standards (comme CSignalEnvelopes etc.) où sont les méthodes pour fixer les valeurs pour chaque modèle, mais elles ne sont pas encore disponibles dans l'assistant ?
Ou peut-être y a-t-il une réponse pour cela quelque part ?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
Je veux sauvegarder une archive de cotations plus longues que celle par défaut (2048 chandeliers) dans MT4 (Alpari-Demo). J'efface ce qui était là et j'appuie sur "Charger".
Quelque chose sera chargé à partir du site MetaQuotes et j'obtiens l'image suivante :

Top : Base de données 2049/12358 enregistrements.
L'avant-dernier date du 17.10.2014, le dernier du 14.07.1993.
Où sont ceux qui manquent ?
 
Appuyez sur "Charger". Seules les 2048 dernières mesures sont automatiquement chargées, le reste doit être botté.
Raison: