KimIV의 유용한 기능 - 페이지 47

 

그래서 이렇게 부르면 나도 어울리지

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

사실, 두 경우의 포인트는 정확히 겹치지 않습니다. 그러나 이것은 SetArrow()의 기능일 가능성이 큽니다.

여기 사진이 있습니다

 
Prival писал (а) >> 를 작성했습니다.
사실, 두 경우의 포인트는 정확히 겹치지 않습니다. 그러나 이것은 SetArrow()의 기능일 가능성이 큽니다.

아니오, 이것은 OBJ_ARROW 그래픽 개체의 기능입니다. 그것은 질량 중심이 아니라 상부 경계의 중간에 의해 고정됩니다.

 

ArrayMo() 함수.

분포 밀도 곡선의 최대값인 모드를 반환합니다. 이 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • x - 숫자 계열 값의 배열입니다.
  • d - 숫자 계열 값의 정확도, 소수 자릿수.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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() 함수를 사용하는 예입니다.

현재 차트의 마지막 1000개 막대 중 가장 자주 발생하는 고가 수준 결정:

 #define R 1000
void start () {
   double a [ R ] ;
   for ( int i = 0 ; i < R ; i ++ ) a [ i ] = High [ i ] ;
   Message ( ArrayMo ( a , 4 )) ;
}
추신. ArrayMo() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.
파일:
 

배열 작업을 위한 b-Array 함수 라이브러리가 완전히 게시되었습니다.

 

또 다른 하나는 공분산 계산입니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов 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 ) ;

수정했습니다.

 
Prival писал (а) >> 를 썼습니다.

또 다른 하나는 공분산 계산입니다.

라이브러리에 추가하십시오. 배열(행렬)에는 훨씬 더 많은 연산이 있습니다. 하지만 차츰차츰 채워가는 것 같아요.

몇 가지 질문이 있습니다.

1. mo_XY가 무엇인가요?

2. X에 대한 MO 축적 라인에서

 mo_X += X [ i ] - X [ 0 ] ;
왜 X[0]을 빼나요?
3. 어레이 X를 주문해야 하는 이유는 무엇입니까?
 

1. mo_XY를 삭제할 수 있으며 다양한 계산 옵션을 테스트했습니다. 잘못된 선택이 남긴 것입니다.

2. 내가 준 이 알고리즘은 Time[]을 X로 사용하면 계산에서 오류가 발생할 가능성이 최소화됩니다. 큰 수를 곱하면 차츰 오차가 누적되어 올라갑니다. 이를 위해 이 오류의 가능한 발생을 제거하고 X[0]을 빼서 X를 (추가로) 원점으로 이동합니다.

3. 너무 똑똑하고 순서가 맞지 않을 수 있습니다. 가장 중요한 것은 X에 입력한 값이 Y에 해당한다는 것입니다.

지금 고칠게

 
mo_X += X [ 0 ] ; // 아마도 잊어버렸을 것입니다.
이것은 중복 작업입니다. 재확인할 수 있습니다.
 
TheXpert писал (а) >>

난 동의하지 않는다.

이것은 좋은 규칙입니다 - 불신. 수학 패키지를 체크인하십시오. 결과를 게시하겠습니다. 지금 MathCade에서 해보겠습니다.