Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 480

 
Hallo liebe Freunde!

Bitte helfen Sie bei der Übersetzung des Algorithmus zur Bestimmung der Koordinaten des Schnittpunkts zweier Segmente

Aus dem Artikel:

Es ist ganz einfach!
x1,y1 und x2,y2 sind die Koordinaten der Eckpunkte des ersten Segments;
x3,y3 und x4,y4 sind die Koordinaten der Scheitelpunkte des zweiten Segments;

Um den Schnittpunkt zu finden, stellen wir die Gleichungen der Linien auf:
erste Gleichung:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
zweite Gleichung
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
Diese Gleichungen definieren eine Linie, die durch zwei Punkte verläuft, und das ist es, was wir brauchen.
Aus diesen Gleichungen lassen sich x und y mit den folgenden Formeln ermitteln:
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);
Da sich unsere Linien schneiden, haben sie einen gemeinsamen Schnittpunkt mit den Koordinaten (x,y), den wir finden müssen.
Damit der Schnittpunkt zu unseren Liniensegmenten gehört, müssen wir ihn einschränken, d. h. die Bedingung überprüfen:
wenn
(((x1<=x)und(x2>=x)und(x3<=x)und(x4 >=x))oder((y1<=y)und(y2>=y)und(y3<=y) und(y4>=y))
dann gibt es einen Schnittpunkt dieser Segmente, und wenn nicht, gibt es keinen Schnittpunkt.
Sie sollten auch die Parallelität dieser Segmente mit Hilfe von Winkelkoeffizienten überprüfen:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
wobei k1 und k2 die Tangenten der Winkel der Segmente an die positive Richtung der OX-Achse sind, wenn k1=k2, dann sind die Segmente parallel und haben daher keine Schnittpunkte.

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

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

}

Vielleicht hat jemand ein fertiges Exemplar in den Archiven?
 
Leo59:
Hallo liebe Freunde!

Bitte helfen Sie bei der Übersetzung des Algorithmus zur Bestimmung der Koordinaten des Schnittpunkts zweier Liniensegmente

Aus dem Artikel:

Es ist ganz einfach!
x1,y1 und x2,y2 sind die Koordinaten der Scheitelpunkte des ersten Segments;
x3,y3 und x4,y4 sind die Koordinaten der Scheitelpunkte des zweiten Segments;

Um den Schnittpunkt zu finden, stellen wir die Gleichungen der Linien auf:
erste Gleichung:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
zweite Gleichung
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
Diese Gleichungen definieren eine Linie, die durch zwei Punkte verläuft, und das ist es, was wir brauchen.
Aus diesen Gleichungen lassen sich x und y mit den folgenden Formeln ermitteln:
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);
Da sich unsere Linien schneiden, haben sie einen gemeinsamen Schnittpunkt mit den Koordinaten (x,y), den wir finden müssen.
Damit der Schnittpunkt zu unseren Liniensegmenten gehört, müssen wir ihn einschränken, d. h. die Bedingung überprüfen:
wenn
(((x1<=x)und(x2>=x)und(x3<=x)und(x4 >=x))oder((y1<=y)und(y2>=y)und(y3<=y) und(y4>=y))
dann gibt es einen Schnittpunkt dieser Segmente, und wenn nicht, gibt es keinen Schnittpunkt.
Sie sollten auch die Parallelität dieser Segmente mit Hilfe von Winkelkoeffizienten überprüfen:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
wobei k1 und k2 die Tangenten der Winkel der Segmente an die positive Richtung der OX-Achse sind, wenn k1=k2, dann sind die Segmente parallel und haben daher keine Schnittpunkte.

Vielleicht hat jemand ein fertiges Exemplar in den Archiven?

Es ist ein bisschen kompliziert... Ich habe die Definition des Schnittpunkts der Linien geschrieben, eine bei 2m-Hochs und die andere bei 2m-Tiefs, weiter als der nächste Balken oder nicht. Ich habe sie mit Hilfe des Tangens geschrieben, dem Verhältnis zwischen der Preisdifferenz in Pips und der Anzahl der Balken zwischen den Haijs, auf denen die Linie gezeichnet wird. Dementsprechend ist es der Tangens des Winkels der zweiten Linie am Tiefpunkt. Und dann benutze ich den Tangens, um die Anzahl der Punkte auf dem nächsten Balken zu finden, d.h. ich benutze die umgekehrte Formel mit dem geänderten Wert von einem Katheten (der Anzahl der Balken). Wir erhalten den Preiswert am geprüften Punkt dieser Linien. Wenn der Kurswert des geraden Balkens also niedriger ist, ist die Kreuzung erfolgt.

Aber bis jetzt kann ich diesen Indikator nicht finden.

 
Leo59:

...

Oder hat vielleicht jemand ein fertiges Exemplar in den Archiven?

Kim hat eine Funktion gepostet. Die Funktion gibt den Preis des Punktes des von der Linie nach rechts gezogenen Strahls zurück.

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

x1 - Takt der ersten Zeilenkoordinate, y1 - Preis der ersten Zeilenkoordinate. x2 - Takt der zweiten Zeilenkoordinate, y2 - Preis der zweiten Zeilenkoordinate, x - der Takt, für den der Preis zurückgegeben wird.

Sie können die Preise für jede der beiden Linien finden und sehen, ob sie sich überschneiden...

 
Vielen Dank, Alexey und Artem, für eure Aufmerksamkeit auf meine Frage!

Ich habe hier sozusagen geschrieben..., etwas zählt und wird gezogen, aber nicht an jeder Kreuzung. Mit meinem Schreiben stimmt etwas nicht. Ich verstehe nicht, was es ist.



#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:
Vielen Dank, Alexey und Artem, für eure Aufmerksamkeit auf meine Frage!

Ich habe hier sozusagen geschrieben..., etwas zählt und wird gezeichnet, aber nicht an jeder Kreuzung. Mit meinem Schreiben stimmt etwas nicht. Ich weiß nicht, was es ist.

Im Moment kann ich nichts mit Programmierung anfangen, denn meine geliebte Frau hat heute Geburtstag. Sie ist 18 Jahre und 384 Monate alt.

Aber!!! Beachten Sie, dass sich die Linien innerhalb oder außerhalb der Balken kreuzen können, und dass der Preis (Y-Koordinate) nur auf dem Balken ermittelt werden kann. Entweder vorher oder nachher, aber der Kreuzungspunkt kann nicht immer bestimmt werden. Ich würde sagen, das ist eine Seltenheit. Überarbeiten Sie Ihren Code unter Berücksichtigung der obigen Ausführungen, vielleicht klappt es dann.

 

Alexey Viktorov 2015.12.12 17:33 RU

Sie ist 18 Jahre alt geworden.

Alexej, jetzt kannst du also alles machen! Alles Gute für Sie.... Herzlichen Glückwunsch!
 
TanFX:
Bitte teilen Sie mir mit, welche Art von Befehlen in den Expert Advisor eingefügt werden sollten, damit er die bereits gesetzten Takeprofits in den offenen Positionen automatisch korrigiert, wenn er sie neu berechnet. Oder gibt es vielleicht ein Skript, das alle Stopps des letzten Satzes korrigiert?
über Positionspflege hier https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Bitte geben Sie Hinweise, wie man Code hinzufügen kann, damit man im Strategietester die Gewichte der Muster ändern kann. m_pattern_0(90) Eingabevariablen ersetzen

Ich bin nicht sehr gut mit OOP, ich bekomme Fehler"member function not defined" oder der Code funktioniert einfach nicht.

Ähnliche unbeantwortete Frage hier https://www.mql5.com/ru/forum/13484

p.s.: Mit CiCustom kann ich Gewichte für Modelle ändern, aber bei Standardindikatoren, die Standardklassen haben (wie CSignalEnvelopes usw.), wo sind die Methoden zum Setzen von Werten für jedes Modell, aber sie sind noch nicht imAssistenten verfügbar?
Oder gibt es vielleicht irgendwo eine Antwort dafür?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
Ich möchte in MT4 (Alpari-Demo) ein Archiv mit Kursen speichern, die länger sind als die Standardwerte (2048 Candlesticks). Ich lösche, was da war, und drücke auf "Laden".
Es wird etwas von der MetaQuotes-Website geladen und ich erhalte das folgende Bild:

Startseite : Datenbank 2049/12358 Datensätze.
Der vorletzte ist vom 17.10.2014, der letzte vom 14.07.1993.
Wo sind die Vermissten?
 
Drücken Sie "Laden". Nur die letzten 2048 Takte werden automatisch geladen, der Rest muss gekickt werden.
Grund der Beschwerde: