Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 480

 
Merhaba canım!

Lütfen iki parçanın kesişme noktasının koordinatlarını bulmak için algoritmayı çevirmeme yardım et

Makaleden:

Her şey çok basit!
x1, y1 ve x2, y2 - ilk bölümün köşelerinin koordinatları;
x3, y3 ve x4, y4 - ikinci bölümün köşelerinin koordinatları;

kesişimi bulmak için çizgilerin denklemlerini oluştururuz:
ilk denklem:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
ikinci denklem
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
bu denklemler iki noktadan geçen düz bir çizgi tanımlar, ihtiyacımız olan da bu.
Bu denklemlerden aşağıdaki formülleri kullanarak x ve y'yi buluruz:
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);
doğrularımız kesiştiği için, bulmamız gereken (x, y) koordinatlarıyla ortak bir kesişme noktalarına sahiptirler.
kavşağın segmentlerimize ait olması için onu sınırlamamız gerekiyor, yani. koşulu kontrol edin:
Eğer
(((x1<=x)ve(x2>=x)ve(x3<=x)ve(x4 >=x))veya((y1<=y)ve(y2>=y)ve(y3<= y) ve(y4>=y)))
o zaman bu segmentlerin bir kesişme noktası vardır ve eğer değilse, o zaman kesişme noktası yoktur.
Eğim katsayılarını kullanarak bu segmentlerin paralelliğini de kontrol etmelisiniz:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
burada k1 ve k2, segmentlerin ОХ ekseninin pozitif yönüne eğim açısının teğetleridir, eğer k1=k2 ise, segmentler paraleldir ve bu nedenle kesişme noktaları yoktur.

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

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

}

Ya da belki arşivlerdeki biri zaten hazırdır?
 
Leo59 :
Merhaba canım!

Lütfen iki parçanın kesişme noktasının koordinatlarını bulmak için algoritmayı çevirmeme yardım et

Makaleden:

Her şey çok basit!
x1, y1 ve x2, y2 - ilk bölümün köşelerinin koordinatları;
x3, y3 ve x4, y4 - ikinci bölümün köşelerinin koordinatları;

kesişimi bulmak için çizgilerin denklemlerini oluştururuz:
ilk denklem:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
ikinci denklem
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
bu denklemler iki noktadan geçen düz bir çizgi tanımlar, ihtiyacımız olan da bu.
Bu denklemlerden, aşağıdaki formülleri kullanarak x ve y'yi buluruz:
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);
doğrularımız kesiştiği için, bulmamız gereken (x, y) koordinatlarıyla ortak bir kesişme noktalarına sahiptirler.
kavşağın segmentlerimize ait olması için onu sınırlamamız gerekiyor, yani. koşulu kontrol edin:
Eğer
(((x1<=x)ve(x2>=x)ve(x3<=x)ve(x4 >=x))veya((y1<=y)ve(y2>=y)ve(y3<= y) ve(y4>=y)))
o zaman bu segmentlerin bir kesişme noktası vardır ve eğer değilse, o zaman kesişme noktası yoktur.
Eğim katsayılarını kullanarak bu segmentlerin paralelliğini de kontrol etmelisiniz:
k1:=(x2-x1)/(y2-y1);
k2:=(x4-x3)/(y4-y3);
burada k1 ve k2, segmentlerin ОХ ekseninin pozitif yönüne eğim açısının teğetleridir, eğer k1=k2 ise, segmentler paraleldir ve bu nedenle kesişme noktaları yoktur.

Ya da belki arşivlerdeki biri zaten hazırdır?

Acı verecek kadar karmaşık bir şey... Çizgilerin kesişiminin tanımını yazdım, biri 2 yüksek, diğeri 2 alçak, bir sonraki çubuktan daha uzak olsun ya da olmasın. Teğeti kullanarak yazdım, puan cinsinden fiyat farkının çizginin çizildiği en yüksek noktalar arasındaki çubuk sayısına oranı. Buna göre, ikinci çizginin açısının tanjantı, düşük. Ve sonra, tanjantı kullanarak bir sonraki çubuktaki noktaların sayısını buldum, yani. bir bacağın değeri değiştirilmiş ters formül (çubuk sayısı). Bu çizgilerin işaretli noktasındaki fiyatın değeri elde edilir. Ve buna göre, yükseklerdeki düz çizginin fiyatının değeri daha azsa, o zaman bir kesişme vardı.

