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

 
이 옵션에 대해 어떻게 생각하십니까?
만약 (오류==146)
{
동안 (IsTradeContextBusy())
{
if (IsTradeAllowed()) 휴식;
또 다른
수면 (1000*1.1);
}}
이것이 더 빠른 솔루션인 것 같습니다. 이것이 제가 일하는 방식입니다. 논평.
고맙습니다.
 
Red.Line писал (а): 유용한 주제에 감사드립니다. 비록 제가 탄 파이에 대해 이야기하고 있지만 여전히 누군가는 μl 단위의 대용량 데이터 배열을 저장하고 샘플링하는 문제에 직면했을 수 있습니다. MKL과 데이터베이스? 아무도이 방향으로 생각하지 않았습니까?
물론 간단한 해결책이지만 뭔가.. https://forum.mql4.com/ru/9377
 
zhuki :
이 옵션에 대해 어떻게 생각하십니까?
 if ( err == 146 )
{
  while ( IsTradeContextBusy ())
  {
    if ( IsTradeAllowed ()) break ;
    else 
    Sleep ( 1000 * 1 , 1 ) ;
  }
}
이것이 더 빠른 솔루션인 것 같습니다. 이것이 제가 일하는 방식입니다. 논평.
고맙습니다.

정상적으로 받아보겠습니다. 이해와 함께. 일시 중지는 더 짧고 더 빠르게 작동합니다... 하지만 버전에 부당한 중복이 있습니다.

IsTradeContextBusy 함수는 거래 흐름 사용 중 플래그를 반환합니다. 195번째 빌드 이전에는 이 기능이 전혀 없었습니다. 그리고 우리는 Expert Advisor가 거래할 수 있고 거래 흐름이 자유롭다는 신호를 반환하는 IsTradeAllowed 함수를 사용했습니다.

Expert Advisor는 Expert Advisor의 속성 대화 상자(F7 키)에서 "Expert Advisor의 거래 허용" 확인란을 선택하여 거래할 수 있습니다.

오류 146(거래 스레드가 사용 중임)은 EA의 거래 허용과 관련이 없습니다. 따라서 거래 흐름에만 관련된 부분에서 IsTradeAllowed 함수의 속성을 살펴보자.

따라서 거래 흐름은 자유롭고 IsTradeAllowed 함수는 True 를 반환합니다. 거래 흐름이 바쁘고 IsTradeAllowed 함수는 False 를 반환합니다. 이제 IsTradeContextBusy 함수가 반환한 값을 고려하십시오. 거래 흐름은 자유롭고 IsTradeContextBusy 함수는 False 를 반환합니다. 거래 흐름이 바쁘고 IsTradeContextBusy 함수가 True 를 반환합니다. 동일한 거래 흐름 상태에 대해 IsTradeAllowedIsTradeContextBusy 함수의 값이 반대임을 알 수 있습니다. 또한 무역 흐름의 상태에 관한 이러한 기능은 서로를 보완하는 것이 아니라 중복됩니다. 따라서 그 중 하나는 제외될 수 있습니다. 뭐라고요? 이미 언급했듯이 IsTradeAllowed 함수는 거래 흐름 상태 플래그 외에 이 상황, 즉 처리 오류 146(거래 흐름이 사용 중)에서 필요하지 않은 EA에 대한 거래 허가 플래그도 반환합니다. . 따라서 IsTradeContextBusy 함수를 하나만 사용하는 것이 필요하고 충분합니다. 위의 약어를 수행하면 코드가 광산으로 축소됩니다.

 if ( err == 146 ) while ( IsTradeContextBusy ()) Sleep ( 1000 * 1 , 1 ) ;
유일한 차이점은 일시 중지 크기입니다. 그러나 이것은 이미 취향, 개인 취향, 거래 스타일 및 기타 사항의 문제입니다. 0.1초의 일시 중지를 설정할 수 있습니다. Unprincipled ... 나는 단지 11 초를 선호합니다.
 
자세한 답변 감사합니다 플래그에 대해 잘 몰랐는데 설명에서 누락된 것 같습니다 하지만 정확성을 위해 여전히 모든 유형 의 거래 작업 사이에서 흐름이 해제될 때까지 5초에서 5초 사이에 일시 중지하는 것을 선호합니다. 이것이 정확하고 여러 Expert Advisors와 함께 정확하고 안전하다고 생각하십시오. 고맙습니다.
 

SetOrder 함수에는 두 가지 오류가 있습니다.

  1. MarketInfo 기능의 잘못된 사용. BEFORE가 아니라 sy 매개변수를 확인한 후 호출해야 합니다.
  2. 주문 배치 수준 수정이 제대로 작동하지 않았습니다. 또한 스톱 및 테이크의 가격 수준은 조정되지 않았습니다. 이제 수정되어 훌륭하게 작동합니다. 이 경우는 테스트 스크립트로 오랜만에 확인했는데, 조금 있다가 올리겠습니다.

주목! 온라인 거래를 위한 SetOrder 기능이 포함된 게시물이 수정되었습니다. 기능이 조금 더 깁니다. 게시물에 완전히 포함되지 않았으므로 트레일러로 가져와야했습니다.

 

이 포스트에서는 SetOrder 함수가 어떻게 작동하는지 설명하는 요점을 설명하기로 결정했습니다. 나 자신은 명령으로 일하지 않습니다. 즉, 여기 나는 외국 영토에 있습니다. SetOrder 기능을 이해하는 사람이 개선 사항을 제안하거나 버그를 찾을 수 있습니다.

1. 코드의 첫 번째 줄에서 지역 변수의 선언과 그 중 일부의 초기화. 예를 들어, lsComm에는 Expert Advisor의 이름과 GetNameTF 함수가 반환한 기간의 이름이 포함됩니다. 그건 그렇고, 나는 누군가가 그들에 대해 질문이있는 경우에만 GetNameOP , GetNameTF , Message 및 기타 작은 기능에 대해 이야기하지 않을 것입니다.

 string   lsComm = WindowExpertName () +" "+ GetNameTF ( Period ()) ;

2. 수신된 매개변수를 확인합니다. sy 가 비어 있으면 현재 기기의 이름으로 초기화됩니다. 연산의 종류에 따라 차트의 아이콘 색상에 대한 변수가 초기화됩니다. 0이 아닌 주문 만료 시간이 현재 시간보다 짧으면 0으로 재설정됩니다.

 if ( sy == "" || sy == " 0 " ) sy = Symbol () ;
msl = MarketInfo ( sy , MODE_STOPLEVEL ) ;
if ( op == OP_BUYLIMIT || op == OP_BUYSTOP ) clOpen = clOpenBuy ; else clOpen = clOpenSell ;
if ( ex > 0 && ex < TimeCurrent ()) ex = 0 ;

3. 거래 시도 주기의 본문이며, 그 횟수 는 전역 변수 NumberOfTry 의 값에 의해 제한됩니다. 다음은 SetOrder 함수의 메인 루프 내에서 수행되는 작업입니다.

 for ( it = 1 ; it <= NumberOfTry ; it ++ )

4. 테스터에서 SetOrder 함수가 실행되지 않으면 작업을 중단할 수 있습니다. 즉시 거래 스레드의 해제를 기다리는 사이클이 실행됩니다. 시장 환경 변수가 업데이트되고 현재 시간이 고정됩니다.

 if ( ! IsTesting () && ( ! IsExpertEnabled () || IsStopped ())) {
  Print ( " SetOrder(): Остановка работы функции " ) ;
  break ;
}
while ( ! IsTradeAllowed ()) Sleep ( 5000 ) ;
RefreshRates () ;
ot = TimeCurrent () ;

5. 거래 서버에 요청 보내기. 티켓이 양수이면 SetOrder 함수가 종료됩니다.

 ticket = OrderSend ( sy , op , ll , pp , Slippage , sl , tp , lsComm , mn , ex , clOpen ) ;
if ( ticket > 0 ) {
  if ( UseSound ) PlaySound ( NameFileSound ) ; break ;
 

6. 음수 티켓의 경우 실행 오류가 처리됩니다 .
7. 오류 128(거래 실행 제한 시간 만료), 142(주문 대기) 및 143(판매자가 실행을 위해 승인한 주문) 오류의 경우 66초 동안 일시 중지가 수행됩니다. 잠시 후 ExistOrders 함수를 사용하여(조금 후에 자세히 설명하겠습니다) 서버에 대한 요청과 현재 순간 사이의 시간 간격에 주문이 접수되었는지 확인합니다. 순서가 설정되었으면 기능을 종료합니다.

 err = GetLastError () ;
if ( err == 128 || err == 142 || err == 143 ) {
  Sleep ( 1000 * 66 ) ;
  if ( ExistOrders ( sy , op , mn , ot )) {
    if ( UseSound ) PlaySound ( NameFileSound ) ; break ;
  }
  Print ( " Error( " , err , " ) set order: " , ErrorDescription ( err ) , " , try " , it ) ;
  continue ;
}

8. 포인트 크기와 Bid 및 Ask 가격은 로컬 변수에 저장됩니다.

 mp = MarketInfo ( sy , MODE_POINT ) ;
pa = MarketInfo ( sy , MODE_ASK ) ;
pb = MarketInfo ( sy , MODE_BID ) ;

9. 오류 130(잘못된 스톱)으로 가능하면 주문, 스톱, 테이크에 대한 가격 수준이 조정됩니다.

 // Неправильные стопы
if ( err == 130 ) {
  switch ( op ) {
    case OP_BUYLIMIT :
      if ( pp > pa - msl * mp ) pp = pa - msl * mp ;
      if ( sl > pp - ( msl + 1 ) * mp ) sl = pp - ( msl + 1 ) * mp ;
      if ( tp > 0 && tp < pp + ( msl + 1 ) * mp ) tp = pp + ( msl + 1 ) * mp ;
      break ;
    case OP_BUYSTOP :
      if ( pp < pa + ( msl + 1 ) * mp ) pp = pa + ( msl + 1 ) * mp ;
      if ( sl > pp - ( msl + 1 ) * mp ) sl = pp - ( msl + 1 ) * mp ;
      if ( tp > 0 && tp < pp + ( msl + 1 ) * mp ) tp = pp + ( msl + 1 ) * mp ;
      break ;
    case OP_SELLLIMIT :
      if ( pp < pb + msl * mp ) pp = pb + msl * mp ;
      if ( sl > 0 && sl < pp + ( msl + 1 ) * mp ) sl = pp + ( msl + 1 ) * mp ;
      if ( tp > pp - ( msl + 1 ) * mp ) tp = pp - ( msl + 1 ) * mp ;
      break ;
    case OP_SELLSTOP :
      if ( pp > pb - msl * mp ) pp = pb - msl * mp ;
      if ( sl > 0 && sl < pp + ( msl + 1 ) * mp ) sl = pp + ( msl + 1 ) * mp ;
      if ( tp > pp - ( msl + 1 ) * mp ) tp = pp - ( msl + 1 ) * mp ;
      break ;
  }
  Print ( " SetOrder(): Скорректированы ценовые уровни " ) ;
}

10. 나중에 문제를 해결하거나 오류를 찾는 데 도움이 될 수 있는 정보가 로그에 표시됩니다.

 Print ( " Error( " , err , " ) set order: " , ErrorDescription ( err ) , " , try " , it ) ;
Print ( " Ask= " , pa , "  Bid= " , pb , "  sy= " , sy , "  ll= " , ll , "  op= " , GetNameOP ( op ) ,
      "  pp= " , pp , "  sl= " , sl , "  tp= " , tp , "  mn= " , mn ) ;
if ( pa == 0 && pb == 0 ) Message ( " SetOrder(): Проверьте в обзоре рынка наличие символа " + sy ) ;

11. 그리고 마지막에 다른 오류를 처리합니다. 일부는 긴 일시 중지(5분)에 걸려 넘어지고, 다른 일부는 고문의 작업을 차단하고, 다른 일부는 거래 시도를 계속하도록 허용합니다.

모든 것! 설명 끝!

 

ExistOrders() 함수.

주문 존재 플래그를 반환합니다. 그것은 순서가 설정되었는지 여부에 대한 질문에 답할 것입니다. 이 기능을 사용하여 더 구체적인 주문뿐만 아니라 모든 주문을 요청할 수 있습니다. 요청 필터는 함수 매개변수를 사용하여 구성됩니다.

  • sy - 도구 이름에 제한을 가합니다. 기본적으로 매개변수는 ""입니다. 제한이 없습니다. 즉, 모든 도구입니다. NULL을 전달하면 주문 선택이 현재 상품으로 제한됩니다.
  • op - 주문 유형에 제한을 둡니다. 기본적으로 제한이 없습니다. 즉, 모든 유형의 주문이 있는지 확인합니다. 유효한 매개변수 값은 -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT 및 OP_SELLSTOP입니다.
  • mn - 주문의 식별("매직") 번호에 제한을 둡니다. 기본적으로 제한이 없습니다. 즉, 마법 번호가 있는 주문이 있는지 확인합니다.
  • ot - 주문 배치 시간에 제한을 둡니다. 확인했습니다. 주문이 이 매개변수의 값보다 나중에 배치되도록 합니다. 기본적으로 제한이 없습니다. 즉, 설정 시간이 있는 주문이 있는지 확인합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders ( string sy = "" , int op =- 1 , int mn =- 1 , datetime ot = 0 ) {
  int i , k = OrdersTotal () , ty ;
 
  if ( sy == " 0 " ) sy = Symbol () ;
  for ( i = 0 ; i < k ; i ++ ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
      ty = OrderType () ;
      if ( ty > 1 && ty < 6 ) {
        if (( OrderSymbol () == sy || sy == "" ) && ( op < 0 || ty == op )) {
          if ( mn < 0 || OrderMagicNumber () == mn ) {
            if ( ot <= OrderOpenTime ()) return ( True ) ;
          }
        }
      }
    }
  }
  return ( False ) ;
}
 

ExistOrders() 함수 사용의 예.

1. 주문 확인

ExistOrders();

2. 현재 차트의 악기에 대한 주문이 있는지 확인합니다.

ExistOrders(NULL);

3. 모든 상품에 대한 BuyLimit 주문 확인

ExistOrders("", OP_BUYLIMIT);

4. EURUSD에서 magic 123456으로 SellStop 주문 확인

ExistOrders("EURUSD", OP_SELLSTOP, 123456);

5. 설치 시간이 2시간 이내인 주문이 있는지 확인합니다.

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);
예고편에는 ExistOrders 기능을 테스트하기 위한 스크립트가 있습니다. 스크립트의 처음 4개 예제는 주석 처리되어 있습니다.

파일:
 

주목! 2008년 3월 12일 오전 7시 24분 게시물에서 SetOrder.mq4 첨부 파일을 교체했습니다.

사유: