새로운 MetaTrader 5 플랫폼 빌드 3490: MQL5의 모바일 웹 터미널 버전 및 새로운 매트릭스 메서드

 

MetaTrader 5 플랫폼 업데이트가 2022년 11월 4일 금요일에 출시됩니다.

업데이트는 모바일 장치를 완벽하게 지원하는 새로운 웹 터미널을 소개합니다. 이제 인터페이스가 사용자 화면 크기에 자동으로 맞춰집니다.

또한 사용된 리소스를 보다 정확하게 모니터링할 수 있도록 작업 관리자를 개선하였습니다. 또한 사용 가능한 장치를 관리할 수 있는 OpenCL 탭을 추가했습니다. 새로운 OpenCL 관리자를 사용하면 더 빠른 계산을 위해 장치를 명시적으로 지정할 수 있습니다.

행렬 및 벡터 작업과 관련한 플랫폼의 기능을 계속 확장하고 있습니다. 새로운 함수는 가격 틱을 활용하는 것과 행렬과 벡터 간의 데이터 교환을 가능하게 합니다. 또한 확장된 할당 메서드를 제공합니다.

모바일 웹 터미널 버전 및 새로운 매트릭스 및 벡터 메소드 모바일 웹 터미널 버전 및MQL5의 새로운 매트릭스 및 벡터 메서드

이외에도 플랫폼의 구성 요소에 대한 여러 수정 사항과 개선 사항을 구현했습니다. 새로운 기능, 수정 사항 및 성능 개선 사항은 아래에 자세히 설명되어 있습니다.


웹 플랫폼의 모바일 버전

새로운 웹 터미널은 모바일 장치를 위한 모든 기능을 지원합니다. 인터페이스는 자동으로 화면 크기에 맞게 조정되어 iOS 및 Android 휴대폰 및 태블릿에서 효율적인 작업이 가능하게 합니다:

모바일 장치에 대한 지원 추가 새 웹 터미널에서 모바일 장치에 대한 지원 추가

또한 웹 터미널에 많은 수정 사항과 개선 사항이 적용되었습니다.

새로운 MetaTrader 5 웹 터미널은 거래 기능을 전부 지원합니다. 사용자는 다음을 수행할 수 있습니다:

  • 데모 및 라이브 계정 작업
  • 모든 심볼의 쿼트 수신
  • 모든 시장에서 거래 가능
  • 30개 이상의 지표와 20개의 그래픽 객체를 사용하여 심볼의 쿼트 분석
  • 펀더멘털 분석을 위한 경제 캘린더 데이터 활용


MetaTrader 5 클라이언트 터미널 빌드 3490

  1. 터미널: 확장된 작업 관리자 기능. 새로운 버전을 사용하면 소비된 리소스를 보다 정확하게 모니터링할 수 있습니다.

    • 스레드와 관련한 스택 크기 표시를 추가하였습니다.
    • 컨텍스트 스위치의 개수 표시를 추가했습니다.
    • 시스템 및 외부 DLL 스레드를 인식하는 기능이 추가되었습니다.
    • 커널 모드 작동 시간 표시가 추가되었습니다. 사용자 모드에서 소비한 시간과 비교하여 이 메트릭이 증가하면 시스템 수준의 문제(드라이버 문제, 하드웨어 오류 또는 느린 하드웨어)가 있다는 것을 의미할 수 있습니다. 자세한 내용은 Microsoft 설명서를 참조하십시오.
    • 사용자 모드를 작동한 시간이 얼마나 되는지를 표시하는 기능이 추가되었습니다.

    OpenCL 관리자 사용 가능한 장치를 제어하는 OpenCL 관리자


  2. 터미널: 사용 가능한 장치를 관리하기 위한 터미널 설정의 새로운 OpenCL 탭. 새로운 OpenCL 관리자를 사용하면 계산에 사용할 장치를 명시적으로 지정할 수 있습니다.

    OpenCL 관리자 사용 가능한 장치를 제어하는 OpenCL 관리자

  3. 터미널: FIFO 모드(브로커 측에서 모드를 활성화할 수 있음)에서 작동하는 계정에서 손절매 및 이익실현 수준을 시장 심도 안에서 표시하도록 하였습니다.

    FIFO 규칙에 따르면 각 상품의 포지션은 진입한 순서대로만 청산할 수 있습니다. 스탑 레벨에 따라 FIFO 규정을 준수하며 포지션의 청산을 보장하기 위해 클라이언트 터미널에서 다음과 같은 로직이 구현되었습니다:

    동일한 기기에 대해 여러 포지션이 있는 경우 포지션 중 하나에 대해 스탑 레벨을 설정하면 다른 모든 위치에도 동일한 레벨이 설정됩니다. 따라서 레벨이 트리거 되면 모든 포지션은 FIFO 규정을 준수하는 순서로 청산됩니다.

    이제 사용자가 이미 진입한 포지션의 상품에 대해 시장 심도를 열면 기존 포지션(있는 경우)의 레벨이 손절매 및 이익실현 필드에 자동으로 지정됩니다.

  4. 터미널: Toolbox\Trade 창에서 X 버튼을 사용하여 손절매 및 이익실현 수준을 삭제하는 것을 수정했습니다. 원클릭 매매 기능이 비활성화되었을 때 오류가 발생했었습니다. 버튼을 클릭하면 관련된 레벨이 빈 값으로 있는 거래 대화 상자가 열립니다.

  5. 터미널: 거래 보고서에서 그래프 캡션 및 최종 커미션의 계산을 수정했습니다. 섹션은 보고서 통계에 잘못된 이익을 표시하고 자본 및 밸런스 그래프 도구 설명에 잘못된 값을 표시할 수 있었습니다.

  6. MQL5: CopyTicks 및 CopyTicksRange를 벡터 및 행렬 메서드로 추가했습니다. 이를 통해 틱 데이터의 배열을 벡터와 행렬로 쉽게 복사할 수 있습니다.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    복사된 데이터 유형은 ENUM_COPY_TICKS 열거형을 사용하여 'flags' 매개변수에 지정됩니다. 다음과 같은 값을 사용할 수 있습니다:
    COPY_TICKS_INFO    = 1,       // Bid와(혹은) Ask 변화에 따른 틱
    COPY_TICKS_TRADE   = 2,       // Last 가격과 볼륨 변화에 따른 틱
    COPY_TICKS_ALL     = 3,       // 변경된 모든 틱
    COPY_TICKS_TIME_MS = 1<<8,    // 밀리세컨드 타임
    COPY_TICKS_BID     = 1<<9,    // Bid 가격
    COPY_TICKS_ASK     = 1<<10,   // Ask 가격
    COPY_TICKS_LAST    = 1<<11,   // Last 가격
    COPY_TICKS_VOLUME  = 1<<12,   // 볼륨
    COPY_TICKS_FLAGS   = 1<<13,   // 틱 프래그
    여러 데이터 유형을 선택한 경우(행렬에만 사용 가능), 행렬의 행 순서는 열거형의 값 순서와 일치합니다.

  7. MQL5: matrix::Assignvector::Assign 메서드의 확장된 기능.

    이제 행렬에 1차원 배열 또는 벡터를 할당할 수 있습니다:
    bool matrix::Assign(const vector &vec);
    결과는 1행 행렬이 됩니다.

    또한 이제 행렬을 벡터에 할당할 수 있습니다(행렬 평활화가 수행됨).
    bool vector::Assign(const matrix &mat);
  8. MQL5: 벡터 및 행렬에 대한 Swap 메서드가 추가되었습니다.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    각 배열, 벡터 또는 행렬은 해당 객체의 요소를 포함하는 메모리 버퍼를 참조합니다. Swap 메서드는 실제로 요소를 메모리에 쓰지 않으면서 이러한 버퍼에 대한 포인터를 교환합니다. 따라서 행렬은 행렬로 남아 있고 벡터는 벡터로 남아 있게 됩니다. 행렬과 벡터를 바꾸면 플랫 표현으로 벡터 요소가 있는 1행 행렬과 행렬 요소가 있는 벡터가 생성됩니다플랫플랫 메서드 참조).
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- swap matrix pointers
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Swap() 메서드는 동적 배열 작업도 가능하게 합니다(고정 크기의 배열은 매개변수로 전달할 수 없음). 배열은 임의의 차원이 될 수 있지만 합의된 크기여야 합니다. 즉 행렬 또는 벡터의 전체 크기는 배열의 0차원의 배수여야 합니다. 배열의 0 차원은 첫 번째 인덱스에 포함된 요소의 수입니다. 예를 들어 동적 3차원 배열 '이중 배열[][2][3]'의 경우 제로 차원은 두 번째 및 세 번째 차원 크기의 곱입니다. 2x3=6. 따라서 이러한 배열은 총 크기가 6의 배수인 행렬과 벡터가 있는 Swap 메서드에서만 사용할 수 있습니다. 6, 12, 18, 24 등

    다음 예를 참고하십시오:
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- 1x10 행렬을 7.0으로 채웁니다
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- 행렬을 배열로 바꿉니다
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // 행렬의 크기가 첫 번째 배열 차원의 배수가 아닙니다.
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- 더 큰 행렬을 사용해서 스왑 작업을 다시 시도
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // 정적 배열은 행렬과 교환하는 데 사용할 수 없습니다.
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- 배열과 행렬을 바꾸려는 또 다른 시도
      double array_dynamic[][10];    // dynamic array
      ArrayResize(array_dynamic, 3); // set the first dimension size
      ArrayCopy(array_dynamic, array_static);
    //--- 이제 스왑을 위해 동적 배열을 사용하십시오.
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  no error
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  9. MQL5: 벡터 및 행렬에 대한 LossGradient 메서드를 추가했습니다. 이 메서드는 예측된 값에 대한 손실 함수의 편도함수의 벡터 또는 행렬을 계산합니다. 선형 대수학에서 이러한 벡터를 기울기라고 하며 머신러닝에 사용됩니다.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  10. MQL5: SQLite에서 FOREIGN KEYS를 사용하여 SQL 쿼리에서 테이블 간의 관계를 적용할 수 있습니다.   예시:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  11. MQL5: 메서드 및 객체 상수에 따른 적절한 클래스 메서드가 선택되는 것을 수정했습니다.

  12. MetaEditor: 의 허용 가능한 주석의 길이가 MQL5 Storage 커밋됩니다. 리포지토리에 변경 사항을 커밋할 때 자세한 주석을 다는 것은 대규모 프로젝트에서 작업할 때 좋은 방법으로 간주되지만 이전에는 주석 길이가 128자로 제한되었습니다. 이제 허용되는 길이는 최대 260자입니다.
  13. MetaTester: 비주얼 모드에서 테스트 속도 스위치의 감도가 향상되었습니다.
  14. 충돌 로그에 보고되는 오류를 수정했습니다.


업데이트는 라이브 업데이트 시스템을 통해서 제공됩니다.

사유: