기고글 토론 "MQL5에서 행렬 및 벡터 연산"

 

새로운 기고글 MQL5에서 행렬 및 벡터 연산 가 게재되었습니다:

효율적인 연산을 위해 수학적인 솔루션과 함께 행렬과 벡터가 MQL5에 도입되었습니다. 새로운 유형은 수학적인 표기법에 가까운 간결하고 이해하기 쉬운 코드를 생성하도록 하는 기본 메서드를 제공합니다. 배열은 광범위한 기능을 제공하지만 행렬이 훨씬 더 효율적인 경우가 많습니다.

지난 몇 년 동안 우리는 MQL5 언어에 고급 기술을 도입하기 위해 많은 노력을 기울였습니다.


      MQL5 언어는 계속 발전할 것이며 가장 우선적으로는 머신 러닝과 관련한 것들입니다. 저희는 큰 계획을 가지고 계속적인 발전을 해 나아갈 것입니다. 그러니 저희와 함께 하고 저희를 지원하고 저희와 함께 계속 배우십시오.

      작성자: MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // 거짓은 벡터가 문자열임을 의미합니다. матрицы

      열에 없는 것이 확실합니까?

       
          //--- 종가를 벡터로 가져옵니다.
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- 시계열 행렬에 벡터를 삽입합니다.
            rates.Col(close, i);

      안타깝게도 행렬을 채우는 이 간단한 방법에는 여러 통화 막대가 동기화되지 않는다는 심각한 결함이 있습니다.

      정확한 데이터를 쉽게 얻으려면 행렬에도 표준 CopyRates 메서드를 사용하는 것이 좋습니다.

       
      우리는 가격 데이터로 벡터를 간단하게 채우는 것에 주목했습니다. 그러나 거래도 있습니다.
      vector::Deals( void* Filter );

      따라서 통계 섹션을 수학적 방법뿐만 아니라 Gain, MaxDD, PF 등과 같은 재무적 방법으로 채울 필요가 있습니다.

       
      fxsaber #:

      열에 없는 것이 확실합니까?

      네, 오타입니다.

      감사합니다, 수정되었습니다.

       
      fxsaber CopyRates 메서드를 사용하는 것이 합리적일 수 있습니다.

      다음은 CopyRates 메서드와 그 예시입니다.

      //+------------------------------------------------------------------+
      //| 스크립트 프로그램 시작 기능|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- 매트릭스에 따옴표 가져오기
        matrix matrix_rates;
        if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLCT, 1, 10))
          Print("matrix rates: \n", matrix_rates);
        else
          Print("matrix_rates.CopyRates failed. Error ", GetLastError());
      //--- 확인
        MqlRates mql_rates[];
        if(CopyRates(Symbol(), PERIOD_CURRENT, 1, 10, mql_rates)>0)
         {
          Print("mql_rates array:");
          ArrayPrint(mql_rates);
         }
        else
          Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error ", GetLastError());
      //--- 벡터로 따옴표 가져오기 = 잘못된 호출
        vector vector_rates;
        if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLC, 1, 15))
          Print("vector_rates COPY_RATES_OHLC: \n", vector_rates);
        else
          Print("vector_rates.CopyRates COPY_RATES_OHLC failed. Error ", GetLastError());
      //--- 종가를 벡터로 가져옵니다.
        if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_CLOSE, 1, 15))
          Print("vector_rates COPY_RATES_CLOSE: \n", vector_rates);
        else
          Print("vector_rates.CopyRates failed. Error ", GetLastError());
       };
      /*
       매트릭스 요금:
       [[0.99686,0.99638,0.99588,0.99441,0.99464,0.99594,0.99698,0.99758,0.99581,0.9952800000000001]
       [0.99708,0.99643,0.99591,0.9955000000000001,0.99652,0.99795,0.99865,0.99764,0.99604,0.9957]
       [0.9961100000000001,0.99491,0.99426,0.99441,0.99448,0.99494,0.9964499999999999,0.99472,0.9936,0.9922]
       [0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
       [1662436800,1662440400,1662444000,1662447600,1662451200,1662454800,1662458400,1662462000,1662465600,1662469200]]
       mql_rates array:
       [시간] [열림] [높음] [낮음] [닫기] [틱_볼륨] [스프레드] [실제_볼륨]
       [0] 2022.09.06 04:00:00 0.99686 0.99708 0.99611 0.99641 44630 0
       [1] 2022.09.06 05:00:00 0.99638 0.99643 0.99491 0.99588 45190 0
       [2] 2022.09.06 06:00:00 0.99588 0.99591 0.99426 0.99441 30600 0
       [3] 2022.09.06 07:00:00 0.99441 0.99550 0.99441 0.99464 38670 0
       [4] 2022.09.06 08:00:00 0.99464 0.99652 0.99448 0.99594 52800 0
       [5] 2022.09.06 09:00:00 0.99594 0.99795 0.99494 0.99697 72270 0
       [6] 2022.09.06 10:00:00 0.99698 0.99865 0.99645 0.99758 101300 0
       [7] 2022.09.06 11:00:00 0.99758 0.99764 0.99472 0.99581 70120 0
       [8] 2022.09.06 12:00:00 0.99581 0.99604 0.99360 0.99528 61660 0
       [9] 2022.09.06 13:00:00 0.99528 0.99570 0.99220 0.99259 69500 0
       vector_rates.CopyRates COPY_RATES_OHLC가 실패했습니다. 오류 4003
       vector_rates COPY_RATES_CLOSE:
       [0.9931,0.99293,0.99417,0.99504,0.9968399999999999,0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
      */
      Документация по MQL5: Методы матриц и векторов / Инициализация / CopyRates
      Документация по MQL5: Методы матриц и векторов / Инициализация / CopyRates
      • www.mql5.com
      CopyRates - Инициализация - Методы матриц и векторов - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
       
      Rashid Umarov #:

      다음은 CopyRates 메서드와 그 안에 있는 예제입니다.

      제가 문제를 제대로 공식화하지 못한 것 같습니다. 심볼 상관관계를 계산하기 위해 행렬을 채울 때 EURUSD[5].BarTime이 GBPUSD[5].BarTime과 일치하지 않는 경우가 발생할 수 있습니다.이를 다중 막대 비동기화라고 합니다. 계산하기 전에 이러한 데이터 준비에 많은 시간/노력을 투자해야 합니다. 한 줄로 해결할 수 있다면 얼마나 좋을까요?

       

      기사에는 다음과 같이 명시되어 있습니다:

      Над матрицами и векторами можно поэлементно производить математические операции — сложение, вычитание, умножение и деление. Для этого оба объекта должны быть одного и того же типа и должны иметь одинаковые размеры. Каждый член матрицы/вектора оперирует с соответствующим элементом второй матрицы/вектора.

      이 계산이 어떻게 수행되는지, 즉 숫자를 두 배로 가져온 다음 계산을 수행하고 다시 초기 데이터 유형으로 변환하여 정밀도 손실을 줄이는지 (또는 내가 틀렸고 차이가 없습니까?) 또는 거기에있는 데이터 유형에서 즉시 계산이 수행되는지 명확히하고 싶습니다. 분명히 다른 유형은 RAM을 절약하지만 배열로 데이터를 계산하는 경우 계산을 위해 숫자를 두 배로 가져온 다음 계산의 정확성을 유지하기 위해 다시 플로트로 가져옵니다. 숫자에 대한 연산을 수행하는 방법을 선택 사항으로 만들어야 하나요?
       
      환상적인 설명입니다. 매우 도움이 되었습니다.
       

      이 명령에는 다음이 포함됩니다.

      void matrix.FromBuffer(const int rows, const int cols, const 스칼라 array[], const int count=-1, const int offset=0)

      frombuffer

      1차원 배열에서 행렬을 생성합니다.


      를 사용해 보았지만 실제로는 작동하지 않습니다. 1차원 배열을 행렬로 복사하는 다른 방법이 있나요?

       
      기사를 읽어보세요 .