mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 152

 
Slava :

그는 존재합니까? 정말 있나요? 어떤 방법으로?

어떻게 번식할 수 있습니까?

네비게이터의 즐겨찾기 에 스크립트를 배치합니다.

 void OnStart () {}


잘못된 버전 컴파일

 void OnStart () {} 123


터미널을 다시 시작하고 즐겨찾기에서 스크립트 편집을 선택하십시오.

 
Vladimir Simakov :

개발자. 설명이 필요합니다. 무엇을 믿어야 할까요? 문서 또는 구현? 지금까지는 정의되지 않은 동작이 얻어졌습니다.

@fxsaber , 공식 설명 전에 사용을 권하지 않습니다. 갑자기 가져 와서 고칠 것입니다.

문서가 오래되었습니다. 수정하겠습니다.

표현식으로 정적 변수를 초기화하지 않는 것이 좋습니다. 가능하면 상수를 사용하십시오.

왜냐하면 상수가 아닌 표현식을 사용할 때 컴파일러는 다음 코드를 생성합니다.

 //--- исходная функция
int func( int value )
  {
   static int myStaticVar= value ;    
   
   myStaticVar += value;
   return (myStaticVar);
  }

//--- то, что будет сгенерировано 
bool __Implicit_myStaticVar_initialized= false ;
int   __Implicit_myStaticVar= 0 ;

//--- исходная функция
int func( int value )
  {
   if (!__Implicit_myStaticVar_initialized)
     {
      __Implicit_myStaticVar_initialized= true ;
      __Implicit_myStaticVar= value ;
     }

   __Implicit_myStaticVar += value;
   return (__Implicit_myStaticVar);
  }


각 호출마다 __Implicit_myStaticVar_initialized 플래그를 확인하는 오버헤드가 발생합니다.

상수가 있는 변형의 경우 다음 코드를 얻습니다.

 //--- исходная функция
int func( int value )
  {
   static int myStaticVar= 10 ;

   myStaticVar += value ;
   return (myStaticVar);
  }

//--- то, что будет сгенерировано 
int   __Implicit_myStaticVar= 10 ;

int func( int value )
  {
   __Implicit_myStaticVar += value ;
   return (__Implicit_myStaticVar);
  }

오버헤드가 없다

 
Ilyas :

감사합니다. 이제 오버헤드가 명확해졌습니다.

 
비정규화된 가격 값 을 사용자 지정 기호에 쉽게 쓸 수 있습니다. 아래는 간단한 검사입니다.
 bool IsNorm( const double Price )
{
   return ( NormalizeDouble (Price, _Digits ) == Price);
}

#define TOSTRING(A) #A + " = " + DoubleToString (A, 16 ) + " "
#define PRINT(A) Print (TOSTRING(A) + TOSTRING( NormalizeDouble (A, _Digits )))
#define ISNORM(A) if (!IsNorm(A)) PRINT(A);

void OnTick ()
{
   MqlTick Tick;
  
   if ( SymbolInfoTick ( _Symbol , Tick))
  {
    ISNORM(Tick.bid)
    ISNORM(Tick.ask)
    ISNORM(Tick.last)
  }
}


결과

 2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 00    Tick.last = 1.8151900000000002 NormalizeDouble (Tick.last, _Digits ) = 1.8151900000000000 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 11    Tick.bid = 1.8151100000000003 NormalizeDouble (Tick.bid, _Digits ) = 1.8151100000000001 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 11    Tick.ask = 1.8153800000000003 NormalizeDouble (Tick.ask, _Digits ) = 1.8153800000000001 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 17    Tick.bid = 1.8151200000000002 NormalizeDouble (Tick.bid, _Digits ) = 1.8151199999999999 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 17    Tick.ask = 1.8153800000000003 NormalizeDouble (Tick.ask, _Digits ) = 1.8153800000000001 
 
이 주제와 관련이 없는 댓글은 " MQL5 MT5 MetaTrader 5 초보자의 질문 "으로 이동되었습니다.
 
RickD :
... 질문이 다릅니다. 아마도 MQL5에 정리해야 할 버그가 있고, 초보자를 위한 주제로 옮기는 것은 상황에 대한 빠른 분석에 기여하지 않을 것입니다.

스레드 제목을 읽으십시오.

[삭제]  
Artyom Trishkin :

스레드 제목을 읽으십시오.

그리고 그 모순을 어디서 보았습니까? 설명된 상황 은 언어의 기능이자 버그일 수 있습니다. 이것이 바로 알아낼 필요가 있었던 것입니다.

 
RickD :

그리고 그 모순을 어디서 보았습니까? 설명된 상황 은 언어의 기능이자 버그일 수 있습니다. 이것이 바로 알아낼 필요가 있었던 것입니다.

아니요. 첫째, 그것은 버그나 기능으로 판명되었습니다. 그 다음에는 금식이며 기능일 뿐입니다. 테마 - 전용 프로 기능.

 

@Ilyas @Slava @Renat Fatkhullin

mql은 함수에 대한 문서화되지 않은 키워드를 지원합니다.

 __inline
__forceinline

그것들을 사용하는 것이 의미가 있습니까?
그렇다면 컴파일러는 어떤 경우에 이를 수락합니까?

 

ArrayReverse 도움말에서:

ArraySetAsSeries() 함수 배열 요소를 물리적으로 이동하지 않고 인덱싱 방향을 거꾸로 뒤집어 요소에 대한 액세스를 시계열 처럼 구성합니다 . ArrayReverse() 함수는 배열이 "반전"되는 방식으로 배열의 요소를 물리적으로 이동합니다.

그러나 이 코드는 그렇지 않음을 증명합니다.

   MqlRates rt[];
   CopyRates ( Symbol (), 0 , 0 , 5 , rt);
   ArraySetAsSeries (rt, true );
   ArrayResize (rt, 6 ); // добавляет элемент в конец массива
   //ArraySetAsSeries(rt, true);
   for ( int x = 0 ; x < ArraySize (rt); x++) {
       Print (rt[x].time);
  }
   Print ( "=================" );
(EURUSD,H1)     2019.12 . 13 02 : 00 : 00
(EURUSD,H1)     2019.12 . 13 01 : 00 : 00
(EURUSD,H1)     2019.12 . 13 00 : 00 : 00
(EURUSD,H1)     2019.12 . 12 23 : 00 : 00
(EURUSD,H1)     2019.12 . 12 22 : 00 : 00
(EURUSD,H1)     1970.01 . 01 00 : 00 : 00 - последний элемент
(EURUSD,H1)     =================
   MqlRates rt[];
   CopyRates ( Symbol (), 0 , 0 , 5 , rt);
   //ArraySetAsSeries(rt, true);
   ArrayResize (rt, 6 ); // добавляет элемент в конец массива
   ArraySetAsSeries (rt, true );
   for ( int x = 0 ; x < ArraySize (rt); x++) {
       Print (rt[x].time);
  }
   Print ( "=================" );
(EURUSD,H1)     1970.01 . 01 00 : 09 : 19 - последний элемент
(EURUSD,H1)     2019.12 . 13 02 : 00 : 00
(EURUSD,H1)     2019.12 . 13 01 : 00 : 00
(EURUSD,H1)     2019.12 . 13 00 : 00 : 00
(EURUSD,H1)     2019.12 . 12 23 : 00 : 00
(EURUSD,H1)     2019.12 . 12 22 : 00 : 00
(EURUSD,H1)     =================