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

 
Maxim Kuznetsov :

Alert("Разбег "+DoubleToString(delta,_Digits));

또는 Alert(StringFormat("%.5f 실행",delta));

일반적으로 익숙해지면 동일한 숫자의 다른 표현일 뿐입니다. 멋진 학창 시절을 기억하십시오 - 이것은 거기에서 왔습니다.

고맙습니다. 델타 값을 숫자로 사용하고 비교해야 하는 경우 어떻게 합니까? 예를 들어.

 if (delta> 0.00005 )
  {
   //------------
  }
맞을까?
 
prom18 :

고맙습니다. 델타 값을 숫자로 사용하고 비교해야 하는 경우 어떻게 합니까? 예를 들어.

맞을까?

다음과 같이 두 개의 실수를 비교할 수 있습니다.

 bool EqualDoubles( double d1, double d2, double epsilon)
  {
   if (epsilon< 0 ) 
      epsilon=-epsilon;
//---
   if (d1-d2>epsilon) 
       return false ;
   if (d1-d2<-epsilon) 
       return false ;
//---
   return true ;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij :

다음과 같이 두 개의 실수를 비교할 수 있습니다.

https://www.mql5.com/ru/docs/basis/types/double

당신은 그들이 가치에 매우 근접할 수 없다고 확신한다면 할 수 있습니다. 결국, 부드러움은 따뜻함과 비교됩니다.
 
Alexey Viktorov :
당신은 그들이 가치에 매우 근접할 수 없다고 확신한다면 할 수 있습니다. 결국, 부드러움은 따뜻함과 비교됩니다.

이해하지 못했습니다. 예를 들어. 나는 가격이 한 틱에 지나간 포인트의 수를 취합니다. 가격이 20포인트 이상 넘어가면 Alert 팝업창이 뜹니다.

가격 차이(1.12300-1.12321=0.00021)를 필요한 최대 값(0.00020)과 비교한 것으로 나타났습니다.

0.00021>0.00020.

부드럽고 따뜻한 것은?

 
prom18 :

이해하지 못했습니다. 예를 들어. 나는 가격이 한 틱에 지나간 포인트의 수를 취합니다. 가격이 20포인트 이상 넘어가면 Alert 팝업창이 뜹니다.

가격 차이(1.12300-1.12321=0.00021)를 필요한 최대 값(0.00020)과 비교한 것으로 나타났습니다.

0.00021>0.00020.

부드럽고 따뜻한 것은?

펀트가 필요하므로 포인트를 비교하십시오. 그건 그렇고, 그들은 전체입니다.

그리고 double은 엡실론 내에서 비교됩니다(메모리가 제공되는 경우 DBL_EPS). 그렇지 않으면 3.0-0.2 > 2.0+0.8(비유적으로 숫자가 다를 수 있음)로 판명될 수 있습니다.

 
Maxim Kuznetsov :

펀트가 필요하므로 포인트를 비교하십시오. 그건 그렇고, 그들은 전체입니다.

그리고 double은 엡실론의 정확도(메모리가 제공되는 경우 DBL_EPS)와 비교됩니다. 그렇지 않으면 3.0-0.2 > 2.0+0.8이 될 수 있습니다(비유적으로 숫자가 다를 수 있음)

다음 목적을 위해 @fxsaber 예제를 사용하는 것이 좋습니다.

 int PriceToInteger( const double Price, const double point )
{
   return (( int )(Price / point + 0.1 ));
}

확인할 스크립트:

 //+------------------------------------------------------------------+
void OnStart ()
{
   int bar1 = PriceToInteger( iClose ( NULL , 0 , 1 ), _Point );
   int bar2 = PriceToInteger( iClose ( NULL , 0 , 2 ), _Point );
   printf ( "bar2 - bar1 = %i point" , bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return (( int )(Price / point + 0.1 ));
}
//+------------------------------------------------------------------+
 
prom18 :

이해하지 못했습니다. 예를 들어. 나는 가격이 한 틱에 지나간 포인트의 수를 취합니다. 가격이 20포인트 이상 넘어가면 Alert 팝업창이 뜹니다.

가격 차이(1.12300-1.12321=0.00021)를 필요한 최대 값(0.00020)과 비교한 것으로 나타났습니다.

0.00021>0.00020.

부드럽고 따뜻한 것은?

글쎄, 때때로 당신은 쓰여진 모든 것을 읽을 필요가 없습니다.

일반적으로 시스템이 나타내는 숫자를 사용했습니다. 이것들을 가져 가라

   double a= 1.12328 ,
         b= 1.12309 ,
         c= 0.00019 ,
         d=a-b;

그리고 얻다

 1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

이론상 ab == c이지만 컴퓨터는 이러한 오류를 제공합니다. 포럼, 검색 및 읽기에서 이에 대해 많이 작성되었습니다.

그러나 정규화 된 차이와 정규화 된 제어 값을 가져와 비교할 수 있습니다.

 
Иван :
모두들 좋은 시간 되세요. 질문: MT4에서 십자형(달러 없는 쌍)이 있는 테스터에서 작업할 때 테스트 중인 계정이 달러인 경우 테스터는 마감된 위치 의 결과를 어떻게 계산합니까? 총포지션을 달러로 환산하는 테스터는 현재 시점의 달러에 대한 크로스의 기준 통화 의 환율을 취합니까, 아니면 연구 구간의 순간에 환율을 취합니까? 나는 현시점에서 그것을 강력히 의심한다. 그렇다면 간격 시간에 강제로 계산할 수 있습니까?
아는 사람 있나요?
 
Иван :
아는 사람 있나요?

각 틱 에 대해 MODE_TICKVALUE 자체를 계산합니다.

 
Alexey Viktorov :
당신은 그들이 가치에 매우 근접할 수 없다고 확신한다면 할 수 있습니다. 결국, 부드러움은 따뜻함과 비교됩니다.

prom18 이 Digits 문자 내에서 두 숫자를 비교해야 하는 경우 이 방법만 적합합니다.

 double price1 = 1.23450 ;
double price2 = 1.23447 ;

if (EqualDoubles(price1, price2, (( _Digits == 4 ) ? 0.0100 : 0.00100 )) {
  ...
}

그러나 보시 다시피 https://www.mql5.com/ru/forum/160683/page1205#comment_17247843 에서 더 많이 퍼졌습니다. 따라서 예제에서는 의도적으로 비교 정확도를 두 자릿수로 줄였습니다. 물론 가격 값의 이러한 스프레드는 다소 부정확합니다. 그러나 그러한 경우에 두 숫자를 비교하는 다른 방법은 무엇입니까?... 편차가 Digits에 대한 것이라면 EqualDoubles를 사용할 수 없지만 불필요한 모든 것을 차단합니다. NormalizeDouble 사용

그러나 다음과 같이 할 수도 있습니다.

 int digits = Digits () - 2 ;

double price1 = NormalizeDouble ( 1.23450 , digits);
double price2 = NormalizeDouble ( 1.23447 , digits);

if (price1 == price2) {
  ...
}