알고리즘, 결정 방법, 성능 비교 - 페이지 22

 

2269로 업데이트되었습니다. 대규모(비합성) Expert Advisor의 프로파일러 결과입니다.


시험 장치



가상


아마도 프로파일러가 잘못된 측정을 하고 있는 것 같습니다. 그렇지 않으면 5개의 OrderSend가 평균적으로 912ms가 걸립니다.

 

하나의 알고리즘(예: NormalizeDouble을 통해)으로 정규화된 모든 double은 서로 직접 비교할 수 있습니다.


이 명백한 상황은 많은 경우에 실수를 비교하는 데 비용이 많이 드는 구성을 피할 수 있게 합니다. 일부 작업에서는 생산성을 크게 높일 수 있습니다.

아마도 이러한 작업 중 가장 눈에 띄는 것은 테스터일 것입니다. 예를 들어 보겠습니다.


BuyLimit 가치가 있습니다. 테스터는 각 틱에서 BuyLimit와 Ask 가격을 비교할 의무가 있습니다. Staff Tester는 이제 이렇게 합니다.

 if ( NormalizeDouble (BuyLimit_Price - Ask , Symbol_Digits) >= 0 )
  BuyLimit -> Buy;


저것들. 모든 거래 수준( 보류 주문 또는 SL/TP)은 하나의 정규화 호출을 생성합니다.


그러나 가격이 사전에(백테스트 전에) 정상화되었다면 매우 효율적인 비교 구성으로 항상 성공할 수 있습니다.

 if (BuyLimit_Price >= Ask)
  BuyLimit -> Buy;


비교해보도록 하겠습니다. 가상을 통해 테스터에서 이 로봇을 시작했습니다.

 #include <MT4Orders.mqh>

#define VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#include <fxsaber\Virtual\Virtual.mqh>

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

input int inAmountOrders = 10 ;
input int inFakeRange = 0 ;

void OnTick ()
{
   static bool FirstRun = true ;
  
   if (FirstRun)
  {
     for ( int i = 0 ; i < inAmountOrders; i++)    
       OrderSend ( _Symbol , OP_BUYLIMIT, 0.1 , Ask - 10000 * _Point , 0 , 0 , 0 );
      
    FirstRun = false ;
  }
}


정상화를 통한 가격 비교.

pass 0 returned result 100000.000000 in 0 : 00 : 01.578
pass 1 returned result 100000.000000 in 0 : 00 : 00.759
pass 2 returned result 100000.000000 in 0 : 00 : 00.894
pass 3 returned result 100000.000000 in 0 : 00 : 00.769
pass 4 returned result 100000.000000 in 0 : 00 : 00.806
pass 5 returned result 100000.000000 in 0 : 00 : 00.772
pass 6 returned result 100000.000000 in 0 : 00 : 01.253
pass 7 returned result 100000.000000 in 0 : 00 : 01.200
pass 8 returned result 100000.000000 in 0 : 00 : 01.089
pass 9 returned result 100000.000000 in 0 : 00 : 00.780
pass 10 returned result 100000.000000 in 0 : 00 : 01.258
optimization finished, total passes 11
optimization done in 0 minutes 11 seconds
shortest pass 0 : 00 : 00.759 , longest pass 0 : 00 : 01.578 , average pass 0 : 00 : 01.014


정규화 없이.

pass 0 returned result 100000.000000 in 0 : 00 : 01.743
pass 1 returned result 100000.000000 in 0 : 00 : 00.844
pass 2 returned result 100000.000000 in 0 : 00 : 00.672
pass 3 returned result 100000.000000 in 0 : 00 : 00.817
pass 4 returned result 100000.000000 in 0 : 00 : 00.635
pass 5 returned result 100000.000000 in 0 : 00 : 00.604
pass 6 returned result 100000.000000 in 0 : 00 : 00.867
pass 7 returned result 100000.000000 in 0 : 00 : 00.611
pass 8 returned result 100000.000000 in 0 : 00 : 00.899
pass 9 returned result 100000.000000 in 0 : 00 : 00.649
pass 10 returned result 100000.000000 in 0 : 00 : 00.742
optimization finished, total passes 11
optimization done in 0 minutes 09 seconds
shortest pass 0 : 00 : 00.604 , longest pass 0 : 00 : 01.743 , average pass 0 : 00 : 00.825


가격을 비교할 때 정규화하지 않으면 이득이 20% 이상임을 알 수 있다.


결과적으로 사내 테스터를 정규화 가격으로 환산하고 가격 비교 시 내부 정규화를 사용하지 않는다면 상당한 성능 향상을 이룰 수 있다.

 
매트 없이 직접 할당 후. 작업도
 
TheXpert :
매트 없이 직접 할당 후. 작업도

물론 할당은 변경되지 않은 숫자의 바이트 표현을 복사합니다.

 

명확성을 위해 1초 이상 지속되는 테스트를 실행하시겠습니까?

여기 한 버전에서 스프레드는 3배입니다: 최단 패스 0:00:00.604, 최장 패스 0:00:01.743. 우리는 무엇을 비교하고 있습니까?

 
Andrey Khatimlianskii :

명확성을 위해 1초 이상 지속되는 테스트를 실행하시겠습니까?

여기 한 버전에서 스프레드는 3배입니다: 최단 패스 0:00:00.604, 최장 패스 0:00:01.743. 우리는 무엇을 비교하고 있습니까?

물론 가장 짧은 것을 비교합니다. 필터링된 틱에서 운전하는 데 사용됩니다. 필터링되지 않은 것은 나중에 만들겠습니다.

 
fxsaber :

물론 가장 짧은 것을 비교합니다.

왜??? 최적화는 한 번의 패스로 구성되지 않습니다. 평균이 크게 다르지 않다면 그것이 그렇게 빨리 미끄러지는 데 무슨 차이가 있습니까?


fxsaber :

필터링된 틱에서 운전하는 데 사용됩니다. 필터링되지 않은 것은 나중에 만들겠습니다.

어쩌면 더 긴 간격일 수도 있습니다. 적어도 초 30 테스트가 갔다.

 
Andrey Khatimlianskii :

왜??? 최적화는 한 번의 패스로 구성되지 않습니다. 평균이 크게 다르지 않다면 그것이 그렇게 빨리 미끄러지는 데 무슨 차이가 있습니까?

이 설정은 최적화되어 있습니다.

 input int inFakeRange = 0 ;

그리고 그것은 논리에 영향을 미치지 않습니다. 따라서 가장 짧습니다.

 
fxsaber :

이 설정은 최적화되어 있습니다.

그리고 그것은 논리에 영향을 미치지 않습니다. 따라서 가장 짧습니다.

여기서 고문의 논리는 무엇입니까? 테스터의 속도를 측정합니다.

 
Andrey Khatimlianskii :

여기서 고문의 논리는 무엇입니까? 테스터의 속도를 측정합니다.

이것은 하나의 에이전트가 동일한 것을 순차적으로 계산하는 방식입니다. 모든 종류의 사고를 제거하면 순 성능이 가장 짧습니다.