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

 
Комбинатор :

일반적으로 10진수 유형은 문제가 되지 않으며 편리한 것입니다.

네, MT가 존재하는 초기부터 가격에 작용하는 소프트웨어가 없다는 것은, 조금, 부끄럽습니다.

추신. 이제 OOP 언어가 있는 상황에서 MQ는 원하는 사람들이 스스로 클래스를 작성할 수 있다고 믿을 것입니다. 그래야만 간단한 구조 에 넣을 수 없습니다. ulong과 같은 간단한 것으로 직렬화/역직렬화해야 합니다.
 
Slava :

이렇게 자세하게 답변해주셔서 정말 감사드립니다. 정규화는 거래 요청 을 생성하는 데 사용됩니다.

 // Point = 0.001, Digits = 3
OrderSend ( 8274 * Point );
OrderSend ( NormalizeDouble ( 8274 * Point , Digits ));

이 예에서는 이 두 OrderSend에서 서로 다른 가격이 전송되고 있음이 밝혀졌습니다.

동시에 정수를 Point로 곱하는 데 추가가 필요하지 않다고 항상 믿어졌습니다. 정규화(예: SL 및 TP가 설정된 방식).

그렇다면 두 줄 중 어느 것이 오류를 일으킬까요?

 
Stanislav Korotky :

네, MT가 존재하는 초기부터 가격에 작용하는 소프트웨어가 없다는 것은, 조금, 부끄럽습니다.

아무도 SD에 쓰지 않을 수 없습니다
 
fxsaber :

이렇게 자세하게 답변해주셔서 정말 감사드립니다. 정규화는 거래 요청 을 생성하는 데 사용됩니다.

이 예에서는 이 두 OrderSend에서 서로 다른 가격이 전송되고 있는 것으로 나타났습니다.

동시에 정수를 Point로 곱하는 데 추가가 필요하지 않다고 항상 믿어졌습니다. 정규화(예: SL 및 TP가 설정된 방식).

그렇다면 두 줄 중 어느 것이 오류를 일으킬까요?

시원한

 #include <MT4Orders.mqh>

void OnStart ()
{
   const double Num = 8.274 ;
   const double Norm = NormalizeDouble (Num, 3 );  
   
   Print (Num);   // 8.273999999999999
   Print (Norm); // 8.274000000000001
  
   Print (( double ) DoubleToString (Num, 3 ) == Num);     // true - без нормализации все замечательно
   Print (( double ) DoubleToString (Norm, 3 ) == Norm);   // false - а после нормализации полный облом!
  
   OrderSend ( "USDSEK" , OP_BUYLIMIT , 1 , Num, 0 , 0 , 0 );
   OrderSend ( "USDSEK" , OP_BUYLIMIT , 1 , Norm, 0 , 0 , 0 );
}

결과

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

두 요청 모두 가격이 다르지만 동일한 가격으로 문제 없이 완료되었습니다. 어때요?

 
fxsaber :

시원한

결과

두 요청 모두 가격이 다르지만 동일한 가격으로 문제 없이 완료되었습니다. 어때요?

매우 간단하게 - double의 관점에서 볼 때 - double은 가수의 52비트 또는 소수점 이하 15자리를 저장하기 때문에 이 숫자는 동일합니다. 후속 숫자의 더하기 또는 빼기 차이는 계산되지 않습니다. 다음 은 Habré에 대한 기사입니다 .

 
Stanislav Korotky :

매우 간단하게 - double의 관점에서 볼 때 - double은 가수의 52비트 또는 소수점 이하 15자리를 저장하기 때문에 이 숫자는 동일합니다. 후속 숫자의 더하기 또는 빼기 차이는 계산되지 않습니다. 다음 은 Habré에 대한 기사입니다 .

 void OnStart ()
{
   const double Num = 8.274 ;
   const double Norm = NormalizeDouble (Num, 3 );
  
   Print (( string )(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber , 2017.07.19 13:00

 void OnStart ()
{
   const double Num = 8.274 ;
   const double Norm = NormalizeDouble (Num, 3 );
  
   Print (( string )(Norm - Num)); // 1.77635683940025e -15
}

그리고?

 

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

오류, 버그, 질문

fxsaber , 2017.07.17 21:49

단일 실행 중에 "중지"를 클릭하면 OnDeinit 및 소멸자가 호출되지 않습니다.

이것은 버그입니까 버그입니까?

이제 "중지" 버튼을 클릭하면 에이전트와 하드 연결 해제가 발생합니다. 너무 어려워서 단일 실행이 완료될 때까지 기다리지 않고는 보고서를 볼 수 없습니다.

MT4에서는 불완전한 단일 실행의 거래 내역을 항상 볼 수 있습니다. 그러나 MT5에서는 - 절대 안됩니다.

연결을 강제로 끊지 않고 잡히고 OnDeinit가 실행될 수 있는 플래그를 에이전트에 보낼 수 있습니까?

 
Stanislav Korotky :

그리고?

스타니슬라프 코로트키 :

매우 간단하게 - double의 관점에서 볼 때 - double은 가수의 52비트 또는 소수점 이하 15자리 를 저장하기 때문에 이 숫자는 동일합니다. 후속 숫자의 플러스 또는 마이너스 차이는 고려되지 않습니다 . 다음 은 Habré에 대한 기사입니다 .

차이는 1e-15보다 큽니다. 또한 Num != Norm. 이것은 같은 숫자가 아니라 다른 숫자입니다.
 
Stanislav Korotky :

그리고?

음, 사실 동의합니다. 리터럴을 설정하면 이중 표현이 리터럴의 자릿수로 즉시 정규화된다는 것이 논리적입니다.