다중 통화 EA 백테스팅 - 페이지 3

 

그 당시에 이것을 출판하고 싶었지만 첫 페이지에서 끔찍하게 보였습니다.

포트폴리오 EA의 논리

 

안녕하세요 여러분,

나도 얼마 전에 이 문제에 부딪쳤고 여기에서 논의했습니다: https://www.mql5.com/en/forum/1642

내 EA에는 공개 가격 전용 전략이 있으며 백테스팅 동안 시간을 절약하기 위해 이 전략을 고수하고 싶었습니다(분명히).

내가 고안한 솔루션은 다음과 같습니다.

  1. EA의 주요 거래 기간 동안 가장 활동적인 쌍을 '드라이버'(틱을 생성하는 차트)로 사용하십시오.
  2. 각 onTick()에서 드라이버가 새 막대를 입력했는지 확인하십시오.
    1. 새로운 바가 없다면 조금만 더 기다려주세요
    2. 새 막대가 있는 경우 개별 거래자에게 OnTick() 메시지를 배포합니다(각 거래자는 하나의 통화 쌍에 대한 책임이 있음).
  3. 상인에서 상인의 통화 쌍의 마지막 시간이 드라이버의 "새 막대 시간"과 같은지 확인하십시오.
    1. 그렇다면 평소처럼 계속할 수 있습니다.
    2. 아니오인 경우 현재 막대의 종가를 찾고 있는 시작 가격으로 처리해야 하고 이전 막대의 정보를 찾고 있다면 이 "하나씩" 상황을 고려하십시오.

여기 아래 EA에서 중요한 코드 섹션을 잘라내어 붙여넣겠습니다. 이것이 당신에게 도움이 되기를 바랍니다!

건배!


 // this is from the Trader base class

     // manage a new tick and predetermines whether a new bar hast started
     virtual void onTick() {
         MqlRates rates[ 1 ];
    
         // check the rates of the tick stream we're attached to (_Symbol!!!)
         if ( CopyRates ( _Symbol , _period, 0 , 1 , rates) != 1 ) {
             Print ( "CopyRates of " , _Symbol , " failed" );
             return ;
        }

         if (_newBar = (rates[ 0 ].time != _currBarTime)) {
            _prevBarTime = _currBarTime;   // remember the previous bar time
            _currBarTime = rates[ 0 ].time;   // remember the current bar time
        }

    }


// this is the actual trader for a specific currency pair

     // checks whether a new trade (closing or opening) is to be performed
     void checkForTrade( void ) {    
    
         MqlRates rates[ 3 ];

         if ( CopyRates (_symbol, _period, 0 , 3 , rates) != 3 ) {
             Print ( "CopyRates of " , _symbol, " failed" );
             return ;
        }

         bool inSameBar = (rates[ 2 ].time == _currBarTime);   // _currBarTime determined in OnTick()!


         double sBuf[ 3 ];   // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 

         if ( CopyBuffer (_ind, SIGNAL3, 0 , 3 , sBuf) != 3 ) {
             Print ( "copy signal from indicator failed, no data" );
             return ;
        }    
        
        
         // first close exiting orders
         double v0 = inSameBar ? sBuf[ 0 ] : sBuf[ 1 ];   // determine the actual 'previous' bar
         double v1 = inSameBar ? sBuf[ 1 ] : sBuf[ 2 ];   // determine the actual 'current' bar
        
         if (_volume > 0 ) {
             if (crossesZeroDownwards(v0, v1)) {   // cross down?
                setReqVolume( 0 );   // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0 ) {
             if (crossesZeroUpwards(v0, v1)) {   // cross up?
                setReqVolume( 0 );   // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

방금이 문제가 발생했습니다. JForex에서 MQL5로 이식하려고 하는 당신은 그것을 짐작했습니다! 마감 연장이 도움이 된다고 생각하지만 귀찮게 하지 않았으면 하는 생각이 들기 시작했습니다. :)

MetaQuotes가 아직 수정하지 않은 것 같습니다.

MT5 외환은 DOM을 지원하지 않는 것 같습니다.

isNewBar가 도움이 되지 않습니다.

말도 안되는 상황인 것 같습니다.

이 문제와 관련하여 MT5 내부에서 변경된 사항이 있는지 아는 사람이 있습니까?

틱을 먹일 것으로 예상되는 다중 통화 전략에 적합한 솔루션을 아는 사람이 있습니까?

좌절에 빠진 당신,


 
TradingGurus :

방금이 문제가 발생했습니다. JForex에서 MQL5로 이식하려고 하는 당신은 그것을 짐작했습니다! 마감 연장이 도움이 된다고 생각하지만 귀찮게 하지 않았으면 하는 생각이 들기 시작했습니다. :)

MetaQuotes가 아직 수정하지 않은 것 같습니다.

MT5 외환은 DOM을 지원하지 않는 것 같습니다.

isNewBar가 도움이 되지 않습니다.

말도 안되는 상황인 것 같습니다.

이 문제와 관련하여 MT5 내부에서 변경된 사항이 있는지 아는 사람이 있습니까?

틱을 먹일 것으로 예상되는 다중 통화 전략에 적합한 솔루션을 아는 사람이 있습니까?

좌절에 빠진 당신,



OnTick() 대신 1초 타이머와 함께 OnTimer()를 사용해 보십시오.
 

안녕하세요 에니비드입니다.

enivid :
OnTick() 대신 1초 타이머와 함께 OnTimer()를 사용해 보십시오.

제안해 주셔서 감사합니다. 귀하의 솔루션은 확실히 우리의 요구 사항에 대해 내가 시도한 다른 솔루션보다 훨씬 더 잘 작동합니다.

그러나 다른 쌍에 대해 다중 통화 백테스트 를 실행하면 여전히 약간 다른 결과가 생성됩니다.

엄청난 자신감을 불러일으키지 않습니다!

이제 자정 오일을 더 많이 태우러 갑니다!

건배,


 
enivid :
OnTick() 대신 1초 타이머와 함께 OnTimer()를 사용해 보십시오.

TradingGurus :

그러나 다른 쌍에 대해 다중 통화 백테스트를 실행하면 여전히 약간 다른 결과가 생성됩니다.

Jim, 저는 제 콘테스트 포트폴리오 EA에서 1초로 OnTimer 솔루션을 사용합니다. 전략이 모든 틱에 의존한다면 그렇습니다. 초당 하나 이상의 틱이 가능하기 때문에 단일 통화 에 대해 OnTimer 대 OnTick을 사용할 때 다른 결과를 얻을 수 있습니다. 나는 "누락된" 눈금이 높거나 낮은 새로운 막대를 만들 때 일반적으로 가장 큰 차이를 만든다는 것을 발견했습니다. 현재 틱이 새로운 고/저 막대를 생성하지 않는 한 변경 사항에 대해 이전 막대 높음/낮음 및 현재 막대 높음/낮음을 확인하고 변경 사항이 발생할 때 이를 "누락된 눈금"으로 삽입할 수 있습니다.

또한 MetaTrader 전략 테스터는 틱 데이터만 시뮬레이션한다는 점을 기억하십시오. 전략이 틱 움직임에 얼마나 민감한지에 따라 이 시뮬레이션은 백 테스팅과 포워드 테스팅에 상당한 영향을 미칠 수 있습니다.

- 패트릭

 
안녕하세요 패트릭입니다.
Pix :

전략이 모든 틱에 의존한다면 그렇습니다. 초당 하나 이상의 틱이 가능하기 때문에 단일 통화에 대해 OnTimer 대 OnTick을 사용할 때 다른 결과를 얻을 수 있습니다.

- 패트릭


그것은 내가 의미한 것이 아닙니다. 우리의 (여전히 유일한 가능성!) 콘테스트 EA는 12쌍 모두를 거래합니다. OnTimer() 만 사용하여 예를 들어 EUR/USD가 아닌 전략 테스터 에서 GBP/USD를 선택하면 다른 백테스트 결과를 얻습니다.

시뮬레이션된 틱을 사용하여 백테스트할 때 MT4의 한계에 대해 너무 잘 알고 있습니다. 불행히도 MT5가 훨씬 더 나은 것 같지는 않습니다!

 

우리는 역사적인 이유로 이 모든 것을 틱으로 진행하고 싶었지만 포기했습니다. 일관성을 유지할 수 없습니다.

우리는 총알을 깨물었고 이제 OnTimer() 및 isNewBar()의 도움으로 1분 막대로 작업하고 있습니다.

드디어 어렴풋이 생각이 나기 시작했고, 게다가 챔피언십 마감까지 4시간 남았습니다. :)

 

마침내 마감일까지 약 5분의 여유를 두고 EA를 제출했습니다.

벨트 아래에 하나의 백테스트 와 최적화가 없습니다.

전에 한 번도 해본 적이 없는데 아직 승인될 가능성이 있는지 말해 줄 수 있는 사람이 있습니까?

그렇다면 다음 주에 입력 설정을 조작할 수 있습니까?


 
TradingGurus :

마침내 마감일까지 약 5분의 여유를 두고 EA를 제출했습니다.

벨트 아래에 하나의 백테스트와 최적화가 없습니다.

전에 한 번도 해본 적이 없는데 아직 승인될 가능성이 있는지 말해 줄 수 있는 사람이 있습니까?

그렇다면 다음 주에 입력 설정을 조작할 수 있습니까?

행운을 빌어요 짐!

귀하의 EA가 2010.01.01에서 2010.08.01까지 오류( 거래 오류 등) 및 이익 없이 올바르게 백테스트한 경우 개인 정보도 정확하다면 승인될 가능성이 높습니다. 그러나 이 시점부터 설정(입력 매개변수)을 포함하여 아무 것도 변경할 수 없습니다.

봇이 작동하는 모습을 보기를 바랍니다!

- 패트릭