MetaTrader 5 전략 테스터: 오류, 버그, 개선 제안 - 페이지 34

 
Artyom Trishkin :

나도 그를 쳐다보지 않는다. 그러나 그것은 유용한 장소를 차지합니다 ...

그러나 그것은 편리 했다.

 
Artyom Trishkin :

나도 그를 쳐다보지 않는다. 그러나 그것은 유용한 장소를 차지합니다 ...

처음에는 동기화에 대한 테스터의 메시지 , Expert Advisor 등의 현지 시간 로딩 , 그리고 나서 Expert Advisor 및 테스트 거래 서버의 테스트 시간 메시지, 때때로 테스터의 메시지와 현지 시간 산재에 대해 충격을 받을 것입니다. ?
 
Tester를 가속화할 수 있는 곳 중 하나를 찾았습니다. 테스터가 두 가격(예: BuyLimit 및 Tick.ask)을 비교할 때마다 값비싼 정규화를 통해 이를 수행하는 것으로 나타났습니다. 이러지 마!
 
Slava :
처음에는 동기화에 대한 테스터의 메시지 , Expert Advisor 등의 현지 시간 로딩 , 그리고 나서 Expert Advisor 및 테스트 거래 서버의 테스트 시간 메시지, 때때로 테스터의 메시지와 현지 시간 산재에 대해 충격을 받을 것입니다. ?

감사합니다. 어떻게 하면 가장 잘 정리할 수 있을지 생각하면서 자리에 앉았습니다. 먼저 시작 시간, 동기화 등에 대한 메시지가 있어야 하고 나머지는 중요한 메시지가 포함된 전문가와 테스터가 있어야 한다고 제안하고 싶었습니다.

말씀하신 내용과 동일하다고 생각합니다 :)

 
fxsaber :
테스터를 가속화할 수 있는 곳 중 하나를 찾았습니다. 테스터가 두 가격(예: BuyLimit 및 Tick.ask)을 비교할 때마다 값비싼 정규화를 통해 이를 수행하는 것으로 나타났습니다. 이러지 마!

터미널 역사상 가격이 정상화되지 않았습니다!

 bool IsNorm( const double Price )
{
   return ( NormalizeDouble (Price, _Digits ) == Price);
}

#define TOSTRING(A) #A + " = " + DoubleToString (A, 16 ) + " "
#define PRINT(A) Print (TOSTRING(A) + TOSTRING( NormalizeDouble (A, _Digits )))
#define ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

void OnStart ()
{
   MqlTick Ticks[];
  
   const int Size = CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , 1000 * ( long ) D'2019.12.01' );
   Print (Size);
  
   for ( int i = 0 , Count  = 0 ; (i < Size) && (Count < 10 ); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}


결과(EURUSD, MQ-베타)

Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 


어떻게 그게 가능합니까? 무역 서버 측에서 오류가 발생했습니까?

결과적으로 Tester는 실제 기호에서도 비뚤어진 가격으로 EA를 구동합니다.


ZY 개발자가 다른 정규화 알고리즘을 적용하는 데 문제가 있는 것 같습니다.

 
Andrey Khatimlianskii :

입력 매개변수에 빈 값이 있는 버그를 재현했습니다.

1. 고문을 모으기:

2. 무엇이든 두 매개변수를 모두 최적화합니다.

3. enam의 선택을 취소하고 x만 최적화:

4. 단일 실행을 시작한 결과에서 첫 번째 최적화 캐시를 로드한 다음 두 번째 최적화 캐시를 로드합니다. -1 대신 INT_MAX를 얻습니다.


-1로 시작하는 모든 열거형과 관련이 있습니다.

t를 체크 해제하면 입력이 완전히 비활성화된다는 의혹이 있습니다.
변수 t는 비어 있지 않은 초기화되지 않은 INT_MAX 값을 포함합니다.

 
fxsaber :

터미널 역사상 가격이 정상화되지 않았습니다!


결과(EURUSD, MQ-베타)


어떻게 그게 가능합니까? 무역 서버 측 오류?

이에 테스터는 실제 심볼에도 비뚤어진 가격으로 Expert Advisors를 운영하고 있다.


ZY 개발자가 다른 정규화 알고리즘을 사용하는 데 문제가 있는 것 같습니다.

이것은 가격 곡선이 아닙니다! 상당히 정상화되었습니다. 이것은 인쇄물에서 매우 분명합니다.

거래 서버에서 거래할 때 항상 입실 가격과 현재 가격을 비교하기 위해 엡실론을 사용합니다.

<some_real_number>*0.5의 결과가 <the_same_real_number>/2.0의 결과와 다를 수 있다는 사실을 알고 계셨습니까?

일부 컴파일러는 코드를 최적화할 때 한 작업을 다른 작업으로 대체할 수 있다는 사실을 알고 계십니까? 어떤 경우에는 교체하고 다른 경우에는 - 아니요, 동일한 프로젝트 내에서. 전쟁 선포가 없습니다.

 
Roman :

t를 체크 해제하면 입력이 완전히 비활성화된다는 의혹이 있습니다.
변수 t는 비어 있지 않은 초기화되지 않은 INT_MAX 값을 포함합니다.

이유가 무엇이든 상관없습니다.

재현하고 수정하는 것이 중요합니다. 버그가 오래되었습니다.

 
Slava :

이것은 가격 곡선이 아닙니다! 상당히 정상화되었습니다. 이것은 인쇄물에서 매우 분명합니다.

이 조건을 통과해야만 가격이 정상화됩니다.

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

MetaTrader 5 전략 테스터: 오류, 버그, 개선 제안

fxsaber , 2019.12.11 07:47

 bool IsNorm( const double Price )
{
   return ( NormalizeDouble (Price, _Digits ) == Price);
}

거래 서버에서 거래할 때 항상 입실 가격과 현재 가격을 비교하기 위해 엡실론을 사용합니다.

무역 서버가 그렇게 하는 것이 맞습니다.

<some_real_number>*0.5의 결과가 <the_same_real_number>/2.0의 결과와 다를 수 있다는 사실을 알고 계셨습니까?

일부 컴파일러는 코드를 최적화할 때 한 작업을 다른 작업으로 대체할 수 있다는 사실을 알고 계십니까? 어떤 경우에는 교체하고 다른 경우에는 - 아니요, 동일한 프로젝트 내에서. 선전포고가 없습니다.

두 질문에 대한 대답은 긍정적입니다.


다시 한번 말씀드리지만, 터미널의 원래 가격은 정상화되지 않았습니다. 여기에서 이러한 상황이 쉽게 발생합니다.

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

MT4의 비정규화된 가격

fxsaber , 2019.02.20 23:03

그러나 상황은 훨씬 더 나쁘고 동시에 MQ-Demo에서
 // 15326434
// wmefo5sa
// MetaQuotes-Demo
void OnStart ()
{
   const double Price1 = HistoryOrderSelect ( 356138100 ) ? HistoryOrderGetDouble ( HistoryOrderGetTicket ( 0 ), ORDER_PRICE_CURRENT ) : 0 ;
   const double Price2 = PositionSelectByTicket ( 356138100 ) ? PositionGetDouble ( POSITION_PRICE_OPEN ) : 0 ;  
  
   Print (Price1 - Price2); // -2.220446049250313e-16
}


현재 위치 의 시작 가격이 주문/거래 가격과 동일하지 않습니다.

사유: