MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 13

 
Viachaslau Baiko :

여기에 그런 뉘앙스가 있습니다. 이 코드를 사용했습니다( Alekseu Fedotov 덕분에 ).

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 (УСЛОВИЕ && NumberOfBarCloseLastPos()> 0 )

그리고 여기에 전체 걸림돌이 있습니다. 왜냐하면. 처음에 NumberOfBarCloseLastPos는 "-1"이 됩니다. 따라서 첫 번째 주문은 열리지 않습니다.

그러한 상황에서 무엇을 할 수 있습니까? 아니면 내가 뭔가를 잘못 이해 했습니까?

이 상황에서 (CONDITION && NumberOfBarCloseLastPos()> -2 ) 시도 하거나 다음 과 같이 생각할 수 있습니다.
 
Viachaslau Baiko :

여기에 그런 뉘앙스가 있습니다. 이 코드를 사용했습니다( Alekseu Fedotov 덕분에 ).

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 ) {
...
   return ( iBarShift (sy, tf, t, True ));
}
if ( УСЛОВИЕ && (NumberOfBarCloseLastPos()> 0 || NumberOfBarCloseLastPos()==- 1 ) )
 
Vitaly Muzichenko :
잘. 그리고 생각해보라고 제안했습니다.
 
Алексей Тарабанов :
이 상황에서 (CONDITION && NumberOfBarCloseLastPos()> -2 ) 시도 하거나 다음 과 같이 생각할 수 있습니다.
그러나 이 옵션을 사용하면 값이 "0"이 됩니다.
 
Vitaly Muzichenko :
if ( УСЛОВИЕ && (NumberOfBarCloseLastPos()> 0 || NumberOfBarCloseLastPos()==- 1 ) )
모든 것이 작동했습니다! 고맙습니다!
 
Viachaslau Baiko :

여기에 그런 뉘앙스가 있습니다. 이 코드를 사용했습니다( Alekseu Fedotov 덕분에 ).

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 (УСЛОВИЕ && NumberOfBarCloseLastPos()> 0 )

그리고 여기에 전체 걸림돌이 있습니다. 왜냐하면. 처음에 NumberOfBarCloseLastPos는 "-1"이 됩니다. 따라서 첫 번째 주문은 열리지 않습니다.

그러한 상황에서 무엇을 할 수 있습니까? 아니면 내가 뭔가를 잘못 이해 했습니까?

글쎄, 나는 이것을 할 것입니다 :

//+------------------------------------------------------------------+
int BarCloseLastPos( string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
   datetime time= 0 ;
   int       j=- 1 ;
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
         if ( OrderMagicNumber ()!=magic_number)   continue ;
         if ( OrderSymbol ()!=symbol_name)         continue ;
         if ( OrderType ()!=type)                   continue ;
         if ( OrderCloseTime ()>time) {
            time= OrderCloseTime ();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS , MODE_HISTORY )) return ( iBarShift (symbol_name,timeframe,time));
   return ( EMPTY );
}
//+------------------------------------------------------------------+

...확인:

if (BarCloseLastPos( Symbol (), PERIOD_CURRENT , OP_BUY ,Magic)> 0 ) {
   // Последняя позиция Buy была закрыта не на текущем баре
   }
 
Artyom Trishkin :

글쎄, 나는 이것을 할 것입니다 :

//+------------------------------------------------------------------+
int BarCloseLastPos( string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
   datetime time= 0 ;
   int       j=- 1 ;
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
         if ( OrderMagicNumber ()!=magic_number)   continue ;
         if ( OrderSymbol ()!=symbol_name)         continue ;
         if ( OrderType ()!=type)                   continue ;
         if ( OrderCloseTime ()>time) {
            time= OrderCloseTime ();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS , MODE_HISTORY )) return ( iBarShift (symbol_name,timeframe,time));
   return ( EMPTY );
}
//+------------------------------------------------------------------+

...확인:

if (BarCloseLastPos( Symbol (), PERIOD_CURRENT , OP_BUY ,Magic)> 0 ) {
   // Последняя позиция Buy была закрыта не на текущем баре
   }
글쎄, 그것이 현재 막대에서 비열한 경우 어떻게 될까요?
 
Алексей Тарабанов :
글쎄, 그것이 현재 막대에서 비열한 경우 어떻게 될까요?

이것은 정확히 건너 뛸 필요가 있습니다. 이전 포지션이 이 바에서 마감된 경우 포지션을 열 필요가 없습니다.

그리고 현재 막대에서 포지션이 마감되었다는 조건을 확인해야 하는 경우 0을 확인해야 합니다.

if (BarCloseLastPos( Symbol (), PERIOD_CURRENT , OP_BUY ,Magic)== 0 ) {
   // Последняя позиция Buy была закрыта на текущем баре
   }
 
Viachaslau Baiko :

여기에 그런 뉘앙스가 있습니다. 이 코드를 사용했습니다( Alekseu Fedotov 덕분에 ).

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 (УСЛОВИЕ && NumberOfBarCloseLastPos()> 0 )

그리고 여기에 전체 걸림돌이 있습니다. 왜냐하면. 처음에 NumberOfBarCloseLastPos는 "-1"이 됩니다. 따라서 첫 번째 주문은 열리지 않습니다.

그러한 상황에서 무엇을 할 수 있습니까? 아니면 내가 뭔가를 잘못 이해 했습니까?

if (УСЛОВИЕ && NumberOfBarCloseLastPos()!= 0 )
 
좋은 하루 MT4 포럼 사용자! 나는 문제에 부딪쳤고 나는 어떻게 해서든 많은 계산기를 보호하거나 MT4 컴파일러를 어떻게든 자체 방식으로 보호하는 방법을 모른다고 생각합니다. 2.0을 얻고 어떤 이유로 1.9999999878을 출력합니다. 이상적으로는 코드가 다음과 같이 들립니다. print((OrdArr[i].buy-Ord[1,3]-PipStep)/Point) pipstep은 0.0020과 같습니다. 그것보다 적습니다. 문제가 무엇인지 아는 사람이 있을지도 모릅니다! 고마워.

사유: