2차원 배열을 2차원으로 정렬하기

 

배열에 넣고 정렬해야 하는 2개의 데이터가 있습니다.

먼저 주문을 두 개의 배열로 분할합니다. 첫 번째 배열은 구매용이고 다른 하나는 판매용입니다. 그렇게 하면 나중에 주문을 실행할 수 있도록 OrderTicket을 수집합니다. 두 번째로 수집하는 것은 주문의 OrderClosePrice 값이므로 정확히 동일한 다른 목록과 비교할 수 있습니다.

그래서 내가 설정한 첫 번째 어레이:

이중 AryBuys[][2];
이중 ArySells[][2];

AryBuy[1][0]에는 티켓이 포함되고 AryBuy[1][1]에는 가격이 포함됩니다.

배열이 가격 내림차순으로 정렬 되도록 두 번째 차원을 어떻게 정렬합니까?

참고: ArraySort를 사용하면 첫 번째 차원만 정렬할 수 있습니다. 여기에 가능한 생각이 있습니다. 임시 배열을 만들고 가격을 임시 배열의 첫 번째 차원으로 만들고 정렬한 다음 다시 배열로 파이프하고 나중에 티켓으로 정렬해야 할 때 역으로 동일한 작업을 수행할 수 있습니다. . 그게 효과가 있을까요?

 

불행히도 그렇게 할 수는 없지만 2차원 교환 위치의 데이터로 두 번째 배열을 만들고 가격(첫 번째 차원)별로 새 배열을 정렬할 수 있습니다. 그런 다음 (여전히 원하는 경우) 데이터를 다시 원래 배열로 복사하여 각 차원의 데이터를 교환할 수 있습니다. 이제 원래 배열에 원래 데이터가 포함되지만 두 번째 차원 값으로 정렬됩니다.

투박하지만 >1 차원을 기준으로 데이터를 정렬하는 유일한 실용적인 방법(내가 알아낼 수 있었던 방법)

 

내 노트에 그렇게 생각했습니다. 내 관심사는 첫 번째 차원이 정렬될 것이고 정렬이 수행될 때 데이터의 두 번째 차원도 재배열될 것인지였습니다. 나는 이것을 시도하기 위해 테스트를 설정할 수 있다고 생각합니다.

 
LEHayes wrote >>

내 노트에 그렇게 생각했습니다. 내 관심사는 첫 번째 차원이 정렬될 것이고 정렬이 수행될 때 데이터의 두 번째 차원도 재배열될 것인지였습니다. 나는 이것을 시도하기 위해 테스트를 설정할 수 있다고 생각합니다.


예, 동일한 기본 인덱스의 모든 요소는 1차원의 정렬과 함께 이동됩니다. 여러 데이터 열이 포함된 스프레드시트를 정렬하는 것처럼 MQL에서만 첫 번째 열로만 정렬할 수 있습니다.
 

지금까지 논의한 대로 설정했습니다. 나는 우리가 대화를 마칠 때까지 이것을 해결할 것이라고 확신하지만 현재 다음을 얻고 있습니다.
2010.04.15 23:51:01,M1: ArraySort 기능 의 잘못된 시작 위치 1
처음에는 다음과 같이 시도했습니다.
ArraySort(AryBuy,WHOLE_ARRAY,0,MODE_DESCEND);
위치 값만 0이라는 동일한 메시지를 받은 다음 시작(위치 값)을 1로 변경하여 어떤 일이 발생할 수 있는지 확인하고 위와 같은 결과를 얻었습니다.

이 시점에서 배열에는 데이터가 있어야 합니다. 문제가 지속되는지 확인하기 위해 테스트를 재설정하겠습니다.

 
LEHayes :

.....
이중 AryBuys[][2];
이중 ArySells[][2];

AryBuy[1][0]에는 티켓이 포함되고 AryBuy[1][1]에는 가격이 포함됩니다. ....

내가 틀렸다면 정정해 주지만 배열을 잘못 정의하고 주소를 지정하는 것 같습니다. 변수 참조 에서 인용:

 int     a[ 50 ];       // A one-dimensional array of 50 integers.
double m[ 7 ][ 50 ];     // Two-dimensional array of seven arrays,
                     //each of them consisting of 50 integers

마지막 중괄호 쌍은 배열의 첫 번째 차원입니다... 배열의 정의되지 않은 크기가 첫 번째 차원이라고 가정합니다. 이것은 IMO가 올바른 것입니다.

 double AryBuys[ 2 ][];
double ArySells[ 2 ][];

AryBuy[ 0 ][ 1 ] contains the ticket, AryBuy[ 1 ][ 1 ] contains the price. 
 
cameofx :
마지막 중괄호 쌍은 배열의 첫 번째 차원입니다... 배열의 정의되지 않은 크기가 첫 번째 차원이라고 가정합니다. 이것은 IMO가 올바른 것입니다.

또한 을 참조하십시오 ...
참고로 저는 다음 차원이 '나중에' 추가되기 때문에(비록 왼쪽에 더 위치하지만) 마지막 중괄호 쌍을 '첫 번째 차원'으로 명명하는 것이 더 편합니다.
IMHO는 그것을 '열의 크기'로 간주하여 개념적으로 더 '고정'합니다.

 
cameofx :

참고로 저는 다음 차원이 '나중에' 추가되기 때문에(비록 왼쪽에 더 위치하지만) 마지막 중괄호 쌍을 '첫 번째 차원'으로 명명하는 것이 더 편합니다.

무엇이라고 부르고 싶든 2D 배열의 첫 번째 차원은 벡터 arr_name[0,1,...,n][0]이므로 기술적으로 첫 번째 괄호는 첫 번째 차원을 유지합니다. 이것은 ArraySort()에 의해 정렬될 벡터이기도 합니다. 책에서:

우리가 ArraySort() 주제에 있는 한 나는 시간이 지남에 따라 발견한 문서화되지 않은 2가지 특성을 언급할 것입니다(누군가가 저를 확인하거나 수정하면 기쁠 것입니다...?):

  1. 첫 번째 차원의 일부 요소가 동일한 경우 반드시 순서를 유지하지는 않습니다. 분명히 이것은 '설계상'인 경우 문서화되어야 하며, 그렇지 않으면 '버그'로 간주됩니다.
  2. OrderSort()는 4D 배열에서 작동하지 않습니다(오류 4053 반환). 다시 말하지만, 이것은 문서화되어야 하지만 그렇지 않습니다.
 
cameofx wrote >>

내가 틀렸다면 정정해 주지만 배열을 잘못 정의하고 주소를 지정하는 것 같습니다. 변수 참조 에서 인용:

마지막 중괄호 쌍은 배열의 첫 번째 차원입니다... 배열의 정의되지 않은 크기가 첫 번째 차원이라고 가정합니다. 이것은 IMO가 올바른 것입니다.



표준 스프레드시트 방식으로 배열 인덱싱 및 차원 지정을 살펴봅니다...행-열(니모닉 "로마 가톨릭").

1D 배열: MyArray[RowNumber-1]

2D 배열: MyArray[RowNumber-1][ColumnNumber-1]

3D 배열: MyArray[RowNumber-1][ColumnNumber-1][Worksheet-1]

가장 왼쪽에 있는 대괄호 집합이 첫 번째 차원이고 첫 번째 차원의 배열 조작과 관련된 모든 작업은 가장 왼쪽에 있는 대괄호 집합의 인덱스로 수행됩니다. 예를 들어 배열 크기 조정(첫 번째 차원에만 수행할 수 있는 작업)은 가장 왼쪽에 있는 대괄호 집합의 값만 변경하고 두 번째, 세 번째 또는 네 번째 차원(두 번째, 세 번째 또는 네 번째 차원의 인덱스 범위는 변경할 수 없습니다. 가장 오른쪽 대괄호 세트).

배열에 있는 모든 데이터 행은 첫 번째 대괄호 집합, 가장 왼쪽 집합에 의해 인덱싱되며 이것이 배열의 "첫 번째 차원"입니다.

MyArray[0][ColumnNumber-1] -> 데이터의 첫 번째 행

