KimIV'ten faydalı özellikler - sayfa 47

 

yani böyle ararsan bana da uyar

   for ( int i = 0 ; i < r ; i ++ )    {
     Y [ i ] = Close [ i + 1 ] ;
     X [ i ] = i ;
   }
    
   Array_LR ( X , Y ) ;
   for ( i = 0 ; i < r ; i ++ ) {
     SetArrow ( 170 , Blue , " arr " + i + r , Time [ i + 1 ] , Y [ i ]) ;
   }

Doğru, her iki durumda da noktalar tam olarak örtüşmez. Ancak bu, büyük olasılıkla SetArrow()'un bir özelliğidir.

işte resim

 
Prival писал (а) >>
Doğru, her iki durumda da noktalar tam olarak örtüşmez. Ancak bu, büyük olasılıkla SetArrow()'un bir özelliğidir.

Hayır, bu OBJ_ARROW grafik nesnesinin bir özelliğidir. Kütle merkezine değil, üst sınırın ortasına demirlenir.

 

ArrayMo() işlevi.

Modu döndürür - dağıtım yoğunluğu eğrisinin maksimumu. İşlev, aşağıdaki isteğe bağlı parametreleri kabul eder:

  • x - Sayısal dizi değerleri dizisi.
  • d - Sayısal serilerin değerlerinin doğruluğu, ondalık basamak sayısı.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.06.2008                                                     |
//|  Описание : Возвращает Моду - максимум кривой плотности распределения.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    d - точность значений числового ряда, количество знаков после запятой   |
//+----------------------------------------------------------------------------+
double ArrayMo ( double & x [] , int d = 4 ) {
   double e , s = 0 ;
   double m [][ 2 ] ;             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
   int      i , k = ArraySize ( x ) ;
   int      n ;                   // номер строки временного массива m
   int      r ;                   // количество строк во временном массиве m

   if ( k > 0 ) {
     for ( i = 0 ; i < k ; i ++ ) {
       e = NormalizeDouble ( x [ i ] , d ) ;
       n = ArraySearchDouble ( m , e ) ;
       if ( n < 0 ) {
         r = ArrayRange ( m , 0 ) ;
         ArrayResize ( m , r + 1 ) ;
         m [ r ][ 0 ] ++;
         m [ r ][ 1 ] = e ;
       } else m [ n ][ 0 ] ++;
     }
     ArraySort ( m , WHOLE_ARRAY , 0 , MODE_DESCEND ) ;
     s = m [ 0 ][ 1 ] ;
   } else Print ( " ArrayMo(): Массив пуст! " ) ;

   return ( s ) ;
}
 

ArrayMo() işlevinin kullanımına bir örnek.

Güncel grafiğin son 1000 çubuğu arasında en sık meydana gelen Yüksek fiyat seviyesinin belirlenmesi:

 #define R 1000
void start () {
   double a [ R ] ;
   for ( int i = 0 ; i < R ; i ++ ) a [ i ] = High [ i ] ;
   Message ( ArrayMo ( a , 4 )) ;
}
not. Ekli, ArrayMo() işlevini test etmek için bir komut dosyasıdır.
Dosyalar:
 

Dizilerle çalışmak için b-Array işlev kitaplığı tamamen yayınlandı.

 

Bir tane daha var, kovaryans hesaplaması

 //+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Рассчет ковариации массива cvar(X,Y)                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

double cvar ( double & X [] , double & Y [])
{
       double mo_X = 0 , mo_Y = 0 , res = 0 ;
       int      i , N = ArraySize ( X ) ;
     
       if ( N > 1 && ArraySize ( Y ) == N )    {
         for ( i = 0 ; i < N ; i ++ ) {
             mo_X += X [ i ] - X [ 0 ] ;
           mo_Y += Y [ i ] ;
       }
       mo_X /= N ;
       mo_Y /= N ;
       for ( i = 0 ; i < N ; i ++ ) res += ( X [ i ] - mo_X ) * ( Y [ i ] - mo_Y ) ;
       res /= N ;
     } else Print ( " cvar(): Недостаточное количество элементов ряда! N= " , N , " или не совпадает размерность " ) ;
   return ( res ) ;

düzeltildi.

 
Prival писал (а) >>

Bir tane daha var, kovaryans hesaplaması

kütüphaneye ekleyin. Dizilerle (matrisler) çok daha fazla işlem olmasına rağmen. Ama yavaş yavaş doldurmayı düşünüyorum.

Birkaç soru var:

1. mo_XY nedir?

2. X için MO birikimi doğrultusunda

 mo_X += X [ i ] - X [ 0 ] ;
Neden X[0] çıkarsın?
3. X dizisinin neden sıralanması gerekiyor?
 

1. mo_XY silinebilir, çeşitli hesaplama seçenekleri test edilmiştir. Kötü bir seçimden arta kalan.

2. Verdiğim bu algoritmanın X olarak Time[] kullanılırsa hesaplamalarda hata alma olasılığı minimumdur. Büyük sayıların çarpımı yavaş yavaş bir hatanın birikmesine neden olur ve dışarı tırmanır. Bu amaçla, bu hatanın olası oluşumunu ortadan kaldırarak, X'in (ilave olarak) X[0] çıkarılarak orijine kaydırılır.

3. Çok akıllı, belki sıralı değil, asıl mesele X'e girilen değerlerin Y'ye karşılık gelmesidir.

şimdi düzelteceğim

 
mo_X += X [ 0 ] ; // Muhtemelen unuttum.
Bu gereksiz bir işlemdir. Tekrar kontrol edebilirsiniz.
 
TheXpert писал (а) >>

Katılmıyorum.

Bu iyi bir kuraldır - güvensizlik. Herhangi bir matematik paketini kontrol edin. Sonuçları yayınlayacağız. Hemen şimdi MathCade'de yapacağım.

Neden: