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

 

isCloseLastPosByStop() 함수.

이 함수는 stop으로 마지막 위치를 닫기 위한 플래그를 반환합니다. 플래그 발생 - True - StopLoss가 트리거되었습니다. 플래그가 생략됨 - False - 다른 이유로 포지션이 마감되었습니다. 고려할 위치의 보다 정확한 선택은 외부 매개변수에 의해 설정됩니다.

  • sy - 시장 상품의 이름. 이 매개변수를 설정하면 이 기능은 지정된 도구의 위치만 고려합니다. 기본값은 "" 는 모든 시장 상품을 의미합니다. NULL 은 현재 기기를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID, MagicNumber. 기본값 -1 은 모든 식별자를 의미합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   double    ocp , osl ;
   int        dg , i , j =- 1 , 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 () ;
                 j = i ;
               }
             }
           }
         }
       }
     }
   }
   if ( OrderSelect ( j , SELECT_BY_POS , MODE_HISTORY )) {
     dg = MarketInfo ( sy , MODE_DIGITS ) ;
     if ( dg == 0 ) if ( StringFind ( OrderSymbol () , " JPY " ) < 0 ) dg = 4 ; else dg = 2 ;
     ocp = NormalizeDouble ( OrderClosePrice () , dg ) ;
     osl = NormalizeDouble ( OrderStopLoss () , dg ) ;
     if ( ocp == osl ) return ( True ) ;
   }
   return ( False ) ;
}
PS Attached는 isCloseLastPosByStop() 함수를 테스트하기 위한 스크립트입니다.
 
Lukyanov :
김 IV :

온라인용 OpenPosition() 함수.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition ( string sy , int op , double ll , double sl = 0 , double tp = 0 , int mn = 0 ) {
//-- skip --
  string   lsComm = WindowExpertName () + " " + GetNameTF ( Period ()) ;
//-- skip -- 
라이브 EA에서 OpenPosition() 함수 연결, 오류 4059, NULL을 Symbol()로 변경, 사라진 후 메시지 표시
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: 전문가 중지
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: 전문가 함수 호출은 허용되지 않습니다. 'stdlib'-'오류 설명'
원본으로 돌아가면 모든 것이 작동합니다... (포함 폴더의 stdlib.mqh && stderror.mqh는 기본 MT 배포판에서 가져온 것입니다)
 
teraptor2 писал (а):
라이브 EA에서 OpenPosition() 함수를 연결했습니다. 오류 4059

오류 4059 는 테스트 모드에서 해당 기능을 사용할 수 없음을 의미합니다. 오류 ID는 ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE입니다. MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle 함수는 오류를 생성합니다.

teraptor2 는 다음과 같이 썼습니다.
NULL을 Symbol()로 변경하고 사라진 후 메시지가 나타남
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: 전문가 중지
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: 전문가 함수 호출은 허용되지 않습니다. 'stdlib'-'오류 설명'
 

isCloseLastPosByTake() 함수.

이 함수는 take로 마지막 위치를 닫기 위한 플래그를 반환합니다. 플래그가 제기됨 - True - TakeProfit이 작동했습니다. 플래그가 생략됨 - False - 다른 이유로 포지션이 마감되었습니다. 고려할 위치의 보다 정확한 선택은 외부 매개변수에 의해 설정됩니다.

  • sy - 시장 상품의 이름. 이 매개변수를 설정하면 이 기능은 지정된 도구의 위치만 고려합니다. 기본값은 "" 는 모든 시장 상품을 의미합니다. NULL 은 현재 기기를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID, MagicNumber. 기본값 -1 은 모든 식별자를 의미합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   double    ocp , otp ;
   int        dg , i , j =- 1 , 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 () ;
                 j = i ;
               }
             }
           }
         }
       }
     }
   }
   if ( OrderSelect ( j , SELECT_BY_POS , MODE_HISTORY )) {
     dg = MarketInfo ( sy , MODE_DIGITS ) ;
     if ( dg == 0 ) if ( StringFind ( OrderSymbol () , " JPY " ) < 0 ) dg = 4 ; else dg = 2 ;
     ocp = NormalizeDouble ( OrderClosePrice () , dg ) ;
     otp = NormalizeDouble ( OrderTakeProfit () , dg ) ;
     if ( ocp == otp ) return ( True ) ;
   }
   return ( False ) ;
}
추신. isCloseLastPosByTake() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.
 

isLossLastPos() 함수.

이 함수는 마지막으로 마감된 포지션의 수익성 플래그를 반환합니다. 플래그 제기 - True - 마지막 위치가 손실로 마감되었습니다. 플래그가 생략됨 - False - 마지막 위치가 0 또는 이익으로 마감되었습니다. 이 기능은 스왑 및 커미션을 고려하지 않습니다. 위치 선택은 외부 매개변수에 의해 설정됩니다.

  • sy - 시장 상품의 이름. 이 매개변수를 설정하면 이 기능은 지정된 도구의 위치만 고려합니다. 기본값은 "" 는 모든 시장 상품을 의미합니다. NULL 은 현재 기기를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID, MagicNumber. 기본값 -1 은 모든 식별자를 의미합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   int        i , j =- 1 , 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 () ;
                 j = i ;
               }
             }
           }
         }
       }
     }
   }
   if ( OrderSelect ( j , SELECT_BY_POS , MODE_HISTORY )) {
     if ( OrderProfit () < 0 ) return ( True ) ;
   }
   return ( False ) ;
}
PS Attached는 isLossLastPos() 함수를 테스트하기 위한 스크립트입니다.
파일:
 

isTradeToDay() 함수.

이 함수는 오늘의 거래 플래그를 반환합니다. 플래그 제기 - True - 포지션이 오늘 열렸습니다. 플래그 생략됨 - 거짓 - 오늘 열린 포지션이 없습니다. 고려할 위치 선택은 외부 매개변수에 의해 설정됩니다.

  • sy - 시장 상품의 이름. 이 매개변수를 설정하면 이 기능은 지정된 도구의 위치만 고려합니다. 기본값은 "" 는 모든 시장 상품을 의미합니다. NULL 은 현재 기기를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID, MagicNumber. 기본값 -1 은 모든 식별자를 의미합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay ( string sy = "" , int op =- 1 , int mn =- 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 ( TimeDay    ( OrderOpenTime ()) == Day ()
              &&   TimeMonth ( OrderOpenTime ()) == Month ()
              &&   TimeYear ( OrderOpenTime ()) == Year ()) return ( True ) ;
             }
           }
         }
       }
     }
   }
   k = OrdersTotal () ;
   for ( i = 0 ; i < k ; i ++ ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
       if ( OrderSymbol () == sy || sy == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( TimeDay    ( OrderOpenTime ()) == Day ()
              &&   TimeMonth ( OrderOpenTime ()) == Month ()
              &&   TimeYear ( OrderOpenTime ()) == Year ()) return ( True ) ;
             }
           }
         }
       }
     }
   }
   return ( False ) ;
}
추신. isTradeToDay() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.
파일:
 
KimIV :

isCloseLastPosByStop() 함수.

이 함수는 stop으로 마지막 위치를 닫기 위한 플래그를 반환합니다. 플래그 발생 - True - StopLoss가 트리거되었습니다. 플래그가 생략됨 - False - 다른 이유로 포지션이 마감되었습니다. 고려할 위치의 보다 정확한 선택은 외부 매개변수에 의해 설정됩니다.

().

안녕하세요 . 이 기능으로 코드를 구현할 때 이해할 수 없는 현상이 나타났습니다. 이 기능을 다음과 같이 적용했습니다.

 if ( isCloseLastPosByStop ( NULL , OP_BUY , MagicLong1 ))                {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
   for ( int rb_ = OrdersTotal () - 1 ; rb_ >= 0 ; rb_ -- )                  {        
       if ( OrderSelect ( rb_ , SELECT_BY_POS , MODE_TRADES ))                  { 
       //выбираем среди открытых и отложенных ордеров          
       if ( ( OrderSymbol () == Symbol ()) && ( OrderMagicNumber () == MagicLong1 ))    {
         //закрываем все остальные позиции BUY
         OrderClose ( OrderTicket () , OrderLots () , Bid ,ОтклонениеЦены, Black ) ;
       OrderDelete ( OrderTicket ()) ; // и удаляем BUY-отложки   
         //  return(0); // выходим     
         }}}}

이 시점까지는 모든 것이 잘 작동합니다! 플래그가 나타나면 모든 BUY 위치가 닫히고 BUY 위치가 삭제됩니다. 그러나 전문가는 진입 신호에 따라 다시 보류 주문을 내립니다. 예상대로.

그러나 이러한 주문은 즉시 삭제됩니다! 아직 깃발이 꽂혀 있는 모양이다. 그는 왜 매달려 있습니까? 결국 마지막 위치는 더 이상 손절매가 아니라 강제로 폐쇄되었습니다!

그런 상황에서 어떻게 해야 합니까? 이 알고리즘을 닫으라는 명령을 실행한 후 전문가가 일반적으로 추가 주문을 할 수 있도록 하시겠습니까?

 
rid писал (а):
그런 상황에서 나는 어떻게 해야 합니까? 닫기 명령을 실행한 후 전문가가 일반적으로 추가 명령을 내릴 수 있도록 하시겠습니까?

이 문제는 단순히 별개의 행동이 아니라 상호작용을 의미하고 일정한 순서를 갖고 있기 때문에 전체 작업의 맥락에서 다루어야 합니다. 따라서 문제를 전체적으로 설명하십시오. 코드가 필요하지 않습니다. 단어로 작업을 설명하십시오.

워밍업 질문입니다. 주문을 삭제하고 다시 주문해야 하는 이유는 무엇입니까? 수정하는 것이 바람직하다고 생각합니다.

 

이익, 손실, 손절매별로 배열로 그룹화된 주문과 위치가 있습니다. 그리고 임. 등등. 원인.

이 특별한 경우, 나는 스톱으로 열린 BUY 포지션의 배열을 닫고 전체적으로 지정된 이익을 얻었습니다. 그리고 나머지 미사용 정지 예금을 삭제합니다.

//------------------------------------------------ -------------------------------------------------- --

 

이제 주석에 기능을 추가했습니다. - Comment (isCloseLastPosByStop());

내가보고 있어요. 초기 기능 = 0. 첫 번째 손절매 종료 후 Comment (isCloseLastPosByStop()); 1씩 변경한 다음 - 다른 위치를 강제로 닫은 후 0으로 돌아가지 않고 계속 1로 유지됩니다!