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

 

SetRegression() 함수 사용의 예.

  • 빨간색 채널은 지난 2일의 막대를 기반으로 하는 선형 회귀입니다.
     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 ) ;

  • 이전 2일의 막대를 기반으로 하는 선형 회귀의 갈색 채널입니다.
     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 ) ;

추신. SetRegression() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.

파일:
 

EquationDirect() 함수.

직선의 방정식. 이 함수는 그래프의 임의의 두 점을 통해 그린 직선과의 교차점에서 X 의 가로 좌표에 대한 Y- 좌표 값을 계산합니다. 이 함수는 다음 필수 매개변수를 허용합니다.

  • x1 , y1 - 첫 번째 점의 좌표입니다.
  • x2 , y2 - 두 번째 점의 좌표입니다.
  • x - 가로 좌표가 Y 세로 좌표를 계산하는 값입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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() 함수 사용의 예.

  • 빨간 점은 23번째, 11번째 막대의 저점을 지나는 직선과 0 막대의 수직선이 교차하는 지점에 있습니다.
     double y = EquationDirect ( 23 , Low [ 23 ] , 11 , Low [ 11 ] , 0 ) ;
    SetArrow ( 108 , Red , "" , 0 , y ) ;

  • 그래프의 임의의 두 점을 통과하는 빨간색 점의 직선.
     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 ) ;
       }
    }

추신. EquationDirect() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.

파일:
 

GetArrowInterval() 함수.

신호 표시기, 즉 출력에서 명확한 매수 또는 매도 신호를 제공하는 지표 개발의 편의성을 개선하기 위해 이 함수를 작성했습니다. 나는 일반적으로 해당 막대 의 고점 위의 아래쪽 화살표 형태 또는 해당 막대의 저점 아래의 위쪽 화살표 형태로 이러한 표시기의 신호를 만듭니다. 화살표가 막대에 "달리지 않도록" 여러 점을 일반적으로 "아래" 및 "위" 값으로 사용했습니다. 예를 들어 몇 시간 동안만 의도된 단일 기간 표시기의 경우에는 특별한 문제가 없었습니다. 각 기간에 대해 저만의 "아래" 및 "위" 값이 있었습니다. 그러나 다중 프레임 표시기의 경우 GetArrowInterval() 함수의 서비스를 사용해야 했습니다.

 //+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
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 ) ;
   }
}

이것은 보다 컴팩트하고 다재다능한 형태로 매우 빠르게 변형된 오래된 변형입니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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() 함수 사용의 예.

  • 현재 막대에서 신호를 판매하십시오.
     SetArrow ( 242 , Red , "" , Time [ 0 ] , High [ 0 ] + GetArrowInterval ( 15 ) * Point , 2 ) ;

  • 이전(첫 번째) 막대에서 신호를 매수하십시오.
     SetArrow ( 233 , Blue , "" , Time [ 1 ] , Low [ 1 ] - GetArrowInterval () * Point , 1 ) ;
    

추신. GetArrowInterval() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.

파일:
 
친애하는 이고르. e-SOTrailing EA에서 테이크 및 스톱을 수정해야 합니다.
 
khorosh писал (а) >> 를 썼습니다.
e-SOTrailing EA에서 테이크 및 스톱을 수정해야 합니다.

덕분에! 완료... 수정된 Expert Advisor가 내 웹사이트에 있습니다.

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

EquationDirect() 함수.

직선의 방정식. 이 함수는 그래프의 임의의 두 점을 통해 그린 직선과의 교차점에서 X 의 가로 좌표에 대한 Y- 좌표 값을 계산합니다. 이 함수는 다음 필수 매개변수를 허용합니다.

  • x1 , y1 - 첫 번째 점의 좌표입니다.
  • x2 , y2 - 두 번째 점의 좌표입니다.
  • x - 가로 좌표가 Y 세로 좌표를 계산하는 값입니다.

직선의 방정식의 두 번째 부분을 쓰도록 요청합니다.

주어진 각도로 그래프의 임의의 한 점을 통해 그린 직선과의 교차점에서 X 가로좌표에 대한 Y 세로좌표 값을 계산합니다. 이 함수는 다음 필수 매개변수를 허용합니다.

  • x1 , y1 - 첫 번째 점의 좌표입니다.
  • a - 각도(도).
  • x - 가로 좌표가 Y 세로 좌표를 계산하는 값입니다.

고맙습니다.

 
실제 프로그래머 이고르. 많은 존경과 존경을 표합니다.
 
djday писал (а) >>

직선 방정식의 두 번째 부분을 쓰도록 요청합니다.

주어진 각도로 그래프의 임의의 한 점을 통해 그린 직선과의 교차점에서 X 가로좌표에 대한 Y 세로좌표 값을 계산합니다. 이 함수는 다음 필수 매개변수를 허용합니다.

  • x1 , y1 - 첫 번째 점의 좌표입니다.
  • a - 각도(도).
  • x - 가로 좌표가 Y 세로 좌표를 계산하는 값입니다.

고맙습니다.

다리가 같을 때 45 °의 각도가 발생합니다. 다리의 측정 단위가 미터법이면 문제가 없습니다. 한 다리는 2미터이고 두 번째 다리도 2미터입니다. 다음은 45° 각도입니다. 그러나 한 다리가 막대 또는 시간의 수이고 다른 다리가 가격인 경우는 어떻습니까? 각도가 45°가 되도록 동일한지 확인하는 방법은 무엇입니까? 스케일링의 문제입니다. 나에게 지지점을 주시면 지구를 움직일 것입니다.