오류, 버그, 질문 - 페이지 107

 
Yedelkin :
simpleton , 나도 비슷한 경로를 따랐지만 int를 입력하기 위해 명시적 캐스트를 사용했습니다. 나는 가능한 최대 로트 크기가 브로커/딜러 또는 자체 자금의 크기에 의해 제한된다는 사실에서 진행했습니다. 이와 관련하여 int를 사용하면 충분합니다. 이 접근 방식(int로 "아래에서" 반올림)에 함정이 있다고 생각합니까?

실제 거래의 경우 가장 가능성이 높습니다. 예, int / uint이면 충분합니다.

그러나 테스터에서 운전하면 일부 실험에서는 충분하지 않을 수 있습니다.

수식의 정수 N이 0..INT_MAX 범위에 들어가고 오버플로가 없음을 보장하는 경우 int를 사용할 때 MQL5 구현에서 가능한 다음 결함을 제외하고는 함정이 없습니다. 즉, 수표를 교체하십시오.

tmp < ULONG_MAX * stepvol


tmp < INT_MAX * stepvol

실제로 int 유형은 서명되고 가능한 값의 절반은 음수 영역에 있으며 여기에는 항상 음수가 아닌 값이 있습니다. 크기는 같지만 음수가 아닌 범위의 두 배인 부호 없는 단위가 있는 경우 int를 사용하는 것은 의미가 없습니다. 따라서 int / uint에서 멈추면 uint를 선택하고 검사를 각각 다음으로 바꾸는 것이 좋습니다.

tmp < UINT_MAX * stepvol
 

gumgum :

 #property script_show_inputs

팁 고마워.
 
simpleton :

실제 거래의 경우 가장 가능성이 높습니다. 예, int / uint이면 충분합니다.

..사실, int 유형 은 부호가 있고 가능한 값의 절반은 음수 영역에 있으며 여기에는 항상 음수가 아닌 값이 있습니다. 크기는 같지만 음수가 아닌 범위의 두 배인 부호 없는 단위가 있는 경우 int를 사용하는 것은 의미가 없습니다. 따라서 int / uint에서 멈추면 uint를 선택하고 검사를 각각 다음으로 바꾸는 것이 좋습니다.

네 알겠습니다 감사합니다!
 

이것은 버그가 아니라 유형에 대한 흥미로운 관찰 경고입니다.

얼마나 많은 것이 2의 2배가 될 것이라고 생각하십니까? 2*2

4 아마도 당신이 옳다고 생각하십시오!

좋아 그래서
이십만 이십만

200000 * 200000

예, 모든 학생은 2를 곱하여 4를 얻습니다. 예, 0을 더하고 다음을 얻습니다.

40000000000.

이제 기계 언어로 된 간단한 코드

긴 로트 = 200000*200000;

값을 취하는 변수의 유형이 길다는 점에 유의하십시오.
최소값은 -9 223 372 036 854 775 808이고 최대값은 9 223 372 036 854 775 807입니다.

우리는 결과를 인쇄하고

많은 = 1345294336
그것은 둘과 둘과는 거리가 멀고 둘을 갖게 될 것입니다.

유형 및 유형 캐스팅 에 대한 도움말 섹션을 다시 읽었습니다.
일반 숫자도 원하는 유형으로 명시적으로 캐스트해야 한다는 정보는 어디에서도 찾지 못했습니다.

즉, 맞아야 한다

롱 랏 = (롱) 200000 * (롱) 200000;

또는 보조 변수를 사용할 수도 있습니다.

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 

뿐만 아니라.

일부 속성을 가져오고 큰 수로 곱하려면 ....

다음은 코드입니다.

 long A = AccountInfoInteger ( ACCOUNT_LOGIN );   // 661701
long B = A;
long C = 661701 ;
Print ( " A=" ,A, "  B=" ,B, "  C=" ,C);
long X = 10000 ;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print ( " L1=" ,L1, "   L2=" ,L2, "   L3=" ,L3);

그리고 여기 결과가 있습니다

L1= 2322042704    L2= 2322042704    L3= 6617010000
A = 661701         B = 661701       C = 661701
입력은 같지만 결과가 다릅니다.
파일:
servis.mq5  2 kb
 

SHOOTER777 :

이제 기계 언어로 된 간단한 코드

긴 로트 = 200000*200000;

값을 취하는 변수의 유형이 길다는 점에 유의하십시오.
최소값은 -9 223 372 036 854 775 808이고 최대값은 9 223 372 036 854 775 807입니다.

우리는 결과를 인쇄하고

많은 = 1345294336
그것은 둘과 둘과는 거리가 멀고 둘을 갖게 될 것입니다.

유형 및 유형 캐스팅 에 대한 도움말 섹션을 다시 읽었습니다.
일반 숫자도 원하는 유형으로 명시적으로 캐스트해야 한다는 정보는 어디에서도 찾지 못했습니다.

즉, 맞아야 한다

롱 랏 = (롱) 200000 * (롱) 200000;

또는 보조 변수를 사용할 수도 있습니다.

"정규 숫자"는 유형이 있는 상수 표현식입니다. 이 경우 유형은 int입니다.

각각 int 유형인 두 하위 표현식의 곱으로 구성된 표현식도 int 유형입니다. 여기서 오버플로가 발생합니다.

그리고 나서야 long 유형의 변수를 초기화할 때 표현식 유형에서 int 유형으로 암시적 캐스트가 발생합니다.

여기 모든 것이 깨끗합니다. 그런데 이 경우 피연산자를 long 유형으로 캐스팅할 필요가 없습니다. 하나를 가져 오는 것으로 충분하며 두 번째는 암시 적으로 제공됩니다.

 
SHOOTER777 :

뿐만 아니라.

일부 속성을 가져오고 큰 수로 곱하려면 ....

다음은 코드입니다.

그리고 여기 결과가 있습니다

입력은 같지만 결과가 다릅니다.

로그와 코드가 섞인 것 같습니다. 주어진 코드는 "깨끗하게" 작동합니다. 그리고 이러한 로그를 얻으려면 int 또는 uint 유형의 변수 A와 B와 uint 유형의 X 변수를 만들어야 했습니다 .

 void OnStart ()
{
int A = 661701 ;
int B = A;
long C = 661701 ;
Print ( " A=" ,A, "  B=" ,B, "  C=" ,C);
uint X = 10000 ;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print ( " L1=" ,L1, "   L2=" ,L2, "   L3=" ,L3);
}

/* Вывод в лог (хронология - сверху вниз):
KO      0       1 (EURUSD,M15)  00:46:28         A=661701  B=661701  C=661701
OE      0       1 (EURUSD,M15)  00:46:28         L1=2322042704   L2=2322042704   L3=6617010000
*/

다음은 원본 코드의 작업입니다.

 void OnStart ()
{
long A = 661701 ;
long B = A;
long C = 661701 ;
Print ( " A=" ,A, "  B=" ,B, "  C=" ,C);
long X = 10000 ;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print ( " L1=" ,L1, "   L2=" ,L2, "   L3=" ,L3);
}

/* Вывод в лог (хронология сверху вниз):
DL      0       1 (EURUSD,M15)  00:49:13         A=661701  B=661701  C=661701
HG      0       1 (EURUSD,M15)  00:49:13         L1=6617010000   L2=6617010000   L3=6617010000
*/

빌드 314(2010년 8월 20일).

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 

예를 들어, 어떤 지표의 값을 얻어야 한다고 말해주세요. 예전에는 내장 함수를 이용해서 정확히 받고 보장받았습니다. 이제 많은 코드, 핸들 버퍼 등을 사용하여 직접 작성해야 합니다. 하지만! 이 경우에는 아닙니다. 나에게 가장 중요한 것은 오류가 발생했는지 여부를 코드의 모든 줄에서 확인해야 하기 때문에 모든 줄에서 문자 그대로 코드가 버그가 있다는 것입니다. 기본적이지만 속도, 안정성 등을 높이기 위해 번거롭고 불편한 작업이 되었습니다. 20개의 신호에 대한 기사를 읽고 있습니다... 다음과 같이 말합니다.

"지표 값을 계산하는 데 시간이 걸리므로 지표 데이터를 생성한 직후에 액세스할 수 없습니다. 따라서 OnInit() 에서 지표 핸들을 생성하는 것이 가장 좋습니다."

다음으로 각 줄을 확인합니다.

"확인해 봅시다. 필요한 것보다 데이터가 적다면 복사하는 동안 오류가 발생했음을 의미하며 데이터를 저장해야 하는 배열에 추가로 액세스하면 오류가 발생합니다. 이를 제외하기 위해 함수를 종료합니다. "

