MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1423

 

그래서 변수를 전역으로 만들려고 했습니까?

 int izmb= 0 , izms= 0 ;

void OnTick ()
   {
   double LB= 0 ,LS= 0 ;
   int b= 0 ,s= 0 ;
   
   for ( int i= 0 ; i< OrdersTotal (); i++)
      {    
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         { 
         if (OrderSymbol()== Symbol ())
            { 
             if (OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
             else if (OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if (izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh :

어드바이저 항목을 검색하기 위한 조건을 매 틱마다 확인하지 않고 다음 주문이 다른 어드바이저에 의해 또는 수동으로 열리거나 닫히는 경우에만(프로세서에 추가 로드가 없도록) 그런 아이디어가 있었습니다. 따라서 각 틱별로 주문 수의 일치 여부를 확인할 필요가 있습니다.

정적 변수 - 정적을 사용할 수 있습니까? 프로그램이 이 형식으로 작동합니까?

또는 가장 간단하고 쉬운 조건

OnTrade() 는 mt5가 있는 mt4와 유사합니다.

 void OnTrade ()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = - 1 ;
static _HTotal = - 1 ;
int OT= OrdersTotal ();
int HT= OrdersHistoryTotal ();
   if (OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade (); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal= OrdersTotal (); // запомним текущее количество
     _HTotal= OrdersHistoryTotal (); // запомним количество в истории
   }
 
ANDREY :

답변 해주셔서 감사합니다. 당신이 쓴 모든 것을 이해했습니다. 하지만 내 문제의 관점에서 쓰여진 것의 의미를 이해하지 못했습니다.

내 코드에서 수평 2차원 배열이란 인덱스 0 또는 1에 2개의 행이 있고 인덱스 0에서 30까지의 열이 있는 경우를 의미합니다. 첫 번째 차원은 다음과 같이 표시됩니다.   [0]   [0],   [0]   [하나],   [0]   [2], ... [0]   두 번째 차원은 다음과 같이 표시됩니다.   [하나]   [0],   [하나]   [하나],   [하나]   [2], ... [1]   [서른]  

내 코드에서 수직 2차원 배열이란 인덱스 0~30에 31개의 행이 있고 인덱스 0과 1에 2개의 열이 있는 경우를 의미합니다. 첫 번째 차원은 다음과 같이 표시됩니다.   [0]   [0],   [하나   [0],   [2]   [0], ... [30]   [0] 두 번째 차원은 다음과 같이 표시됩니다.   [0]   [하나],   [하나]   [하나],   [2]   [1], ... [30]   [하나]  

내 코드를 실행하면 배열이 세로로 채워집니다. 그리고 ArraySort() 함수는 배열을 정렬 해야 하는 대로 정렬합니다.

질문 ArrayFill() 함수가 작동하지 않는 이유는 무엇입니까? 결국 20분에 배열의 첫 번째 차원(31개 요소)을 동일한 값 0.5555로 채우라고 했습니다.
도와 주셔서 감사합니다.

MQL4는 4차원 배열 이하에서 작동할 수 있습니다. 따라서 arr[31][31]은 오류입니다. 배열은 arr[][4]보다 클 수 없습니다. 동시에 첫 번째 차원은 MQL에 의해 제한되는 것이 아니라 무엇에 의해 제한되는지 확실하지 않습니다. 아마도 누군가 설명할 것입니다.

ArrayFill() 함수는 작동 하지만 arr[3][2] 배열의 요소 수가 6이고 이 함수에 첫 번째 차원 크기의 3이 아니라 6을 써야 한다는 점을 이해해야 합니다. .

 

4D 차원: arr[][][][] 또는 arr[,,,].

동시에 마지막 세 측정의 치수는 발표 중에 표시되어야 하며 단단히 고정되어야 합니다. 그리고 첫 번째 것은 생략하고 나중에 변경할 수 있습니다.

 int arr[, 100 , 200 , 500 ];

2차원 배열의 예에서 배열의 데이터는 다음과 같이 배열됩니다.

 int arr[ 2 , 5 ]={ 0 , 1 , 2 , 3 , 4 ,  - в нулевом элементе первого измерения 
               5 , 6 , 7 , 8 , 9 }; - в первом элементе первого измерения

정렬은 전체 수평 정렬을 첫 번째 차원으로 이동하고,

ArrayFill()은 한 요소에서 다른 요소로(예: 3에서 8로) 채웁니다.

첫 번째 차원을 따라 일부 수평 값을 채우려면 데이터의 위치를 알고 채우기의 시작과 끝을 직접 제어해야합니다.

예를 들어, 첫 번째 차원의 0 요소에 대한 전체 눈금자는 다음과 같습니다.

 int value= 5 ;
int index= 0 ;
ArrayFill (arr, index* ArrayRange (arr, 1 ), ArrayRange (arr, 1 ), value); 

0이 하나만 있으면 다음과 같이 됩니다.

 ArrayFill (arr, index* ArrayRange (arr, 1 ), 1 , value); 

0 요소가 많은 경우 루프 및 단순 할당입니다.


Mnogabukav는 아마도 명확하게 설명하지 않았을 것입니다 ... 인쇄를 사용하고주기에있는 모든 것을 인쇄하십시오. 이런 식으로하면 인식이 올 것입니다. 그러니 더 빨리 배우십시오.

printf는 내 친구야!

 
Alexey Viktorov :

MQL4는 4차원 배열 이하에서 작동할 수 있습니다. 따라서 arr[31][31]은 오류입니다. 배열은 arr[][4]보다 클 수 없습니다. 동시에 첫 번째 차원은 MQL에 의해 제한되는 것이 아니라 무엇에 의해 제한되는지 확실하지 않습니다. 아마도 누군가 설명할 것입니다.


그리고 첫 번째 차원(즉, 행 수)은 몇 개로 제한됩니까? MQL4가 허용 하는다차원 배열 의 최대 행 수는 얼마입니까?

 

네 가지 차원 모두에 한계가 있다고 생각합니다. INT_MAX

구조에 대해.

2차원:

그 구조에서 요소가 다음과 같이 배열된 1차원 배열을 나타냅니다. 첫 번째 줄, 두 번째 줄, 세 번째 줄입니다.

3D:

그것도 3D로. 이것은 1차원 배열로, 처음에는 첫 번째 시트의 행이 차례로, 다음으로 두 번째 행이 ....

왜 1차원인가? 한 행의 여러 셀이 컴퓨터 메모리의 배열에 할당되므로 모든 것이 순서대로 기록됩니다. 00행 + 01행 + 02행 + 10행 + 11행 ....


그리고 3차원 배열 시트 팩인 4차원을 추가할 수 있는 또 다른 가능성이 있습니다.

프로그램 중에는 줄 수만 변경할 수 있습니다. 모든 선, 기둥, 시트 및 팩은 구조를 이해하기 위한 규칙입니다. 사실 차원은 우리 공간에 있는 것이 아니라 차원일 뿐입니다.

Alexei는 다음과 같이 말합니다.

Alexey Viktorov :

 ...   가로로 위치해서 소파에 누워서 보고있으니까 ... ... ...

 
Alexey Viktorov :

메모 에 주의를 기울였습니까?

배열 채우기

다차원 배열은 ArrayFill() 함수로 처리될 때 1차원으로 처리됩니다. 예를 들어 array[2][4]는 array[8]로 처리되므로 이 배열로 작업할 때 인덱스를 지정할 수 있습니다. 초기 요소의 값은 5와 같습니다. 따라서 array[2][4]에 대해 ArrayFill(array, 5, 2, 3.14)을 호출하면 array[1][1] 및 array[1][2]에 값 3.14가 채워집니다.


ArrayFill() 을 제외한 모든 것을 이해했습니다.

1. 배열을 선언할 때 Double LoY[31][31]; 기본적으로 31행 x 31열의 테이블을 만들고 있습니다. 2D(4D 아님) 배열을 만들었지만 아직 채우지 않았습니다.

2. 코드 에서 배열의 각 개별 요소를 Bid 값으로 채웁니다. 2가지 옵션으로 채울 수 있어요
a) LoY[31][0]=입찰가 - 31행과 배열의 첫 번째 열을 입찰가 값으로 채웁니다. 그리고 두 번째 차원(인덱스 1의 열은 기본적으로 채우지 않기 때문에 0으로 채워집니다. 따라서 이 버전에서 내가 가진 첫 번째 차원은 31개의 채워진 요소와 1의 두 번째 차원으로 구성됩니다.

b) LoY[0][31]=Bid - 31개의 열과 배열의 첫 번째 행을 값으로 채웁니다.   매기다   . 그리고 두 번째 차원(인덱스 1의 라인은 기본적으로 0으로 채워져 있습니다. 제가 채우지 않기 때문입니다. 따라서 이 버전에서 두 번째 차원은 31개의 채워진 요소와 1의 두 번째 요소로 구성됩니다.

ArraySort() 는 2차원 배열을 첫 번째 차원으로만 정렬합니다. 따라서 첫 번째 차원에 31개의 행이 있는 옵션 a)를 정렬하고 첫 번째 차원에 1개의 행만 있는 옵션 b)를 정렬하지 않습니다. 1개의 행은 정렬할 수 없기 때문입니다.
지금   ArrayFill() 2차원 배열의 필요한 요소에 필요한 값을 할당하기 전에 2차원 배열을 한 줄로 뽑아낸다. 즉, 내 배열 LoY[31][31]을 961개 요소 크기의 한 줄로 가져와야 합니다. 이것은 매우 긴 줄이며 대부분의 요소가 중복됩니다.

따라서 LoY[31][2](옵션 a)) 또는 LoY[2][31](옵션 b)) 배열을 만듭니다.

방법은 분명하다     배열 채우기()   옵션 b)를 한 줄로 가져옵니다. 두 번째 줄은 첫 번째 줄과 첫 번째 줄의 마지막 요소 뒤에 결합됩니다. LoY[0][31] ArrayFill() 배열의 첫 번째 줄   계속하다   LoY[0][32] 및 끝   LoY[0][62] 그리고 ArrayFill() 함수의 배열 요소 값은 인덱스 0에서 31까지의 순서로 배열 요소가 가격 값으로 채워지고 인덱스 32에서 끝까지 0으로 채워집니다.    

문제. 그리고 ArrayFill() 이 옵션 a)를 한 줄로 가져오는 방법은 무엇입니까? 결국, 이 버전에는 28개의 줄이 있습니다. 그리고 한 줄이면 배열 요소의 값이 어떤 순서로 들어갈까요? ArrayFill() 이 1차원 배열로 변환한 후 Print()를 사용하여 2차원 배열의 요소를 인쇄할 수 있습니까? 이 함수 자체는 값을 반환하지 않으므로 Print()가 삽입된 경우 이를 인쇄하지 않습니다.

도와 주셔서 감사합니다.

 

내가 여기서 뭔가 했어 ... 그것은 이미 부끄러운

에서 배열의 각 개별 요소를 Bid 값으로 채웁니다. 2가지 옵션으로 채울 수 있어요
a) LoY[31][0]=입찰가 - 31행과 배열의 첫 번째 열을 입찰가 값으로 채웁니다. 그리고 두 번째 차원(인덱스 1의 열은 기본적으로 채우지 않기 때문에 0으로 채워집니다. 따라서 이 버전에서 내가 가진 첫 번째 차원은 31개의 채워진 요소와 1의 두 번째 차원으로 구성됩니다.

b) LoY[0][31]=Bid - 31개의 열과 배열의 첫 번째 행을 값으로 채웁니다.   매기다   . 그리고 두 번째 차원(인덱스 1의 라인은 기본적으로 0으로 채워져 있습니다. 제가 채우지 않기 때문입니다. 따라서 이 버전에서 두 번째 차원은 31개의 채워진 요소와 1의 두 번째 요소로 구성됩니다.

ArraySort() 는 2차원 배열을 첫 번째 차원으로만 정렬합니다. 따라서 첫 번째 차원에 31개의 행이 있는 옵션 a)를 정렬하고 첫 번째 차원에 1개의 행만 있는 옵션 b)를 정렬하지 않습니다. 1개의 행은 정렬할 수 없기 때문입니다.
지금   ArrayFill() 2차원 배열의 필요한 요소에 필요한 값을 할당하기 전에 2차원 배열을 한 줄로 뽑아낸다. 즉, LoY[31][31] 배열을 961개 요소 크기의 한 줄로 가져와야 합니다. 이것은 매우 긴 줄이며 대부분의 요소가 중복됩니다.

