
MQL5 전략 테스터를 이해하고 효과적으로 사용하기
소개
우리는 MQL5 프로그래머 또는 개발자로서 트레이딩에서 좋은 결과를 얻으려면 전략 테스터를 잘 이해하고 사용해야 합니다. 이 귀중한 도구를 사용하면 우리가 만든 MQL5 프로그램의 성능에 대해 귀중한 통찰력을 얻을 수 있으며 이는 더 나은 거래 결과를 얻는 데 영향을 미칠 것입니다. 개발자로서 실수로 인해 오류가 발생하는 것은 매우 당연한 일입니다. 테스트를 하며 모든 오류 유형에 대처하기 전에 오류와 관련한 중요한 내용을 잘 이해해야 합니다. 우리가 잘 이해해야 할 또 다른 주제는 우리가 만든 프로그램을 대화형 방식으로 실행할 수 있게 해주는 디버깅입니다. 그런 다음 우리에게 가장 중요하고 가치 있는 도구인 전략 테스터를 통해 MetaTrader 4보다 더욱 흥미로운 기능으로 우리가 만든 프로그램을 테스트하고 평가할 수 있습니다. 따라서 이 글에서는 MQL5 전략 테스터의 사용에서 가장 중요한 측면을 배워 볼 것입니다. 다음 주제를 통해 이를 다룰 것입니다:
프로그래머 또는 개발자로서 우리가 처리해야 할 내용을 잘 이해하기 위해 앞의 주제와 관련하여 가장 많이 언급되는 사항을 다룰 것입니다. 저는 이 주제를 다루면서 모든 독자가 이미 MQL5 프로그래밍 언어를 알고 있고 프로그램을 코딩하는 방법을 알고 있다고 가정합니다. 이 글을 여러분이 최대한의 활용하기 위해서는 여러분의 사전 이해가 필요합니다. 언어에 대해 먼저 배워야 하는 경우 MQL5 설명서를 참조하세요. 또한 mql5 프로그래밍의 기초를 배우고 가장 인기있는 기술 지표를 기반으로 거래 시스템을 만드는 방법에 대한 저의 다른 기사들을 읽어 보시고 유용하게 사용하시기 바랍니다.
오류
이 주제에서는 MQL5 프로그램을 생성, 실행 및 실행할 때 발견할 수 있는 오류에 대해 알아보겠습니다. 이 주제를 이해하는 것이 매우 중요한 이유는 MQL5는 이러한 오류를 정확하게 보고하지만 우리가 이러한 오류가 무엇을 의미하는지 또는 프로그램의 어느 단계에서 발생하는지 알지 못한다면 이미 오류의 의미를 알고 있는 경우보다 문제를 처리하거나 해결하는 데 훨씬 더 많은 시간이 소요되기 때문입니다.
이 주제는 우리가 MQL5로 프로그래밍을 하는 작업 단계를 기준으로 할 것입니다. 코드를 작성하는 동안 컴파일 오류 및 경고라는 오류와 경고에 직면할 수 있습니다. MQL5 프로그램을 실행할 때 런타임 오류가 발생할 수 있으며 MQL5 프로그램이 거래를 시도할 때 거래 서버 오류인 다른 유형의 오류가 발생할 수도 있습니다. 우리는 다음과 같은 유형의 오류를 다룰 것입니다:
- 컴파일 오류 및 경고
- 런타임 오류
- 거래 서버 오류
이러한 오류를 다루기 전에 여러분은 오류가 나타나는 위치를 알아야 합니다. MQL5 IDE에서 도구 상자 창은 가장 아래 부분에 있으며 다음 방법 중 하나를 사용하여 볼 수 있습니다:
1- 보기 ==> 도구 상자 선택 클릭
2- 키보드에서 Ctrl+T를 누릅니다.
3- 기본 도구 상자에서 도구 상자 버튼을 클릭합니다.
그 후에는 다음 그림과 같이 찾을 수 있습니다.
컴파일 오류 및 경고:
우리는 프로그램에의 코드를 작성할 때 잘못된 구문을 작성하거나 오타가 발생하여 코드를 컴파일할 때 오류가 발생하는 등 실수를 할 수 있으며 이는 매우 정상적인 현상입니다. 이 부분에서는 흔히 발생하는 이러한 유형의 오류에 대해 설명합니다. 또한 여러분이 알아야 할 가장 중요한 점은 오류가 제거되거나 해결된 후에야 프로그램을 컴파일할 수 있다는 것입니다. 여기서는 가장 많이 발생할 수 있는 오류를 소개하겠습니다:
세미콜론 오류입니다:
줄 끝에 세미콜론을 쓰는 것을 잊어버려서 세미콜론이 누락되었거나 왼쪽 대괄호를 잊어버렸을 때 이 오류가 발생하게 됩니다. 이러한 유형의 오류를 방지하려면 이러한 유형의 기호를 올바르게 사용해야 합니다. 다음 코드는 이러한 오류의 예입니다.
오류가 있는 잘못된 코드입니다:
int a=(2+1)
오류는 다음과 같습니다:
오류 없는 올바른 코드를 입력
코드 줄 끝에 세미콜론을 추가하여 코드를 수정하면 다음과 같이 올바른 코드가 됩니다:
int a=(2+1);
코드를 컴파일한 후 오류가 제거되고 다음과 같이 오류 없이 코드가 컴파일 된 것을 확인했습니다:
예기치 않은 토큰 오류:
이것은 우리가 흔히 직면하는 또 다른 유형의 코드로 그 이유는 코드의 마지막 줄에 오른쪽 괄호를 잊어버리거나 현재 코드 줄에 왼쪽 괄호를 추가해서 썻기 때문입니다. 이러한 유형의 오류의 예는 다음과 같습니다:
오류가 있는 잘못된 코드입니다:
int a=(2+1;
도구 상자의 오류 탭에서 다음과 같은 오류를 확인할 수 있습니다:
오류 없는 올바른 코드를 입력
int a=(2+1);
다음과 같이 오른쪽 괄호를 추가하여 코드를 수정한 후 오류 탭에서 오류를 확인할 수 있습니다:
선언되지 않은 식별자 오류입니다:
이러한 유형의 오류는 변수를 사용하거나 값을 할당하기 전에 새 변수를 선언해야 하는데 먼저 선언하지 않고 변수를 사용할 때 발생합니다. 예를 들어 정수나 문자열과 같이 변수로 반환해야 하는 적절하고 적합한 데이터 유형을 선택하여 선언합니다. 다음은 이와 같은 선언을 하지 않고 새 변수를 사용할 때 이러한 유형의 오류가 발생하는 예입니다.
오류가 있는 잘못된 코드입니다:
a=5;
이전 코드에서 변수 (a)를 선언하지 않고 변수에 5를 할당했습니다. 따라서 이 코드를 컴파일하면 다음과 같이 선언되지 않은 식별자 오류가 발생합니다:
보시다시피 오류 설명의 정확성은 오류를 보고할 뿐만 아니라 이 오류의 원인인 변수 'a'를 명시하기 때문에 매우 유용할 수 있습니다.
오류 없는 올바른 코드를 입력
int a=5;
이 올바른 코드를 컴파일한 후에는 도구 상자의 오류 탭에서 앞의 그림과 같은 오류를 찾을 수 없습니다.
왼쪽 괄호 오류입니다:
이러한 유형의 오류는 올바른 괄호를 놓치거나 오른쪽 괄호를 추가로 사용할 때 발생합니다. 다음 예시를 통해 이 오류를 확인할 수 있습니다.
오류가 있는 잘못된 코드입니다:
bool a=7; if (a=5 a=5;
이전 코드에서 오른쪽 괄호를 잊어버림으로써 다음 그림과 같이 ‘연산자가 있어야 합니다'의 오류와 더불어 '왼쪽 괄호 불균형'의 오류가 발생했습니다.
오류 없는 올바른 코드를 입력
bool a=7; if (a=5) a=5;코드를 수정하면 오류 없이 컴파일 된 것을 확인할 수 있습니다.
예기치 않은 프로그램 종료 오류:
코드에서 닫는 대괄호를 놓쳐 예기치 않은 프로그램 종료 오류가 발생하는 경우가 있습니다. 이 오류를 해결하기 위해 코드를 확인하여 추가해야 할 내용을 확인하거나 모든 여는 대괄호에 닫는 대괄호가 있는지 확인해야 합니다. 다음은 이 코드의 예시입니다.
오류가 있는 잘못된 코드입니다:
void OnStart() { bool a=7; if (a=5) a=5;
마지막 줄(a=5) 뒤에 닫는 괄호를 빼고 이전 코드 블록과 동일하게 코드를 작성하면 다음 그림과 같이 "예기치 않은 프로그램 종료" 오류와 함께 "괄호 불균형" 오류를 발견할 수 있습니다.
오류 없는 올바른 코드를 입력
void OnStart() { bool a=7; if (a=5) a=5; }
닫는 대괄호를 추가하여 코드를 수정하면 코드가 오류 없이 컴파일 된 것을 확인할 수 있습니다.
전역 범위에는 표현식이 허용되지 않습니다 오류:
이 오류는 복합 연산자에서 왼쪽 대괄호를 놓쳤을 때 발생하거나 문이나 표현식을 작성하는 특정 함수 범위 내의 표현식만 사용해야 하는데 이를 어긴 경우에 발생할 수 있습니다. 다음의 예는 이러한 유형의 오류에 대한 예입니다.
오류가 있는 잘못된 코드입니다:
int a=(7+5); if (a<7) a=7; }
이전 코드에서 범위를 변경하는 (}) 개구부가 누락되어 "전역 범위에서는 표현식이 허용되지 않습니다"라는 오류가 보고되었습니다. 다음은 오류 탭의 내용입니다.
오류 없는 올바른 코드를 입력
int a=(7+5); if (a<7) { a=7; }
이전의 코드 블록과 동일하게 코드를 수정하면 코드가 오류 없이 컴파일 된 것을 확인할 수 있습니다.
잘못된 매개변수 개수 오류입니다:
이러한 유형의 코드는 특정 매개변수가 있는 특정 함수를 사용하면서 매개변수를 제대로 지정하지 않았을 때 발생합니다. 이 오류는 미리 정의된 함수 또는 자체 생성한 함수를 사용하는 경우 나타납니다. 다음은 이 오류의 예입니다.
오류가 있는 코드:
만약 우리가 두 개의 정수 값을 합산한 결과의 정수 값을 반환하는 "myVal" 함수를 만들었다면 이 함수에 두 개의 매개 변수가 있다는 것은 무엇을 의미할까요? 따라서 이 두 매개 변수와 다른 매개 변수를 사용하여 이 함수를 호출하면 다음 코드와 같은 오류가 발생합니다.
void OnStart() { int example=myVal(10); } //+------------------------------------------------------------------+ int myVal(int a, int b) { return a+b; }
이전 압축 코드를 컴파일하면 다음과 같은 오류가 발생합니다:
오류 없이 코딩하세요:
이 코드를 올바르게 작성하려면 이 생성된 함수의 지정된 매개 변수를 다음과 같이 사용해야 합니다.
void OnStart() { int example=myVal(10,20); } //+------------------------------------------------------------------+ int myVal(int a, int b) { return a+b; }
이 올바른 코드를 컴파일한 후에는 오류를 찾을 수 없습니다.
연산자가 있어야 합니다 오류입니다:
이러한 유형의 오류는 특정 위치에서 연산자를 완전히 놓치거나 잘못 배치하여 발견되는 오류입니다. 다음은 이러한 유형의 오류의 예입니다.
오류가 있는 코드:
int a= 7 10;
이전 코드에서 두 숫자 사이에 연산자를 놓쳤기 때문에 다음 그림과 같이 "일부 연산자가 있어야 합니다”라는 오류가 발생합니다:
오류 없이 코딩하세요:
int a= 7+10;
(+)를 추가하여 코드를 수정하면 코드가 오류 없이 컴파일되는 것을 확인할 수 있습니다.
이 오류는 컴파일 오류로 이 유형에서 가장 많이 발생하는 오류이지만 컴파일 경고이며 정보 제공 목적으로 표시되는 것으로 오류가 아닙니다. 다음은 오류 탭에서 경고가 표시되는 코드 예시입니다.
int a;
이전 코드를 컴파일하면 새 'a' 변수를 선언했지만 사용하지 않거나 값을 할당하지 않았기 때문에 'a' 변수가 사용되지 않았다는 경고가 표시됩니다. 다음은 그림으로 표시되는 경고입니다.
MQL5에 대한 자세한 내용은 다음 문서에서 확인할 수 있습니다:
이러한 오류가 발생했을 때 이를 처리하는 데 매우 유용하고 도움이 될 수 있는 몇 가지 팁을 알려드리겠습니다:
- 처음의 오류부터 수정하세요. 그러면 이 오류의 원인에 의한 다른 오류도 해결될 수 있습니다.
- 도구 상자의 오류 탭에서 오류 줄을 두 번 클릭하면 문제가 있는 코드 줄로 이동합니다.
이제 우리는 MQL5 프로그램의 코드를 작성할 때 첫 번째 단계에서 발생할 수 있는 오류에 대해 배웠습니다. 다음은 프로그램을 실행할 때 발생하는 오류인 런타임 오류로 넘어가겠습니다.
런타임 오류:
앞서 언급했듯이 실행시간 에러는 MQL5 프로그램 실행 중에 발생하는 에러 유형입니다. 이러한 오류는 코드가 오류 없이 컴파일되는 것을 막지는 못하지만 우리가 필요하거나 기대하는 대로 실행되거나 작동하지는 않습니다. 이러한 오류는 로그에서 오류 이유와 함께 인쇄된 메시지로 확인할 수 있으며 소스 코드에서도 오류가 발생한 줄을 확인할 수 있습니다.
이러한 오류의 예
오류 코드 | 오류 발생 이유 |
---|---|
4007 | 배열 재배치를 위한 메모리 부족 또는 정적 배열의 크기 변경 시도 |
4101 | 잘못된 차트 ID |
4301 | 시장 정보로 알 수 없는 기호 |
4754 | 주문을 찾을 수 없습니다 |
5120 | 내부 데이터베이스 오류 |
MQL5는 모든 런타임 에러를 코드별로 정의하여 식별하기 쉽도록 했습니다. 프로그램에 에러 처리 방법을 추가할 때 GetLastError() 함수를 사용하면 에러 코드를 찾을 수 있기 때문에 테스트 중 저널 탭이나 현재 시간에 실행할 차트에 프로그램을 첨부한 상태에서 Expert 탭에서 에러를 확인할 수 있으며, 다음 링크를 통해 모든 코드가 포함된 런타임 에러를 MQL5 문서에서 확인하실 수 있습니다:
https://www.mql5.com/ko/docs/constants/errorswarnings/errorcodes
예를 들어 배열 범위 초과 오류와 같이 실행을 종료하는 몇 가지 중요한 오류를 제외하고는 런타임 오류 후에는 프로그램이 실행을 종료하지 않는다는 점을 말씀드립니다.
거래 서버 오류:
이러한 유형의 오류는 OrderSend() 함수를 사용하는 거래 요청 MqlTradeRequest의 구조로 거래 실행 단계에서 발생하며 테스트 중 저널 탭 또는 현재 시간에 실행할 차트에 프로그램을 첨부하는 동안 expert 탭에서도 이러한 오류가 보고되는 것을 확인할 수 있습니다. 이러한 오류의 예는 다음과 같습니다:
오류 코드 | 오류 발생 이유 |
---|---|
10006 | 요청이 거부되었습니다. |
10032 | 라이브 계정에만 운영이 허용됩니다. |
10033 | 대기 중인 주문 수가 한도에 도달했습니다. |
10034 | 해당 심볼의 주문 및 포지션 거래량이 한도에 도달했습니다. |
10041 | 펜딩 중인 주문 활성화 요청이 거부되면 주문이 취소됩니다. |
이 유형의 오류에 대한 모든 코드는 다음 링크를 통해 MQL5 문서에서 확인할 수 있습니다:
https://www.mql5.com/ko/docs/constants/errorswarnings/enum_trade_return_codes
디버깅
이번 주제에서는 MQL5 디버거 도구를 통해 디버깅을 사용하는 방법에 대해 알아보겠습니다. 디버깅은 우리가 만든 프로그램을 기록 데이터 또는 라이브 데이터를 통해 실행하는 데 사용할 수 있습니다. 도구 상자의 다음 디버거 버튼 그림과 같이 실제 또는 기록 데이터에서 디버깅 시작/재개를 클릭하여 디버깅을 수행할 수 있습니다.
1- 히스토리 데이터에서 디버깅 시작/재시작
2- 실제 데이터에서 디버깅 시작/재시작
3- 디버깅 일시 중지
4- 디버깅 중지
히스토리 데이터에 대한 디버깅을 위해 시작 버튼을 시작하면 히스토리 데이터에 대한 프로그램을 디버깅하기 위해 차트를 열어 기록 데이터에서 프로그램이 실행되거나 실제 데이터에 대한 디버깅을 선택한 경우 실제 데이터에 차트가 첨부되고 프로그램 옆에 (디버깅 중)이 표시됩니다.
전략 테스터
이 부분에서는 MetaTrader 5에서 가장 중요하고 가치 있는 도구인 전략 테스터에 대해 알아보고 예를 들어 다중 통화 테스트 등과 같이 MetaTrader 4의 테스터보다 나은 새로운 기능을 갖춘 전략 테스터에 대해 설명합니다. 이 전략 테스터를 사용하는 방법은 다음 방법 중 하나와 같이 할수 있습니다:
1- MetaTrader 5 트레이딩 터미널을 여는 동안 키보드에서 Ctrl+R을 누릅니다.
2- 보기 ==> 전략 테스터 메뉴에서 전략 테스터를 선택합니다.
그런 다음 개요 탭에서 다음과 같은 전략 테스터를 찾아 필요한 항목이나 테스트 유형을 선택합니다.
개요 탭에서 테스트할 항목을 선택하면 테스트할 항목에 따라 미리 정의된 설정이 있는 설정 탭으로 탭이 변경됩니다.
- 시그널: 시각화 모드 없이 시그널로 Expert advisors를 테스트할 수 있습니다.
- 지표: 지표를 테스트하기 위한 것입니다.
- 시각화: 차트에서 테스트하는 동안 시각화 모드로 테스트하여 프로그램이 지침에 따라 데이터에 어떻게 반응하는지 확인합니다.
- 스트레스 및 지연: 이름에서 알 수 있듯이 스트레스 및 지연을 테스트합니다.
- 최적화 옵션(전체, 유전, 포워드).
- 마켓 스캐너: 시장 스캔 테스트용입니다.
- 수학 계산: 수학 계산도 테스트할 수 있습니다.
마지막 옵션인 이전 결과 보기를 통해 이전 테스트의 결과를 확인할 수도 있습니다. 테스트 옵션 아래의 검색을 통해 특정한 이전의 테스트를 검색할 수도 있습니다.
설정 탭으로 이동하면 다음과 같이 표시됩니다:
- 1- Expert: 테스트할 프로그램 파일을 선택합니다.
- 2- IDE: 선택한 프로그램의 소스 코드를 엽니다.
- 3-특정 설정을 저장하거나 로드합니다.
- 4- Symbol: 테스트할 심볼을 선택합니다.
- 5- 테스트할 선택한 심볼의 차트 주기를 선택합니다.
- 6- 선택한 심볼의 사양을 나타냅니다.
- 7- Date: 테스트할 기간을 선택합니다.
- 8- 테스트 시작 기간을 선택합니다.
- 9- 테스트 종료 기간을 선택합니다.
- 10- Foward: 최적화 기간 중 필요한 부분을 선택하여 포워드 테스트를 위해 따로 설정합니다.
- 11- 포워딩 날짜를 선택하거나 시작합니다.
- 12- 지연, 실제에 가까운 데이터를 얻도록 조정합니다.
- 13- 실제 데이터와 실제 실행에 가까워지도록 노력합니다.
- 13/2- 모델링: 테스트 할 모델을 선택하려면 모든 틱을 기준으로 하나요 아니면 다른 것을 기준으로 하나요?
- 14- 핍 단위의 수익이 필요한 경우 선택합니다.
- 15- 테스트를 시작하는 데 필요한 입금액을 선택합니다.
- 16- 입금 통화를 선택합니다.
- 17-레버리지를 선택합니다.
- 18- 최적화를 원하는지 여부를 선택하는 것은 나중에 다룰 것입니다.
- 19- 테스트 중에 거래 또는 체결을 시각화해야 하는 경우 선택합니다.
또한 테스트된 프로그램에 사용자가 삽입하거나 편집할 수 있는 입력이 있는지 확인할 수 있는 입력 탭이 있습니다.
설정을 정하고 시작 버튼을 누르면 프로그램이 테스트되며 테스트를 시각화 하면 나타나는 차트와 이 차트의 탭을 통해 해당 테스트를 모니터링할 수 있습니다. 프로그램이 실행한 주문을 볼 수 있는 거래, 체결 또는 취소된 주문을 모니터링하는 내역, 모든 작업을 볼 수 있는 작업, 프로그램이 출력한 메시지 등을 확인할 수 있는 저널 등이 있습니다. 또한 전략 테스터 창의 그래프 탭을 통해 프로그램의 성능을 모니터링할 수도 있습니다.
테스트가 완료되면 다음 예제와 같은 모든 테스트 통계 및 인사이트가 표시되는 백테스트 탭도 확인할 수 있습니다.
테스트할 프로그램에 따라 이 백테스트 탭의 데이터는 이전 예제에 표시된 것과 같거나 다르게 나타납니다.
여기서 한 가지 더 언급해야 할 것이 있는데 테스트 과정에서 매우 중요한 것은 다양한 파라미터와 입력을 선택하고 이러한 입력 또는 파라미터의 가능한 모든 조합을 확인하여 어떤 파라미터가 최상의 결과를 생성하는지 확인하고 테스트하는 최적화 과정입니다. 여기서는 개요 탭에서 최적화 모델 중 하나를 선택하고 다음 그림과 같이 최적화의 적절한 설정을 선택합니다.
우리가 테스트 후 확인하고 평가해야 할 가장 중요한 요소입니다:
- 순이익: 이는 총 이익에서 총 손실을 차감하여 계산합니다.
- 드로다운: 거래 중 계좌에서 발생하는 최대 손실입니다.
- 수익 비율: 총 이익과 총 손실의 비율입니다.
- 예외 보상: 거래의 평균 수익 또는 손실입니다.
- 복구 계수: 손실이 발생한 후 테스트한 전략이 얼마나 잘 복구되는지 측정합니다.
결론
우리는 MetaTrader 5 트레이딩 터미널의 전략 테스터를 통해서 테스트 프로세스인 MQL5 프로그램을 개발할 때 마스터해야 하는 가장 중요하고 가치 있는 도구 중 하나에 대한 몇 가지 필수 주제를 배웠으며 이 도구를 효과적으로 이해하고 사용하는 데 도움이 될 몇 가지 관련 주제에 대해 알아보았습니다. MQL5 프로그램을 개발할 때 직면하는 오류의 유형에 따라 오류에 대해 알아보았습니다:
- 컴파일 오류 및 경고.
- 런타임 오류.
- 거래 서버 오류.
이어서 MQL5 IDE의 디버거 사용법을 배우며 디버깅에 대해 알아보고 MetaTrader 5의 전략 테스터의 다양한 모델 학습을 통해 모델에 따라 테스트의 설정을 어떻게 할 수 있는지, MQL5 프로그램을 테스트할 때 모든 것을 보고하는 다른 탭을 통해 테스트 과정을 모니터링하는 방법, 테스트 후 테스트 보고서를 어떻게 읽을 수 있는지, 테스트를 통해 가장 중요한 요소를 확인하고 평가해야 하는 방법과 테스트 MQL5 프로그램에서 최적의 결과를 얻기 위해 전략을 최적화할 수 있는 방법을 알아보는 시간으로 구성했습니다.
이 글과 관련 정보가 효과적인 테스트와 MQL5 프로그램 제작을 통해 결과를 개선하는 데 도움이 되길 바랍니다. 이 글이 유용했고 더 많은 글이 필요하다면 가장 인기 있는 보조지표를 기반으로 트레이딩 시스템을 만드는 방법을 공유하고 다른 글도 확인해 보세요.
MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/12635