Ama şu ana kadar bu göstergeyi bulamıyorum.

 
Leo59 :

...

Ya da belki arşivlerdeki biri zaten hazırdır?

Kim bir fonksiyon yayınladı. Fonksiyon, doğrudan sağa doğru çizilen ışının noktasının fiyatını döndürür.

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

x1 - satırın ilk koordinatının çubuğu, y1 - satırın ilk koordinatının fiyatı. x2 - satırın ikinci koordinatının çubuğu, y2 - satırın ikinci koordinatının fiyatı, x - fiyatın iade edileceği çubuk.

İki çizginin her biri için fiyatları bulabilir ve kesişip kesişmediklerini görebilirsiniz..

 
Soruma gösterdiğiniz ilgi için Alexey ve Artyom'a çok teşekkür ederim!

Burada şöyle yazdım ..., bir şey düşünüldü ve çizildi, ancak her kavşakta değil. Bir şey doğru yazılmamış. Ne var, anlamıyorum.



 #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 :
Soruma gösterdiğiniz ilgi için Alexey ve Artyom'a çok teşekkür ederim!

Burada şöyle yazdım ..., bir şey düşünüldü ve çizildi, ancak her kavşakta değil. Bir şey doğru yazılmamış. Ne var, anlamıyorum.

Bu aralar programlamadan hiç bir şey anlayamıyorum sevgili eşimin bugün reçel günü var. 18 yaşında 384 aylık.

Ancak!!! Çizgilerin çubukların DIŞINDA veya ARASINDA geçebileceğini ve fiyatın (Y koordinatı) yalnızca çubuktan alınabileceğini unutmayın. Veya öncesi veya sonrası, ancak kesişme noktası her zaman belirlenemez. Bunun nadir olduğunu söyleyebilirim. Yukarıdakileri göz önünde bulundurarak, kodunuzu bunu göz önünde bulundurarak inceleyin, işe yarayabilir.

 

Alexey Viktorov 2015.12.12 17:33 RU

18 yaşına girdi

Alexey, artık her şeyi yapabilirsin! Mutlusun .... Tebrikler!
 
TanFX :
Lütfen bana danışmana neyin eklenmesi gerektiğini (hangi komutlar kümesini) söyleyin, böylece yeniden hesaplanırken, açık pozisyonlarda zaten ayarlanmış olan karları otomatik olarak düzeltir. Veya tüm durakları belirtilen sonuncuya göre düzelten bir komut dosyası olabilir mi?
pozisyon takibi hakkında burada https://www.mql5.com/en/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Lütfen strateji test cihazında değiştirebilmeniz için kodu nasıl ekleyeceğimi söyleyin - model kalıplarının ağırlıklarını seçin. m_pattern_0(90) girdiyi değişkenlerle değiştir

OOP ile pek iyi değilim, hatalar ya " üye işlevi tanımlanmadı " ya da kod çalışmıyor

Cevabı olmayan benzer bir soru burada https://www.mql5.com/ru/forum/13484

ps: CiCustom ile modeller için ağırlıkları değiştirmek mümkün görünüyor, ancak standart sınıflara ( CSignalEnvelopes , vb.) ?
Ya da belki bunun cevabı zaten bir yerde önerilmiştir?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
MT4'te (Alpari-Demo) bir dosyaya varsayılandan (2048 mum) daha uzun bir alıntı arşivi kaydetmek istiyorum. Ne olduğunu siliyorum, "İndir" e tıklıyorum.
MetaQuotes web sitesinden bir şey yükleniyor, aşağıdaki resmi alıyorum:

Üst: Veritabanı 2049/12358 girişleri.
Mumlar: 17.10.2014 tarihinden sondan bir önceki, son - 14.07.1993.
özlenenler nerede?
 
İndir'i tıklayın. Yalnızca son 2048 çubuk otomatik olarak yüklenir, geri kalanının atılması gerekir.
Neden: