"KimIV의 유용한 기능"만. - 페이지 8

 

TakeProfitLastClosePos() 함수.

마지막으로 마감된 포지션의 TakeProfit 가격 수준을 반환하거나 -1 을 반환합니다. TakeProfitLastClosePos() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • sy - 도구 이름. "" - 모든 문자, NULL - 현재 문자. 기본값은 "" 입니다.
  • op - 거래 작업. 유효한 값: -1 , OP_BUY , OP_SELL . 기본값은 -1 - 모든 작업입니다.
  • mn - 거래 작업의 식별자, MagicNumber. 기본값은 -1 - 모든 마법입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.10.2008                                                     |
//|  Описание : Возвращает цену TakeProfit последней закрытой позиций или -1.  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double TakeProfitLastClosePos( string sy= "" , int op=- 1 , int mn=- 1 ) {
   datetime t;
   double    r=- 1 ;
   int       i, k=OrdersHistoryTotal();

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
       if (OrderSymbol()==sy || sy== "" ) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
               if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
   return (r);
}

MovingInWL() 함수.

미결 포지션의 StopLoss 가격 수준을 손익분기점으로 이동합니다. MovingInWL() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • sy - 도구 이름. "" - 모든 문자, NULL - 현재 문자. 기본값은 "" 입니다.
  • op - 거래 작업. 유효한 값: -1 , OP_BUY , OP_SELL . 기본값은 -1 - 모든 작업입니다.
  • mn - 거래 작업의 식별자, MagicNumber . 기본값은 -1 - 모든 마법입니다.

또한 MovingInWL() 함수는 전역 변수 (스크립트 또는 Expert Advisor의 외부 매개변수)가 있다고 가정합니다.

  • int LevelProfit - 스톱이 손익분기점 수준으로 이동하기 위해 위치가 도달해야 하는 포인트 단위의 이익 수준입니다.
  • int LevelWLoss - 이익이 LevelProfit 레벨(포인트)에 도달한 후 포지션 스톱이 이동할 포인트의 손익분기 레벨입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double po, pp;
   int     i, k= OrdersTotal ();

   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
       if (OrderType()==OP_BUY) {
         if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
           if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(- 1 , OrderOpenPrice()+LevelWLoss*po, - 1 );
          }
        }
      }
       if (OrderType()==OP_SELL) {
         if (OrderStopLoss()== 0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
           if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(- 1 , OrderOpenPrice()-LevelWLoss*po, - 1 );
          }
        }
      }
    }
  }
}
 

SimpleTrailing() 함수.

TrailingStop 알고리즘에 따라 오픈 포지션의 StopLoss 가격 수준을 이동합니다. SimpleTrailing() 함수는 다음과 같은 선택적 매개변수를 사용합니다.

  • sy - 도구 이름. "" - 모든 문자, NULL - 현재 문자. 기본값은 "" 입니다.
  • op - 거래 작업. 유효한 값: -1 , OP_BUY , OP_SELL . 기본값은 -1 - 모든 작업입니다.
  • mn - 거래 작업의 식별자, MagicNumber. 기본값은 -1 - 모든 마법입니다.

또한 SimpleTrailing() 함수는 전역 변수 (스크립트 또는 Expert Advisor의 외부 매개변수)가 있다고 가정합니다.

  • bool TSProfitOnly - 트롤이 작업을 시작하는 구역을 전환합니다. True 이면 포지션 이익이 TStop.Buy/Sell+TrailingStep 포인트 값에 도달한 후에만 후행이 작동하기 시작합니다. False 이면 EA는 현재 가격을 기준으로 포지션 스톱이 항상 TStop.Buy/Sell+TrailingStep 포인트보다 크지 않은지 확인합니다. 즉, True 이면 EA가 해당 포지션의 이익 영역에서만 작동하고, False 이면 음수 영역에서 작동합니다.
  • int TStop.Buy - 트롤 크기(포인트).
  • int TStop.Sell - 판매 포인트 단위의 트롤 크기입니다.
  • int TrailingStep - 포인트의 후행 단계. 잦은 요청으로 딜러를 괴롭히지 않기 위해 필요합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Сопровождение позиций простым тралом                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void SimpleTrailing( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double po, pp;
   int     i, k= OrdersTotal ();

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
         if (mn< 0 || OrderMagicNumber()==mn) {
           if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
             if (!TSProfitOnly || pp-OrderOpenPrice()>TStop.Buy*po) {
               if (OrderStopLoss()<pp-(TStop.Buy+TrailingStep- 1 )*po) {
                ModifyOrder(- 1 , pp-TStop.Buy*po, - 1 );
              }
            }
          }
           if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
             if (!TSProfitOnly || OrderOpenPrice()-pp>TStop.Sell*po) {
               if (OrderStopLoss()>pp+(TStop.Sell+TrailingStep- 1 )*po || OrderStopLoss()== 0 ) {
                ModifyOrder(- 1 , pp+TStop.Sell*po, - 1 );
              }
            }
          }
        }
      }
    }
  }
}

