각 배열, 벡터 또는 행렬은 해당 객체의 요소를 포함하는 메모리 버퍼를 참조합니다. 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]]
*/
}
MQL5: 벡터 및 행렬에 대한 LossGradient 메서드를 추가했습니다. 이 메서드는 예측된 값에 대한 손실 함수의 편도함수의 벡터 또는 행렬을 계산합니다. 선형 대수학에서 이러한 벡터를 기울기라고 하며 머신러닝에 사용됩니다.
MQL5: 메서드 및 객체 상수에 따른 적절한 클래스 메서드가 선택되는 것을 수정했습니다.
MetaEditor: 의 허용 가능한 주석의 길이가 MQL5 Storage 커밋됩니다. 리포지토리에 변경 사항을 커밋할 때 자세한 주석을 다는 것은 대규모 프로젝트에서 작업할 때 좋은 방법으로 간주되지만 이전에는 주석 길이가 128자로 제한되었습니다. 이제 허용되는 길이는 최대 260자입니다.
MetaTrader 5 플랫폼 업데이트가 2022년 11월 4일 금요일에 출시됩니다.
업데이트는 모바일 장치를 완벽하게 지원하는 새로운 웹 터미널을 소개합니다. 이제 인터페이스가 사용자 화면 크기에 자동으로 맞춰집니다.
또한 사용된 리소스를 보다 정확하게 모니터링할 수 있도록 작업 관리자를 개선하였습니다. 또한 사용 가능한 장치를 관리할 수 있는 OpenCL 탭을 추가했습니다. 새로운 OpenCL 관리자를 사용하면 더 빠른 계산을 위해 장치를 명시적으로 지정할 수 있습니다.
행렬 및 벡터 작업과 관련한 플랫폼의 기능을 계속 확장하고 있습니다. 새로운 함수는 가격 틱을 활용하는 것과 행렬과 벡터 간의 데이터 교환을 가능하게 합니다. 또한 확장된 할당 메서드를 제공합니다.
MQL5의 새로운 매트릭스 및 벡터 메서드
이외에도 플랫폼의 구성 요소에 대한 여러 수정 사항과 개선 사항을 구현했습니다. 새로운 기능, 수정 사항 및 성능 개선 사항은 아래에 자세히 설명되어 있습니다.
웹 플랫폼의 모바일 버전
새로운 웹 터미널은 모바일 장치를 위한 모든 기능을 지원합니다. 인터페이스는 자동으로 화면 크기에 맞게 조정되어 iOS 및 Android 휴대폰 및 태블릿에서 효율적인 작업이 가능하게 합니다:
또한 웹 터미널에 많은 수정 사항과 개선 사항이 적용되었습니다.
새로운 MetaTrader 5 웹 터미널은 거래 기능을 전부 지원합니다. 사용자는 다음을 수행할 수 있습니다:
MetaTrader 5 클라이언트 터미널 빌드 3490
FIFO 규칙에 따르면 각 상품의 포지션은 진입한 순서대로만 청산할 수 있습니다. 스탑 레벨에 따라 FIFO 규정을 준수하며 포지션의 청산을 보장하기 위해 클라이언트 터미널에서 다음과 같은 로직이 구현되었습니다:
동일한 기기에 대해 여러 포지션이 있는 경우 포지션 중 하나에 대해 스탑 레벨을 설정하면 다른 모든 위치에도 동일한 레벨이 설정됩니다. 따라서 레벨이 트리거 되면 모든 포지션은 FIFO 규정을 준수하는 순서로 청산됩니다.
이제 사용자가 이미 진입한 포지션의 상품에 대해 시장 심도를 열면 기존 포지션(있는 경우)의 레벨이 손절매 및 이익실현 필드에 자동으로 지정됩니다.
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, // 틱 프래그
여러 데이터 유형을 선택한 경우(행렬에만 사용 가능), 행렬의 행 순서는 열거형의 값 순서와 일치합니다.이제 행렬에 1차원 배열 또는 벡터를 할당할 수 있습니다:
bool matrix::Assign(const vector &vec);
결과는 1행 행렬이 됩니다.또한 이제 행렬을 벡터에 할당할 수 있습니다(행렬 평활화가 수행됨).
bool vector::Assign(const matrix &mat);
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]] */ }
vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const; matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );
업데이트는 라이브 업데이트 시스템을 통해서 제공됩니다.