mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 232

 

DBL_EPSILON의 정의에 대한 설명입니다:

void OnStart()
  {
   double epsilon = 1.0;
   while(1.0 + epsilon != 1.0)
      epsilon /= 2;
   epsilon *= 2;

   Print(epsilon);  // 2.220446049250313e-16
  }
 
fxsaber # :

이는 다음과 같은 이유로 잘못된 설명입니다.

이것은 표준 수학적 속성이 복식에 대해 보장되지 않는다는 것을 증명하는 것입니다.

제공한 예제에서는 곱셈에 '분포' 속성을 사용합니다.
 

DBL_EPSILON의 의미를 설명하는 또 다른 방법입니다:

//+------------------------------------------------------------------+
//| Returns the size of a unit in the last place (machine epsilon)   |
//| for a specified double value. This is the positive distance      |
//| between this double value and the representable value next       |
//| larger in magnitude.                                             |
//+------------------------------------------------------------------+
double machine_eps(const double value)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;
   dbl.bits++;

   return dbl.value - value;
  }

void  OnStart()
  {
   double epsilon = machine_eps(1.0);

   Print(epsilon);   // 2.220446049250313e-16
  }

DBL_EPSILON은 [1,2)의 연속된 더블 사이의 간격 크기입니다.

https://www.exploringbinary.com/the-spacing-of-binary-floating-point-numbers/

https://en.wikipedia.org/wiki/Machine_epsilon

 

DBL_EPSILON을 더 잘 이해하려면 부동 소수점 카운터를 증가시켜 보십시오:

//+------------------------------------------------------------------+
//| Advances a fp double value by a specified number of epsilons.    |
//+------------------------------------------------------------------+
double DoubleAdvance(const double value, const long distance)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;
   dbl.bits += distance;

   return dbl.value;
  }

void OnStart()
  {
   double myvalue = 1.0;
   //doubel myvalue = 1024.0;

   // Print the first 10 representable numbers from the counter
   for (int i = 0; i < 10; i++)
     {
      myvalue = DoubleAdvance(myvalue, 1);  // Increment the integer representation by 1 bit
      Print(myvalue);
     }
  }

카운터의 초기 값이 1.0인 경우 카운터의 단계 크기(엡실론)는 소수점 16번째 자리에서 2.220446049250250313e-16 (DBL_EPSILON) ≈ 2가 됩니다.

/*
1.0000000000000002
1.0000000000000004
1.0000000000000007
1.0000000000000009
1.000000000000001
1.0000000000000013
1.0000000000000016
1.0000000000000018
1.000000000000002
1.0000000000000022
*/

카운터의 초기 값이 1024인 경우 카운터의 단계 크기(엡실론 )는 소수점 13번째 자리에서 2.2737363675443232321e-13(1024 * DBL_EPSILON) ≈ 2가 됩니다.

/*
1024.0000000000002
1024.0000000000005
1024.0000000000007
1024.000000000001
1024.0000000000011
1024.0000000000014
1024.0000000000016
1024.0000000000018
1024.000000000002
1024.0000000000023
*/

카운터의 초기 값이 4503599627370496 (2^52)인 경우 카운터의 단계 크기는 1.0 (2^52 * DBL_EPSILON)= 1이 됩니다 . 이 범위에서 배수는 정수 카운터처럼 작동하며 분수는 표현할 수 없습니다.

/*
 4503599627370497.0
 4503599627370498.0
 4503599627370499.0
 4503599627370500.0
 4503599627370501.0
 4503599627370502.0
 4503599627370503.0
 4503599627370504.0
 4503599627370505.0
 4503599627370506.0
*/

숫자가 작을수록 그 사이의 간격이 작고, 숫자가 클수록 그 사이의 간격이 크다는 것을 알 수 있습니다.

따라서 DBL_EPSILON은 상대적인 오류율입니다. 상대적이란 숫자의 크기에 대한 상대적인 것을 의미합니다.

1.0에서 절대 오차 = 1 * 2.2204460492503131e-016 (DBL_EPSILON).

d에서 절대 오차 ≈ d * DBL_EPSILON.

(DBL_EPSILON은 은행의 연간 이자율과 같은 1.0의 기준 이자율이며 2^-52와 같습니다.)


참고: 1024.0000000000003을 인쇄하려고 하면 1024.0000000000002이 대신 인쇄됩니다(가장 가까운 표현 가능한 숫자로 반올림). 1024.0000000000003은 표현 가능한 숫자(존재하지 않는 fp 번호)가 아니기 때문입니다.

이를 표현 오류라고 합니다:

void OnStart()
  {
   Print(1024.0000000000003);  // 1024.0000000000002
  }

이전/다음 표현 가능한 숫자는 비트 조작(이전과 같은 열거형: DoubleAdvance(value, -1))을 통해 또는 DBL_EPSILON을 사용하여 도달할 수 있습니다:

void OnStart()
  {
   double myvalue = 1024.0000000000014;
   Print( myvalue * (1 - DBL_EPSILON) );  // 1024.0000000000011
   Print( myvalue * (1 + DBL_EPSILON) );  // 1024.0000000000016
  }

DBL_EPSILON은 주로 복식에 대한 수학적 연산(수치 해석) 후 fp 반올림 오류를 추정(또는 수정)하는 데 사용됩니다:

|실제 결과 - fp 결과| / 실제 결과 <= DBL_EPSILON

 

사용자 지정 최적화 기준이 아닌 유전적 최적화 알고리즘이 있는 경우 MT5 테스터에서 OnTester() 호출이 비활성화되나요?

아닐 것 같습니다. 하지만 저는... 가급적이면 구성 구문 분석 없이.

추신. 카라 울!!! 모든 것이 사라졌습니다! 최적화의 각 패스 (해야 /해서는 안됨)에서 OnTester ()가 호출되므로 총 최적화 시간이 크게 늘어날 수 있습니다!

도와주세요... )))))

 
IP_ADAPTER_INFO를 정의하는 방법을 알려주실 수 있나요? 이 값의 정의가 올바르지 않습니다
구조체 IP_ADAPTER_INFO {
// 구조체 _IP_ADAPTER_INFO *Next; // 다음 NIC 정보.
uint ComboIndex; // 콤보 인덱스 &. nbsp;
uchar AdapterName[256]; // NIC 이름
uchar Description[256]; // NIC에 대한 설명.
uchar Address[6]; // MAC 주소 &nbsp uchar Address[6]; // MAC 주소.
uint AddressLength; // MAC 주소 길이
uint Index; // NIC 인덱스
uint Type; // NIC 타입 NIC Type; // NIC 유형
bool DhcpEnabled; // DHCP 활성화 여부. nbsp;; DhcpEnabled
uchar CurrentIpAddress[16];// 현재 IP 주소
uchar IpAddressList[16]; // IP 주소 목록.
uchar GatewayList[16]; // 기본 게이트웨이
uchar DhcpServer[16]; // DHCP 서버
datetime LeaseObtained; // 임대 시간 가져오기
datetime LeaseExpires; // 임대 만료 시간
}; datetime LeaseObtained; // LeaseObtained.

"iphlpapi.dll" #임포트
int GetAdaptersInfo(IP_ADAPTER_INFO &AdapterInfo[], int &Size);
#import
 
현지 시간 보다 약간 앞당기면 즉시 거래 서버와의 연결이 끊어집니다.
2023.05.24 11:11:15.645 '4999464569': connection to MetaQuotes-Demo lost
 

검색 중에 문서화되지 않은 흥미로운 기능을 발견했습니다.

대화 상자에 대한 입력 주석을 숨길 수 있습니다.

input int  param=0;  /* показываемый комментарий */   // комментарий для программиста

원본 게시물은 여기

https://www.mql5.com/ru/forum/1271#comment_9019

Предложение по комментариям к внешним переменным
Предложение по комментариям к внешним переменным
  • 2010.06.30
  • www.mql5.com
Общее обсуждение: Предложение по комментариям к внешним переменным
 
lynxntech #:

검색 중에 문서화되지 않은 흥미로운 기능을 발견했습니다.

대화 상자에 대한 입력 주석을 숨길 수 있습니다.

원본 게시물은 여기

https://www.mql5.com/ru/forum/1271#comment_9019

고마워요, 놓쳤어요... 유용합니다.
 

테스터에서는 두 가지 경우에만 히스토리 테이블을 덮어씁니다.

  1. 히스토리선택 호출.
  2. OnTrade 호출(지정하지 않은 경우에도).
이는 리소스를 절약하기 위한 것입니다. 그렇기 때문에 모호한 문제가 발생할 수 있습니다.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  const ulong Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - 1000 * _Point, 0, 0, 0);
  const ulong Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - 1000 * _Point, 0, 0, 0);

  OrderDelete(Ticket2);
  HistorySelect(0, INT_MAX); // Если убрать эту строку, то конечный Print-результат будет иным.
  
  OrderDelete(Ticket1);    
  HistorySelect(0, INT_MAX);
  
  for (int i = 0; i < HistoryOrdersTotal(); i++)
    Print(HistoryOrderGetTicket(i)); // 2 3 или 3 2.
      
  TesterStop();
}
검색 문자열: 울루치셰니 064.