KimIV'ten faydalı özellikler - sayfa 36

 

SetRegression() işlevini kullanma örnekleri.

  • Kırmızı kanal, son 2 günün çubuklarına dayanan doğrusal bir regresyondur.
     datetime d0 = StrToTime ( TimeToStr ( TimeCurrent () , TIME_DATE )) ;
    datetime d1 = TimeCurrent () - 24 * 60 * 60 ;
    while ( TimeDayOfWeek ( d1 ) == 0 || TimeDayOfWeek ( d1 ) == 6 ) d1 -= 24 * 60 * 60 ;
    d1 = StrToTime ( TimeToStr ( d1 , TIME_DATE )) ;
    SetRegression ( Red , "" , d1 , 0 , True ) ;

  • Önceki 2 günün çubuklarına dayalı doğrusal regresyonun kahverengi kanalı.
     datetime d0 = StrToTime ( TimeToStr ( TimeCurrent () , TIME_DATE )) ;
    datetime d1 = TimeCurrent () - 24 * 60 * 60 ;
    while ( TimeDayOfWeek ( d1 ) == 0 || TimeDayOfWeek ( d1 ) == 6 ) d1 -= 24 * 60 * 60 ;
    d1 = StrToTime ( TimeToStr ( d1 , TIME_DATE )) ;
    datetime d2 = d1 - 24 * 60 * 60 ;
    while ( TimeDayOfWeek ( d2 ) == 0 || TimeDayOfWeek ( d2 ) == 6 ) d2 -= 24 * 60 * 60 ;
    d2 = StrToTime ( TimeToStr ( d2 , TIME_DATE )) ;
    SetRegression ( Brown , "" , d2 , d0 , True , STYLE_DASH ) ;

not. Ekli, SetRegression() işlevini test etmek için bir komut dosyasıdır.

Dosyalar:
 

EquationDirect() işlevi.

Düz bir çizginin denklemi. Bu fonksiyon, grafikte rastgele iki noktadan çizilen düz bir çizgi ile kesişme noktasında X'in apsisi için Y koordinatının değerini hesaplar. İşlev, aşağıdaki gerekli parametreleri kabul eder:

  • x1 , y1 - İlk noktanın koordinatları.
  • x2 , y2 - İkinci noktanın koordinatları.
  • x - Apsisi Y koordinatını hesaplayacak değer.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect ( double x1 , double y1 , double x2 , double y2 , double x ) {
   if ( x2 == x1 ) return ( y1 ) ;
   return (( y2 - y1 ) / ( x2 - x1 ) * ( x - x1 ) + y1 ) ;
}
 

EquationDirect() işlevini kullanma örnekleri.

  • Kırmızı nokta, 23. ve 11. çubukların alt noktalarından çizilen düz çizgi ile sıfır çubuğunun düşeyinin kesiştiği noktadadır.
     double y = EquationDirect ( 23 , Low [ 23 ] , 11 , Low [ 11 ] , 0 ) ;
    SetArrow ( 108 , Red , "" , 0 , y ) ;

  • Grafikte rastgele iki noktadan geçen düz bir kırmızı nokta çizgisi.
     double p , x [ 2 ] , y [ 2 ] ;
    int      cd = 115 , i , k , ot ;
    string on ;
    
    ArrayInitialize ( x , 0.0 ) ;
    ArrayInitialize ( y , 0.0 ) ;
    
    k = ObjectsTotal () ;
    for ( i = k - 1 ; i >= 0 ; i -- ) {
       on = ObjectName ( i ) ;
       ot = ObjectType ( on ) ;
       if ( ot == OBJ_ARROW ) {
         if ( ObjectGet ( on , OBJPROP_ARROWCODE ) == cd ) ObjectDelete ( on ) ;
       }
    }
    k = ObjectsTotal () ;
    for ( i = 0 ; i < k ; i ++ ) {
       on = ObjectName ( i ) ;
       ot = ObjectType ( on ) ;
       if ( ot == OBJ_ARROW ) {
         if ( x [ 0 ] == 0 ) {
           x [ 0 ] = iBarShift ( NULL , 0 , ObjectGet ( on , OBJPROP_TIME1 )) ;
           y [ 0 ] = ObjectGet ( on , OBJPROP_PRICE1 ) ;
         } else {
           if ( x [ 1 ] == 0 ) {
             x [ 1 ] = iBarShift ( NULL , 0 , ObjectGet ( on , OBJPROP_TIME1 )) ;
             y [ 1 ] = ObjectGet ( on , OBJPROP_PRICE1 ) ;
           }
         }
       }
    }
    if ( x [ 0 ] == 0 || x [ 1 ] == 0 || y [ 0 ] == 0 || y [ 1 ] == 0 )
       Message ( " НЕ инициализированы исходные данные! " ) ;
    else {
       if ( x [ 0 ] > x [ 1 ]) k = x [ 0 ] ; else k = x [ 1 ] ;
       for ( i = k ; i >= 0 ; i -- ) {
         if ( i != x [ 0 ] && i != x [ 1 ]) p = EquationDirect ( x [ 0 ] , y [ 0 ] , x [ 1 ] , y [ 1 ] , i ) ;
         else {
           if ( i == x [ 0 ]) p = y [ 0 ] ;
           if ( i == x [ 1 ]) p = y [ 1 ] ;
         }
         SetArrow ( cd , Red , " arr " + i , Time [ i ] , p ) ;
       }
    }