즉, 속도 대신 결과를 얻으려면 이 함수를 통해 루프(몇 번?) ... 이것은 각 값에 대해 별도의 함수입니다... 추가 변수와 코드가 많이 있습니다...

간략하게 설명하고 링크를 제공하고 이 모든 것의 의미를 이해하고 싶습니다.

그리고 레퍼런스의 MKL4에서 MKL5로의 전환 섹션에 그러한 질문에 대한 답변을 넣거나 토론 없이 포럼에 적절한 섹션, 특히 질문-답변을 만들고 왜 그런지 설명하는 것이 좋을 것입니다. ... 예를 들어, 여기 에 기간에 대해 매우 명확하게 설명되어 있습니다. 여기에서도 마찬가지로 기본 질문에 대한 답변을 받고 싶습니다.

 
Dmitriy2 :

예를 들어, 어떤 지표의 값을 얻어야 한다고 말해주세요. 예전에는 내장 함수를 이용해서 정확히 받고 보장받았습니다. 이제 많은 코드, 핸들 버퍼 등을 사용하여 직접 작성해야 합니다. 하지만! 이 경우에는 아닙니다. 나에게 가장 중요한 것은 오류가 발생했는지 여부를 코드의 모든 줄에서 확인해야 하기 때문에 모든 줄에서 문자 그대로 코드가 버그가 있다는 것입니다. 기본적이지만 속도, 안정성 등을 높이기 위해 번거롭고 불편한 작업이 되었습니다. 20개의 신호에 대한 기사를 읽고 있습니다... 다음과 같이 말합니다.

"지표 값을 계산하는 데 시간이 걸리므로 지표 데이터를 생성한 직후에 액세스할 수 없습니다. 따라서 OnInit() 에서 지표 핸들을 생성하는 것이 가장 좋습니다."

다음으로 각 줄에 대해 검사가 있습니다.

"확인해 봅시다. 필요한 것보다 데이터가 적다면 복사하는 동안 오류가 발생했음을 의미하며 데이터를 저장해야 하는 배열에 추가로 액세스하면 오류가 발생합니다. 이를 제외하기 위해 함수를 종료합니다. "

즉, 속도 대신 결과를 얻으려면 이 함수를 통해 루프(몇 번?) ... 이것은 각 값에 대해 별도의 함수입니다... 추가 변수와 코드가 많이 있습니다...

간략하게 설명하고 링크를 제공하고 이 모든 것의 의미를 이해하고 싶습니다.

그리고 레퍼런스의 MKL4에서 MKL5로의 전환 섹션에 그러한 질문에 대한 답변을 넣거나 토론 없이 포럼에 적절한 섹션, 특히 질문-답변을 만들고 왜 그런지 설명하는 것이 좋을 것입니다. ... 예를 들어, 여기 에 기간에 대해 매우 명확하게 설명되어 있습니다. 여기에서도 마찬가지로 기본 질문에 대한 답변을 받고 싶습니다.

더 듬직 해요? 초기화 중에 핸들을 수신하는 것이 신뢰할 수 없는 이유는 무엇입니까? 필요한 데이터를 확인하는 것이 신뢰할 수 없는 이유는 무엇입니까? 더욱이 수표의 존재가 신뢰할 수 없는 이유는 무엇입니까?

초보자에게는 쉽지 않을 수 있지만 시간이 지남에 따라 모든 것이 명확해질 것입니다 ...

 
Interesting :

더 듬직 해요? 초기화 중에 핸들을 수신하는 것이 신뢰할 수 없는 이유는 무엇입니까? 필요한 데이터를 확인하는 것이 신뢰할 수 없는 이유는 무엇입니까? 더욱이 수표의 존재가 신뢰할 수 없는 이유는 무엇입니까?

초보자에게는 쉽지 않을 수 있지만 시간이 지남에 따라 모든 것이 명확해질 것입니다 ...

이 글의 저자로서 당신을 전적으로 지지합니다. 데이터를 확인한다고 해서 프로그램 전체의 속도가 나빠지는 것은 아니고 0.01% 정도밖에 되지 않는다. 나는 그런 확인은 하지 않았지만, 사용하기 전에 데이터를 확인해야 한다는 사실은 전체의 안정성을 위한 것일 뿐이다. 그렇지 않으면 터미널이 일반적으로 충돌할 때까지 예측할 수 없는 결과가 발생할 수 있습니다.