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

 
aceventura :

때문에 주문 수의 기능이 작동하지 않습니다. 각 쌍에 대해 동일한 어드바이저가 고유한 방식으로 구성됩니다. 그리고 그는 동시에 다른 쌍을 주문합니다. 그런 다음 두 쌍에 대해 네 개의 주문이 들어오면 하나가 작동하고 세 개는 삭제됩니다. 그러나 각각에 대해 반대가 필요합니다.

KimIV의 모든 기능은 유형+페어+매직으로 정렬됩니다. 저것들. (그래서 나는! :) 실행하고 검색하지 마십시오 - 이 페이지에서 " SecondsAfterCloseLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) " ) 하나를 나타내는 "Some kind of Count"를 호출하여 당신은 쌍에 관심이 있고(첫 번째 필드의 Symbol() 만), 당신의 마법은 아마 같을 것입니다. 비록 제가 다른 쌍에서 다른 마법으로 같은 조언자를 실행하더라도, 이 쌍에 대한 실제 수의 미결 주문을 얻게 될 것입니다. 또는 심지어 이 조언자(마법).

추신. 나는 기능을 의미

 int NumberOfOrders ( string sy = "" , int op =- 1 , int mn =- 1 )

12페이지부터.

 
SergNF :

KimIV의 모든 기능은 유형+페어+매직으로 정렬됩니다. 저것들. (그래서 나는! :) 실행하고 검색하지 마십시오 - 이 페이지에서 " SecondsAfterCloseLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) " ) 하나를 나타내는 "Some kind of Count"를 호출하여 당신은 쌍에 관심이 있고(첫 번째 필드의 Symbol()만), 당신의 마법은 아마 같을 것입니다. 비록 제가 다른 쌍에서 다른 마법으로 같은 조언자를 실행하더라도, 이 쌍에 대한 실제 수의 미결 주문을 얻게 될 것입니다. 또는 심지어 이 조언자(마법).

추신. 나는 기능을 의미

12페이지부터.

고맙습니다! 많은 도움이 되었습니다! 나는 이해할 것이다

 
침입해서 죄송합니다 찻주전자를 도와주세요 MT4에서 평행선을 빠르고 편리하게 구축하는 방법은 무엇입니까?
 
extern double Lots = 0.1 ;
extern double TrailingStop = 10 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start ()
  {
   double ADXg_1 , ADXr_1 , ao2 , ao1 , ac1 , ac2 ;
   double P_up0 , P_down0 , P_up1 , P_down1 ;
   int cnt , ticket , total ;
 
   if ( Bars < 100 )
     {
      Print ( " bars less than 100 " ) ;
      return ( 0 ) ;  
     }
   P_up0 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 0 , 0 ) ;
   P_down0 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 1 , 0 ) ;
   P_up1 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 0 , 1 ) ;
   P_down1 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 1 , 1 ) ;
   ADXg_1 = iCustom ( 0 , 0 , " ADX пересечение " , 14 , 10000 , 0 , 1 ) ;
   ADXr_1 = iCustom ( 0 , 0 , " ADX пересечение " , 14 , 10000 , 1 , 1 ) ;
   ao1 = iAO ( 0 , 0 , 1 ) ;
   ao2 = iAO ( 0 , 0 , 2 ) ;
   ac1 = iAC ( 0 , 0 , 1 ) ;
   ac2 = iAC ( 0 , 0 , 2 ) ;
//задали все данные 
 
   total = OrdersTotal () ;
   if ( total < 1 ) 
     {
      // Проверка свободной маржи
      if ( AccountFreeMargin () < ( 1000 * Lots ))
        {
         Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
         return ( 0 ) ;  
        }
      // Условие открытие позиции BUY
      if ( ADXg_1 < ADXr_1 && ao2 < ao1 && ac2 < ac1 )
        {
         ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 16384 , 0 , Green ) ;
         if ( ticket > 0 )
           {
            if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES )) Print ( " BUY order opened : " , OrderOpenPrice ()) ;
           }
         else Print ( " Error opening BUY order : " , GetLastError ()) ; 
         return ( 0 ) ; 
        }
      // Условие открытие позиции SELL
      if ( ADXg_1 > ADXr_1 && ao2 > ao1 && ac2 > ac1 )
        {
         ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , 3 , 0 , 0 , "" , 16384 , 0 , Red ) ;
         if ( ticket > 0 )
           {
            if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES )) Print ( " SELL order opened : " , OrderOpenPrice ()) ;
           }
         else Print ( " Error opening SELL order : " , GetLastError ()) ; 
         return ( 0 ) ; 
        }
      return ( 0 ) ;
     }
    
   for ( cnt = 0 ; cnt < total ; cnt ++ )
     {
      OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
      if ( OrderType () <= OP_SELL &&   
         OrderSymbol () == Symbol ())  
        {
         if ( OrderType () == OP_BUY )   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if ( P_down1 > P_down0 )
                {
                 OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Violet ) ; 
                 return ( 0 ) ; 
                }
            if ( TrailingStop > 0 )  
              {                 
               if ( Bid - OrderOpenPrice () > Point * TrailingStop )
                 {
                  if ( OrderStopLoss () < Bid - Point * TrailingStop )
                    {
                     OrderModify ( OrderTicket () , OrderOpenPrice () , Bid - Point * TrailingStop , OrderTakeProfit () , 0 , Green ) ;
                     return ( 0 ) ;
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if ( P_up1 < P_up0 )
              {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Violet ) ; 
               return ( 0 ) ; 
              }
            if ( TrailingStop > 0 )  
              {                 
               if (( OrderOpenPrice () - Ask ) > ( Point * TrailingStop ))
                 {
                  if (( OrderStopLoss () > ( Ask + Point * TrailingStop )) || ( OrderStopLoss () == 0 ))
                    {
                     OrderModify ( OrderTicket () , OrderOpenPrice () , Ask + Point * TrailingStop , OrderTakeProfit () , 0 , Red ) ;
                     return ( 0 ) ;
                    }
                 }
              }
           }
        }
     }
   return ( 0 ) ;
  }
도와주세요, 제발. 후행 중지를 사용하여 간단한 Expert Advisor를 컴파일했습니다.

후행 정지를 +5 포인트로 한 번 설정한 후 이월되지 않도록 하는 방법, 닫기가 발생합니다.

임베디드 지표? 예를 들어 가능하다면!
 
KimIV писал (а) >> 를 썼습니다.

아마도 아닐 것입니다 ... 나는 두 가지 밖에 없습니다 : 집게 손가락과 움켜 잡기 ... 이런

이고르, 나는 게이는 아니지만 당신과 사랑에 빠졌습니다. 결국, 당신과 Zadornov는 일할 수 있습니다.

 

SecondsAfterOpenLastPos() 함수.

이 함수는 마지막 위치가 열린 이후의 시간(초)을 반환합니다. 고려할 위치 선택은 외부 매개변수에 의해 설정됩니다.

  • 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   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 == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( t < OrderOpenTime ()) t = OrderOpenTime () ;
             }
           }
         }
       }
     }
   }
   return ( TimeCurrent () - t ) ;
}
PS Attached는 SecondsAfterOpenLastPos() 함수를 테스트하기 위한 스크립트입니다.
 

물론, 정말 죄송합니다. 당신이 하는 일은 물론 좋은 일입니다.

그러나 당신이 그것을하는 방법, 나는 그것을 절대적으로 좋아하지 않습니다.

1. 당신이 변수의 이름을 기술한다는 사실은 멋지지만, 다음 야생 약어가 무엇을 의미하는지 보기 위해 헤더로 올라갈 때마다 - 그것은 주석입니다. 코드에서 찾고 싶었습니다. 특히 당신이 다른 사람들을 위해 하고 있기 때문에 주석 없이도 영어를 아는 사람이 이해할 수 있는 고품질 자체 문서화된 코드를 작성하는 것이 정말로 불가능한가요? 코드가 있는 경우.



2. 기능 과부하. 보편성은 사악하고 기능에 대한 6개의 매개변수는 많습니다.



3. 코드의 단순성

예시.

 datetime SecondsAfterOpenLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   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 == "" ) {
         if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
           if ( op < 0 || OrderType () == op ) {
             if ( mn < 0 || OrderMagicNumber () == mn ) {
               if ( t < OrderOpenTime ()) t = OrderOpenTime () ;
             }
           }
         }
       }
     }
   }
   return ( TimeCurrent () - t ) ;
}

이것은 당신의 코드입니다. 그것으로 무엇을 할 수 있는지 봅시다:

 datetime SecondsAfterOpenLastPos ( string symbol = "" , int type = - 1 , int magic = - 1 ) 
{
   datetime nearestTime = 0 ; // Инициализировать не надо? Самые сложно находимые ошибки.
   int count = OrdersTotal () ;
 
   if ( symbol == " 0 " ) 
     symbol = Symbol () ;
 
   for ( int i = 0 ; i < count ; i ++ ) 
   {
     // invalid select    
     if ( ! OrderSelect ( i , SELECT_BY_POS )) continue ;
     
     // not needed symbol     
     if ( OrderSymbol () != symbol && symbol != "" ) continue ;
 
     int currentType = OrderType () ;
 
     // only active orders are checked     
     if ( currentType != OP_BUY && currentType != OP_SELL ) continue ;
     
     // type doesn't pass     
     if ( type > 0 && currentType != type ) continue ;
 
     // magic number doesn't pass     
     if ( magic > 0 && OrderMagicNumber () != magic ) continue ;
 
     if ( nearestTime < OrderOpenTime ()) nearestTime = OrderOpenTime () ;
   }
 
   return ( TimeCurrent () - nearestTime ) ;
}

코드를 비교하시겠습니까? 그는 똑같이 한다.

1. 네, 제 코드는 더 크지만 결국 우리는 플로피 디스크 시대에 살고 있지 않습니다. 공간이 충분합니까 ???

2. 내 코드가 훨씬 더 명확해졌습니다. 제자리에 삽입된 주석이 없어도.

3. 귀하의 함수에는 7의 중첩이 있습니다. 저는 2가 있습니다. 차이점이 있습니까?

4. 과부하가 걸리지 않는 몇 안 되는 함수 중 하나이지만 열기, 수정 등은 주석입니다.



ZYZH: 이 글을 쓰는 사람들을 존중하십시오.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-하나. 동의하지 않는다. 형식과 내용 면에서 절대적으로 모든 것이 적합합니다. 정확히 같은 형식으로 계속하십시오.

예, 내 코드가 더 큽니다.

정확히. 그리고 코드가 작을수록 이해하기 쉽습니다. 나는 2-3개의 스크린에서 f번째 "번짐"을 싫어한다. 기능은 뒤집지 않고 화면에 모두 표시되어야 합니다. 그러므로 나는 간결함을 추구한다.

귀하의 기능에는 7의 중첩이 있습니다. 나는 2를 가지고 있습니다. 차이점이 있습니까?

그건 그렇고, 독자의 주의를 다시 그들 자신에게 끌어들이는 선택적인 연속체를 많이 가지고 있어도 괜찮습니까?

 
Andrey ( TheXpert ), 귀하의 의견과 제안에 감사드립니다! 그들 모두는 절대적으로 공정하며 당신의 진술은 절대적으로 옳습니다!
 

DeleteOppositeOrders() 함수.

이 함수는 op 매개변수에 지정된 위치와 반대되는 하나 이상의 주문을 제거합니다. 예를 들어, 매수 포지션은 SellLimitSellStop 주문 과 반대입니다. 예를 들어 두 개의 반대 주문이 배치되고 그 중 하나가 트리거되는 경우 반대 주문을 제거해야 합니다.

  • sy - 시장 상품의 이름. 이 매개변수를 설정하면 이 기능은 지정된 도구의 위치만 고려합니다. 기본값은 "" 는 모든 시장 상품을 의미합니다. NULL 값은 현재 기기를 의미합니다.
  • op - 거래 작업, 위치 유형. 유효한 값: OP_BUY , OP_SELL 또는 -1 . 기본값 -1 은 임의의 위치를 의미합니다.
  • mn - 위치 ID, MagicNumber. 기본값 -1 은 모든 식별자를 의미합니다.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   bool eb , es ;

   switch ( op ) {
     case OP_BUY : eb = ExistPositions ( sy , OP_BUY , mn ) ; break ;
     case OP_SELL : es = ExistPositions ( sy , OP_SELL , mn ) ; break ;
     default :       eb = ExistPositions ( sy , OP_BUY , mn ) ;
                   es = ExistPositions ( sy , OP_SELL , mn ) ; break ;
   }

   if ( eb ) {
     DeleteOrders ( sy , OP_SELLLIMIT , mn ) ;
     DeleteOrders ( sy , OP_SELLSTOP , mn ) ;
   }
   if ( es ) {
     DeleteOrders ( sy , OP_BUYLIMIT , mn ) ;
     DeleteOrders ( sy , OP_BUYSTOP , mn ) ;
   }
}
추신. DeleteOppositeOrders() 함수를 테스트하기 위한 스크립트가 첨부되어 있습니다.