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

 

핍 모드에서 성배를 얻으려면 전체 포지션 볼륨 에 대해 하나의 시장으로 수익성이 없는 포지션을 닫고 0.01랏의 군중에서 수익성이 있는 포지션을 닫으십시오.

예시.

 #include <MT4Orders.mqh>

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

const bool Init = EventSetTimer ( 100 );

void OnTimer ()
{
   while ( OrdersTotal ())
     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0 ) ? 0.01 : OrderLots() , OrderClosePrice(), 0 );
      
   OrderSend ( _Symbol , OP_BUY, 1 , Ask, 0 , 0 , 0 );
}


결과

 

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

라이브러리: SingleTesterCache

fxsaber , 2020.01.12 23:20

현재 버전의 tst-format에는 다음 데이터가 포함되어 있지 않습니다.

  • 밀리초 단위의 시간입니다.
  • 위치ID.
  • 매직넘버.
이는 사용 사례에 제한을 부과합니다.
 

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

라이브러리: SingleTesterCache

fxsaber , 2020.01.13 00:01

여러 버그를 재현합니다. 헤지 계정의 테스터에서 Expert Advisor를 시작합니다.

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

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

#define PAUSE 100000

void OnTick ()
{
   static bool FirstRun = true ;
  
   if (FirstRun)
  {
     OrderSend ( _Symbol , OP_BUY, 1 , Ask, 0 , 0 , 0 );
     Sleep (PAUSE);
    
     OrderSend ( _Symbol , OP_BUY, 2 , Ask, 0 , 0 , 0 );
     Sleep (PAUSE);

     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 );
     Sleep (PAUSE * 2 );
    
     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 );
     Sleep (PAUSE * 2 );

     TesterWithdrawal ( 100 );    
    
    FirstRun = false ;
  }
}

void OnDeinit ( const int )
{
   const int Total = OrdersHistoryTotal();
  
   for ( int i = 0 ; i < Total; i++)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
       Print (OrderTicketID()); // MT5-PositionID
    }
}


우리는 이것을 얻는다

 2020.01 . 08 23 : 59 : 58    # 1 2020.01 . 01 00 : 00 : 00 balance 0.00 0.00000 0.00000 0.00000 2020.01 . 01 00 : 00 : 00 0.00000 0.00 0.00 100000.00 0
2020.01 . 08 23 : 59 : 58    0
2020.01 . 08 23 : 59 : 58    # 4 2020.01 . 02 06 : 00 : 00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01 . 02 06 : 03 : 20 1.12132 - 3.56 0.00 - 4.46 0
2020.01 . 08 23 : 59 : 58    2
2020.01 . 08 23 : 59 : 58    # 5 2020.01 . 02 06 : 01 : 40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01 . 02 06 : 06 : 40 1.12129 - 7.14 0.00 - 14.27 0
2020.01 . 08 23 : 59 : 58    3
2020.01 . 08 23 : 59 : 58    # 6 2020.01 . 02 06 : 10 : 00 balance 0.00 0.00000 0.00000 0.00000 2020.01 . 02 06 : 10 : 00 0.00000 0.00 0.00 - 100.00 withdrawal 0
2020.01 . 08 23 : 59 : 58    0


다음으로 스크립트로 해당 tst 파일을 읽습니다.

 #include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart ()
{  
   uchar Bytes2[];
  
   if (MTTESTER::GetLastTstCache(Bytes2) != - 1 ) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
     const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

     for ( int i = 0 ; i < ArraySize (SingleTesterCache.Positions); i++)
       Print (SingleTesterCache.Positions[i].ToString());
  }
}


위치 데이터를 표시합니다

id = 0
mfe = 0.0
mae = - 8.029999999999999
profit = - 4.46
lifetime = 00 : 03 : 20

id = 0
mfe = 0.0
mae = - 21.4
profit = - 14.27
lifetime = 00 : 05 : 00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00 : 00 : 00


이 게시물의 모든 것을 비교하면 다음 버그가 공식화됩니다.

  • 올바른 ID 대신 ID가 0입니다.
  • 이익을 계산할 때 수수료와 스왑은 고려되지 않습니다.
  • 철수 거래는 실수로 마감 된 거래 포지션의 수로 떨어집니다.

 

디버거가 제대로 작동하지 않습니다. 표준 디버거와 비교하여 부족한 것의 내림차순으로 누락된 것입니다.

1. 메모리 수정. 변수를 볼 수는 있지만 편집할 수 없는 것 같습니다.

2. 조건부 중단점. 변수 test=10인 경우 중지하려면 입력하십시오.

3. 구현을 추진할 기회. 저것들. 예를 들어 어떤 주기를 건너뛰십시오. 즉, 선을 찔러보고 지금 여기에서하십시오.

4. 이미 실행 중인 스크립트/어드바이저/인디케이터에 연결합니다. 또는 최소한 충돌 시 부착 가능성이 있으므로 편리하게 분석할 수 있습니다.

 
traveller00 :

디버거가 제대로 작동하지 않습니다. 표준 디버거와 비교하여 부족한 것의 내림차순으로 누락된 것입니다.

2. 조건부 중단점. 변수 test=10인 경우 중지하려면 입력하십시오.

 if (smth) {

     int a;

}
 
예, 동의합니다. 재조립은 거의 모든 것을 달성할 수 있습니다. 포인트 4를 제외하고는. 그러나 여전히 디버거에서 이것을 보고 싶습니다. 왜냐하면 이것이 디버거의 표준 기능 세트이기 때문입니다.
 

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

라이브러리: SingleTesterCache

fxsaber , 2020.01.14 10:49

이제 설정 파일 대신 tst 파일을 사용합니다. 입력 매개변수뿐만 아니라 전체 백테스트도 포함하여 매우 빠르게 전환할 수 있습니다.

tst에 밀리초 데이터가 부족하여 서로 다른 TS를 포트폴리오로 완전히 결합하는 것이 이제 불가능하다는 것이 유감입니다.


기존 필드의 개발자들이 최대한 활용하기 시작하기를 바랍니다.

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;               // время снятия завки

시간 값을 초 단위가 아니라 밀리초 단위로 기록합니다.


일반적으로 실제로 tst를 사용하는 모든 쿨함을 입증하는 것은 tst의 작은 결함을 전혀 제공하지 않습니다. 고칠 것 입니다.

 


보고서에 TesterWithdrawal에 대한 데이터가 포함되어 있지만 누락 - TesterDeposit.

 
그런 그림을 이해하는 방법. 최적화 그래프 는 5000 부근의 피크 값을 보여줍니다. 그리고 최적화 테이블에서 최대 값은 4670입니다. 최고의 패스의 매개 변수는 어디에 있습니까?
파일:
8c97so2_7-1.jpg  184 kb
 
Grozir :
그런 그림을 이해하는 방법. 최적화 그래프 는 5000 부근의 피크 값을 보여줍니다. 그리고 최적화 테이블에서 최대 값은 4670입니다. 최고의 패스의 매개 변수는 어디에 있습니까?

"결과" 열을 정렬합니다.