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

 
Kira27 :

나를 혼미하게 만드는 데 도움이))))

설명서에는 따옴표 없이 말합니다. 그래서 당신은 거기에 자신을 넣어.

 
수염 난 질문입니다. 하지만 나는 이 결과가 이해가 되지 않는다.
 void OnStart ()
{
   Print ( NormalizeDouble ( 1.79435 , 5 ) == 1.79435 ); // false   
}
 
fxsaber :
수염 난 질문입니다. 하지만 나는 이 결과가 이해가 되지 않는다.

"정확한 이중 비교를 사용하지 말고 엡실론을 사용하십시오"라는 말이 100번 있었습니다. 문서에 포함됩니다.

0.3이나 0.7도 그들의 표현과 비교할 수 없습니다. 수락하고 화해하십시오. 또는 가서 공부하십시오(예: MTI에서)

 
Slava :

"정확한 이중 비교를 사용하지 말고 엡실론을 사용하십시오"라는 말이 100번 있었습니다. 문서에 포함됩니다.

물론 내가 할 수 있는 복식 비교.

0.3이나 0.7도 그들의 표현과 비교할 수 없습니다. 수락하고 화해하십시오. 또는 가서 공부하십시오(예: MTI에서)

 Print ( NormalizeDouble ( 0.3 , 5 ) == 0.3 ); // true
Print ( NormalizeDouble ( 0.7 , 5 ) == 0.7 ); // true

Print ( NormalizeDouble ( 0.12345 , 5 ) == 0.12345 ); // true

질문을 이해하지 못했습니다.

 
십진수는 일을 더 쉽게 만들 수 있지만 느립니다(
 
fxsaber :

물론 내가 할 수 있는 복식 비교.

질문을 이해하지 못했습니다.

여기에 더 많은 뉘앙스가 있습니다.

0.5를 곱한 실수는 2.0으로 나눈 동일한 숫자와 비교할 수 없습니다.

 
Slava :

여기에 더 많은 뉘앙스가 있습니다.

0.5를 곱한 실수는 2.0으로 나눈 동일한 숫자와 비교할 수 없습니다.

그런거야. 그러나 문제는 왜 숫자 1.79435가 소수점 이하 다섯 번째 자리로 정규화되지 않았습니까?


질문의 ZY 선사시대.

SL은 테스터에서 일했습니다. DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0( MT5에서 일반적으로 사용됨), DEAL_COMMENT = "sl 1.79435".

SL 수행 중 슬립이 있었는지 여부를 이해해야 했습니까? 그래서 댓글에 있는 가격과 DEAL_PRICE를 간단하게 비교해봤습니다. 내 눈으로 보니 가격은 똑같지만 MQL은 그렇지 않다고 한다. 결과적으로 나는 원래 비교의 맨 아래에 도달했습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2020.08.10 09:04

 void OnStart ()
{
   Print ( NormalizeDouble ( 1.79435 , 5 ) == 1.79435 ); // false   
}
 
fxsaber :

그런거야. 그러나 문제는 왜 숫자 1.79435가 소수점 이하 5자리로 정규화되지 않았는지였습니다.


질문의 ZY 선사시대.

SL은 테스터에서 일했습니다. DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0( MT5에서 일반적으로 사용됨), DEAL_COMMENT = "sl 1.79435".

SL 수행 중 슬립이 있었는지 여부를 이해해야 했습니까? 그래서 댓글에 있는 가격과 DEAL_PRICE를 간단하게 비교해봤습니다. 눈으로 보니 가격은 똑같지만 MQL은 그렇지 않다고 합니다. 결과적으로 나는 원래 비교의 바닥에 도달했습니다.

미안하지만, 당신에게서 이것을 듣는 것은 어쩐지 이상합니다.


 
Alexey Viktorov :

미안하지만, 당신에게서 이것을 듣는 것은 어쩐지 이상합니다.

내 질문을 반복합니다.

fxsaber :

숫자 1.79435가 소수점 이하 5자리로 정규화되지 않은 이유는 무엇입니까?

 void OnStart ()
{
   const double Norm = NormalizeDouble ( 1.79435 , 5 );
  
   Print (( double )( string )Norm == Norm);     // false
   Print (( double )( string )Norm == 1.79435 ); // true
}
 
fxsaber :

그런거야. 그러나 문제는 왜 숫자 1.79435가 소수점 이하 5자리로 정규화되지 않았는지였습니다.

정규화는 반올림이 아닙니다.

@Slava 는 double의 내부 표현이 다르다고 씁니다.

 #define PRINT(EX) Print ( #EX, " = " ,EX)
//+------------------------------------------------------------------+
void OnStart ()
{
   union ULONG_DOUBLE
   {
       double d_value;
       ulong ul_value;
   }tmp;
   double NORM_DOUBLE   = NormalizeDouble ( 1.79435 , 5 );
   double CONST_DOUBLE  = 1.79435 ;
   
   PRINT(NORM_DOUBLE);
   tmp.d_value = NORM_DOUBLE;
   PRINT(LongToHex(tmp.ul_value));
   
   tmp.d_value = CONST_DOUBLE;
   PRINT(CONST_DOUBLE);
   PRINT(LongToHex(tmp.ul_value));
}
//+------------------------------------------------------------------+
string LongToHex( const ulong value)
{
   return ( StringFormat ( "%llX" , value));
}
//+------------------------------------------------------------------+

2020.08.10 13:33:37.737 tst_normalize(EURUSD,H1) NORM_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize(EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD A

2020.08.10 13:33:37.737 tst_normalize(EURUSD,H1) CONST_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize(EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD 9


추신: @Nikolai Semko의 좋은 게시물이 어딘가에 있었는데, 그는 double로 작업을 아주 잘 설명했습니다. 아마도 링크를 찾아서 게시할 것입니다.

UPD: https://www.mql5.com/ru/forum/1111/page2623#comment_14473837