MQL4 마스터에 대한 질문입니다. 다시 Double Compare에 대해. - 페이지 2

 
다시.

가격, 제비, 돈 - 고정 정확도.
표시기 - 부동.

이 차이는 본질적으로 두 가지를 모두 나타내기 위해 double을 사용하는 데 사용됩니다. 실제로 "프로그래밍 스타일"이라고 부르는 것을 정의합니다.
다시 말하지만 "정확함"의 기준은 사람마다 다릅니다. 예를 들어 내 개념에 따르면 NormalizeDouble ()은 가장 우스꽝스럽고 비효율적이며 따라서 절대적으로 불필요한 함수입니다.
 
komposter :
 //--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal ( double value1 , double value2 , int precision = 8 )
{
    return ( nd ( abs ( nd ( value1 , precision ) - nd ( value2 , precision ) ) , precision ) < nd ( MathPow ( 0.1 , precision ) , precision ) ) ;
}
코드는 명확하고 귀하의 예는 매우 시사적입니다! 하지만 이 난리
 nd ( MathPow ( 0.1 , precision ) , precision )
교체하는게 낫지 않을까요
 //--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal ( double value1 , double value2 , int precision = 8 )
{
    return ( nd(nd ( abs ( nd ( value1 , precision ) - nd ( value2 , precision ) ) , precision )) , precision )  == 0.0 ) ;
}
아니면 불가능합니까?
 
Irtron :
배정밀도를 사용하여 숫자를 비교하는 문제는 상당히 이해하기 어려운 문제이며 재료에 대한 기본적인 무지에서 비롯됩니다.
그러나 포럼에서 부러워하는 불변의 vylazit.
이 "문제"를 해결하는 방법에 대한 명확한 지침을 제공하거나 둘 중 하나를 제공해야 합니다 =)

일트론 :
그러나 성능 문제가 있을 것입니다.
제안은 무엇입니까(MT 개발자 수준이 아닌 사용자 수준에서)?
 
komposter :
제안은 무엇입니까(MT 개발자 수준이 아닌 사용자 수준에서)?
예를 들어 가격 때문입니다. 입찰가는 다음과 같이 묻습니다.
 int ComparePrice ( double a , double b )
{
    a -= b ;
    b = Point / 2 .;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
로트와 레벨의 모든 계산을 정수로 수행하는 것이 더 나은 경우가 많습니다. 원칙적으로 몇 배 더 빠르고 이산화 오류가 없습니다.
 
Irtron :
다시.

가격, 제비, 돈 - 고정 정확도.
표시기 - 부동.

이 차이는 본질적으로 두 가지를 모두 나타내기 위해 double을 사용하는 데 사용됩니다. 실제로 "프로그래밍 스타일"이라고 부르는 것을 정의합니다.
다시 말하지만 "정확함"의 기준은 사람마다 다릅니다. 예를 들어 내 개념에 따르면 NormalizeDouble ()은 가장 우스꽝스럽고 비효율적이며 따라서 절대적으로 불필요한 함수입니다.
최근 한 지점(정확히 기억나지 않음)에서 한 사람이 고문의 이해할 수 없는 일을 한탄했습니다. 그러나 주문에서 서버에서 가져온 가격조차도 여전히 정상화해야한다는 것이 밝혀졌습니다!!!
그 후 나는 NormalizeDouble()을 나 자신을 위한 필수 절차로 받아들였습니다. 나는 때때로 코드가 어떻게 작동하는지 정말로 이해하지 못하기 때문에 어떻게 되어야 하는지에 관심이 있습니다.
NormalizeDouble() 대신 어떤 접근 방식을 제안합니까?
 
Irtron :
퇴비통 :
제안은 무엇입니까(MT 개발자 수준이 아닌 사용자 수준에서)?
예를 들어 가격 때문입니다. 입찰가는 다음과 같이 묻습니다.
 int ComparePrice ( double a , double b )
{
    a -= b ;
    b = Point / 2 .;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
로트와 레벨의 모든 계산을 정수로 수행하는 것이 더 나은 경우가 많습니다. 원칙적으로 몇 배 더 빠르고 이산화 오류가 없습니다.
동의합니다. Omega에서는 모든 것이 INT에 있었습니다. 먼저 모든 것을 MT에서 INT로 변환한 다음 계산할 것을 제안합니까?
추신: 그리고 귀하의 ComparePrice는 매우 흥미로운 솔루션이며, 즉시 제공되지도 않았습니다.
 ComparePrice ComparePrice
 
Irtron :
다시.

가격, 제비, 돈 - 고정 정확도.
표시기 - 부동.

이 차이는 본질적으로 두 가지를 모두 나타내기 위해 double을 사용하는 데 사용됩니다. 실제로 "프로그래밍 스타일"이라고 부르는 것을 정의합니다.
다시 말하지만 "정확함"의 기준은 사람마다 다릅니다. 예를 들어 내 개념에 따르면 NormalizeDouble ()은 가장 우스꽝스럽고 비효율적이며 따라서 절대적으로 불필요한 함수입니다.

우선, Expert Advisors 몇 명을 작성하여 주문하고, 갑자기 Stop Loss가 잘못된 곳에서 1 pip으로 판명되었다는 사실에서 고객의 폭풍을 느끼며 ... 그런 다음 NormalizeDouble()의 부조리에 대해 설명하십시오. 기능, 어떻게 할 수 있는지 궁금합니다 =)
 
VBAG :
그러나 주문에서 서버에서 가져온 가격조차도 여전히 정상화해야한다는 것이 밝혀졌습니다!!!
가능성이 낮습니다(c). Offal MT zanormalizeny는 거의 더 이상 없습니다.
이해할 수없는 역사적 데이터를 테스트 할 때 고문의 이해할 수없는 작업에 대해 많은 이야기가 있었고 많은 이야기가있었습니다.
 
Irtron :
예를 들어 가격 때문입니다. 입찰가는 다음과 같이 묻습니다.
그것은 이미 뭔가입니다. 구체적인 내용이 나왔습니다 ;)
가격비교를 한다면 저와 같은 오버로드 기능은 당연히 필요하지 않습니다.

그리고 단순화된 형태에서는 ComparePrice만큼 빠르게 작동합니다.
 int start ()
{
    double a = 1.23450001 , b = 1.23449999 ;
    int start1 = GetTickCount () , c1 ;
    for ( c1 = 0 ; c1 < 100000000 ; c1 ++ ) ComparePrice ( a , b ) ;
    int end1 = GetTickCount () ;
    
    int start2 = GetTickCount () , c2 ;
    for ( c2 = 0 ; c2 < 100000000 ; c2 ++ ) equal ( a , b ) ;
    int end2 = GetTickCount () ;
 
    Print ( " ComparePrice: " , ( end1 - start1 ) , " , equal: " , ( end2 - start2 ) ) ;
 
    return ( 0 ) ;
}
 
int ComparePrice ( double a , double b )
{
    a -= b ;
    b = Point / 2 .;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
 
bool equal ( double a , double b )
{
    return ( MathAbs ( a - b ) < Point ) ;
}
2007.09.10 03:19:24 CheckCompareDoubleSpeed ​GBPUSD,일일: ComparePrice: 20922 , equal: 20453
 
Integer :

먼저 Expert Advisors 몇 명을 써서 주문하고, 갑자기 스톱로스가 엉뚱한 곳에서 1포인트가 되었다는 사실에 고객의 폭풍을 느끼며... 그런 다음 그들에게 NormalizeDouble ()의 부조리에 대해 설명하십시오. 기능, 어떻게 할 수 있는지 궁금합니다 =)

비밀을 공개하겠습니다.
나는 시작해야 할 것보다 훨씬 더 많은 맞춤형 전문가를 작성했습니다. 고객이 이유를 알려주지 않았기 때문에 나는 고객의 폭풍을 느껴본 적이 없습니다. 내 프로그램의 손절매는 필요한 곳에 보장됩니다("나타나지" 않음). 따라서 고객에게 특히 특정 기능에 대해 설명할 필요가 없습니다. 내가 보기에 주문하기 위해 고문을 쓴다는 의미는 고객에게 그런 질문과 설명을 없애는 것입니다.