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

 

답변 감사합니다, Igor는 이해했습니다. 여러분의 기능도 따로 사용하지만, 전문가를 키우는 단계에서 라이브러리를 활용하고 싶었습니다.

kompostertrade_lib&info_lib 를 보고 내 자신의 사용을 위해 일부 변경했습니다.

1. 모든 라이브러리에서 #property 라이브러리 를 제거하고 라이브러리의 #include 교차 링크를 혼동하지 않도록 라이브러리 이름을 변경했습니다.

2. 모든 라이브러리의 직접 호출 블록을 EA에 삽입했습니다.

 #include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

이제 모든 라이브러리의 모든 기능을 사용할 수 있으며 정상적인 "참조되지 않음.."을 제외하고 컴파일할 때 오류 및 범죄 메시지가 없습니다.

모든 외부 고문을 사용할 수 있으며 문제가 없습니다.

더 쓰시면 연결해서 사용하겠습니다. 먼저 총 이익에 대한 후행 함수를 보고 싶습니다.

 

WeekOfMonth() 함수.

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

  • dt - 날짜, 시간. 기본값 - 0 - 거래 서버의 현재 날짜 및 시간.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 ) ;
}

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

파일:
 
이고르, 로트가 더 큰 포지션부터 시작해서 모든 포지션을 청산하는 기능이 있나요?
 

안녕, 이고르! 당신의 유용한 기능에 대해 대단히 감사합니다! 최대한 빨리 사용하고 있습니다! 나는 최근에 이것에 도취되어 당신을위한 질문 ... 어제 인터넷이 주기적으로 쏟아졌습니다. 그 후 내 고문은 일하고 싶지 않습니다 젠장 ... 그는 만족스러운 얼굴 대신 십자가를 넣습니다! 나는 당신의 OpenPosition 기능을 사용합니다. 아마도 그는 어떤 스레드에서 처리한 오류에 반응했을 것입니까? 다음은 어제의 로그입니다. 그 전에는 모든 것이 정상이었습니다! 데모계정으로 테스트중인데.. 220오류 는 어디에도 안나오네요...........

07:47:28 MetaTrader 4.00 빌드 220 시작(MetaQuotes Software Corp.)
07:47:28 전문가 공개 확률 USDJPY EURUSD,M1: 성공적으로 로드됨
07:47:32 '1262868': 로그인
07:47:44 '1262868': 로그인
07:49:40 '1262868': 로그인
07:49:46 '1262868': 로그인
07:54:44 '1262868': 연결 실패 [연결 없음]
11:38:16 전문가 공개 확률 USDJPY EURUSD,M1: 제거됨
11:38:18 MetaTrader 4.00 빌드 220 중지됨
14:05:05 MetaTrader 4.00 빌드 220 시작(MetaQuotes Software Corp.)
14:05:05 전문가 열기 확률 USDJPY EURUSD,M1: 성공적으로 로드됨
14:05:10 '1262868': 로그인
14:05:31 '1262868': 로그인
14:06:39 '1262868': 로그인
14:06:46 '1262868': 로그인
15:57:06 '1262868': 연결 실패 [연결 없음]
18:30:46 전문가 공개 확률 USDJPY EURUSD,M5: 제거됨
18:30:49 메인 펌핑: 정지 시 타임아웃
18:30:52 메인 펌핑: 정지 시 타임아웃
18:30:55 메인 펌핑: 정지 시 타임아웃
18:30:58 메인 펌핑: 정지 시 타임아웃
18:31:01 메인 펌핑: 정지 시 타임아웃
18:31:01 메인 펌핑: 종료
18:31:02 MetaTrader 4.00 빌드 220 중지됨
18:31:02 시스템 종료로 인해 MetaTrader 4.00 빌드 220이 중지되었습니다.
18:47:57 MetaTrader 4.00 빌드 220 시작(MetaQuotes Software Corp.)
18:47:58 전문가 공개 확률 USDJPY EURUSD,M5: 성공적으로 로드됨
18:48:01 '1262868': 연결 실패 [연결 없음]
18:48:10 '1262868': 로그인
18:48:20 '1262868': 로그인
20:19:00 '1262868': 로그인
20:19:07 '1262868': 로그인
20:20:05 '1262868': 로그인
20:20:13 '1262868': 로그인
20:59:29 '1262868': 로그인
20:59:39 '1262868': 로그인
21:02:16 '1262868': 로그인
21:02:41 '1262868': DataCenter 연결 실패 [6]
22:08:40 '1262868': 핑 실패
22:08:43 '1262868': 로그인
22:08:49 '1262868': DataCenter 연결 실패 [6]
22:10:01 '1262868': 로그인
22:10:05 '1262868': DataCenter 연결 실패 [6]
22:14:59 '1262868': 로그인
22:15:13 '1262868': 로그인
22:15:22 '1262868': DataCenter 연결 실패 [6]
22:37:16 '1262868': 로그인
22:37:27 '1262868': DataCenter 연결 실패 [6]
22:40:51 '1262868': 로그인
22:41:04 '1262868': DataCenter 연결 실패 [6]
23:17:14 전문가 공개 확률 USDJPY EURUSD,M5: 제거됨
23:17:16 전문가 공개 확률 USDJPY EURUSD,M5: 성공적으로 로드됨
23:25:52 전문가 공개 확률 USDJPY EURUSD,M5: 제거됨
23:25:55 MetaTrader 4.00 빌드 220 중지됨
23:25:59 MetaTrader 4.00 빌드 220 시작(MetaQuotes Software Corp.)
23:26:05 '1262868': 로그인
23:26:05 전문가 공개 확률 USDJPY EURUSD,M5: 성공적으로 로드됨
23:26:15 '1262868': 로그인
23:27:19 '1262868': 로그인
23:27:34 '1262868': 로그인
23:28:20 전문가 공개 확률 USDJPY EURUSD,M5: 제거됨
23:28:25 전문가 공개 확률 USDJPY USDCHF,H4: 성공적으로 로드됨
23:28:33 전문가 공개 확률 USDJPY USDCHF,H4: 제거됨

미리 대단히 감사합니다!

 
khorosh писал(а) >>
이고르, 더 많은 로트가 있는 포지션부터 시작해서 모든 포지션을 청산하는 기능이 있나요?

아니 ... 쓴 ...

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

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

 

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

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

파일:
 

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

추신. 첨부 파일은 toTime() 함수를 테스트하기 위한 스크립트입니다.

파일:
 

Igor, 어렵지 않다면 가격이 변수 중 하나와 일치하면 해당 신호를 제공하는 함수, 예를 들어 b=1.2400, s=1.2300이라고 합시다.

b=가격 sig=1이면 s=가격 sig=-1입니다.

무식해서 죄송합니다.)

 
Prival >> :
죄송합니다. 저는 이고르가 아닙니다. 그러나 아마도 이것이 도움이 될 것입니다.

저도 사과드립니다. 더 정확할거야

 //+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign ( double b , double s )
   {
   double var , e ; var = Close [ 0 ] ; e = 0.000001 ;
   if ( var < b + e & & var > b - e ) return ( 1 ) ;
   if ( var < s + e & & var > s - e ) return ( - 1 ) ; 
   return ( 0 ) ;
   }
 
Prival >> :

..저녁까지 가지를 어지럽히지 않도록 글을 지울게..

필요 없음. 가격의 정확한 가치가 일관되게 포착되지 않는다는 생각을 깨워주는 것이 유용할 것입니다.