MyArray[1][ColumnNumber-1] -> 데이터의 두 번째 행

MyArray[2][ColumnNumber-1] -> 데이터의 세 번째 행

MQL에서는 데이터의 첫 번째 열에 포함된 데이터로만 정렬할 수 있습니다. 즉, MyArray[i][0]에 있는 값입니다. 동일한 행에 있는 값(이 경우 동일한 "i")이지만 다른 열(대괄호의 두 번째 집합에 있는 값)은 정렬/순위 지정에 사용할 수 없습니다.

다음은 2D 배열의 예입니다.

3 5
1 9
7 6

따라서 MyArray[0][0] = 3, MyArray[0][1] = 5, MyArray[2][1] = 6 등입니다.

이 배열을 정렬할 수 있습니다.

ArraySort(MyArray,WHOLE_ARRAY,0,MODE_ASCEND) 및 결과는 다음과 같습니다.

1 9
3 5
7 6

첫 번째 열이 정렬되고 데이터의 두 번째 열(즉, 동일한 1차원 인덱스가 있는 모든 데이터)이 첫 번째 열의 순위 지정에서 수행된 정렬/이동과 함께 이동합니다.

MQL에서 데이터의 두 번째 열을 정렬/순위를 지정할 수 없습니다...즉, 다음을 얻을 수 없습니다(어쨌든 직접적으로는 아님).

3 5
7 6
1 9

(두 번째 열은 이제 가장 작은 것부터 큰 것 순으로 정렬됩니다.)

두 번째 열(또는 첫 번째 열이 아닌 다른 열)이 정렬된 배열에 도달하려면 열 간에 데이터를 수동으로 교환해야 합니다(첫 번째 차원 인덱스는 동일하게 유지하지만 두 번째 차원 인덱스 값은 교환). 데이터를 정렬한 다음 다시 교환합니다.

마이뉴어레이:
5 3
9 1
6 7

이제 첫 번째 열인 ArraySort(MyNewArray,WHOLE_ARRAY,0,MODE_ASCEND)를 기준으로 정렬하면 결과는 다음과 같습니다.

5 3
6 7
9 1

그런 다음 첫 번째 차원의 값을 동일하게 유지하면서 두 번째 차원의 인덱스를 다시 한 번 내 원래 배열에 값을 복사합니다.

3 5
7 6
1 9

이제 원래 배열이 있지만 데이터는 두 번째 열을 기준으로 정렬됩니다.

 

이 모든 것이 악몽으로 바뀌었고 더 이상 설득하려 했는지조차 기억나지 않는다. 내가 가진 아이디어는 공개 거래 목록을 가져 와서 판매에서 구매를 2 개의 배열로 분리하는 것이 었습니다. 각 배열에는 첫 번째 열에 티켓 번호가 포함되어 있고 두 번째 열에는 거래의 가격 값이 포함되어 있습니다. 일반적으로 아이디어는 모든 고가 매수 가치를 모든 고가 매도 가치와 일치시키고 최고 매수 가치가 최고 매도 가치를 초과하면 두 거래를 모두 종료하고 프로세스를 반복하는 것입니다.

이제 이 아이디어를 철회하는 것을 고려하게 된 마지막 후크는 이 프로세스를 거친 후 헤지 거래 시스템을 계속 유지하기 위해 테이블에 최소 1개의 긍정적인 매수 거래와 1개의 긍정적인 매도 거래를 남겨두고 싶었습니다. 이것은 기본적으로 헤징 전략을 위한 하락 관리 도구로 설계되고 있습니다. 그래서 나는 헤지를 유지하고 싶지만 테이블에서 수익을 제거하고 싶습니다. 배열 알고리즘을 사용하면 이에 대한 솔루션이 제공될 수 있다는 생각이 들었습니다.

5가지 정도의 전략을 발표하려다 보니 정말 지치고 힘들었어요. 그래서 이건 필수품이라기 보다는 약간의 멋스러움이 되었습니다.

저를 위해 이 기능을 작성할 수 있는 사람이라면 누구와도 거래할 용의가 있습니다. 나는 당신에게 몇 년 라이선스가 있는 제품을 선택할 수 있도록 도와줄 것입니다. 무료로 이 헷징 전략의 개인 사본을 평생 무료로 무제한 사용할 수 있습니다. 나는 모든 것을 하기에는 너무 벅차고 내 개발 팀은 이미 우리 판에 있는 것을 공개해야 하는 무거운 짐을 지고 있습니다. 팀 전체의 평균 수면 시간은 하루 4~6시간 정도라고 생각합니다.

그래서 만약 당신이 약간의 물물교환과 무역에 관심이 있다면 그것이 제 제안입니다.

목적:
1. 매도와 매수를 구분하라
2. 가장 높은 가격 값에서 가장 낮은 값으로 각각 정렬
3. 매수의 양수 가격 이 가장 높고 매도의 양수 가격이 가장 낮으면 가장 높은 매수 거래로 가장 낮은 매도 거래를 마감하고자 하는 경우 매수 거래는 매도 거래 비용을 초과해야 합니다. 매도의 양수 가격이 더 높으면 이 조치를 되돌려 가장 낮은 매수 가격을 가장 높은 매도 가격으로 마감합니다. 아이디어는 모든 손실에 대해 더 높은 가격으로 마감하여 승리가 손실을 초과하고 평균 양의 수익을 얻도록 한다는 것입니다.

예시:
사다 팔다
$15 $-12
$5 $ - 6
$ 1.5 $ -1
$ 1 $ - .5

이는 양측에서 균형 잡힌 수의 미결 거래를 보여줍니다. $15 매수와 $-12 매도에 주목하세요. 플러스 매수가 마이너스 매도를 초과하기 때문에 닫을 수 있습니다. 5와 -6도 닫을 수 있습니다. 처음 두 폐쇄에서 충분한 수입이 있기 때문에 그 중 4를 폐쇄하는 것 사이의 균형이 플러스가 될 것입니다. 1.5와 -1에 대해서도 동일한 작업을 수행할 수 있지만 헤지된 상황을 유지하기 위해 1과 -.5를 닫고 싶지 않습니다.

대부분의 경우 거래는 양쪽에서 동등하게 균형을 이루지 않습니다. 이것은 더 큰 로트 크기로 가장 무거운 쪽을 상쇄하고 이기는 쪽을 위해 추가 거래를 하는 디자인의 기본이 되었기 때문에 1개의 판매만 가질 수 있으며 이 경우 아무 것도 하지 않을 수 있습니다. 균형이 맞지 않지만 양쪽에 최소 2개의 거래가 있는 경우 양쪽 거래를 열어 두어야 합니다. 1개의 긍정적인 거래가 1개의 부정적인 거래보다 더 많은 경우, 서로에게 가장 작은 양쪽의 하나의 거래를 제외하고 모두 닫을 수 있습니다.

특정 ticketid를 닫을 닫는 함수를 호출하도록 설계되어야 하므로 닫는 것에 대해 걱정할 필요가 없습니다. 목록이 마감된 거래를 비교하지 않고 처리 중에 발생한 새로운 거래를 비교하지 않도록 목록을 다시 작성해야 할 수도 있습니다.

아, 한가지 더...
너무 탐욕스러워서는 안 됩니다. 이 기능이 실행되는 빈도를 지시하는 사용자 extern을 제공해야 합니다. 촛불 수 또는 시간 또는 분 단위를 기반으로 할 수 있지만 모든 틱 또는 모든 새 촛불을 실행해서는 안 됩니다. . 추가 도구가 포함되어 있기 때문에 이 도구를 호출하려면 먼저 다른 도구가 실행되어야 합니다. 따라서 다른 도구가 작동하고 도구가 작동하기 위한 카운트다운이 시작됩니다.

 
Larry, 여기에서 CloseBy() -> https://book.mql4.com/trading/orderclose (페이지의 약 2/3 아래에 있습니다...)에 대한 코드를 확장하여 원하는 작업을 수행할 수 있다고 확신합니다. (어레이를 사용하지 않고)... 그냥 마음속으로 생각했습니다.