not. EquationDirect() işlevini test etmek için bir komut dosyası ektedir.

Dosyalar:
 

GetArrowInterval() işlevi.

Bu işlevi, sinyal göstergeleri, yani çıktıda net bir alım veya satım sinyali veren göstergeler geliştirmenin kolaylığını artırmak için yazdım. Genellikle böyle bir göstergenin sinyalini, ilgili çubuğun üst kısmının üzerinde bir aşağı ok şeklinde veya ilgili çubuğun alt kısmının altında bir yukarı ok şeklinde yaparım. Okun çubuğa "girmemesi" için genellikle "altında" ve "yukarıda" değerler olarak birkaç nokta alındı. Örneğin, yalnızca saatlerce amaçlanan tek bir zaman dilimi göstergesi durumunda özel bir sorun yoktu. Her zaman dilimi için kendi "altında" ve "üstünde" değerlerim vardı. Ancak çoklu çerçeve göstergeleri için GetArrowInterval() işlevinin hizmetlerini kullanmak zorunda kaldım:

 //+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
int GetArrowInterval () {
   int p = Period () ;

   switch ( p ) {
     case 1 :     return ( 4 ) ;
     case 5 :     return ( 5 ) ;
     case 15 :     return ( 6 ) ;
     case 30 :     return ( 8 ) ;
     case 60 :     return ( 10 ) ;
     case 240 :   return ( 20 ) ;
     case 1440 :   return ( 40 ) ;
     case 10080 : return ( 80 ) ;
     case 43200 : return ( 150 ) ;
   }
}

Bu, çok hızlı bir şekilde daha kompakt ve daha çok yönlü bir forma dönüşen eski bir varyanttır:

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает интервал установки сигнальных указателей            |
//|  Параметры:                                                                |
//|    pr - процент относительно ценового размера окна                         |
//+----------------------------------------------------------------------------+
int GetArrowInterval ( int pr = 7 ) {
   if ( pr <= 0 ) pr = 7 ;
   return (( WindowPriceMax () - WindowPriceMin ()) / 100 * pr / Point ) ;
}
 

GetArrowInterval() işlevini kullanma örnekleri.

  • Mevcut çubukta sinyal sat.
     SetArrow ( 242 , Red , "" , Time [ 0 ] , High [ 0 ] + GetArrowInterval ( 15 ) * Point , 2 ) ;

  • Önceki (ilk) çubukta sinyal satın alın.
     SetArrow ( 233 , Blue , "" , Time [ 1 ] , Low [ 1 ] - GetArrowInterval () * Point , 1 ) ;
    

not. GetArrowInterval() işlevini test etmek için bir komut dosyası ektedir.

Dosyalar:
 
Sevgili Igor. e-SOTrailing EA'da kalkışlar ve duraklar değiştirilmelidir.
 
khorosh писал (а) >>
e-SOTrailing EA'da kalkışlar ve duraklar değiştirilmelidir.

Sayesinde! Bitti... Düzeltilmiş Expert Advisor web sitemde.

 
KimIV писал (а) >>

EquationDirect() işlevi.

Düz bir çizginin denklemi. Bu fonksiyon, grafikte rastgele iki noktadan çizilen düz bir çizgi ile kesişme noktasında X'in apsisi için Y koordinatının değerini hesaplar. İşlev, aşağıdaki gerekli parametreleri kabul eder:

  • x1 , y1 - İlk noktanın koordinatları.
  • x2 , y2 - İkinci noktanın koordinatları.
  • x - Apsisi Y koordinatını hesaplayacak değer.

Sizden düz bir doğrunun denkleminin ikinci kısmını yazmanızı rica ediyorum.

Verilen bir açıyla grafik üzerinde rastgele bir noktadan çizilen düz bir çizgiyle kesişme noktasındaki X apsisi için Y ordinat değerinin hesaplanması. İşlev, aşağıdaki gerekli parametreleri kabul eder:

  • x1 , y1 - İlk noktanın koordinatları.
  • a - Derece cinsinden açı.
  • x - Apsisi Y koordinatını hesaplayacak değer.

Teşekkür ederim.

 
Gerçek programcı Igor. Size çok saygılar ve saygılar.
 
djday писал (а) >>

Sizden düz bir doğrunun denkleminin ikinci kısmını yazmanızı rica ediyorum.

Verilen bir açıyla grafik üzerinde rastgele bir noktadan çizilen düz bir çizgiyle kesişme noktasındaki X apsisi için Y ordinat değerinin hesaplanması. İşlev, aşağıdaki gerekli parametreleri kabul eder:

  • x1 , y1 - İlk noktanın koordinatları.
  • a - Derece cinsinden açı.
  • x - Apsisi Y koordinatını hesaplayacak değer.

Teşekkür ederim.

Bacaklar eşit olduğunda 45 ° 'lik bir açı oluşur. Bacaklar için ölçü birimi metrik olduğunda, sorun yoktur. Bir bacak iki metre, ikincisi de iki metre. İşte 45 derecelik açı. Peki ya bir bacak çubuk sayısı veya zaman olduğunda ve diğer bacak fiyat olduğunda? Açı 45 ° olacak şekilde eşit olduklarından nasıl emin olunur? Bu bir ölçeklendirme meselesi. Bana bir destek noktası verin, dünyayı (ları) yerinden oynatayım.