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

 
Igor Makanu :

나는 당신이 짧은 코드를 읽는 데 어려움을 겪을 것이라고 생각하지 않고 다음 도움말을 읽으십시오 https://www.mql5.com/en/docs/trading/ordercalcmargin

고마워, 나는 이미 그것을 알아 냈어.)

MQL5를 배우기 시작했습니다. 아마도 올바른 스레드에 없을 것입니다

 
플랫폼 간 차이 ArrayCopy .
 #property strict

void OnStart ()
{
   int Array1[ 1 ];
   int Array2[ 1 ];
  
   Print ( ArrayCopy (Array1, Array2, 0 , 0 , 0 )); // MQL4 - 1, MQL5 - 0
   Print ( WHOLE_ARRAY ); // MQL4 - 0, MQL5 - -1
}
 
fxsaber :
플랫폼 간 차이 ArrayCopy.

분명히 차이가 없도록 작성해야합니다.

   Print ( ArrayCopy (Array1, Array2, 0 , 0 , WHOLE_ARRAY ));

또는

 Print ( ArrayCopy (Array1, Array2, 0 , 0 ));

또는 이 컨텍스트에서 기본적으로 모든 것

 Print ( ArrayCopy (Array1, Array2));
 
Artyom Trishkin :

분명히 차이가 없도록 작성해야합니다.

또는

또는 이 컨텍스트에서 기본적으로 모든 것

여기에 문제가 있습니다.

 ArrayCopy (Array1, Array2, 0 , 0 , GetAmountToCopy() );

함수가 0을 반환하면 MQL4와 MQL5의 결과가 다릅니다.

 
fxsaber :

여기에 문제가 있습니다.

함수가 0을 반환하면 MQL4와 MQL5의 결과가 다릅니다.

따라서 GetAmountToCopy()에서 함수가 0을 반환해야 하는 경우 이 문제를 해결할 수 있습니다.

예를 들어:

 return (res== 0 ? WHOLE_ARRAY : res);
 
fxsaber :

여기에 문제가 있습니다.

함수가 0을 반환하면 MQL4와 MQL5의 결과가 다릅니다.

거기에서 무엇을 기대하는지 명확하지 않습니다. GetAmountToCopy()에서 반환하는 몇 가지 옵션이 있을 수 있습니다.

0 - 아무 것도 복사하지 않고(이것이 문제를 일으키는 조건입니다. 제가 이해한 바 있음) -1 - 전체 배열을 복사하면 분명히 반환 값을 0과 다르게 설정해야 하고 -1 아무것도 복사할 필요가 없는 경우. 예를 들어 EMPTY_VALUE를 반환합니다. 이 경우 GetAmountToCopy()에서 전달된 내용을 먼저 확인하는 오버로드 된 ArrayCopy() 함수 를 만들어야 합니다. EMPTY_VALUE인 경우 함수를 종료합니다. 그렇지 않으면 WHOLE_ARRAY 상수를 사용할 때 MQL5와 MQL4 모두에서 복사된 데이터의 크기가 올바르게 선택됩니다.

 
Artyom Trishkin :

거기에서 무엇을 기대하는지 명확하지 않습니다.

MQL4/5 차이점을 우회하는 가능한 구현에 대해 쓰는 이유는 완전히 명확하지 않습니다. 크로스 플랫폼 코드를 작성하는 사람들을 위해 이러한 차이점을 언급했습니다.

차이점은 이미 기사에 축적되었습니다 ... 누군가가 쓸 것입니다.

 
fxsaber :

MQL4/5 차이점을 우회하는 가능한 구현에 대해 쓰는 이유는 완전히 명확하지 않습니다. 크로스 플랫폼 코드를 작성하는 사람들을 위해 이러한 차이점을 언급했습니다.

차이점은 이미 기사에 축적되었습니다 ... 누군가가 쓸 것입니다.

나는 그것이 질문이라고 생각했다. 좋은. 내 게시물을 삭제할 수 있습니다.

 

예전에는 의심했지만 지금은 확인되었습니다. 리소스로 작업할 때 메모리 누수가 발생하기 쉽습니다.


예시.

 #include <Graphics\Graphic.mqh>

#define MIN_WIDTH 10

// Создание графика.
string GraphPlot( const double &Y[],
                   int Width = 0 , int Height = 0 , const ENUM_CURVE_TYPE Type = CURVE_NONE,
                   const string CurveName = NULL , string ObjName = NULL )
{
  Width = Width ? Width : ( int ):: ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );
  Height = Height ? Height : ( int ):: ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );
  ObjName = (ObjName == NULL ) ? __FUNCTION__ : ObjName;

  CGraphic Graphic;

   const bool Res = (:: ObjectFind ( 0 , ObjName) >= 0 ) ? Graphic.Attach( 0 , ObjName) : Graphic.Create( 0 , ObjName, 0 , 0 , 0 , Width, Height);

   if (Res)
  {
     const int Size = :: ArraySize (Y);

    Graphic.CurveAdd(Y, ((Type == CURVE_NONE) && Size) ? ((Width / Size < MIN_WIDTH) ? CURVE_LINES : CURVE_POINTS_AND_LINES) : Type, CurveName);

    Graphic.CurvePlotAll();
    Graphic.Update();
  }

   return (Res ? Graphic.ChartObjectName() : NULL );
}

void OnStart ()
{  
   const double Array[] = { 0 , 1 , 2 , 3 , 4 , 5 };
      
   const string ObjName = GraphPlot(Array, 1200 ); // Создали график-объект.
   const string ResourceName = :: ObjectGetString ( 0 , ObjName, OBJPROP_BMPFILE ); // К какому ресурсу привязка объекта.
  
   // ObjectDelete(0, ObjName); // Удалили объект.

//  ResourceFree(StringSubstr(ResourceName, StringFind(ResourceName, "::"))); // Без этой строки утечка памяти.
}


SB를 통한 스크립트는 차트에 숫자 배열의 차트를 표시합니다. 그런 다음 이 차트(객체)를 수동으로 삭제할 수 있지만 이 차트에 할당된 리소스는 읽기 전용 모드로 메모리에 영원히 남아 있습니다. 때문에 삭제할 수 없습니다. 호스트 스크립트에서만 삭제할 수 있습니다(강조 표시된 줄 참조).


MQL에는 너무 많은 점유 메모리를 해제하는 기능이 없습니다. VPS에서는 특히 주의하십시오.

 
fxsaber :

이전에는 의심만 하다가 이제는 확인되었습니다. 리소스로 작업할 때 메모리 누수가 발생하기 쉽습니다.


예시.


SB를 통한 스크립트는 차트에 숫자 배열의 차트를 표시합니다. 그런 다음 이 차트(객체)를 수동으로 삭제할 수 있지만 이 차트에 할당된 리소스는 읽기 전용 모드로 메모리에 영원히 남아 있습니다. 때문에 삭제할 수 없습니다. 호스트 스크립트에서만 삭제할 수 있습니다(강조 표시된 줄 참조).


MQL에는 너무 많은 점유 메모리를 해제하는 기능이 없습니다. VPS에 특히 주의하십시오.

메모리 누수 메시지를 받으면 해당 메모리를 해제하는 명시적 명령이 없음을 의미합니다.

프로그램이 종료되면(즉, 작업이 끝날 때 이러한 메시지를 수신함) 어떤 경우에도 누출된 메모리를 포함하여 모든 메모리를 해제합니다.