초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 480

 
안녕!

두 세그먼트의 교차점 좌표를 찾는 알고리즘을 번역하는 데 도움을 주세요.

기사에서:

모든 것이 매우 간단합니다!
x1, y1 및 x2, y2 - 첫 번째 세그먼트의 정점 좌표.
x3, y3 및 x4, y4 - 두 번째 세그먼트의 정점 좌표.

교차점을 찾기 위해 선의 방정식을 작성합니다.
첫 번째 방정식:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
두 번째 방정식
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
이 방정식은 우리가 필요로 하는 두 점을 통과하는 직선을 정의합니다.
이 방정식에서 다음 공식을 사용하여 x와 y를 찾습니다.
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);
우리 선들이 교차하기 때문에 우리가 찾아야 할 좌표 (x, y)와의 공통 교차점이 있습니다.
교차점이 우리 세그먼트에 속하도록 하려면 제한해야 합니다. 즉, 조건을 확인합니다.
만약
(((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<= y) 및(y4>=y)))
이 세그먼트의 교차점이 있고 그렇지 않은 경우 교차점이 없습니다.
또한 기울기 계수를 사용하여 이러한 세그먼트의 평행도를 확인해야 합니다.
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
여기서 k1과 k2는 ОХ 축의 양의 방향에 대한 세그먼트 경사각의 접선입니다. k1=k2인 경우 세그먼트는 평행하므로 교차점이 없습니다.

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

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

}

아니면 아카이브의 누군가가 이미 준비가 되어 있습니까?
 
Leo59 :
안녕!

두 세그먼트의 교차점 좌표를 찾는 알고리즘을 번역하는 데 도움을 주세요.

기사에서:

모든 것이 매우 간단합니다!
x1, y1 및 x2, y2 - 첫 번째 세그먼트의 정점 좌표.
x3, y3 및 x4, y4 - 두 번째 세그먼트의 정점 좌표.

교차점을 찾기 위해 선의 방정식을 구성합니다.
첫 번째 방정식:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
두 번째 방정식
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
이 방정식은 우리가 필요로 하는 두 점을 통과하는 직선을 정의합니다.
이 방정식에서 다음 공식을 사용하여 x와 y를 찾습니다.
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);
우리 선들이 교차하기 때문에 우리가 찾아야 할 좌표 (x, y)와의 공통 교차점이 있습니다.
교차점이 우리 세그먼트에 속하도록 하려면 제한해야 합니다. 즉, 조건을 확인합니다.
만약
(((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<= y) 및(y4>=y)))
이 세그먼트의 교차점이 있고 그렇지 않은 경우 교차점이 없습니다.
또한 기울기 계수를 사용하여 이러한 세그먼트의 평행도를 확인해야 합니다.
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
여기서 k1 및 k2는 ОХ 축의 양의 방향에 대한 세그먼트 경사각의 접선입니다. k1=k2인 경우 세그먼트는 평행하므로 교차점이 없습니다.

아니면 아카이브의 누군가가 이미 준비가 되어 있습니까?

뭔가 고통스럽게 복잡합니다... 나는 선의 교차점에 대한 정의를 썼습니다. 하나는 최고 2개, 다른 하나는 최저 2개, 다음 막대보다 더 멀리 있는지 여부에 관계없이. 나는 접선, 즉 선이 그려지는 고점 사이 의 막대 수에 대한 가격 차이의 비율을 사용하여 썼습니다. 따라서, 두 번째 선의 각도의 접선은 낮습니다. 그런 다음 접선을 사용하여 다음 막대의 점 수를 찾았습니다. 한 레그(막대 수)의 값이 변경된 역 공식. 이 라인의 체크 포인트에서 가격 값을 얻습니다. 따라서 최고점의 직선 가격 값이 더 작 으면 교차점이 있습니다.

그러나 지금까지 이 지표를 찾을 수 없습니다.

 
Leo59 :

...

아니면 아카이브의 누군가가 이미 준비가 되어 있습니까?

Kim님이 기능을 게시했습니다. 이 함수는 선에서 오른쪽으로 그려진 광선 점의 가격을 반환합니다.

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

x1 - 라인의 첫 번째 좌표의 막대, y1 - 라인의 첫 번째 좌표의 가격. x2 - 라인의 두 번째 좌표의 막대, y2 - 라인의 두 번째 좌표의 가격, x - 가격이 반환될 막대.

두 선 각각에 대한 가격을 찾고 교차하는지 확인할 수 있습니다.

 
제 질문에 관심을 가져주신 Alexey와 Artyom께 진심으로 감사드립니다!

나는 여기에 ...와 같이 썼습니다. 무언가가 고려되고 그려지지만 모든 교차점에서 그런 것은 아닙니다. 뭔가 제대로 작성되지 않았습니다. 그리고 문제가 무엇인지, 나는 이해하지 못합니다.



 #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 :
제 질문에 관심을 가져주신 Alexey와 Artyom께 진심으로 감사드립니다!

나는 여기에 ...와 같이 썼습니다. 무언가가 고려되고 그려지지만 모든 교차점에서 그런 것은 아닙니다. 뭔가 제대로 작성되지 않았습니다. 그리고 문제가 무엇인지, 나는 이해하지 못합니다.

현재 나는 프로그래밍을 하나도 이해하지 못하고 사랑하는 아내가 오늘 잼데이를 보내고 있다. 그녀는 18세 384개월입니다.

하지만!!! 선은 OUTSIDE 또는 BETWEEN 막대를 교차할 수 있으며 가격(Y 좌표)은 막대에서만 얻을 수 있습니다. 또는 이전 또는 이후에 있지만 교차점이 항상 결정될 수는 없습니다. 나는 이것이 드물다고 말하고 싶다. 위의 사항을 고려하여 이를 염두에 두고 코드를 검토하면 작동할 수 있습니다.

 

Alexey Viktorov 2015.12.12 17:33 RU

그녀는 18살이 되었다

Alexey, 이제 무엇이든 할 수 있습니다! 행복하세요 .... 축하합니다!
 
TanFX :
재계산할 때 자동으로 이미 설정된 이익을 미해결 위치 에서 수정하도록 어드바이저에 삽입해야 하는 항목(명령 세트)을 알려주십시오. 아니면 마지막에 지정된 정류장에 따라 모든 정류장을 수정하는 스크립트가 있습니까?
여기에서 위치 추적에 대해 알아보십시오. https://www.mql5.com/en/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

전략 테스터 에서 변경할 수 있도록 코드를 추가하는 방법을 알려주십시오. 모델 패턴의 가중치를 선택하십시오. m_pattern_0(90) 입력을 변수로 바꿉니다.

나는 OOP를 잘 사용하지 못합니다. 오류는 " 멤버 함수 정의 되지 않음"이거나 코드가 단순히 작동하지 않습니다.

답변이 없는 비슷한 질문은 여기 https://www.mql5.com/ru/forum/13484입니다.

ps: CiCustom을 사용하면 모델의 가중치를 변경할 수 있지만 표준 클래스가 있는 표준 표시기(예: CSignalEnvelopes 등)를 사용하면 각 모델의 중요성을 설정하는 방법이 있지만 마법사 에서 아직 사용할 수 없습니다. ?
아니면 이것에 대한 답이 이미 어딘가에서 제안되었을 수도 있습니다.

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
MT4(Alpari-Demo)에서 기본값(2048 양초)보다 긴 따옴표 아카이브를 파일에 저장하고 싶습니다. 나는 무엇을 삭제하고 "다운로드"를 클릭합니다.
MetaQuotes 웹 사이트에서 무언가를 로드하고 있습니다. 다음 그림이 표시됩니다.

상단: 데이터베이스 2049/12358 항목.
양초: 2014년 10월 17일부터 끝에서 두 번째, 마지막 - 1993년 7월 14일.
놓친 사람들은 어디에 있습니까?
 
다운로드를 클릭합니다. 마지막 2048개의 막대만 자동으로 로드되고 나머지는 제거해야 합니다.
사유: