기고글 토론 "MQL5 프로그래밍 기본: 배열" - 페이지 3

 
Ernie Gunning:

좋아요, 영어 버전의 MQL을 사용해 보겠습니다.


코드를 게시해 주셔서 감사합니다. 시간을 절약할 수 있었어요. MQL 배열을 사용하려고 했는데 혼란스러웠습니다. 그런 다음 다시 한 번 기본 구조를 작성해야한다는 사실에 매우 우울했지만 배열에 대한 연구 시간과 동적으로 성장 \ 증가시키는 방법을 절약 할 수있는 코드를 발견했습니다. 정말 감사합니다.

저도 보답할 수 있으면 좋겠어요! 아래 코드는 모든 데이터 유형에서 작동합니다. 객체에서도 작동하지만 Contains(검색) 메서드는 작동하지 않을 수 있습니다. 더블, 인트, 부울 유형에서만 테스트했습니다. 문자열에서도 문제가 발생할 수 있으며 코드를 확장해야 할 수도 있습니다.



그런 다음 필요한 모든 유형에 대해 다음과 같이 선언할 수 있습니다:




도움이 되길 바랍니다.


모든 데이터 유형에 대해 동적 배열을 사용하라는 위의 제안은 무시하십시오. 이미 선언 된 일반 CArrayList가 있습니다. 이것을 사용하십시오. 이 스레드에서 해결 된 객체 사용 문제가 발생했습니다 : https://www.mql5.com/en/forum/358432

Using CArrayList gives error
Using CArrayList gives error
  • 2020.12.20
  • www.mql5.com
Hi Guys, Thanks for your time. I'm struggling to use the CArrayList in the generics folder. Are these interfaces and classes complete...
 
이미 몇 가지 좋은 기사를 읽었습니다. 이번 글도 예외는 아니었습니다.
 

예제에서 배열의 내용이 1, 2, 3이 아닌 일반 인덱싱에서 1, 1, 3인 arrayResize() 함수에 오류가 있는 것 같습니다. 이 예제를 참조하세요:

//+------------------------------------------------------------------+
//|false.mq5 |
//|저작권 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 사용자 지정 표시기 초기화 기능 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 표시기 버퍼 매핑
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 사용자 지정 인디케이터 반복 함수|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // 배열
ArrayResize(ar,2); // 배열 준비
ar[0]=1; // 값 설정
ar[1]=2; 
ArraySetAsSeries(ar,true); // 인덱싱 순서 변경
ArrayResize(ar,3); // 배열 크기 늘리기
ar[0]=3; // 새 배열 요소의 값을 설정합니다.
Alert(ar[0]," ",ar[1]," ",ar[2]); // 배열 값 인쇄
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // 배열 값 인쇄
//--- 다음 호출을 위한 prev_calculated의 반환 값
   return(rates_total);
  }
//+------------------------------------------------------------------+
이 예제에서 arraySetAsSeries() 함수를 추가하면 arrayresieze 함수의 영향을 받는 것 같습니다:
//+------------------------------------------------------------------+
//|errorindex.mq5 |
//|저작권 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 사용자 지정 표시기 초기화 기능 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 표시기 버퍼 매핑
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 사용자 지정 인디케이터 반복 함수|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // 배열
ArrayResize(ar,2); // 배열 준비
ar[0]=9; // 값 설정
ar[1]=8; 
ArrayResize(ar,6); // 배열 크기 늘리기
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // 인덱싱 순서 변경
ArrayResize(ar,4); // 배열 크기 늘리기
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // 인덱싱 순서 변경 0
ar[0]=8; // 새 배열 요소의 값을 설정합니다.
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // 배열 값 인쇄
//--- 다음 호출을 위한 prev_calculated의 반환 값
   return(rates_total);
  }
//+------------------------------------------------------------------+

Steps:

1. ar = {}
2. ar = {9, 8}

3. ar = {9, 8, 0, 8, 0, 0}

4. 시리즈 참으로 설정합니다:

ar = {0, 0, 8, 0, 8, 9}

5. 4로 크기 조정

ar = {0, 0, 8, 0}

6. 시리즈 거짓으로 설정합니다:

ar = {0, 8, 0, 0} 7.

7. 계열 참으로 설정합니다:

ar = {0, 0, 8, 0} 8.

8. 첫 번째 요소 a[0]을 수정합니다.

ar = {8, 0, 8, 0} 8.


배열 크기 조정 (3 -5)이 값을 가져 와서 새 위치로 복사하고 앞으로 6은 임의의 값을 가져 오는지 모르겠습니다. 나는 먼저 resize()를 사용한 다음 이와 같이 setasseries()를 선호합니다:

//+------------------------------------------------------------------+
//|인덱싱 배열 테스트.mq5 |
//|저작권 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| 사용자 지정 표시기 초기화 기능 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 표시기 버퍼 매핑
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 사용자 지정 인디케이터 반복 함수|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // 배열
ArrayResize(ar,2); // 배열 준비
ar[0]=1; // 값 설정
ar[1]=2;
ArrayResize(ar,3); // 배열 크기 늘리기
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // 인덱싱 순서 변경
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // 새 배열 요소의 값을 설정합니다.
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // 배열 값 인쇄
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // 배열 값 인쇄
//--- 다음 호출을 위한 prev_calculated의 반환 값
   return(rates_total);
  }
//+------------------------------------------------------------------+