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

 
rid писал (а):
엄마. 빠른. 나는 정확히 하루를 지킬 것입니다 - 나는 그것을 삭제할 것입니다!

삭제할 필요가 없습니다! 그대로 두자...

 

Igor, 우선 귀하의 기능에 감사드리며 이 스레드를 통해 많은 비전문 프로그래머를 도우셨습니다. 그런데 NumberOfOrders() 함수에 대해 질문을 드리고 싶습니다. 전혀 작동하지 않습니다. 사용 방법의 예를 위해 표준 MACD Expert Advisor에 포함시켰습니다. 나는 코드를 첨부하고 있습니다 :

간단히 설명하면 다음과 같이 변경됩니다.

 // в стандартной версии  
total = OrdersTotal () ;
   if ( total < 1 ) 
     {
// бла бла бла ...
 // в моей версии эксперта
   total = OrdersTotal () ; // total я оставил т.к. он используется дальше
   if ( NumberOfOrders ( NULL ,- 1 ,- 1 ) < 1 ) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders () ниже
당연히 작동하지 않습니다. 무엇이 잘못되었는지 설명해 주시겠습니까? 미리 감사드립니다.
파일:
 
seifer писал (а):
무엇이 잘못되었는지 설명해 주시겠습니까? 미리 감사드립니다.

두 가지 의견:

1. 나는 이렇게 하고 싶다:

 total = NumberOfOrders ( NULL ) ;
if ( total < 1 ) {
  ...
}
2. NumberOfOrders() 함수는 주문 수를 반환합니다. BuyLimit, BuyStop, SellLimit 및 SellStop 유형의 거래 작업입니다. 주문으로 수정한 Expert Advisor가 작동하지 않습니다. 그는 시장 가격, 즉 매수 및 매도와 같은거래 작업 을 수행합니다. 다음 포스트에서 포스팅할 NumberOfPositions() 함수를 사용해야 합니다.
 

NumberOfPositions() 함수.

이 함수는 현재 열려 있는 위치의 수를 반환합니다. 계산된 위치의 보다 정확한 선택은 외부 매개변수에 의해 설정됩니다.

  • 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   int i , k = OrdersTotal () , kp = 0 ;

   if ( sy == " 0 " ) sy = Symbol () ;
   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 ) kp ++;
           }
         }
       }
     }
   }
   return ( kp ) ;
}
ZY Attached는 NumberOfPositions() 함수를 테스트하기 위한 스크립트입니다.
 

우와! 나는 이 디자인이 다음과 같다고 생각했다.

       ...
       ot = OrderType () ;
       if ( ot > 1 && ot < 6 ) {
      ...
모든 위치(OP_SELL 및 OP_BUY 포함)를 반복합니다. 이제 모든 것이 작동합니다. 다시 한번 감사합니다!
 

GetProfitFromDateInCurrency() 함수.

이 함수는 특정 날짜에 마감된 포지션의 예금 통화로 총 이익을 반환합니다. 고려할 위치의 보다 정확한 선택은 외부 매개변수에 의해 설정됩니다.

  • sy - 시장 상품의 이름. 이 매개변수를 설정하면 이 기능은 지정된 도구의 위치만 고려합니다. 기본값은 "" 는 모든 시장 상품을 의미합니다. NULL 은 현재 기기를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID, MagicNumber. 기본값 -1 은 모든 식별자를 의미합니다.
  • dt - 1970년 이후의 날짜 및 시간(초). 기본값 - 0 은 기록에서 사용 가능한 모든 위치를 고려함을 의미합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency ( string sy = "" , int op =- 1 , int mn =- 1 , datetime dt = 0 )
{
   double p = 0 ;
   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 == "" ) && ( op < 0 || OrderType () == op )) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( mn < 0 || OrderMagicNumber () == mn ) {
             if ( dt < OrderCloseTime ()) {
               p += OrderProfit () + OrderCommission () + OrderSwap () ;
             }
           }
         }
       }
     }
   }
   return ( p ) ;
}

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

다양한 기간 동안의 절대 및 백분율 값을 보여주는 i-Profit 표시기의 예를 사용하여 이 기능의 사용을 마스터하는 것이 더 실용적입니다.

 

안녕하세요 이고르입니다.

상관관계 기능에 대해 감사하다는 말을 전하고 싶습니다. 나는 몇 가지 옵션이 있었고, 나는 단지 그것들을 명확히 하고 싶었습니다)

여기에 또 다른 질문이 있습니다. 테스트에서 매우 자주, 그리고 실시간으로 어드바이저를 테스트할 때도 오류 130 - 잘못된 중지가 발생합니다. 제가 분석을 해보지 않아서 이런 상황에서 왜 나오는지 이해가 되지 않습니다. 나는 이런 구조를 사용하기 시작했다

   double md = MarketInfo ( Symbol () , MODE_TICKSIZE ) ;
   return ( NormalizeDouble ( Value / md , 0 ) * md ) ;

말하자면 정지를 정상화하고 값을 취했지만 상황이 해결되지 않았습니다. 아마도 당신은 비슷한 것을 발견했을 것입니다. 이 문제를 처리하는 방법을 알려주세요) 및 분석하는 가장 좋은 방법

설명: 공개 가격에서 +1p에서 스탑을 설정하려고 할 때 종종 이런 일이 발생합니다.

 
scorpionk писал (а):
오류 131 - 잘못된 중지가 발생했습니다.

131 - 잘못된 볼륨, 볼륨 과립화 오류. 거래되는 로트 크기입니다.

 
KimIV :
전갈 은 다음과 같이 썼습니다.
오류 131 - 잘못된 중지가 발생했습니다.

131 - 잘못된 볼륨, 볼륨 과립화 오류. 거래되는 로트 크기입니다.

131이 아니라 130이 아니라 코드에 실수를 했습니다.

 
scorpionk :

131이 아니라 130이 아니라 코드에 실수를 했습니다.

알았습니다...

다음과 같이 정규화를 시도합니다.

 int dg = MarketInfo ( Symbol () , MODE_DIGITS ) ;
return ( NormalizeDouble ( Value , dg )) ;
이렇게 하면 오류 130 이 발생하지 않습니다.