ArrayZ() 함수.

이 함수는 참조에 의해 배열에 전달된 숫자 시리즈의 Z-점수를 계산하고 반환합니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.10.2008                                                     |
//|  Описание : Возвращает Z-счёт числового ряда.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    arr - массив значений числового ряда                                    |
//+----------------------------------------------------------------------------+
double ArrayZ( double & arr[]) {
   double x, z;
   int     i, l= 0 , n= ArraySize (arr), r= 1 , w= 0 ;

   for (i= 0 ; i<n; i++) {
     if (i== 0 ) r= 1 ;
     else {
       if (arr[i- 1 ]*arr[i]< 0 ) r++;
    }
     if (arr[i]> 0 ) w++; else l++;
  }

   if (n> 2 ) {
     if (w> 0 && l> 0 ) {
      x= 2 *w*l;
       if (x!=n) z=(n*(r- 0.5 )-x)/ MathSqrt (x*(x-n)/(n- 1 ));
    } else {
       if (l== 0 ) z= 100 ; else z=- 100 ;
       Print ( "ArrayZ(): Нет чередования серий!" );
    }
     return (z);
  } else {
     Print ( "ArrayZ(): В массиве недостаточно элементов!" );
     return ( 0 );
  }
}
 

ArrayDeleteInt() 함수

주어진 인덱스에서 배열 요소를 삭제합니다 . 새 배열의 크기를 반환하거나 제거할 수 없는 경우 -1 을 반환합니다. ArrayDeleteInt() 함수는 다음 필수 매개변수를 사용합니다.

  • m - 요소의 배열.
  • i - 배열 요소의 인덱스.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteInt( int & m[], int i) {
   int j, k= ArraySize (m);

   if (i>= 0 && i<k) {
     for (j=i; j<k; j++) m[j]=m[j+ 1 ];
    k= ArrayResize (m, k- 1 );
     return (k);
  } else Print ( "ArrayDeleteInt(): Неверный индекс элемента массива! i=" , i);

   return (- 1 );
}

ArrayDeleteDouble() 함수

주어진 인덱스에서 배열 요소를 삭제합니다. 새 배열의 크기를 반환하거나 제거할 수 없는 경우 -1 을 반환합니다. ArrayDeleteDouble() 함수는 다음 필수 매개변수를 사용합니다.

  • m - double 유형의 요소 배열입니다.
  • i - 배열 요소의 인덱스.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteDouble( double & m[], int i) {
   int j, k= ArraySize (m);

   if (i>= 0 && i<k) {
     for (j=i; j<k; j++) m[j]=m[j+ 1 ];
    k= ArrayResize (m, k- 1 );
     return (k);
  } else Print ( "ArrayDeleteDouble(): Неверный индекс элемента массива! i=" , i);

   return (- 1 );
}
 

ArrayDeleteString() 함수

주어진 인덱스에서 배열 요소를 삭제합니다 . 새 배열의 크기를 반환하거나 제거할 수 없는 경우 -1 을 반환합니다. ArrayDeleteString() 함수는 다음 필수 매개변수를 사용합니다.

  • m - string 유형의 요소 배열입니다.
  • i - 배열 요소의 인덱스.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет удаление элемента массива с заданным индексом.       |
//|             Возвращает размер нового массива или -1,                       |
//|             если не удалось ничего удалить.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    i - индекс элемента                                                     |
//+----------------------------------------------------------------------------+
int ArrayDeleteString( string & m[], int i) {
   int j, k= ArraySize (m);

   if (i>= 0 && i<k) {
     for (j=i; j<k; j++) m[j]=m[j+ 1 ];
    k= ArrayResize (m, k- 1 );
     return (k);
  } else Print ( "ArrayDeleteString(): Неверный индекс элемента массива! i=" , i);

   return (- 1 );
}

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

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

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

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

iBarOfDayCalc() 함수.

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

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

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

NameDayOfWeek() 함수

매개변수로 전달된 숫자로 요일의 이름을 반환합니다.

  • ndw - 요일의 수. 필수 매개변수입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование дня недели                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ndw - номер дня недели                                                  |
//+----------------------------------------------------------------------------+
string NameDayOfWeek( int ndw) {
   if (ndw== 0 ) return ( "Воскресенье" );
   if (ndw== 1 ) return ( "Понедельник" );
   if (ndw== 2 ) return ( "Вторник" );
   if (ndw== 3 ) return ( "Среда" );
   if (ndw== 4 ) return ( "Четверг" );
   if (ndw== 5 ) return ( "Пятница" );
   if (ndw== 6 ) return ( "Суббота" );
}
 

NormalizeLot() 함수.

이 함수는 거래된 로트의 정규화된 값을 반환합니다. 정규화 외에 로트 크기를 딜링 센터에서 설정한 한도 내로 유지하는 기능도 있습니다(최소 및 최대 로트 값 확인 및 로트 변경 단계 확인). NormalizeLot() 함수는 다음 매개변수를 사용합니다.

  • lo - 정규화할 로트 값입니다. 필수 매개변수입니다.
  • ro - 반올림 방법. 거짓 -아래, -위. 기본값은 False - down입니다.
  • sy - 거래 상품의 이름. NULL 또는 "" 는 현재 문자입니다. 기본값은 "" 입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot( double lo, bool ro=False, string sy= "" ) {
   double l, k;
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double ls=MarketInfo(sy, MODE_LOTSTEP);
   double ml=MarketInfo(sy, MODE_MINLOT);
   double mx=MarketInfo(sy, MODE_MAXLOT);

   if (ml== 0 ) ml= 0.1 ;
   if (mx== 0 ) mx= 100 ;

   if (ls> 0 ) k= 1 /ls; else k= 1 /ml;
   if (ro) l= MathCeil (lo*k)/k; else l= MathFloor (lo*k)/k;

   if (l<ml) l=ml;
   if (l>mx) l=mx;

   return (l);
}

NormalizePrice() 함수.

이 함수는 정규화된 가격 값을 반환합니다. MarketInfo(MODE_TICKSIZE || MODE_DIGITS) 함수의 값을 사용하여 정규화를 수행합니다. NormalizePrice() 함수는 다음 매개변수를 사용합니다.

  • np - 정규화할 로트 값입니다. 필수 매개변수입니다.
  • sy - 거래 상품의 이름. NULL 또는 "" 는 현재 문자입니다. 기본값은 "" 입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.08.2008                                                     |
//|  Описание : Возвращает нормализованное под размер тика значение цены.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    np - нормализуемое значение цены.                                       |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//+----------------------------------------------------------------------------+
double NormalizePrice( double np, string sy= "" ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double pp, ts=MarketInfo( Symbol (), MODE_TICKSIZE);
   int     di=MarketInfo( Symbol (), MODE_DIGITS);

   if (ts> 0 ) pp= NormalizeDouble (np/ts, 0 )*ts;
   else {
     if (di> 0 ) pp= NormalizeDouble (np*di, 0 )/di; else pp=np;
  }
   return (pp);
}
 

WeekOfMonth() 함수.

이 함수는 날짜가 지정된 월의 주 번호를 반환합니다. 하나의 선택적 매개변수만 사용합니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth( datetime dt= 0 ) {
   if (dt<= 0 ) dt= TimeCurrent ();
   datetime d;
   int       i, kd=TimeDay(dt), nn= 1 ;

   for (i= 2 ; i<=kd; i++) {
    d=StrToTime(TimeYear(dt)+ "." +TimeMonth(dt)+ "." +i);
     if (TimeDayOfWeek(d)== 1 ) nn++;
  }
   return (nn);
}

ClosePosBySortLots() 함수.

이 기능은 로트 크기별로 정렬된 순서로 위치를 마감합니다. 즉, 이 기능을 이용하여 로트 크기의 오름차순 또는 내림차순으로 포지션을 청산할 수 있습니다. ClosePosBySortLots() 함수는 다음과 같은 선택적 매개변수를 허용합니다.

  • sy - 거래 상품의 이름. "" - 모든 계측기, NULL - 현재 계측기. 기본값은 "" 입니다.
  • op - 무역 작업 유형. 유효한 값 -1 - 모든 위치, OP_BUY - 매수, OP_SELL - 매도. 기본값은 -1 입니다.
  • mn - 고유한 거래 작업 식별자인 MagicNumber. 기본값은 -1 - 모든 마법입니다.
  • sd - 로트 크기 정렬 방향. MODE_ASCEND 의 유효한 값은 오름차순, MODE_DESCEND 는 내림차순입니다. 기본값은 MODE_DESCEND 입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots( string sy= "" , int op=- 1 , int mn=- 1 , int sd=MODE_DESCEND) {
   double a[][ 2 ];                   // Массив лотов и тикетов
   int     i, k= OrdersTotal ();       // Счётчик и количество ордеров
   int     p= 0 ;                     // Количество позиций

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (mn< 0 || OrderMagicNumber()==mn) {
            p++;
             ArrayResize (a, p);
            a[p- 1 ][ 0 ]=OrderLots();
            a[p- 1 ][ 1 ]=OrderTicket();
          }
        }
      }
    }
  }

   // вдруг позиций нету, тогда и закрывать нечего
   if (p> 0 ) {
     ArraySort (a, WHOLE_ARRAY , 0 , sd);
     for (i= 0 ; i<p; i++) {
       if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET)) {
         // проверим незакрытость на всякий случай,
         // может какая-то позиция уже закрылась по стопу/тейку
         if (OrderCloseTime()== 0 ) ClosePosBySelect();
      }
    }
  }
}
 

AddLeadingZero() 함수.

이 함수는 문자열의 길이가 지정된 값과 같도록 문자열에 선행(왼쪽) 0 "0"을 추가합니다. AddLeadingZero() 함수는 다음 필수 매개변수를 사용합니다.

  • s - 선행 0을 추가할 문자열입니다.
  • k - 결과 문자열의 길이 S .
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero( string s, int k) {
   while ( StringLen (s)<k) s= StringConcatenate ( "0" , s);
   return (s);
}

toTime() 함수.

이 함수는 2/3 정수 를 시간 형식의 문자열 로 변환합니다. 두 개의 숫자가 함수에 전달되면 첫 번째 숫자는 시간으로 사용되고 두 번째 숫자는 분으로 사용됩니다. "HH:MM" 형식의 문자열이 반환됩니다. 숫자가 세 개인 경우 세 번째 숫자는 초 자리에 배치되고 함수는 "HH:MM:SS" 형식 문자열을 반환합니다. toTime() 함수는 다음과 같은 선택적 매개변수를 사용합니다.

  • h - 시간. 기본값은 0 입니다.
  • m - 분. 기본값은 0 입니다.
  • s - 초. 0 - 사용하지 마십시오. 기본값은 0 입니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime( int h= 0 , int m= 0 , int s= 0 ) {
   string st= "" ;

   if (h== 0 ) st= "00:" ;
   else       st= StringConcatenate (AddLeadingZero(h, 2 ), ":" );

   if (m== 0 ) st= StringConcatenate (st, "00" );
   else       st= StringConcatenate (st, AddLeadingZero(m, 2 ));

   if (s!= 0 ) st= StringConcatenate (st, ":" , AddLeadingZero(s, 2 ));

   return (st);
}
사유: