코드를 작성하는 데 시간을 절약해 주셔서 감사합니다. MQL5 배열 객체 (double, int 등)를 사용하려고했는데 좌절했습니다. 귀하의 게시물을 방문하여 배열의 크기를 조정하는 코드를 발견했습니다. 모든 데이터 유형에 맞게 코드를 수정했습니다. 다만 객체가 참조일 수 있으므로 객체에 대해 Contains (검색 메서드) 메서드를 사용하지 마십시오. 저는 MQL5 내에서 C#을 다시 만들려고 노력하고 있으므로 약어가 비슷합니다 :)
신의 축복 !!!
// + ----------------------------------------------- ------------------- +
//
CDynamicArray.mqh |
// |
정수 |
// |
https://login.mql5.com/ru/users/Integer |
// + ----------------------------------------------- ------------------- +
#property
copyright
"Integer"
#property
link
"https://login.mql5.com/en/users/Integer"
// + - -------------------------------------------------- --------------- +
// |
|
// + ----------------------------------------------- ------------------- +
template
<
typename
T>
class
CDynamicArray
{
private
:
int
m_ChunkSize;
// 청크 크기
int
m_ReservedSize;
// 배열의 실제 크기
int
m_Size;
// 배열의 활성 요소 수
public
:
T Element [];
// 적절한 배열입니다.
공개 섹션에 있습니다,
//를 사용하여 필요한 경우 직접 사용할 수 있습니다.
// + --------------------------- --------------------------------------- +
|
생성자 |
// + ----------------------------------------------- ------------------- +
void
CDynamicArray (
int
ChunkSize =
1024
)
{
m_Size =
0
;
// 활성 요소 수
m_ChunkSize = ChunkSize;
// 청크 크기
m_ReservedSize = ChunkSize;
// 배열의 실제 크기
ArrayResize
(Element, m_ReservedSize);
// 배열 준비
}
// + ----------------------------------------- ------------------------- +
// |
배열 끝에 요소를 추가하는 함수 |
// + ----------------------------------------------- ------------------- +
void
Add (T Value)
{
m_Size ++;
// 활성 요소 수 늘리기
if
(m_Size> m_ReservedSize)
{
// 필요한 숫자는 실제 배열 크기보다 큽니다.
m_ReservedSize + = m_ChunkSize;
// 새 배열 크기 계산
ArrayResize
(Element, m_ReservedSize);
// 실제 배열 크기 늘리기
}
Element [m_Size-
1
] = Value;
// 값 추가
}
void
Set (
int
index, T Value)
{
m_Size ++;
// 활성 요소 수 늘리기
if
(m_Size <index)
{
return
;
}
Element [index] = Value;
// 값 추가
}
// + ----------------------------------------- ------------------------- +
//
배열의 활성 요소 수를 가져오는 함수 |
// + ----------------------------------------------- ------------------- +
int
Count ()
{
return
(m_Size);
}
T
operator
[] (
const
int
index)
const
{
return
Element [index];
}
bool
Contains (T itemToFind)
{
for
(
int
i =
0
; i <Count (); i ++)
{
if
(Element [i] == itemToFind)
{
return
true
;
}
}
return
false
;
}
int
IndexOf (T itemToFind)
{
for
(
int
i =
0
; i <Count (); i ++)
{
if
(Element [i] == itemToFind)
{
return
i;
}
}
return
-
1
;
}
};
// + ----------------------------------------------- ------------------- +
Tickets =
new
CDynamicArray<
int
>();
FixedSLUsed =
new
CDynamicArray<
bool
>();
PrevBarSLUsed =
new
CDynamicArray<
bool
>();
그리고 코드에서 일반 클래스처럼 사용하면 됩니다:
int
ticket =
PositionGetInteger
(
POSITION_TICKET
);
int
index;
if
(!Tickets.Contains(ticket)) // If Ticket Object does NOT contains ticket then we go into the if
{
Tickets.Add(ticket);
FixedSLUsed.Add(
false
);
PrevBarSLUsed.Add(
false
);
}
index = Tickets.IndexOf(ticket);
코드를 게시해 주셔서 감사합니다. 시간을 절약할 수 있었어요. MQL 배열을 사용하려고 했는데 혼란스러웠습니다. 그런 다음 다시 한 번 기본 구조를 작성해야한다는 사실에 매우 우울했지만 배열에 대한 연구 시간과 동적으로 성장 \ 증가시키는 방법을 절약 할 수있는 코드를 발견했습니다. 정말 고마워요.
저도 보답할 수 있으면 좋겠어요! 아래 코드는 모든 데이터 유형에서 작동합니다. 객체에서도 작동하지만 Contains(검색) 메서드는 작동하지 않을 수 있습니다. 더블, 인트, 부울 유형에서만 테스트했습니다. 문자열에서도 문제가 발생할 수 있으며 코드를 확장해야 할 수도 있습니다.
//+------------------------------------------------------------------+//|CDynamicArray.mqh |//|정수 |//| https://login.mql5.com/ru/users/Integer |//+------------------------------------------------------------------+#property copyright"Integer"#property link"https://login.mql5.com/ru/users/Integer"//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+template <typename T>
class CDynamicArray
{
private:
int m_ChunkSize; // 청크 크기int m_ReservedSize; // 배열의 실제 크기int m_Size; // 배열의 활성 요소 수public:
T Element[]; // 적절한 배열입니다. 공개 섹션에 있습니다, //를 사용하여 필요한 경우 직접 사용할 수 있습니다.//+------------------------------------------------------------------+//| 생성자|//+------------------------------------------------------------------+void CDynamicArray(int ChunkSize=1024)
{
m_Size=0; // 활성 요소 수
m_ChunkSize=ChunkSize; // 청크 크기
m_ReservedSize=ChunkSize; // 배열의 실제 크기ArrayResize(Element,m_ReservedSize); // 배열 준비
}
//+------------------------------------------------------------------+//| 배열 끝에 요소를 추가하는 함수 ||//+------------------------------------------------------------------+void Add(T Value)
{
m_Size++; // 활성 요소 수 늘리기if(m_Size>m_ReservedSize)
{ // 필요한 숫자가 실제 배열 크기보다 큽니다.
m_ReservedSize+=m_ChunkSize; // 새 배열 크기 계산ArrayResize(Element,m_ReservedSize); // 실제 배열 크기 늘리기
}
Element[m_Size-1]=Value; // 값 추가
}
void Set(int index, T Value)
{
m_Size++; // 활성 요소 수 늘리기if(m_Size<index)
{
return;
}
Element[index]=Value; // 값 추가
}
//+------------------------------------------------------------------+//| 배열의 활성 요소 수를 가져오는 함수|//+------------------------------------------------------------------+int Count()
{
return(m_Size);
}
T operator[](constint index) const { return Element[index]; }
bool Contains(T itemToFind)
{
for(int i=0;i<Count();i++)
{
if(Element[i] == itemToFind)
{
returntrue;
}
}
returnfalse;
}
int IndexOf(T itemToFind)
{
for(int i=0;i<Count();i++)
{
if(Element[i] == itemToFind)
{
return i;
}
}
return -1;
}
};
//+------------------------------------------------------------------+
그런 다음 필요한 모든 유형에 대해 다음과 같이 선언 할 수 있습니다:
//내 클래스에서 다음과 같이 선언했습니다.
CDynamicArray<int> *Tickets;
CDynamicArray<bool> *FixedSLUsed;
CDynamicArray<bool> *PrevBarSLUsed;
// 그런 다음 클래스 메서드에 다음과 같이 선언했습니다.
Tickets = new CDynamicArray<int>();
FixedSLUsed = new CDynamicArray<bool>();
PrevBarSLUsed = new CDynamicArray<bool>();
// 그리고 제 클래스 메서드에 다음과 같이 사용했습니다:int ticket = PositionGetInteger(POSITION_TICKET);
int index;
if(!Tickets.Contains(ticket))
{
Tickets.Add(ticket);
FixedSLUsed.Add(false);
PrevBarSLUsed.Add(false);
}
index = Tickets.IndexOf(ticket);
//더 많은 코드가 제거되었습니다.
함수에서 배열을 반환하는 방법? 지금까지 해결 방법을 찾았지만 분명히 "정면으로"할 수있는 방법이있을 것입니다)).
정면으로 할 수 있는 방법은 없습니다... 배열에 대한 포인터를 사용하는 것 외에는 방법이 없습니다. 예를 들어
CArrayDouble *Function(void);
이 섹션에서는 정면으로 접근하지는 않지만 이와 같은 표준 접근 방식을 사용합니다:
일반적으로 반환된 배열은 매개변수 참조입니다...네, 감사합니다. 저는 바로
반환 *x; 습관적으로, C++에서처럼 )))
대신
반환 GetPointer(x)
를 반환하는 것을 알아냈습니다))
새 문서 MQL5 프로그래밍 기초: 배열이 게시되었습니다:
작성자: Dmitry Fedoseev
1 질문:
컴파일러는 이러한 구성을 금지합니다. 왜 그럴까요?
더블 쿼티(double &q[]);
#import
dll을 만들고 있는데 배열 포인터를 전달하고 싶습니다.
하지만 어떻게 해야 할지 모르겠어요.
뭔가 잘못됐어요.
C++의 아날로그가 필요합니다.
더블 쿼티(더블 *q);
double *q;
q = new double [100];
쿼티(Q);
MQL5에서 하는 방법...
코드를 작성하는 데 시간을 절약해 주셔서 감사합니다. MQL5 배열 객체 (double, int 등)를 사용하려고했는데 좌절했습니다. 귀하의 게시물을 방문하여 배열의 크기를 조정하는 코드를 발견했습니다. 모든 데이터 유형에 맞게 코드를 수정했습니다. 다만 객체가 참조일 수 있으므로 객체에 대해 Contains (검색 메서드) 메서드를 사용하지 마십시오. 저는 MQL5 내에서 C#을 다시 만들려고 노력하고 있으므로 약어가 비슷합니다 :)
신의 축복 !!!
그런 다음 다음과 같이 선언 할 수 있습니다:
와 같이 선언하고
그리고 코드에서 일반 클래스처럼 사용하면 됩니다:
좋아요, 영어 버전의 MQL을 사용해 보겠습니다.
코드를 게시해 주셔서 감사합니다. 시간을 절약할 수 있었어요. MQL 배열을 사용하려고 했는데 혼란스러웠습니다. 그런 다음 다시 한 번 기본 구조를 작성해야한다는 사실에 매우 우울했지만 배열에 대한 연구 시간과 동적으로 성장 \ 증가시키는 방법을 절약 할 수있는 코드를 발견했습니다. 정말 고마워요.
저도 보답할 수 있으면 좋겠어요! 아래 코드는 모든 데이터 유형에서 작동합니다. 객체에서도 작동하지만 Contains(검색) 메서드는 작동하지 않을 수 있습니다. 더블, 인트, 부울 유형에서만 테스트했습니다. 문자열에서도 문제가 발생할 수 있으며 코드를 확장해야 할 수도 있습니다.
그런 다음 필요한 모든 유형에 대해 다음과 같이 선언 할 수 있습니다:
이것이 누군가에게 도움이되기를 바랍니다.