[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 276

 
rid >> :

이 파일의 기능을 사용(호출)할 때(이미 처음에 MT4에 포함됨) 어드바이저의 잘못된 작동의 경우 로그에서 코드에서 만든 오류 번호를 볼 수 있습니다.

예를 들어 GetLastError() 함수를 호출합니다.

이 경우 코드에 오류가 있거나 외부 매개변수를 잘못 설정하면 이 오류의 번호가 로그에 표시됩니다.

예를 들어 - 130입니다.

그리고 페이지의 번호 디코딩을 볼 수 있습니다 - https://book.mql4.com/ru/appendix/errors

그리고 더 이상 전체 코드를 삽질할 필요가 없습니다. 우리는 이미 이 숫자로 알고 있습니다 - 정확히 어디에서 실수가 있었는지!

약간 수정하겠습니다. GetLastError 함수는 헤더 파일 없이 호출되지만 사이트를 크롤링하지 않고 오류에 대한 설명을 얻으려면 라이브러리를 이미 포함해야 합니다.

 #include <stderr.mqh>
#include <stdlib.mqh>

. . .
Print ( "Ошибка открытия ордера BUY #" , ErrorDescription ( GetLastError ( ) ) ) ;
. . .
 
rid писал(а) >>

함수를 잘못 호출했습니다.

다음과 같이 호출했습니다. if (NumberOfPositions(NULL,Magic)> 1)

그리고 다음과 같아야 합니다.


차이를 느껴보세요("-1"을 놓쳤습니다)! 코드를 수정하십시오.

그리고 제어를 위해 차트에 주석을 표시할 수 있습니다. 예를 들어 다음과 같이 (START 기능의 맨 처음에)

두 번째 조건에 관해서는 ("더 이상 고민하지 않고") 다른 마법과 별도의 함수 Open_Buy_2()를 설정하여 두 번째 조건에 따라 포지션을 열겠습니다!

그러면 두 번째 조건의 코드는 다음과 같습니다.

제거하다,

감사합니다. 오류를 수정했습니다. 두 번째 조건이 작동하지 않는 이유도 분명해졌습니다. 아마도 작업을 올바르게 설명하지 않았을 것입니다.

어드바이저는 원칙적으로 이 주문이 종료된 지 오래 되더라도 자신이 주문을 열었는지 여부를 구별해야 합니다. NumberOfPositions는 작동하지만 현재 열려 있는 위치의 수를 계산합니다. 위치가 닫힌 경우 값은 각각 0입니다. (그래서 작동하지 않습니다)

내 EA 코드에는 이전 위치의 데이터를 고려하여 각 다음 위치를 여는 스크립트가 있으며 이전 위치가 아직 없는 경우 이 조건 없이 맨 처음 주문을 열어야 합니다(그렇지 않으면 EA는 단순히 시작). 이를 분리하려면 이 Expert Advisor의 주문이 하나 이상 열렸는지 여부를 이해하는 기능이 있어야 합니다(주문이 닫혔더라도). 아직 주문이 없는 경우(작업 시작), 두 번째 조건을 고려하지 않고 첫 번째 주문이 열리고 두 번째 조건을 고려하여 모든 후속 주문이 열립니다. 과거 명령에 따라.

기능을 이렇게 설정할 수 있나요?

 

iTime 기능이 무엇을 보여주는지 알려주세요.

이 10자리 abra-kadabra는 무엇입니까? 초?

년-월-일-시-분으로 변환하는 방법입니다.

 

분명한. 다음과 같은 위치가 기록에 있는지 확인할 수 있습니다.

  for ( int i = 0 ; i < OrdersTotal ( ) ; i + + )                          {
    if ( ! ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY ) ) ) continue ;
//выбираем из истории счета
    if ( OrderSymbol ( ) ! = Symbol ( ) ) continue ;    
     if ( OrderMagicNumber ( ) = = Magic )                            {
              позиции = true ;
                                                             } }
                  



그러나 코드는 테스터에서만 작동합니다. 왜냐하면 그렇지 않으면 온라인에서 고문을 켤 때마다 마법을 변경해야 합니다.

분명히 계정 기록을 가져오는 시간을 설정해야 합니다.

저것들. 주어진 마법으로 마지막 거래가 언제 열렸거나 닫혔습니까? 6개월 전인가 하루 전인가?

기능이 있습니다, 고양이. 마지막 거래의 시작 또는 종료의 막대 번호(역사의 깊이에서 현재 숫자부터 계산)를 반환합니다.


 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos ( string sy = "0" , int tf = 0 , int op = - 1 , int mn = - 1 ) {
  datetime t ;
  int      i , k = OrdersTotal ( ) ;

  if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
  for ( i = 0 ; i < k ; i + + ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
      if ( OrderSymbol ( ) = = sy ) {
        if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          if ( op < 0 | | OrderType ( ) = = op ) {
            if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) {
              if ( t < OrderOpenTime ( ) ) t = OrderOpenTime ( ) ;
            } } } } } }  return ( iBarShift ( sy , tf , t , True ) ) ; }

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos ( string sy = "0" , int tf = 0 , int op = - 1 , int mn = - 1 ) {
  datetime t ;
  int      i , k = OrdersHistoryTotal ( ) ;

  if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
  for ( i = 0 ; i < k ; i + + ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY ) ) {
      if ( OrderSymbol ( ) = = sy ) {
        if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          if ( op < 0 | | OrderType ( ) = = op ) {
            if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) {
              if ( t < OrderCloseTime ( ) ) t = OrderCloseTime ( ) ;
            } } } } }  }  return ( iBarShift ( sy , tf , t , True ) ) ; }

예를 들어. 내 코드에서 다음과 같은 기능을 사용했습니다.
 //======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos ( NULL , 1440 , - 1 , Magic ) = = 0 
     | |  NumberOfBarCloseLastPos ( NULL , 1440 , - 1 , Magic ) = = 0 )
    Trade = false ;       else Trade = true ;
//================================================================

또는 다음과 같이:
 //======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos ( NULL , 60 , - 1 , Magic ) < = 85 
     | |  NumberOfBarCloseLastPos ( NULL , 60 , - 1 , Magic ) < = 85 )
    Trade = false ;       else Trade = true ;
 
주님! 돕다. 메시지가 표시되도록 코드를 작성하는 방법. 닫힌 마지막 촛불이 흰색(위) 또는 검은색(아래)입니다. 말도 안되는 소리인건 알지만 그래도...

 

흠.. 저도 똑같은 문제로 괴로워하고 있습니다.. 포지션의 바다가 열리고 더 이상 1개만 필요하지 않습니다. 그리고 매수가 마감되고 매도를 열라는 신호가 오면.. 저에게 알려주고 고쳐주세요. 잘못된.. 아래 코드에서 .. 그리고 마법을 작성해야 하는 위치는? 어렵지 않다면 덤 테스트 예제를 만들어 교차할 때 매수(1개 이하 주문), 내릴 때 1개 이상 팔지 않도록 하세요. 많은 초보자들의 궁금증을 바로 풀 수 있을 거라 생각합니다. 미리 감사드립니다

//---- input parameters
extern int        Ema1 = 14 ;
extern int        Ema2 = 48 ;
double Ema_1 ;
double Ema_2 ;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
   {
   int Orders = OrdersTotal ( ) ; 
   Ema_1 = iMA ( NULL , 0 , Ema1 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;
   Ema_2 = iMA ( NULL , 0 , Ema2 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;
   
   int ticket ;
   if ( NumberOfPositions ( NULL , OP_BUY ) < 1 & & Ema_1 > Ema_2 ) 
     {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , 0.5 , Ask , 10 , Ask - 850 * Point , Ask + 550 * Point , "kupil" , 16384 , 0 , Green ) ;
     } 
   if ( NumberOfPositions ( NULL , OP_BUY ) < 1 & & Ema_1 < Ema_2 ) 
     {
      ticket = OrderSend ( Symbol ( ) , OP_SELL , 0.5 , Bid , 10 , Ask + 850 * Point , Bid - 550 * Point , "kupil" , 16384 , 0 , Green ) ;
     } 
   return ( 0 ) ;
   }

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

또 다른 어리석은 질문:

- 외부 변수에 의해 원소의 개수가 주어지는 배열을 선언하는 방법.

 
chaynik_1 >> :
주님! 돕다. 메시지가 표시되도록 코드를 작성하는 방법. 닫힌 마지막 촛불이 흰색(위) 또는 검은색(아래)입니다. 말도 안되는 소리인건 알지만 그래도...

이렇습니다 -

 if ( (Open [ 1 ] - Close [ 1 ] ) < 0  ) Comment ( "1 свеча =  бычья" ) ;
 
alderru >> :

또 다른 어리석은 질문:

- 외부 변수에 의해 원소의 개수가 주어지는 배열을 선언하는 방법.

https://docs.mql4.com/en/array/ArrayResize

 
morok >> :

흠.. 저도 똑같은 문제로 고생하고 있습니다.. 포지션의 바다가 열리고 1개만 있으면 더 이상 필요하지 않습니다. 매수가 마감되고 매도를 열라는 신호가 오면... 저에게 알려주고 고쳐주세요. 아래 코드에서 .. 그리고 어디에 마법을 써야 할까요? 어렵지 않으시다면 횡보시 매수(1개 이상 주문 불가), 내림시 1개 이상 매도 하지 않도록 어리석은 테스트 예시를 만들어 보세요. 많은 초보자분들의 궁금증이 바로 풀릴 것 같습니다. 미리 감사드립니다

다음과 같이 시도하십시오.

(헤더가 다음과 같이 말하는 것이 헛되지 않기 때문에 f- 및 NumberOfPositions() 값을 더 신중하게 설정해야 합니다.

/| 설명 : | 설명 : 위치의 수를 반환합니다.
//| 옵션: |
//| sy - 기기 이름("" 또는 NULL - 현재 기호) |
//| 연산 - 연산( -1 - 임의의 위치) |
//| mn - MagicNumber( -1 - 모든 마법) |
//+----------------------------------------------- ------------------------------+

 extern int       Magic = 5675 ;
extern int       Ema1 = 14 ;
extern int       Ema2 = 48 ;
double Ema_1 ;
double Ema_2 ;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
  {
   //int Orders = OrdersTotal(); 
   Ema_1 = iMA ( NULL , 0 , Ema1 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;
   Ema_2 = iMA ( NULL , 0 , Ema2 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;   
   int ticket ;
//------------------------------------------------
 if ( NumberOfPositions ( NULL , OP_BUY , Magic ) < 1 & & Ema_1 > Ema_2 ) 
    {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , 0.5 , Ask , 10 , Ask - 850 * Point , Ask + 550 * Point , "kupil" , 16384 , 0 , Green ) ;
    } 
//------------------------------------------------------
   if ( NumberOfPositions ( NULL , OP_SELL , Magic ) < 1 & & Ema_1 < Ema_2 ) 
    {
      ticket = OrderSend ( Symbol ( ) , OP_SELL , 0.5 , Bid , 10 , Ask + 850 * Point , Bid - 550 * Point , "kupil" , 16384 , 0 , Green ) ;
    } 
//------------------------------------------------------
   return ( 0 ) ;
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

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