Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 480

 
Ciao cari amici!

Aiuta a tradurre l'algoritmo per trovare le coordinate del punto di intersezione di due segmenti

Dall'articolo:

È molto semplice!
x1,y1 e x2,y2 sono coordinate dei vertici del primo segmento;
x3,y3 e x4,y4 sono le coordinate dei vertici del secondo segmento;

per trovare l'intersezione facciamo le equazioni delle linee:
prima equazione:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
seconda equazione
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
queste equazioni definiscono una retta passante per due punti, che è ciò di cui abbiamo bisogno.
Da queste equazioni troviamo x e y con le seguenti formule:
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);
poiché le nostre linee si intersecano, hanno un punto di intersezione comune con le coordinate (x,y), che dobbiamo trovare.
Affinché l'intersezione appartenga ai nostri segmenti di linea, dobbiamo vincolarla, cioè controllare la condizione:
se
(((x1<=x)e(x2>=x)e(x3<=x)e(x4 >=x))o((y1<=y)e(y2>=y)e(y3<=y) e(y4>=y))
allora c'è un punto di intersezione di questi segmenti, e se non c'è, non c'è nessun punto di intersezione.
Dovresti anche controllare il parallelismo di questi segmenti usando i coefficienti angolari:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
dove k1 e k2 sono le tangenti degli angoli dei segmenti alla direzione positiva dell'asse OX, se k1=k2, allora i segmenti sono paralleli e quindi non hanno punti di intersezione.

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

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

}

Forse qualcuno ne ha uno già pronto negli archivi?
 
Leo59:
Ciao cari amici!

Aiuta a tradurre l'algoritmo per trovare le coordinate del punto di intersezione di due segmenti di linea

Dall'articolo:

È molto semplice!
x1,y1 e x2,y2 sono le coordinate dei vertici del primo segmento;
x3,y3 e x4,y4 sono le coordinate dei vertici del secondo segmento;

per trovare l'intersezione facciamo le equazioni delle linee:
prima equazione:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
seconda equazione
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
queste equazioni definiscono una retta passante per due punti, che è ciò di cui abbiamo bisogno.
Da queste equazioni troviamo x e y con le seguenti formule:
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);
poiché le nostre linee si intersecano, hanno un punto di intersezione comune con le coordinate (x,y), che dobbiamo trovare.
Affinché l'intersezione appartenga ai nostri segmenti di linea, dobbiamo vincolarla, cioè controllare la condizione:
se
(((x1<=x)e(x2>=x)e(x3<=x)e(x4 >=x))o((y1<=y)e(y2>=y)e(y3<=y) e(y4>=y))
allora c'è un punto di intersezione di questi segmenti, e se non c'è, non c'è nessun punto di intersezione.
Dovresti anche controllare il parallelismo di questi segmenti usando i coefficienti angolari:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
dove k1 e k2 sono le tangenti degli angoli dei segmenti alla direzione positiva dell'asse OX, se k1=k2, allora i segmenti sono paralleli e quindi non hanno punti di intersezione.

Forse qualcuno ne ha uno pronto negli archivi?

È un po' complicato... Ho scritto la definizione dell'intersezione delle linee, una a 2m highs e l'altra a 2m lows, oltre la prossima barra o no. L'ho scritto usando la tangente, il rapporto tra la differenza di prezzo in pip e il numero di barre tra le Haijs su cui è disegnata la linea. Corrispondentemente, è la tangente dell'angolo della seconda linea in basso. E poi uso la tangente per trovare il numero di punti della prossima barra, cioè uso la formula inversa con il valore cambiato di un cateto (il numero di barre). Otteniamo il valore del prezzo nel punto testato di queste linee. E di conseguenza se il valore del prezzo della barra dritta è inferiore, l'incrocio è avvenuto.

Ma finora non riesco a trovare questo indicatore.

 
Leo59:

...

O forse qualcuno ne ha uno già pronto negli archivi?

Kim ha pubblicato una funzione. La funzione restituisce il prezzo del punto della semiretta disegnata dalla linea verso destra.

//+----------------------------------------------------------------------------+
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 della coordinata della prima linea, y1 - prezzo della coordinata della prima linea. x2 - barra della coordinata della seconda linea, y2 - prezzo della coordinata della seconda linea, x - la barra per la quale viene restituito il prezzo.

Puoi trovare i prezzi di ciascuna delle due linee e vedere se si sovrappongono...

 
Grazie mille Alexey e Artem per la vostra attenzione alla mia domanda!

Ho scritto qui una specie di..., qualcosa conta e viene disegnato, ma non ad ogni incrocio. C'è qualcosa che non va nella mia scrittura. Non capisco cosa sia.



#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:
Grazie mille Alexey e Artem per la vostra attenzione alla mia domanda!

Ho scritto qui una specie di..., qualcosa conta e viene disegnato, ma non ad ogni incrocio. C'è qualcosa che non va nella mia scrittura. Non so cosa sia.

Al momento, non sono in grado di capire nulla nella programmazione, oggi è il compleanno della mia amata moglie. Ha 18 anni e 384 mesi.

Ma!!! Si noti che l'incrocio delle linee può avvenire dentro o fuori le barre, e il prezzo (coordinata Y) può essere ottenuto solo sulla barra. O prima o dopo, ma il punto di crossover non può essere sempre determinato. Direi che è raro. Considerando quanto sopra, rivedete il vostro codice con questo in mente, forse funzionerà.

 

Alexey Viktorov 2015.12.12 17:33 RU

Ha compiuto 18 anni.

Alexei, quindi ora puoi fare qualsiasi cosa! Felice voi.... Congratulazioni!
 
TanFX:
Si prega di consigliare che tipo di comandi dovrebbero essere inseriti nell'Expert Advisor in modo che corregga automaticamente i takeprofits già impostati nelle posizioni aperte quando le ricalcola. O forse c'è uno script che corregge tutte le fermate dell'ultimo set?
sul mantenimento della posizione qui https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Si prega di consigliare come aggiungere codice in modo che nel tester delle strategie sia possibile cambiare i pesi dei modelli. m_pattern_0(90) sostituire le variabili di input

Non sono molto bravo con l'OOP, ottengo errori" funzionemembro non definita" o il codice semplicemente non funziona.

Domanda simile senza risposta qui https://www.mql5.com/ru/forum/13484

p.s.: con CiCustom posso cambiare i pesi per i modelli, ma con gli indicatori standard che hanno classi standard (come CSignalEnvelopes ecc.) dove sono i metodi per impostare i valori per ogni modello, ma non sono ancora disponibili nelWizard?
O forse c'è una risposta per questo da qualche parte?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
Voglio salvare un archivio di quotazioni più lungo di quello predefinito (2048 candele) in MT4 (Alpari-Demo). Cancello quello che c'era e premo "Load".
Qualcosa sarà caricato dal sito MetaQuotes e ottengo la seguente immagine:

Top : Database 2049/12358 record.
Il penultimo è del 17.10.2014, l'ultimo è del 14.07.1993.
Dove sono quelli che mancano?
 
Premere "Load". Solo le ultime 2048 barre sono caricate automaticamente, il resto deve essere calciato.