따라서 LoY[31][2](옵션 a)) 또는 LoY[2][31](옵션 b)) 배열을 만듭니다.

방법은 분명하다     배열 채우기()   옵션 b)를 한 줄로 가져옵니다. 두 번째 줄은 첫 번째 줄과 첫 번째 줄의 마지막 요소 뒤에 결합됩니다. LoY[0][31] ArrayFill() 배열의 첫 번째 줄   계속하다   LoY[0][32] 및 끝   LoY[0][62] 그리고 ArrayFill() 함수의 배열 요소 값은 인덱스 0에서 31까지의 순서로 배열 요소가 가격 값으로 채워지고 인덱스 32에서 끝까지 0으로 채워집니다.    

문제. 그리고 ArrayFill() 이 옵션 a)를 한 줄로 가져오는 방법은 무엇입니까? 결국, 이 버전에는 28개의 줄이 있습니다. 그리고 그것이 한 줄이면 배열 요소의 값이 어떤 순서로 들어갈까요? ArrayFill() 이 1차원 배열로 변환 한 후 Print()를 사용하여 2차원 배열의 요소를 인쇄할 수 있습니까? 이 함수 자체는 값을 반환하지 않으므로 Print()가 삽입된 경우 이를 인쇄하지 않습니다.

도와 주셔서 감사합니다.

