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

 
슬라바 :
샘플링 시작이 첫 번째 OnTick의 시작 부분에 있음을 지정하는 것을 잊었습니다. 측정 종료 - OnDeinit 시작 시
또는 OnTester를 시작할 때
 // После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

이 주제에

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

오류, 버그, 질문

fxsaber , 2016.08.25 11:13

생활 해킹
 // Возвращает true, если полностью выполнился OnTick() на последнее событие NewTick в тестере - окончание бэктеста. Иначе - false.
   static bool BACKTEST::IsEnding( void )
     {
       return (:: TesterStatistics ( STAT_BALANCEMIN ) > 0 );
     }
 
fxsaber :
또는 OnTester를 시작할 때


측정 결과를 OnTester의 반환 코드로 반환합니다.
 
슬라바 :
측정 결과를 OnTester의 반환 코드로 반환합니다.

아직 테스터에서 GetTickCount를 테스트하지 않았습니다. 나는 이 기능이 테스터에 의해 에뮬레이트될 것이라고 가정했는데, 어떤 상황에서는 논리적일 수 있습니다.

그건 그렇고, 최대 ms의 정확도로 테스터의 현재 시간 을 이해하는 방법은 무엇입니까? SymbolInfoTick+Tick.time_msc를 통해 메인 심볼의 OnTick 호출 시간을 알아낸다. 따라서 테스터 슬립 모드가 올바르게 작동하는지 확인하십시오. 하지만 다른 방법은 없는 것 같습니다.


사실, 나는 다른 것에 대해 묻고 싶었습니다. 첫 번째 값과 마지막 값을 버리고 옵티마이저에서 벤치를 자동화하려면 프레임을 통해 작업해야 합니까(OnTester 결과를 전송하기 위해), 아니면 결과가 왜곡됩니까?

 
테스터의 GetTickCount 는 제대로 작동하며 Sleep과 달리 에뮬레이트되지 않습니다.
 
fxsaber :

사실, 나는 다른 것에 대해 묻고 싶었습니다. 첫 번째 값과 마지막 값을 버리고 옵티마이저에서 벤치를 자동화하려면 프레임을 통해 작업해야 합니까(OnTester 결과를 전송하기 위해), 아니면 결과가 왜곡됩니까?

왜곡해서는 안됩니다. 측정 후 발송됩니다. 노력하다
 
슬라바 :
대량 측정의 경우 마이크로초 타이머를 사용하지 마십시오. 일반 밀리초 GetTickCount를 사용합니다.

GetMicrosecondCount가 GetTickCount보다 테스터의 속도를 더 느리게 합니까 (또는 에뮬레이트합니까)?

아니면 EventSetMillisecondTimer를 포기한다는 뜻입니까?

 
fxsaber :

GetMicrosecondCount가 GetTickCount보다 테스터의 속도를 더 느리게 합니까(또는 에뮬레이트합니까)?

아니면 EventSetMillisecondTimer를 포기한다는 뜻입니까?

GetMicrosecondCount 를 의미합니다. 서버가 느려지는지 여부를 확실히 말할 수는 없습니다. 간접적인 영향을 미칠 수 있습니다. 따라서 시스템 기본 GetTickCount를 사용하는 것이 좋습니다.

GetMicrosecondCount는 코드 실행의 짧은 섹션을 측정하는 데 사용됩니다. 대규모 OnTick 집합의 실행을 측정하려면 GetTickCount가 여전히 더 좋습니다.

안정적인 결과를 얻은 후 GetTickCount 대신 GetMicrosecondsCount를 사용해 보십시오. 그럼 여기서 말하세요. 어쩌면 나는 아무렇지도 않게 걱정하고 있습니다.

 
히스토리 기능을 통해 데이터를 사용할 수 있는 2개의 현재 히스토리 테이블(주문 테이블 및 거래 테이블)이 있습니다.

해당 내용은 HistorySelect 기능을 통해서만 영향을 받을 수 있습니다. 그리고 이렇게 됩니다

  • HistorySelect 및 HistorySelectByPosition - 두 테이블에 동시에 영향을 줍니다.
  • HistoryDealSelect는 거래 테이블에만 영향을 줍니다(현재 주문 내역 테이블에는 영향을 주지 않음).
  • HistoryOrderSelect는 주문 테이블에만 영향을 줍니다(현재 거래 내역 테이블에는 영향을 주지 않음).

 
주문은 Request.expiration 필드를 최대 LONG_MAX + 2( 포함)로 설정할 수 있습니다. 해당 값은 주문이 활성 상태인 경우 ORDER_TIME_EXPIRATION 을 통해 완전히 사용할 수 있습니다(기록 테이블에 없음).
 
잔액 거래의 PositionIdentifier는 0과 같습니다. 따라서 예를 들어 다음과 같은 함수를 작성하기 쉽습니다.
 // Возвращает сумму всех балансовых не торговых операций (начисления + списания)
double GetSumBalanceOperations( void )
{
   double Res = 0 ;
  
   if ( HistorySelectByPosition ( 0 ))
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
      Res += HistoryDealGetDouble ( HistoryDealGetTicket (i), DEAL_PROFIT );
      
   return (Res);
}

이러한 거래의 DEAL_ENTRY는 DEAL_ENTRY_IN (0)과 같습니다.