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

 
Kos Mos :

그래서 나는 내가 정확히 무엇을 할 수 없는지 알아내려고 노력하고 있습니다. 누군가가 당신에게 무료로 무언가를 말할 것 같지 않다는 것을 이해합니다 - 자본주의는 그것의 어머니입니다.)) 나는 그것에 반대할 것이 없습니다. 왜 거래를 하는지 이해해야 합니다 각 양초에서 매수 방향으로 열립니다.

나는 당신에게 대답하지 않았다.

당신은 - 스키를 타기 위해 - 신호를 수신할 때 중요한 변수 의 값을 최소한 인쇄하고 로그에서 결과를 확인해야 합니다.

 

for(int i=0;i<ArrayRange(arr2,0);i++)와 같은 주기가 있습니다. 즉, 이 ArrayRange(arr2,0) 계산이 수행되는 횟수에 관심이 있음을 의미합니다. 한 번 및 기계가 값을 기억하거나 회전 루프가 ArrayRange (arr2,0) 함수에서 값을 반환할 때마다? 예시:

첫 번째 옵션.

i=0,i<(반환 값), 증가, 다음

i<(다시 값을 반환), 증가, 다음

i<(다시 값을 반환), 증가하므로 결과가 나타납니다.

두 번째 옵션.

또는 이 계산 ArrayRange(arr2,0)에서 값이 한 번 반환되면 5가 반환되고 기계가 이 5ku를 기억하고 다음 시나리오가 얻어진다고 가정해 보겠습니다.

i=0,i<(반환 값) 즉, i<5, 증분, 다음

i<5, 증가, 다음

i<5, 증가하므로 결과가 나타납니까?

내가 묻는 이유: 모든 것이 첫 번째 옵션에 따라 발생하는 경우 루프 전에 이 값을 추출하고 변수에 저장하여 루프의 각 패스에서 프로그램이 ArrayRange(arr2,0)를 계산하지 않도록 하는 것이 좋습니다. 기능.

 
Seric29 :

for(int i=0;i<ArrayRange(arr2,0);i++)와 같은 주기가 있습니다. 즉, 이 ArrayRange(arr2,0) 계산이 수행되는 횟수에 관심이 있음을 의미합니다. 한 번 및 기계가 값을 기억하거나 회전할 때마다 루프 가 ArrayRange (arr2,0) 함수에서 값을 반환합니까? 예시:

첫 번째 옵션.

i=0,i<(반환 값), 증가, 다음

i<(다시 값을 반환), 증가, 다음

i<(다시 값을 반환), 증가하므로 결과가 나타납니다.

두 번째 옵션.

또는 이 계산 ArrayRange(arr2,0)에서 값이 한 번 반환되면 5가 반환되고 기계가 이 5ku를 기억하고 다음 시나리오가 얻어진다고 가정해 보겠습니다.

i=0,i<(반환 값) 즉, i<5, 증분, 다음

i<5, 증가, 다음

i<5, 증가하므로 결과가 나타납니까?

내가 묻는 이유: 모든 것이 첫 번째 옵션에 따라 발생하는 경우 루프 전에 이 값을 추출하고 변수에 저장하여 루프의 각 패스에서 프로그램이 ArrayRange(arr2,0)를 계산하지 않도록 하는 것이 좋습니다. 기능.

일반적인 경우 - 첫 번째 옵션.

PS/ 2nd는 루프 내부에 ArrayResize가 없는 경우 ArrayRange:=const 임을 파악할 수 있는 "최적화" 컴파일러에만 가능합니다. mql 컴파일러가 이미 "네이티브" 기능에 대해 이론적으로 가능하지만 코드를 너무 깊이 파고 있는지 확신할 수 없습니다.

PPS/ ArrayRange()를 사용한 예제는 정확하지 않습니다. 아마도 직접적인 함수 호출이 없을 것이기 때문입니다. 컴파일러는 배열에 대한 모든 것을 알고 있기 때문에 i를 내부 배열 변수와 비교하도록 간단히 줄여야 합니다.

 
Maxim Kuznetsov :

일반적인 경우 - 첫 번째 옵션.

PS/ 2nd는 루프 내부에 ArrayResize가 없는 경우 ArrayRange:=const 임을 파악할 수 있는 "최적화" 컴파일러에만 가능합니다. mql 컴파일러가 이미 "네이티브" 기능에 대해 이론적으로 가능하지만 코드를 너무 깊이 파고 있는지 확신할 수 없습니다.

PPS/ ArrayRange()가 있는 예제는 매우 정확하지 않습니다. 아마도 직접적인 함수 호출이 없을 것이기 때문입니다. 컴파일러는 배열에 대한 모든 것을 알고 있기 때문에 i를 내부 배열 변수와 비교하도록 간단히 줄여야 합니다.

음, 이 옵션을 사용하겠습니다. 5 + 5 * 5라는 표현식이 있습니다.

첫 번째 옵션.

i=0,i<(5+5*5), 증가, 다음

i<(5+5*5), 증가, 그 다음

i<(5+5*5), 증가하므로 결과가 나타납니다.

두 번째 옵션.

또는 이 계산에서 5 + 5 * 5 이 한 번 반환됩니다. 30을 반환하고 기계가 이 30을 기억하고 다음과 같이 나타납니다.

i=0,i<(반환 값) i.e. i<30, 증분, 추가(30을 어디에도 저장하지 않았기 때문에 기계는 30을 자동으로 기억합니다)

i<30, 증분, 다음

i<30, 증가하므로 결과가 나타납니까?

나는 그것이 첫 번째 옵션이 될 것이라고 이해합니까? 5+5*5 루프의 각 패스에서 이 표현식은 프로그램이 이 표현식을 계산합니다. 루프 전에 이 표현식을 계산하고 30을 변수에 저장하고 기계의 루프에 대입할 수 있습니다. 물론 이 30k를 자동으로 계산하고 자체적으로 기억하지 않는 한 말입니다.


함수 호출이 없으면 컴파일러는 논리식 i<5를 확인할 수 없습니다. 즉, 첫 번째 옵션이 실행될 것입니다.

 

함수의 결과( ArrayRange )는 루프 내에서 또는 함수에 의해 변경될 수 있습니다.
그리고 상수 표현식 (5+5*5) 은 항상 동일합니다.

따라서 함수는 각 패스에서 계산됩니다.
그리고 상수 값은 컴파일하는 동안 컴파일러에 의해 코드로 대체됩니다.

 
Taras Slobodyanik :

함수의 결과( ArrayRange )는 루프 내에서 또는 함수에 의해 변경될 수 있습니다.
그리고 상수 표현식 (5+5*5) 은 항상 동일합니다.

따라서 함수는 각 패스에서 계산됩니다.
그리고 상수 값은 컴파일하는 동안 컴파일러에 의해 코드로 대체됩니다.

5 + 5 * 5 또한 표현식이며 각 패스에서 계산해야 합니다. 함수의 경우 동일한 결과를 반환해야 합니다. 루프의 각 패스에서 컴파일러는 여전히 함수와 표현식 5 + 5 * 5를 모두 계산합니다. 따라서 첫 번째 옵션이 있습니다. 즉. 계산은 루프의 각 패스에서 수행되므로 루프 전에 이 값을 계산하고 변수에 저장하고 변수를 동일한 정적 값으로 사용하여 루프의 각 패스에서 계산이 발생하지 않도록 하는 것이 좋습니다. 이것은 궁극적으로 프로그램의 성능에 영향을 줄 수 있습니다.

정수 k=5+5*5; //k=30  

for(int i=0;i<k;i++){}

여기서 k는 항상 30 또는

int k= ArrayRange (arr2,0) //k=5  

for(int i=0;i<k;i++){}

여기서 k는 항상 5입니다.

 
Seric29 :

5 + 5 * 5 또한 표현식이며 각 패스에서 계산해야 합니다. 함수의 경우 동일한 결과를 반환해야 합니다. 루프의 각 패스에서 컴파일러는 여전히 함수와 표현식 5 + 5 * 5를 모두 계산합니다. 따라서 첫 번째 옵션이 있습니다. 즉. 계산은 루프의 각 패스에서 수행되므로 루프 전에 이 값을 계산하고 변수에 저장하고 변수를 동일한 정적 값으로 사용하여 루프의 각 패스에서 계산이 발생하지 않도록 하는 것이 좋습니다. 이것은 궁극적으로 프로그램의 성능에 영향을 줄 수 있습니다.

잉크 = 5+5*5; //k=30  

for(int i=0;i<k;i++){}

여기서 k는 항상 30 또는

int k= ArrayRange(arr2,0) //k=5  

for(int i=0;i<k;i++){}

여기서 k는 항상 5입니다.

루프를 확장하기만 하면 불필요한 변수를 만들지 않아도 됩니다.

 
Seric29 :

5 + 5 * 5 또한 표현식이며 각 패스에서 계산해야 합니다. 함수의 경우 동일한 결과를 반환해야 합니다. 루프의 각 패스에서 컴파일러는 여전히 함수와 표현식 5 + 5 * 5를 모두 계산합니다. 따라서 첫 번째 옵션이 있습니다. 즉. 계산은 루프의 각 패스에서 수행되므로 루프 전에 이 값을 계산하고 변수에 저장하고 변수를 동일한 정적 값으로 사용하여 루프의 각 패스에서 계산이 발생하지 않도록 하는 것이 좋습니다. 이것은 궁극적으로 프로그램의 성능에 영향을 줄 수 있습니다.

컴파일러는 텍스트를 코드로 컴파일할 때 항상 한 번만 작동합니다.
(내가 기억하는 한 MT4는 코드로 직접 컴파일하기도 함)

5+5*5는 상수가 있는 표현식이므로 다시 계산할 필요가 없습니다. 따라서 컴파일 시 한 번만 계산되며 코드에서 숫자는 30이 됩니다.

5+5*5+i는 변수가 있는 표현식이며 각 패스의 코드에서 30+i로 계산됩니다.

ArrayRange 함수는 값을 반환하고 컴파일러는 이 값이 무엇인지 알지 못하므로 코드에 대한 함수 호출을 대체하고 각 패스(코드에서) 에서 함수 가 호출됩니다.
 
Taras Slobodyanik :

컴파일러는 텍스트를 코드로 컴파일할 때 항상 한 번만 작동합니다.
(내가 기억하는 한 MT4는 코드로 직접 컴파일하기도 함)

5+5*5는 상수가 있는 표현식이므로 다시 계산할 필요가 없습니다. 따라서 컴파일 시 한 번만 계산되며 코드에서 숫자는 30이 됩니다.

5+5*5+i는 변수가 있는 표현식이며 각 패스의 코드에서 30+i로 계산됩니다.

ArrayRange 함수는 컴파일러가 이 값이 무엇인지 알지 못하는 값을 반환하므로 코드에 대한 함수 호출을 대체하고 각 패스(코드에서) 에서 함수 가 호출됩니다.

분명한. 고맙습니다. 질문은 확실히 심각하지 않지만 뉘앙스가 있습니다.

 
Artyom Trishkin :

루프를 확장하기만 하면 불필요한 변수를 만들지 않아도 됩니다.

제 경우에는 2개의 수학 표현식이 있습니다. 첫 번째 - ArrayRange(arr2,0) 두 번째 5+5*5 내 목표는 컴파일러가 더 적은 부하로 작동할 조건을 만드는 것입니다.

for(int i=0;i<ArrayRange(arr2,0);i++) 이 경우 각 패스에서 비교 값이 반환 됩니다.

int k=ArrayRange(arr2,0)//k=5 for(int i=0;i<k;i++){} 이 경우 비교값은 4번이 아닌 1번 반환되지만 변수가 생성됨 , 그럼에도 불구하고 여기에는 부하가 적습니다. 특히 수천 또는 수백만의 경우에는 더욱 그렇습니다.

변수를 생성하지 않도록 루프를 확장하는 방법을 보여줍니까?