당신을 이해하기 어렵습니다. 아마도 설명하기에는 충분하지 않을 것입니다. LoY[5][3] 배열, 즉 5행과 3열로 질문을 반복합니다.

ArrayFill은 어떤 식으로든 원래 배열을 변환하지 않습니다. 1차원 배열이 거기에 배치 된 것처럼 배열의 처리만 발생합니다 . 함수가 배열에 필요한 작업을 수행하고 차원을 위반하지 않고 롤아웃되었습니다.

문서에 따르면 ArrayFill(LoY, 3, 6, 12) 함수는 값이 12인 인덱스 1과 2가 있는 행만 LoY 배열에 채웁니다.

LoY[1][0]은 12입니다.

LoY[1][1] 은 12입니다.

LoY[1][2] 는 12입니다.

LoY[2][0] 은 12입니다.

LoY[2][1] 은 12입니다.

LoY[2][2] 는 12입니다.

다른 모든 것은 그대로 유지됩니다.

이해하기 쉬운 작은 배열과 숫자로 실험해 보세요. 예를 들어 12와 8은 어느 것이 더 많은지 쉽게 알 수 있습니다. 그리고 1.123654와 1.123583이 더 어렵습니다.

 
Alexey Viktorov :

ArrayFill은 어떤 식으로든 원래 배열을 변환하지 않습니다 . 1차원 배열이 거기에 배치된 것처럼 배열 처리만 발생합니다. 함수가 배열에 필요한 작업을 수행하고 차원을 위반하지 않고 롤아웃되었습니다.


이것은 내 오해를 크게 줄이고 이해를 높였습니다. 이제 새롭게 발견된 상황을 고려하여 제가 쓴 모든 것을 새로운 방식으로 분석하겠습니다....

 
Alexey Viktorov :


문서에 따르면 ArrayFill(LoY, 3, 6, 12) 함수는 값이 12인 인덱스 1과 2가 있는 행만 LoY 배열에 채웁니다.

LoY[1][0]은 12입니다.

LoY[1][1] 은 12입니다.

LoY[1][2] 는 12입니다.

LoY[2][0] 은 12입니다.

LoY[2][1] 은 12입니다.

LoY[2][2] 는 12입니다.


문제
어떤 값을 어떻게 입력해야합니까?   ArrayFill(), 동일한 배열의 노란색 요소를 값 12로 채워야 하는 경우?

옵션 N 1

옵션 N 2


도와 주셔서 감사합니다