가격 수 != 가격 ? - 페이지 2

 

비교를 위한 것이라면 쉽게 고유한 함수를 만들 수 있습니다.

 bool checkDoubles( double a, double b, string check)
{
if (check== ">" ){
if (a - b > Point / 2 ) return ( 1 ); else return ( 0 );
} else if (check== "<" ){
if (b - a > Point / 2 ) return ( 1 ); else return ( 0 );
} else if (check== ">=" ){
if (a - b > - Point ) return ( 1 ); else return ( 0 );
} if (check== "<=" ){
if (b - a > - Point ) return ( 1 ); else return ( 0 );
} else if (check== "!=" ){
if ( MathAbs (a - b) > Point / 2 ) return ( 1 ); else return ( 0 );
} else {
Print ( "Sorry you've entered a wrong check value" );
}
return ( 0 );
}

그냥 생각입니다.

 
heelflip43 :

비교를 위한 것이라면 쉽게 고유한 함수를 만들 수 있습니다.

그냥 생각입니다.


좋은 생각이네요 감사합니다 :-)
 

"Point" 또는 "Point/2.0"의 사용은 그다지 좋은 차이 값이 아닙니다, IMO. NormalizeDouble에 의해 도입된 반올림 오류(오늘까지 불타버렸습니다)는 확실히 8자리, 15자리보다 훨씬 작습니다.

이전 팁을 감안하고 아직 엄격하게 테스트되지는 않았지만 일부 변경을 수행하고 잘 작동하는 것처럼 보이는 다음 루틴을 구성했습니다("diff"를 소수점 이하 15자리까지 사용하는 경우에도).

 //+------------------------------------------------------------------+
bool AvsB( double A, string checkStr, double B)
{
   //checkStr = StringTrimLeft(StringTrimRight(checkStr));
   double diff = 0.000000000000001 ; // 15 decimal places
   //double diff = 0.000000005;
   //double diff = 0.00000001;
   if      (checkStr == ">" ){ if (A - B >  diff) return ( true ); else return ( false );}
   else if (checkStr == "<" ){ if (B - A >  diff) return ( true ); else return ( false );}
   else if (checkStr == ">=" ){ if (A - B > -diff) return ( true ); else return ( false );}
   else if (checkStr == "<=" ){ if (B - A > -diff) return ( true ); else return ( false );}
   else if (checkStr == "!=" ){ if (MathAbs(A - B) >  diff) return ( true ); else return ( false );}
   else if (checkStr == "=" || checkStr == "==" ){ if (MathAbs(A - B) <  diff) return ( true ); else return ( false );}
   else {Print( "Sorry, bad usage: AvsB(A, checkStr, B).  Wrong checkStr value: " ,checkStr);}
   return ( false );
} // end of AvsB
//+------------------------------------------------------------------+

Here is a check of the obvious:

   if ( 1.34929 == NormalizeDouble ( 1.34929 , 5 ))   Alert ( "MT4 Pass" );
   else Alert ( "MT4 FAIL.  ROUNDOFF BUG" );     // Yes, this is what MT4 does, a fail.

   if (AvsB( 1.34929 , "==" , NormalizeDouble ( 1.34929 , 5 )))   Alert ( "AvsB Pass" );   // It does pass using the AvsB routine!
   else Alert ( "AvsB FAIL.  ROUNDOFF BUG" ); 
 

다음은 비교할 수 있지만 내부적으로 A 및/또는 B를 정규화할 수 있고 비교 차이(AB 또는 BA)를 "숫자"를 기반으로 더 큰 숫자로 완화할 수 있는 또 다른 가능한 루틴입니다. 위의 간단한 "AvsB"와 비교하여 이 루틴이 필요한지 의심되지만 원하는 대로 사용할 수 있도록 제공됩니다.

 //+------------------------------------------------------------------+
bool AvsB_nA_nB_digits( double A, string checkStr, double B, bool normalizeA, bool normalizeB, int digits)
{
   //checkStr = StringTrimLeft(StringTrimRight(checkStr));
   if (normalizeA) A = NormalizeDouble(A,MathMin( 8 ,digits));
   if (normalizeB) B = NormalizeDouble(B,MathMin( 8 ,digits));
   
   double diff;
   switch (digits)
   {
       case 0   : diff = 0.5 ; break ; // Or 1.0 ??
       case 1   : diff = 0.1 ; break ;
       case 2   : diff = 0.01 ; break ;
       case 3   : diff = 0.001 ; break ;
       case 4   : diff = 0.0001 ; break ;
       case 5   : diff = 0.00001 ; break ;
       case 6   : diff = 0.000001 ; break ;
       case 7   : diff = 0.0000001 ; break ;
       case 8   : diff = 0.00000001 ; break ;
       case 9   : diff = 0.000000001 ; break ;
       case 10 : diff = 0.0000000001 ; break ;
       case 11 : diff = 0.00000000001 ; break ;
       case 12 : diff = 0.000000000001 ; break ;
       case 13 : diff = 0.0000000000001 ; break ;
       case 14 : diff = 0.00000000000001 ; break ;
       default : diff = 0.000000000000001 ; break ; // 15 decimal places max (I think)
   }
   
   if      (checkStr == ">" ){ if (A - B >  diff) return ( true ); else return ( false );}
   else if (checkStr == "<" ){ if (B - A >  diff) return ( true ); else return ( false );}
   else if (checkStr == ">=" ){ if (A - B > -diff) return ( true ); else return ( false );}
   else if (checkStr == "<=" ){ if (B - A > -diff) return ( true ); else return ( false );}
   else if (checkStr == "!=" ){ if (MathAbs(A - B) >  diff) return ( true ); else return ( false );}
   else if (checkStr == "=" || checkStr == "==" ){ if (MathAbs(A - B) <  diff) return ( true ); else return ( false );}
   else {Print( "Sorry, bad usage: AvsB(A, checkStr, B).  Wrong checkStr value: " ,checkStr);}
   return ( false );
} // end of AvsB_nA_nB_digits
//+------------------------------------------------------------------+
 
pips4life :

"Point" 또는 "Point/2.0"의 사용은 그다지 좋은 차이 값이 아닙니다, IMO. NormalizeDouble에 의해 도입된 반올림 오류(오늘까지 불타버렸습니다)는 확실히 8자리, 15자리보다 훨씬 작습니다.

반올림 오차로 간주할 수 없는 가장 큰 값, 또는 동등하게 가격 변동 으로 간주할 수 없는 가장 작은 값을 원합니다. 가격은 포인트의 배수로만 변경될 수 있으므로 포인트/2가 바로 그것입니다.

중개인의 두 배 값은 1.23457500000000000에서 1.2345849999999999 사이일 수 있으며 여전히 동일한 1.23458 가격으로 간주됩니다.

이것을 사용했다면 문제가 없었을 것입니다.

 if (a > b)
 if (a - b > Point / 2 .)
 if (a >= b)
 if (a - b > - Point /2.)
 if (a != b)
 if ( MathAbs (a - b) > Point / 2 .)
 

normalisedouble 사용을 피해야 합니까 ??

아니면.. MathRound 함수 를 사용할 수 있다고 생각합니다.

전 . 더블 x= ( MathRound ( 1.37883 * 100000)) / 100000 ;

그래서 우리는 기능을 만들 수 있습니다

 double round ( double value )

{ int D= MathPow ( 10 , Digits );

double x =  ( MathRound (value * D)) / D ;

return (x);

} 
 
*두 손가락으로 넥타이를 제자리로 흔듭니다* double이 있는 모든 곳이 아니라 double 값과 관련된 계산에서만 normalize double을 사용하십시오.
 
tonny :
*두 손가락으로 넥타이를 제자리로 흔듭니다* double이 있는 모든 곳이 아니라 double 값을 포함하는 계산에서만 normalize double을 사용하십시오.
또는 NormalizeDouble() 을 전혀 사용하지 마십시오. 사용할 때 대부분 사용할 필요가 없습니다. . . 오류 4107은 NormalizeDouble()을 사용하여 해결할 수 있지만 다른 방법이 있습니다. 사전 정의된 변수 또는 시계열 함수 에서 오는 모든 가격은 정규화될 필요가 없으며 정수에 Point를 곱한 결과도 마찬가지입니다.
 
WDholic :

normalisedouble 사용을 피해야 합니까 ??

아니면.. MathRound 함수를 사용할 수 있다고 생각합니다.

전 . 더블 x= ( MathRound ( 1.37883 * 100000)) / 100000 ;


당신은 여전히 두 배와 가격의 가능성으로 끝납니다!= 가격

double 을 비교하기 위해 double 을 int 로 바꾸는 이 솔루션에 도달했습니다. . .

 int Flat( double ValueToFlatten)
   {
   double Power = MathPow ( 10 , Digits );
   int ReturnValue;
   
   ReturnValue = MathRound (Power * (ValueToFlatten + ( 4.9 / (Power* 10 ) ) ) ) ;
   return (ReturnValue);
   
   }

하도록 하다 . . .

Flat(price) != Flat(price)

절대 사실이 아닙니다.

 
간단한 솔루션 대신 많은 계산에서