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

 

ArrayInsertDouble() 함수

주어진 인덱스에 배열의 한 요소를 삽입합니다. 새 배열의 요소 수(크기)를 반환합니다. 삽입은 다음과 같이 수행됩니다. 먼저 배열의 크기를 1만큼 늘립니다. 그런 다음 인덱스가 삽입된 요소의 인덱스보다 크거나 같은 모든 요소는 배열의 끝으로 하나씩 이동하여 삽입된 요소를 위한 공간을 만듭니다. 마지막으로 값이 원하는 셀에 기록됩니다. ArrayInsertDouble() 함수는 다음 매개변수를 사용합니다.

  • m - double 유형의 요소 배열입니다.
  • e - 삽입될 배열 요소의 값.
  • i - 삽입할 배열 요소의 인덱스. 인덱스 값이 0보다 작거나 배열 크기보다 크거나 같으면 요소가 배열 끝에 추가됩니다. 기본값은 -1 입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble ( double & m [ ] , double e , int i = - 1 ) {
   int j , k = ArraySize ( m ) ;

   ArrayResize ( m , k + 1 ) ;
   if ( i > = 0 & & i < k ) {
     for ( j = k ; j > i ; j - - ) m [ j ] = m [ j - 1 ] ;
    m [ i ] = e ;
   } else m [ k ] = e ;

   return ( k + 1 ) ;
}

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

ZZY. 사이트에서 b-Array 라이브러리를 업데이트했습니다.

 

Igor는 방금 배열을 사용했습니다. 배열 정렬에 대한 이전 요청으로 돌아가 보겠습니다( '유용한 기능 from KimIV' ). 이전에 수행한 작업은 약간 다릅니다. 루트가 아닌 TK에 대해 사과드립니다.

EXCEL 의 연산과 유사한 주어진 열(행)을 기준으로 2차원 배열을 정렬해야 합니다. 이 절차는 상관 행렬 분석의 일부 변형에서 Spearman 의 순위 상관 통계를 사용하는 데 필요합니다. 통화(포트폴리오).

 

BubbleSort2() 함수.

이 함수는 임의의 열을 기준으로 2차원 배열의 요소를 버블 정렬합니다. 또한 정렬 방향을 설정할 수 있습니다. BubbleSort2() 함수는 다음 매개변수를 사용합니다.

  • a - 요소의 2차원 배열. 필수 매개변수입니다.
  • r - 정렬 열(열)의 번호(색인). 기본값 - 0 - 첫 번째 열(인덱스가 0인 열).
  • m - 정렬 방향. 유효한 값: MODE_ASCEND - 오름차순, MODE_DESCEND - 내림차순 기본값은 MODE_ASCEND 입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2 ( double & a [ ] [ ] , int r = 0 , int m = MODE_ASCEND ) {
   double t ;
   int     e , i , j ;
   int     k = ArrayRange ( a , 1 ) ;        // Количество колонок
   int     n = ArrayRange ( a , 0 ) ;        // Количество строк

   if ( r < 0 ) r = 0 ;
   if ( r > k ) r = k ;

   for ( i = n - 1 ; i > 0 ; i - - ) {
     for ( j = 0 ; j < i ; j + + ) {
       if ( m = = MODE_ASCEND ) {
         // по возрастанию
         if ( a [ j ] [ r ] > a [ j + 1 ] [ r ] ) {
           for ( e = 0 ; e < k ; e + + ) {
            t = a [ j ] [ e ] ;
            a [ j ] [ e ] = a [ j + 1 ] [ e ] ;
            a [ j + 1 ] [ e ] = t ;
           }
         }
       } else {
         // по убыванию
         if ( a [ j ] [ r ] < a [ j + 1 ] [ r ] ) {
           for ( e = 0 ; e < k ; e + + ) {
            t = a [ j ] [ e ] ;
            a [ j ] [ e ] = a [ j + 1 ] [ e ] ;
            a [ j + 1 ] [ e ] = t ;
           }
         }
       }
     }
   }
}
추신. BubbleSort2() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.
파일:
 

GetTypeLastDeleted() 함수.

이 함수는 마지막으로 삭제된 주문 의 유형 또는 -1 을 반환합니다. 방금 삭제된 주문의 유형에 어드바이저의 논리를 연결해야 하는 상황이 있습니다. 예를 들어 BuyStop 이 이제 제거되면 무언가를 수행하고 BuyLimit 이면 다른 작업을 수행하는 등의 작업을 수행합니다. GetTypeLastDeleted() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • sy - 도구 이름. "" - 모든 문자, NULL - 현재 문자. 기본값은 "" 입니다.
  • mn - 맞춤 주문 ID(MagicNumber). 기본값은 -1 - 모든 마법입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted ( string sy = "" , int mn = - 1 ) {
   datetime t ;
   int       i , k = OrdersHistoryTotal ( ) , r = - 1 ;

   if ( sy = = "0" ) sy = Symbol ( ) ;
   for ( i = 0 ; i < k ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY ) ) {
       if ( ( OrderSymbol ( ) = = sy | | sy = = "" ) & & ( mn < 0 | | OrderMagicNumber ( ) = = mn ) ) {
         if ( OrderType ( ) > 1 & & OrderType ( ) < 6 & & t < OrderCloseTime ( ) ) {
          t = OrderCloseTime ( ) ;
          r = OrderType ( ) ;
         }
       }
     }
   }
   return ( r ) ;
}
 
beginner писал(а) >>

예, 이제 이

#include "b-KimIV.mqh" // 추가 기능 라이브러리

안녕하세요 올렉입니다!

오류 없이 b-Positions.mqh 라이브러리를 컴파일하려면 이 분기에 이미 있는 b-kimiv.mqh 라이브러리의 함수가 필요합니다.

  • GetNameOP() - 거래 작업 이름을 반환합니다.
  • GetNameTF() - 기간 이름을 반환합니다.
  • IIFc() - 조건에 따라 두 값 중 하나를 반환합니다.
  • Message() - 댓글 및 로그에 메시지를 출력합니다.

따라서 다음을 수행할 수 있습니다.

  1. b-Positions.mqh 파일이 있는 동일한 폴더에 b-kimiv.mqh라는 빈 파일을 만듭니다.
  2. 위의 함수를 붙여넣고 b-Positions.mqh 파일을 컴파일합니다.

행운을 빕니다!

 

iBarLargest() 함수.

이 함수는 가장 큰 막대의 인덱스 또는 -1을 반환합니다. 막대 크기는 검색 요소의 유형인 입력 매개변수 ty 에 의해 결정되는 두 가지 방법 중 하나로 함수에 의해 측정됩니다. 몸의 크기만 아니면 그림자와 함께. iBarLargest() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • sy - 도구 이름. "" 또는 NULL 은 현재 문자입니다. 기본값은 "" 입니다.
  • tf - 기간. 기본값 - 0 - 현재 시간 프레임.
  • ty - 검색 요소의 유형입니다. 유효한 값은 0 - High-Low, 1 - abs(Open-Close)입니다.
  • co - 시계열 요소의 수입니다. 기본값은 0 - 모든 요소입니다.
  • in - 초기 막대의 인덱스입니다. 기본값 - 0 - 현재 막대.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest ( string sy = "" , int tf = 0 , int ty = 0 , int co = 0 , int in = 0 ) {
   if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
   if ( tf < = 0 ) tf = Period ( ) ;
   if ( in < 0 ) in = 0 ;
   if ( co < = 0 ) co = iBars ( sy , tf ) - in ;

   double r , rb = 0 ;        // размер бара
   int     i , nb = - 1 ;        // счётчик и номер бара

   for ( i = co + in ; i > = in ; i - - ) {
     if ( ty > 0 ) r = MathAbs ( iOpen ( sy , tf , i ) - iClose ( sy , tf , i ) ) ;
     else r = iHigh ( sy , tf , i ) - iLow ( sy , tf , i ) ;
     if ( rb < r ) {
      rb = r ;
      nb = i ;
     }
   }

   return ( nb ) ;
}
추신. iBarLargest() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.
파일:
 

iBarOfDayCalc() 함수.

이 함수는 하루의 시작부터 계산된 막대 번호를 반환합니다. 막대는 1부터 시작하여 번호가 매겨집니다. 즉, 주어진 날짜에 여는 시간이 가장 짧은 막대가 1번이고 다음 막대가 2번이 되는 식입니다. 이 기능은 입장/퇴장 시간을 최적화할 때 유용합니다. 세부 사항에 관심이 있는 사람이 있으면 질문하십시오. 나는 대답하려고 노력할 것이다. iBarOfDayCalc() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • tf - 기간. 기본값 - 0 - 현재 시간 프레임.
  • dt - 바를 여는 날짜와 시간. 기본값 - 0 - 현재 시간.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc ( int tf = 0 , datetime dt = 0 ) {
   if ( tf < = 0 ) tf = Period ( ) ;
   if ( dt < = 0 ) dt = TimeCurrent ( ) ;
   if ( tf > PERIOD_D1 ) {
     Print ( "iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1" ) ;
     return ( 0 ) ;
   }
   double ms = MathMod ( dt / 60 , 1440 ) ;        // количество минут от начала суток
   int     bd = MathFloor ( ms / tf ) + 1 ;          // номер бара от начала суток

   return ( bd ) ;
}

추신. iBarOfDayCalc() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다. 아래 그림은 스크립트가 어떻게 사용되는지 보여줍니다.

파일:
 

iBarOfDayReal() 함수.

이 함수는 하루의 시작부터 실제 막대 번호를 반환합니다. 막대는 1부터 시작하여 번호가 매겨집니다. 즉, 주어진 날짜에 여는 시간이 가장 짧은 막대가 1번이고 다음 막대가 2번이 되는 식입니다. 나는 아직 이 기능의 실질적인 적용을 찾지 못했다. 그리고 iBarOfDayCalc() 함수와 함께 :-) 를 썼습니다. iBarOfDayReal() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • sy - 거래 상품의 이름. NULL 또는 "" 는 현재 문자입니다. 기본값은 "" 입니다.
  • tf - 기간. 기본값 - 0 - 현재 시간 프레임.
  • dt - 바를 여는 날짜와 시간. 기본값 - 0 - 현재 시간.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal ( string sy = "" , int tf = 0 , datetime dt = 0 ) {
   if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
   if ( tf < = 0 ) tf = Period ( ) ;
   if ( dt < = 0 ) dt = TimeCurrent ( ) ;
   if ( tf > PERIOD_D1 ) {
     Print ( "iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1" ) ;
     return ( 0 ) ;
   }

   int cd = TimeDay ( dt ) ;                        // текущий день месяца
   int nb = iBarShift ( sy , tf , dt , False ) ;        // номер текущего бара
   int bd = 0 ;                                  // номер бара от начала суток

   while ( TimeDay ( iTime ( sy , tf , nb ) ) = = cd ) {
    nb + + ;
    bd + + ;
   }

   return ( bd ) ;
}

추신. iBarOfDayReal() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다. 아래 그림은 스크립트가 어떻게 사용되는지 보여줍니다.

파일:
 
KimIV писал(а) >>

iBarOfDayReal() 함수.

나는 아직 이 기능의 실질적인 적용을 찾지 못했다.

야... :)

나는 훈련으로 여기에서 이동한 거리를 계산할 스크립트를 작성하기로 결정했습니다.

누가 알면 마우스가 모니터를 가로 질러 몇 킬로미터를 달렸는지 계산하는 프로그램이 있습니다.

따라서 여기 에 현재 날짜(주, 월 또는 연도)의 시가 막대를 추가하거나

다르게, 모피 코트를 꿰매는 바늘이 달린 실처럼 : open-clos-open-clos-open-clos ... 일정에 따라.

똑같은데 하이로우...

*

연결은 첫 단계부터 시작되었습니다.

계산을 위해 오늘의 막대를 필터링하는 방법...

나는 이 애지중지하기 위해 당신의 기능을 적용하려고 노력할 것입니다.

 

이고르. 안녕하세요.

어쩌면 당신은 당신을 위해 간단한 작업을 그릴 수 있습니다: 그리고 작업(저를 위해)은 다음과 같습니다:

작업은 다음과 같습니다. 신호 라인 이 MACD를 교차할 가격 값, 즉 MACD 히스토그램이 0이 되는 값을 결정합니다.

이러한 문제의 해결은 예를 들어 이 표시기를 사용하여 거래 시스템의 신호에서 다음 막대에 대한 정지 가격 또는 주문 제한을 계산하는 데 필요합니다.

MACD 히스토그램이 0선(즉, 가격과 한 선의 교차점 - 차트의 선)을 교차하는 가격 수준을 시각적으로 보여줍니다.

이것은 공식 MACD = ( FastEMA / SlowEMA - 1)로 계산된 MACD 백분율에 적용됩니다. 기간 12, 26, 신호 9.

Omega 및 metstock에 대한 코드가 있습니다. 그러나 MT4에서 구현하는 방법은 아직 어디에서도 찾지 못했습니다.

고맙습니다


사유: