English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5의 Expert Advisor 테스트 및 최적화 가이드

MQL5의 Expert Advisor 테스트 및 최적화 가이드

MetaTrader 5테스터 | 18 8월 2021, 09:49
388 0
Samuel Olowoyo
Samuel Olowoyo

소개

개발자가 Expert Advisor를 작성할 때 대부분의 경우 Expert Advisor가 좋은 수익성이라는 목표를 달성하는지 확인하는 것은 항상 매우 힘든 과정입니다. 이 글에서는 Expert Advisor를 작성하는 원하는 목표에 근접할 수 있도록 Expert Advisor를 테스트하고 최적화하는 데 필요한 몇 가지 주요 단계를 살펴보겠습니다.


1. 코드 오류 식별 및 수정

Expert Advisor 코드를 작성하는 과정에서 일반적으로 발생하는 몇 가지 일반적인 코드 오류를 살펴보는 것으로 이 글을 시작합니다. 대부분의 경우 초보자는 코드를 작성하거나 다른 개발자가 작성한 코드를 수정할 때 코드 오류를 식별하고 수정하는 데 어려움을 겪습니다. 이 섹션에서는 MQL5 편집기를 사용하여 이러한 오류 중 일부를 식별하고 수정하는 것이 얼마나 쉬운지 살펴보겠습니다.

방금 코드 작성을 완료했으며 코드에 오류가 없다고 거의 확신하기 때문에 모든 것이 제대로 작동하는 것 같습니다. 아니면 다른 사람이 작성한 코드이고 당신이 약간의 변경을 가했습니다. 컴파일 버튼을 누르면(또는 F7 키를 누름) MetaEditor 도구 상자 창의 오류 탭과 같이 코드에 일련의 오류가 표시됩니다.

Expert Advisor 코드의 컴파일 오류

그림 1. Expert Advisor 코드의 컴파일 오류

와! 오류 38개 및 경고 1개, 코드에 여기에 표시된 것과 같은 오류가 없을 수 있습니다. 코드를 컴파일할 때 표시될 가능성이 있는 다양한 유형의 오류와 이를 해결할 수 있는 방법을 살펴보고자 합니다. 위의 도표를 설명해봅시다.

  • 1으로 표시된 섹션은 코드의 오류 설명을 보여줍니다. 이것은 오류가 어떻게 생겼는지에 대한 아이디어를 제공합니다.
  • 2 로 표시된 섹션은 오류가 있는 파일을 보여줍니다. 오류가 있는 파일이 포함된 경우 이는 매우 중요합니다. 이를 통해 설명된 오류를 검사할 파일을 알 수 있습니다.
  • 3으로 표시된 섹션은 코드에서 오류가 있는 줄과 열(줄에 있음)을 보여줍니다. 이를 통해 설명된 오류를 확인할 특정 라인을 알 수 있습니다.
  • 4로 표시된 섹션은 컴파일 오류 및 경고 요약을 보여줍니다.

이제 하나씩 오류를 해결하기 시작하겠습니다. 처음부터 시작할 수 있도록 오류 탭의 첫 번째 줄까지 스크롤하겠습니다.

코드 오류 식별 및 해결-1

그림 2. 코드 오류 식별 및 해결

첫 번째 문제는 "상수 값 절단"으로 설명되며 16행 20열에서 발견되어 Google에서 정확한 행을 찾습니다. 코드를 편집하려면 MetaEditor의 편집 메뉴에서 행으로 이동을 선택하거나 키보드에서 CTRL G를 누르십시오.

그림 3. 오류 코드 줄 번호 찾기

그림 3. 오류 코드 줄 번호 찾기

대화 상자가 표시됩니다.

그림 4. 오류 줄 번호 찾기 대화 상자

그림 4. 오류 줄 번호 찾기 대화 상자

대화 상자에 표시된 숫자 범위는 코드의 총 줄 수입니다. 이 경우 (1-354) 는 코드에 354줄의 코드가 포함되어 있음을 보여줍니다.

확인란에 확인하려는 줄 번호를 입력하고 확인 버튼을 클릭합니다. 코드의 줄 번호로 바로 이동합니다. 특정 줄에서 마우스 커서가 깜박이는 것을 볼 수 있습니다.

그림 5. 오류 줄 번호를 표시하는 커서

그림 5. 오류 줄 번호를 표시하는 커서

여기서 문제는 Lot정수 (int) 변수로 선언하지만 double 값으로 초기화한다는 것입니다. (0.1). 이 오류를 수정하기 위해 intdouble으로 변경하고 파일을 저장한 다음 COMPILE 버튼을 다시 클릭하여 수정되었는지 확인합니다.

그림 6. 수정 후 컴파일 및 저장

그림 6. 수정 후 컴파일 및 저장 

다시 컴파일하면 첫 번째 문제가 해결되었지만 아래와 같이 여전히 더 많은 문제가 있습니다.

해결해야 할 코드의 추가 오류

그림 7. 컴파일 후 코드에 더 많은 오류가 표시됨

이제 위와 동일한 절차를 따르고 31 줄로 이동합니다. 그러나 이번에는 오류 탭에서 오류를 마우스 오른쪽 버튼으로 클릭하고 줄로 이동을 선택합니다. 나

코드 오류 라인을 찾는 또 다른 방법

그림 8. 코드 오류 라인을 찾는 또 다른 방법 

또는 오류를 선택하고 키보드의 Enter 버튼을 누르십시오. 즉시 코드 줄 번호 31로 이동합니다.

특정 코드 라인 31에서 마우스 커서가 깜박이고 작은 둥근 빨간색 버튼(오류 아이콘)이 표시됩니다.

코드 오류 라인 찾기

그림 9a. 코드 오류 라인 찾기

그러나 이전에 수정한 16행의 첫 번째 것과 같은 경고 메시지인 경우 삼각형 노란색 버튼(경고 아이콘)이 표시됩니다.

경고 표시

그림 9b. 코드 오류 라인 찾기

31 줄에는 문제가 없는 것이 매우 분명하지만 오류 설명에는 "'STP' - 예기치 않은 토큰"이 있습니다.

그런 다음 이전 코드 줄(즉, 30행)을 확인하여 무엇이 잘못되었는지 확인해야 합니다. 자세히 살펴보면 "double ccminb = -95.0000" 뒤에 세미콜론이 없습니다. 30번째 줄에, 그래서 31번째 줄에 그 오류가 있는 것입니다. 이제 -95.0000 뒤에 세미콜론을 입력하여 이 오류를 수정하고 코드를 다시 컴파일합니다.

이제 줄 31 오류가 사라졌습니다. 다음은 아래와 같이 100줄입니다.

코드에 여전히 더 많은 오류가 있습니다.

그림 10. 코드에 여전히 더 많은 오류가 있습니다.

Olowsam, 우리는 각 수정 후에 컴파일해야 합니다. 모든 라인을 동시에 살펴보고 모든 수정을 완료한 후 각 수정 후에 컴파일하는 대신 코드를 한 번 컴파일하는 것이 어떻습니까?

이 질문을 방금 했습니까?

당신이 어떤 면에서 옳을 수도 있지만 저는 그것을 조언하지 않을 것입니다. 문제는 항상 하나씩 하나씩 해결됩니다. 문제를 하나로 묶고 한번에 해결하려는 시도는 많은 골칫거리로 이어질 수 있습니다. 당신은 곧 이유를 이해하게 될 것입니다... 인내심을 가지십시오.

문제로 돌아가서 다음 오류에 대해 100행을 확인해야 합니다. 오류 상태: "'if' - 식은 전역 범위에서 허용되지 않음" 그리고 100번째 줄의 if 식은 전역 범위에 있지 않다고 확신하지만 왜 이 오류가 발생합니까? 100행으로 가도록 합시다.

그림 11.  코드에서 오류 찾기

그림 11. 코드에서 오류 찾기

100행에서는 문제를 찾을 수 없으며 31행 수정을 방금 완료했기 때문에 이제 문제가 32행과 99행 사이에 있다고 확신합니다. 따라서 99행으로 위로 이동하겠습니다(주석이 있으므로 오류가 될 수 없음). 선언(MqlTick, Mqltraderequest Mqltraderesult)도 위쪽으로 살펴보면 올바르게 선언되고 구두점이 있습니다.

다음으로 이러한 선언 코드 행 앞에 있는 if 표현식의 코드를 살펴보고 표현식이 괜찮은지 확인하겠습니다. 매우 면밀한 연구에서 if 표현식이 닫는 중괄호는 있지만 여는 중괄호는 없습니다.

그림 12. 오류를 식별하기 위해 오류 행 번호 위를 살펴봅니다.

그림 12. 오류를 식별하기 위해 오류 행 번호 위를 살펴봅니다.

여는 중괄호를 추가하고 코드를 다시 컴파일하십시오.

//--- Do we have enough bars to work with
   int Mybars=Bars(_Symbol,_Period);
   if(Mybars<60) // if total bars is less than 60 bars
    {
      Alert("We have less than 60 bars, EA will now exit!!");
      return;
     }

코드가 컴파일되면; 100, 107, 121, 126, 129 등 줄의 오류가 완전히 지워지고 새 오류가 나타납니다. 단계별로 따라하는 것이 왜 좋은지 알아볼까요? 

코드에 더 많은 오류가 표시됨

그림 13. 코드에 여전히 더 많은 오류가 있습니다.

다음으로 두 개의 오류가 있는 56 줄로 이동합니다. "'cciVal1' - 매개변수 변환이 허용되지 않음" 및 "'cciVal1' - 배열이 필요합니다."

56 줄을 자세히 살펴보면 cciVal1이 배열로 선언되어 있다고 가정합니다. 배열로 선언하지 않았지만 지금은 배열로 사용하려고 하는 것은 아닐까요? 다음에 무엇을 할지 알기 전에 선언 섹션을 확인하여 이를 확인합시다.

//--- Other parameters
int maHandle;               // handle for our Moving Average indicator
int cciHandle1,cciHandle2;  // handle for our CCI indicator
double maVal[];             // Dynamic array to hold the values of Moving Average for each bars
double cciVal1,cciVal2[];   // Dynamic array to hold the values of CCI for each bars
double p1_close,p2_close;   // Variable to store the close value of Bar 1 and Bar 2 respectively

여기에서 대괄호([])를 생략했기 때문에 cciVal1을 동적 배열이 아닌 double로 잘못 선언했음을 알 수 있습니다. 대괄호를 추가한 다음(cciVal2[]에서와 같이) 코드를 컴파일합니다.

//--- Other parameters
int maHandle;               // handle for our Moving Average indicator
int cciHandle1,cciHandle2;  // handle for our CCI indicator
double maVal[];             // Dynamic array to hold the values of Moving Average for each bars
double cciVal1[],cciVal2[]; // Dynamic array to hold the values of CCI for each bars
double p1_close,p2_close;   // Variable to store the close value of Bar 1 and Bar 2 respectively

코드 오류가 크게 감소했습니다.

그림 14. 코드 오류가 상당히 감소했습니다.

뭐라고요! 너무 많은 오류가 사라졌습니다. 56 행에 보고된 오류만 수정했으며 일부 다른 오류는 자동으로 수정되었습니다. 이는 56행에 보고된 오류가 다른 오류의 원인이 되었기 때문입니다. 이것이 코드의 오류를 해결하기 위해 단계별 프로세스를 따르는 것이 좋은 이유입니다.

이제 103 행에서 보고된 다음 오류로 이동합니다. "'GetLastError' - 선언되지 않은 식별자" 잠시만, GetLastError 은(는) 함수여야 합니다... 103 줄로 이동하여 문제가 무엇인지 확인하십시오.

//--- Get the last price quote using the MQL5 MqlTick Structure
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError,"!!");    // line 103
      return;
     }

문제는 실제로 103 줄에 있습니다. GetLastError는 함수이며 모든 함수에는 입력 매개변수에 대해 한 쌍의 괄호가 필요합니다. 빈 괄호 쌍을 입력한 다음 코드를 컴파일해 보겠습니다. 빈 괄호 쌍은 함수가 인수나 매개변수를 사용하지 않음을 나타냅니다.

//--- Get the last price quote using the MQL5 MqlTick Structure
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");  // line 103
      return;
     }

다음으로 159 줄로 이동합니다. "'=' - l-value required" 경고: "expression is not Boolean" 159 줄로 이동하여 이 오류가 의미하는 바를 살펴보겠습니다. 

      else if(PositionGetInteger(POSITION_TYPE) = POSITION_TYPE_SELL) // line 159
       {
            Sell_opened = true; // It is a Sell

여기에서 if 문에서 POSITION_TYPE_SELL 값을 PositionGetInteger(POSITION_TYPE)에 할당한 것을 볼 수 있습니다. 이것은 우리가 하려는 것이 아닙니다. 대신 비교하고 싶었습니다. 이제 대입 연산자를 사용하는 대신 등호 연산자를 사용하도록 표현식을 변경합니다. (즉, '=' 대신 '=='입니다). 수정하고 코드를 컴파일하십시오.

      else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) // line 159
       {
            Sell_opened = true; // It is a Sell

좋습니다! 이제 한 번 더 가야 합니다. 292행으로 이동하여 "'PositionsTotal' - 선언되지 않은 식별자"라고 표시되는 이유를 살펴보겠습니다. 잠시만요, 우리가 전에 이와 같은 오류를 본 것을 기억할 수 있습니까? 'GetlastError' 줄 103. PositionsTotal 역시 함수이기 때문에 한 쌍의 괄호를 추가하는 것을 잊었을 수도 있습니다. 292행으로 이동하여 확인하겠습니다.

bool CheckTrade(string otyp)
{
   bool marker = false;
   for (int i=1; i<=PositionsTotal;i++)  // line 292
   {

예상대로 PositionsTotal 함수에 괄호 쌍을 추가하는 것을 잊었기 때문입니다. 이제 한 쌍의 괄호(PositionsTotal())를 추가하고 코드를 컴파일합니다. 또한 코드의 어느 곳에서도 선언하지 않은 변수를 실제로 사용하는 경우 이 오류가 발생할 수 있음을 언급하겠습니다.

그림 15. 모든 컴파일 오류가 완전히 해결되었습니다.

그림 15. 모든 컴파일 오류가 완전히 해결되었습니다.

아주 멋집니다! 이제 모든 컴파일 오류를 수정할 수 있습니다. 이제 코드를 디버그하고 런타임 오류가 있는지 확인할 시간입니다. 이 문서에서 이미 설명한 대로 코드를 디버깅하는 방법에 대한 자세한 내용은 여기에서 다루지 않겠습니다.

디버그 세션이 시작되면 또 다른 오류가 발생합니다.

그림 16. 코드 디버깅 중 관찰된 런타임 오류

그림 16. 코드 디버깅 중 관찰된 런타임 오류

확인 버튼을 클릭하면 오류를 생성하는 코드 줄로 이동합니다.

런타임 오류를 생성하는 코드 줄 식별

그림 17. 런타임 오류를 생성하는 코드 줄 식별

위 그림에서 볼 수 있듯이 172 줄에서 이 코드에 의해 오류가 생성됩니다. 오류는 "범위를 벗어난 배열" 오류이므로 배열에서 얻으려는 값이 사용 가능한 배열 값의 범위를 벗어났음을 의미합니다. 이제 표시기 버퍼를 배열에 복사하여 문제가 무엇인지 확인하는 행으로 이동합니다.

//--- Copy the new values of our indicators to buffers (arrays) using the handle
   if(CopyBuffer(maHandle,0,0,3,maVal)<0)
     {
      Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(cciHandle1,0,0,3,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,3,cciVal2)<0)
     {
      Alert("Error copying CCI indicator buffer - error:",GetLastError());
      return;
     }

CopyBuffer 함수에서 세 개의 값(Bar 0, 1, 2)만 복사했음을 관찰할 수 있습니다. 이는 maVal[0]의 배열 값에만 액세스할 수 있음을 의미합니다. maVal[1], maVal[2]cciVal1[0] , cciVal1[1] cciVal1[2] 등이죠. 그러나 172 줄의 코드에서 cciVal1[3]에 대한 배열 값을 얻으려고 했습니다. 이것이 오류가 생성된 이유입니다. 이제 오류를 수정할 수 있도록 디버거를 중지합니다.

그림 18. 코드의 오류를 수정하기 위해 디버거 중지

그림 18. 코드의 오류를 수정하기 위해 디버거 중지

이 문제를 해결하려면 필요한 경우 cciVal1[0], cciVal1[1], cciVal1[2], cciVal1[3],cciVal1[4]의 배열 값을 얻을 수 있도록 표시기 버퍼에서 복사할 레코드 수를 5로 늘려야 합니다.

//--- Copy the new values of our indicators to buffers (arrays) using the handle
   if(CopyBuffer(maHandle,0,0,5,maVal)<0)
     {
      Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(cciHandle1,0,0,5,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,5,cciVal2)<0)
     {
      Alert("Error copying CCI indicator buffer - error:",GetLastError());
      return;
     }

표시된 대로 코드를 수정한 다음 디버거를 다시 시작하십시오. 이번에는 Expert Advisor이 거래 조치를 수행하는 것을 볼 때 더 이상 오류가 발생하지 않습니다.

그림 19. 모든 오류 수정, Expert Advisor는 디버깅 중 거래 수행

그림 19. 모든 오류 수정, Expert Advisor는 디버깅 중 거래 수행

 

2. expert 조언자 테스트

코드에 오류가 없는지 확인했으면 이제 Expert Advisor를 테스트하여 최상의 결과를 제공하는 최상의 설정을 얻을 수 있습니다. 테스트를 수행하기 위해 MetaTrader 터미널에 내장된 프로그램인 Strategy Tester를 사용할 것입니다. 전략 테스터를 실행하려면 터미널의 보기 메뉴로 이동하여 전략 테스터를 선택하십시오.

그림 20. 전략 테스터 실행

그림 20. 전략 테스터 실행

2.1. Expert Advisor의 예비 테스트

이 시점에서 시장 창에서 사용 가능한 기호를 사용하여 expert를 테스트하려고 합니다. 이 결과를 통해 expert를 더 잘 최적화할 수 있는 통화 쌍을 추측할 수 있습니다. 시장 창에 expert를 대상으로 하는 대부분의 통화가 포함되어 있는지 확인하십시오.

Strategy Tester 설정 탭에서 expert를 선택하고 원하는 기간/기간을 선택한 다음(물론 다른 기간에 대해 테스트할 수도 있음) '모든 기호 선택 MARKET Watch'를 최적화 필드에 표시합니다. 바로 앞에 최적화 결과 매개변수가 있습니다. 균형 + 최대 이익 계수를 선택하십시오.

그림 34. Market Watch 창에 모든 기호가 있는 Expert Advisor의 예비 테스트

그림 21. Market Watch 창에 모든 기호가 있는 Expert Advisor의 예비 테스트 

1. 틱 생성 모드 선택 –(모든 틱)

2. 최적화 유형 선택 -(마켓워치에서 모든 기호 선택)

3. 최적화에서 예상되는 결과 유형 선택

터미널 도움말 문서에서 다양한 최적화 유형에 대한 세부 정보를 얻을 수 있습니다. 우리는 앞으로 테스트하지 않으므로 ForwardNo로 두십시오.

이 테스트에서는 입력 탭의 기본 값/매개변수(녹색으로 강조 표시됨)가 사용됩니다.

그림 35. 예비 테스트 입력 매개변수

그림 22. 예비 테스트 입력 매개변수

완료되면 설정 탭으로 전환하고 시작 버튼을 클릭합니다. 테스트가 완료되면 저널 탭에 다음과 유사한 메시지가 표시됩니다.

그림 36. 예비 테스트 완료

그림 23. 예비 테스트 완료

테스트가 완료되면 최적화 결과 탭으로 이동하여 결과를 확인하십시오.

그림 37. 예비 테스트 최적화 결과

Figure 24. 예비 테스트 최적화 결과

우리의 관심은 우리의 설정(균형 + 최대 이익 계수)에 따라 가장 높은 결과를 제공하는 기호에 있습니다. 이를 얻으려면 결과 제목을 클릭하여 결과를 정렬하여 결과가 가장 높은 기호가 맨 위에 나열되도록 합시다.

그림 38. 예비 최적화 결과 분석

그림 25. 예비 최적화 결과 분석

이 결과에서 우리는 Expert Advisor가 우리가 선택한 기간에 다음 기호(EURUSD, EURJPY, AUDUSD)에 대해 수익성이 있을 수 있음을 알 수 있습니다. 다른 기간(예: 30분) 동안 이 테스트를 더 수행하고 현재 상태를 확인할 수 있습니다. 이것은 과제로 받아들여야 하며 우리 모두가 배울 수 있도록 결과를 공유하십시오.

예비 테스트 결과에서 이제 Expert Advisor를 최적화할 기호와 기간을 결정할 것입니다.

이 예에서는 EURUSD1시간 시간 프레임에 대해 Expert Advisor을 최적화할 것입니다. 방금 선택한 동기는 무엇입니까? :

  • 이익 계수:

이익 계수는 해당 테스트에 대한 총 이익 대 총 손실의 비율입니다. 이익 계수가 높을수록 거래 전략의 수익성이 높아집니다.

  • 축소 %:

이것은 자기자본의 상대적인 감소 또는 자기자본의 최대 가치에서 가장 큰 손실(퍼센트)을 나타냅니다. 축소(%)이 낮을수록 더 나은 전략입니다.

  • 회복 계수:

이것은 최대 손실에 대한 이익의 비율입니다. 그것은 거래 전략의 위험을 반영합니다.

사용할 심볼과 기간을 결정했다면 이제 Expert Advisor를 최적화할 때입니다.

2.2. Expert Advisor 최적화

최적화는 단순히 EA에 코딩된 전략의 효율성 또는 수익성을 결정하는 다양한 요소(매개변수)로 테스트하여 EA의 성능을 미세 조정하는 프로세스입니다. 테스트와 유사한 절차이지만 EA를 한 번만 테스트하는 대신 입력 탭에서 선택한 매개변수에 따라 여러 번 테스트합니다.

시작하려면 설정 탭으로 이동하여 최적화를 활성화한 다음 최적화에서 원하는 결과 유형을 선택합니다.

그림 39. Expert Advisor의 최적화 설정

그림 26. Expert Advisor의 최적화 설정

1. 틱 생성 모드 선택 –(모든 틱)

2. 최적화 유형 선택 –(빠른 유전자 기반 알고리즘)

3. 최적화의 예상 결과 유형 선택 (여기서 잔액 + 최대 이익 계수 선택)

터미널 도움말 문서에서 다양한 최적화 유형에 대한 세부 정보를 얻을 수 있습니다. 우리는 포워드 테스트가 아니므로 포워드를 아니오로 둡니다. 최적화 속성을 설정했으면 입력 탭에서 최적화에 사용할 매개변수를 설정하겠습니다.

그림 40. 최적화 입력 매개변수

Figure 27. 최적화 입력 매개변수

최적화 중이므로 노란색으로 강조 표시된 영역에만 집중할 것입니다. 우선 최적화에 사용하지 않으려는 매개변수를 선택 취소해야 합니다. 즉, EA 최적화에 사용하려는 매개변수만 확인합니다. 여기서는 5개의 매개변수를 확인했지만 전략의 효율성이 기반으로 하는 매개변수에 따라 1개 또는 2개만 확인할 수도 있습니다. 예를 들어 이동 평균 및 CCI 기간만 확인하면 최적화 결과를 통해 EA에 최고의 성과를 제공하는 각 지표에 대한 최상의 값을 알 수 있습니다. 이것이 최적화의 핵심입니다.

또한 검사한 매개변수의 수에 따라 EA가 통과할 총 테스트 수가 결정됩니다. 곧 내가 무슨 말을 하는지 알게 될 것입니다.

값 설정

시작:

최적화를 위해 선택한 변수에 사용할 시작 값입니다. Stop Loss 변수를 사용하여 값을 설정하는 방법을 설명하겠습니다. 손절매의 경우 테스터에게 30 값으로 시작하도록 요청했습니다. 이것은 최적화 동안 손절매에 사용될 최소값입니다.

단계:

이것은 손절매의 증분 값입니다. 증분을 2로 설정하면; 첫 번째 테스트에서 손절매에 30을 사용하는 경우 두 번째 테스트에서는 32, 36, 34 등을 사용한다는 의미입니다. 30을 사용한 다음 32, 34 등을 사용합니다. 아니요, 무작위로 값을 선택하지만 항상 시작 값과 중지 값 사이의 2의 배수입니다.

멈춤:

이것은 최적화에 사용될 최대값 또는 최대값입니다. 여기에서 38을 지정했습니다. 즉, 테스트에 사용되는 값은 3038 사이이지만 2의 배수인 값입니다. 40 이상의 값은 사용하지 않습니다.

수행될 총 테스트 수는 이 세 섹션의 설정에 따라 다릅니다. 이 예에서 테스터는 단계 열에 표시된 대로 손절매에 대해 단독으로 총 5개의 가능성을 결합합니다. 입력 탭, 이익 실현 등 총 8가지 가능성을 결합합니다. 다른 모든 변수를 고려할 때까지는 수백 또는 수천 가지 가능성(테스트/통과)에 도달할 것입니다. 단일 EA를 최적화하기 위해 연령을 기다리지 않으려면 너무 많은 변수를 포함하거나 확인하지 않도록 하십시오. EA의 성능이 실제로 의존하는 두세 가지 정도일 수 있습니다(가장 특히, 자체 코드에서 사용하는 경우 표시기 기간). 또한 단계 값이 너무 많은 가능성(테스트)을 갖지 않도록 해야 합니다. 예를 들어, 단계 값으로 1을 사용하면 손절매에 대한 시도 횟수만 10으로 늘었습니다. 앞서 말했듯이 최적화 세션을 완료하는 데 필요한 총 시간은 시스템에 설정한 사용 가능한 에이전트의 총 수에 따라 다릅니다.

설명이 충분하다고 생각합니다.

입력 설정을 마치면 이제 설정 탭으로 돌아가 시작 버튼을 클릭합니다.

최적화가 완료되면 저널 탭에서 세부 정보를 볼 수 있습니다.

그림 43. 저널 탭에 표시된 대로 최적화 완료

그림 28. 저널 탭에 표시된 대로 최적화 완료

각 테스트가 통과되거나 완료될 때 결과를 보려면 최적화 결과 탭으로 이동합니다. 최적화 설정을 기반으로 최상의 결과를 제공하는 설정을 쉽게 식별할 수 있도록 항상 결과를 기준으로 출력을 정렬하는 것이 좋습니다. 최적화 결과 탭에서 결과 제목을 클릭하면 결과가 오름차순 또는 내림차순으로 정렬됩니다.

그림 44. 최적화 보고서

그림 29. 최적화 보고서

그래프가 어떻게 보이는지 보려면 최적화 그래프 탭으로 전환하십시오.

그림 45. 최적화 그래프

그림 30. 최적화 그래프

당신이 보는 것을 이해하지 못합니까? 걱정하지 마십시오. 표시되는 점은 선택한 최적화 결과 유형을 기반으로 한 최적화 결과에 대해 EA가 통과한 테스트 수의 플롯입니다. 우리의 경우 균형 + 최대 이익 계수를 선택했습니다.

2.3. 결과 해석

최적화 보고서를 성공적으로 해석하려면 최적화 결과 탭으로 이동하십시오. Profit factor, Expected Payoff, Drawdown % 등과 같은 일부 필드를 볼 수 없다는 것을 알게 될 것입니다. 이를 보려면 최적화 결과 탭의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 아래와 같이 보고 싶은 추가 정보를 선택하십시오.

그림 46. 최적화 결과에서 Drawdown% 선택

그림 31. 최적화 결과에서 Drawdown% 선택

  그림 47. 최적화 결과에서 Profit Factor 선택

그림 32. 최적화 결과에서 Profit Factor 선택

이러한 추가 기록을 추가하면 이제 최적화 결과를 분석하여 Expert Advisor에 가장 적합한 설정을 결정할 것입니다.

최적화 보고서 분석

그림 33. 최적화 결과 분석

위 그림에서 A와 B로 표시된 강조 표시된 섹션은 Expert Advisor에 대한 최상의 결과를 나타냅니다. 이제 당신의 선택은 전적으로 당신의 몫입니다. 모든 것은 당신이 찾고 있는 것에 달려 있습니다. 그러나 여기에서 우리는 가장 높은 이익을 줄 뿐만 아니라 더 낮은 축소%도 갖는 설정에 관심이 있습니다.

보시다시피 섹션 A(노란색으로 강조 표시됨)는 이익과 (924.10) 함께 22381.71의 최상의 결과(잔액 + 최대 이익 계수)를 가지고 있습니다. 섹션 B(녹색으로 강조 표시됨)는 22159.25로 두 번째로 좋은 결과를 갖지만 936.55의 더 높은 수익을 냅니다. . 섹션 A1.78의 더 낮은 축소 %를 갖고 있는 반면 B는 1.95의 더 높은 드로우다운을 가지고 있습니다.

전략 테스터는 최적화 결과를 "<클라이언트 터미널 데이터 폴더>\Tester\cache" 폴더에 저장합니다. 귀하의 경우 모든 최적화 데이터는 cci_ma_ea.EURUSD.H1.0.xml 파일에 저장됩니다.

파일 이름은 ExpertName.SYMBOL.PERIOD.GenerationMode.xml 형식입니다. 여기서:

  • ExpertName - Expert Advisor 이름;
  • 기호 - 기호;
  • 기간 - 기간(M1,H1,...)
  • GenerationMode - 틱 생성 모드(0-모든 틱, 1 - 1분 OHLC, 2 - 공개 가격만).

XML 파일은 MS Excel에서 열 수 있습니다.

2.4. 최상의 결과 선택

마지막으로 최상의 결과를 얻으려면 최적화 그래프를 다시 살펴봐야 합니다. 최적화 그래프로 다시 전환합니다. 그래프 내 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 1D 그래프를 선택합니다.

1차원 그래프 형태 최적화 그래프 선택

그림 34. 결과 분석을 위한 1차원(1D) 그래프 선택

이를 통해 최상의 결과를 제공하는 각 입력 매개변수의 값을 쉽게 볼 수 있습니다. 이제 각 매개변수를 선택하여 최상의 값을 볼 수 있습니다. 그래프를 마우스 오른쪽 버튼으로 클릭하고 X축을 선택한 다음 확인하려는 매개변수를 선택합니다. 아래처럼 보일 것입니다(손절매의 경우)

그림 50. 최적화 결과에서 최고의 StopLoss 값 얻기

그림 35. 최적화 결과에서 최고의 StopLoss 값 얻기

실제로 최적화 결과에서 최고의 Stoploss는 34, 최고의 TakeProfit은 78, 최고의 CCI_Period1은 62임을 알 수 있습니다. MAPeriod 및 CCI_Period2에 대한 최상의 값을 얻으려면 위와 같이 각각을 선택하십시오.

그림 51. 최적화 결과에서 최상의 이동 평균 기간 값 얻기

그림 36. 최적화 결과에서 최상의 이동 평균 기간 값 얻기

이 그래프는 가장 좋은 결과를 가진 MA_Period로 26의 값을 보여줍니다.

그림 52. 최적화 결과에서 최상의 CCI_Period1 값 얻기

그림 37. 최적화 결과에서 최상의 CCI_Period1 값 얻기

이 그래프는 최상의 결과를 가진 CCI_Period1로 62의 값을 보여줍니다.

그림 53. 최적화 결과에서 최상의 CCI_Period2 값 얻기

그림 38. 최적화 결과에서 최상의 CCI_Period2 값 얻기

이 그래프는 CCI_Period2로 28 또는 30 값을 가장 좋은 결과로 보여줍니다.

각 매개변수에 대한 최상의 값을 얻었으면 이제 Expert Advisor의 최종 테스트 시간입니다.

2.5. 최종 테스트

최종 테스트에는 Expert Advisor 테스트에 가장 적합한 매개변수를 모으는 작업이 포함됩니다. 이 경우 아래와 같이 Strategy Tester의 INPUT 섹션에서 찾은 최상의 값을 사용합니다.

최종 테스트를 위한 입력 값

그림 39. 최종 테스트 입력 매개변수

전략 테스터의 설정 탭에서 아래와 같이 최적화를 비활성화합니다.

최종 테스트를 위한 설정

그림 40. 최종 테스트 설정

이제 START 버튼을 클릭하여 테스트를 시작하겠습니다. 테스트가 완료되면 아래와 같이 결과 탭에 결과가 표시됩니다.

그림 56. 최종 테스트 결과

그림 41. 최종 테스트 결과

마찬가지로 GRAPH 탭에 테스트용 그래프가 있습니다.

그림 57. 최종 테스트 그래프 결과

그림 42. 최종 테스트 그래프 결과

결론

이 글에서는 코드 오류를 식별하고 수정하는 방법에 대해 논의했으며 시장 조사에서 최고의 기호에 대해 Expert Advisor를 테스트하고 최적화하는 방법도 논의했습니다.

이 글을 통해 편집기를 사용하여 코드 오류를 확인하고 Strategy Tester를 사용하여 Expert Advisors를 최적화 및 테스트하면 더 좋고 수익성 있는 Expert Advisor를 작성할 수 있다고 믿습니다.

MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/156

파일 첨부됨 |
cci_ma_ea.mq5 (14.23 KB)
MetaTrader 5의 주문, 포지션 및 거래 MetaTrader 5의 주문, 포지션 및 거래
강력한 거래 로봇을 만드는 것은 MetaTrader 5 거래 시스템의 메커니즘에 대한 이해 없이는 수행할 수 없습니다. 클라이언트 터미널은 거래 서버로부터 포지션, 주문 및 거래에 대한 정보를 수신합니다. MQL5를 사용하여 이 데이터를 올바르게 처리하려면 MQL5 프로그램과 클라이언트 터미널 간의 상호 작용을 잘 이해해야 합니다.
적응형 거래 시스템과 MetaTrader 5 클라이언트 터미널에서의 사용 적응형 거래 시스템과 MetaTrader 5 클라이언트 터미널에서의 사용
이 글에서는 각각 고유한 "가상" 거래 작업을 수행하는 여러 전략으로 구성된 적응형 시스템의 변형을 제안합니다. 실제 거래는 현재 가장 수익성이 높은 전략의 신호에 따라 수행됩니다. 객체 지향 접근 방식, 데이터 작업을 위한 클래스 및 표준 라이브러리의 거래 클래스 덕분에 시스템 아키텍처는 단순하고 확장 가능한 것처럼 보였습니다. 이제 수백 가지 거래 전략을 포함하는 적응형 시스템을 쉽게 만들고 분석할 수 있습니다.
MetaTrader 5 터미널의 Strategy Tester 내 틱 생성 알고리즘 MetaTrader 5 터미널의 Strategy Tester 내 틱 생성 알고리즘
MetaTrader 5를 사용하면 Expert Advisors와 MQL5 언어를 사용하여 임베디드 전략 테스터 내에서 자동 거래를 시뮬레이션할 수 있습니다. 이러한 유형의 시뮬레이션을 Expert Advisors 테스트라고 하며 다중 스레드 최적화를 사용하여 동시에 여러 기기에서 구현할 수 있습니다. 철저한 테스트를 제공하려면 사용 가능한 분 기록을 기반으로 하는 틱 생성을 수행해야 합니다. 이 글은 MetaTrader 5 클라이언트 터미널에서 이력 테스트를 위해 틱이 생성되는 알고리즘에 대한 자세한 설명을 제공합니다.
Bill Williams의 "New Trading Dimensions"에 기반한 Expert Advisor Bill Williams의 "New Trading Dimensions"에 기반한 Expert Advisor
이 글에서는 Bill Williams의 "New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities" 책을 기반으로 한 Expert Advisor의 개발에 대해 논의할 것입니다. 이 전략 자체는 잘 알려져 있으며 그 사용은 여전히 ​​트레이더들 사이에서 논란이 되고 있습니다. 이 글은 시스템의 거래 신호, 구현의 세부 사항 및 과거 데이터에 대한 테스트 결과를 고려합니다.