English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
MetaTrader 5 테스트의 기초

MetaTrader 5 테스트의 기초

MetaTrader 5테스터 | 5 7월 2021, 10:46
372 0
MetaQuotes
MetaQuotes

전략 테스터가 필요한 이유

자동 거래라는 아이디어는 거래 로봇이 연중 무휴 24시간 논스톱으로 작업 할 수 있다는 점에서 매력적입니다. 로봇은 피곤하거나 의심스럽거나 무서워하지 않으며 심리적인 문제를 전혀 겪지 않습니다. 거래 규칙을 명확하게 공식화하고 이를 알고리즘에 구현하는 것으로 충분하며 로봇은 지칠 줄 모르고 작업 할 준비가 되어 있습니다. 그러나 먼저 다음 두 가지 중요한 조건이 충족되는지 확인해야 합니다.

  • Expert Advisor는 거래 시스템의 규칙에 따라 거래 작업을 수행합니다.
  • EA에서 구현된 거래 전략은 그 동안 지켜본 바에 따라 이익을 보이고 있습니다.

이러한 질문에 대한 답을 얻으려면 MetaTrader 5 클라이언트 터미널에 포함된 전략 테스터를 참조하십시오.


틱 생성 모드

Expert Advisor는 MQL5로 작성된 프로그램으로, 일부 외부 이벤트에 대한 응답으로 매번 실행됩니다. EA에는 사전 정의된 각 이벤트에 대한 해당 기능 (이벤트 핸들러)이 있습니다.

NewTick 이벤트 (가격 변경)는 EA의 주요 이벤트이므로 EA를 테스트하기 위해 틱 시퀀스를 생성해야 합니다. MetaTrader 5 클라이언트 터미널의 전략 테스터에는 3가지 틱 생성 모드가 구현되어 있습니다.

  • 틱마다
  • 1 분 OHLC (미닛 바가 있는 OHLC 가격)
  • 시가 전용

기본적이고 가장 상세한 것은 "모든 틱 (Every tick)" 모드이고 다른 두 가지 모드는 기본 모드를 단순화 한 것으로 "모든 틱" 모드와 비교하여 설명합니다. 이들의 차이점을 이해하기 위해 세 가지 모드를 모두 고려해주십시오.


"모든 틱"

금융 상품에 대한 과거 시세 데이터는 포장된 미닛 바 형태로 거래 서버에서 MetaTrader 5 클라이언트 단말기로 전송됩니다. 요청 발생 및 필요한 시간 프레임 구성에 대한 자세한 정보 MQL5 Reference의 데이터 액세스 정리 (Organizing Data Access) 장에서 얻을 수 있습니다.

가격 기록의 최소 요소는 가격의 네 가지 값에 대한 정보를 얻을 수 있는 미닛 바입니다.

  • 오픈 - 미닛 바가 열린 가격,
  • 높음 - 이 미닛 바 동안 달성된 최대값,
  • 낮음 - 이 미닛 바 동안 달성된 최소값,
  • 종가 - 바의 종가.

새로운 분이 시작되는 순간 (초 수가 0이 됨)에는 새로운 미닛 바가 열리지 않지만 틱이 발생하면 가격이 1 포인트 이상 변경됩니다. 그림은 개장 시간이 2011.01.10 00:00 인 새로운 거래 주의 첫 번째 미닛 바를 보여줍니다. 차트에서 볼 수 있는 금요일과 월요일 사이의 가격 차이는 일반적입니다. 뉴스가 들어 오면 환율이 주말에도 변동하기 때문입니다.

그림 1. 금요일과 월요일의 가격 차이

이 바의 경우 미닛 바가 2011 년 1 월 10 일 00시 00 분에 열렸다는 것만 알고 있지 초에 대해서는 아무것도 모릅니다. 00:00:12 또는 00:00:36 (새로운 날이 시작된 후 12 초 또는 36 초) 또는 해당 분 내의 다른 시간에 열렸을 수 있습니다. 그러나 저희는 EURUSD의 시가가 새로운 분 바 개장 시점에 1.28940 이었다는 것을 알고 있습니다.

저희는 또한 고려된 미닛 바의 종가에 해당하는 틱이 언제 도착했는지 1 초 이내에 알 수 없습니다. 저희는 단 한 가지만 알고 그것은 바로 미닛 바의 종가입니다. 해당 미닛에 대한 가격은 1.28958이었습니다. 고가와 저가가 출현한 시기도 알 수 없지만, 최고 가격과 최저 가격이 각각 1.28958과 1.28940 수준임을 알고 있습니다.

거래 전략을 테스트하려면 Expert Advisor에 작업을 시뮬레이션 할 일련의 틱이 필요합니다. 따라서 매 미닛 바에 대해 가격이 확실히 있었던 4통제 지점을 알고 있습니다. 바에 4 개의 틱만 있는 경우, 이는 테스트를 수행하기에 충분한 정보이지만 일반적으로 틱의 거래량은 4보다 큽니다.

따라서 시가, 고가, 저가 및 종가 사이에 발생하는 틱에 대한 추가 컨트롤 지점을 생성해야 합니다. "모든 틱"에 대한 틱 생성 모드의 원칙은 MetaTrader 5 터미널의 전략 테스터 내의 틱 생성 알고리즘에 설명되어 있으며, 그로부터 아래에 나와 있습니다.

그림 2. 틱 생성 알고리즘

"모든 틱" 모드에서 테스트 할 때 EA의 OnTick() 함수는 모든 컨트롤 지점에서 호출됩니다. 각 컨트롤은 생성된 시퀀스의 틱입니다. EA는 온라인으로 작업 할 때와 마찬가지로 시뮬레이션된 틱의 시간과 가격을 받습니다.

중요: "모든 틱" 테스트 모드가 가장 정확하지만 동시에 가장 많은 시간이 소요됩니다. 대부분의 거래 전략에 대한 초기 테스트의 경우 일반적으로 다른 두 테스트 모드 중 하나를 사용하는 것으로 충분합니다.


"1 분 OHLC"

"모든 틱" 모드는 세 가지 모드 중 가장 정확하지만 동시에 가장 느립니다. OnTick() 핸들러의 실행은 매 틱마다 발생하지만 틱 볼륨은 상당히 클 수 있습니다. 바 전체에 걸친 가격 움직임의 틱 순서가 중요하지 않은 전략의 경우 더 빠르고 거친 시뮬레이션 모드인 "1 분 OHLC"가 있습니다.

"1 분 OHLC" 모드에서 틱 시퀀스는 미닛 바의 OHLC 가격에 의해서만 구성되며 생성된 컨트롤 지점의 수가 크게 감소하므로 테스트 시간도 단축됩니다. OnTick() 함수의 시작은 OHLC 미닛 바의 가격으로 구성된 모든 컨트롤 지점에서 수행됩니다.

오픈, 하이, 로우, 클로즈 가격 사이에 추가적인 중간 틱을 발생시키지 않는 것은 가격 개발에 있어서 엄격한 결정론의 출현으로 이어지는데 이는 시가가 결정되는 순간부터 입니다. 이를 통해 테스트 균형의 멋진 상향 그래프를 보여주는 "테스팅 그레일 (Testing Grail)"을 만들 수 있습니다.

이러한 그레일의 예는 코드 베이스 (Code Base) - Grr-al에 나와 있습니다.

그림 3. Grr-al Expert Advisor는 OHLC 가격의 특별한 기능을 사용합니다.

그림은 이 EA 테스트의 매우 매력적인 그래프를 보여줍니다. 어떻게 얻었습니까? 저희는 1 미닛 바에 대해 4 가지 가격을 알고 있으며 첫 번째 가격이 시가이고 마지막 가격이 종가임을 알고 있습니다. 저희는 그들 사이에 고가와 저가가 있고 그 발생 순서는 알 수 없지만 고가는 시가보다 크거나 같습니다 (그리고 저가가 공개 가격보다 작거나 같다는 것은 알려져 있습니다).

시가를 받는 시간을 결정하고 다음 틱을 분석하여 고가 또는 저가가 그 전에 오는지 여부를 결정하기에 충분합니다. 가격이 Open 가격보다 낮 으면 낮은 가격이 있고이 틱에서 매수하면 다음 틱은 매수를 마감하고 매도를 위해 열리는 High 가격에 해당합니다. 다음 틱은 마지막 틱이고 이것이 종가이며 저희는 그에 대한 판매를 마감합니다. 

가격 이후에 시가보다 높은 가격의 틱을 받으면 거래 순서가 반전됩니다. 이 "치트" 모드에서 1 미닛 바를 처리하고 다음 바를 기다리십시오.

그러한 EA를 내역에서 테스트 할 때 모든 것이 순조롭게 진행되지만 온라인으로 시작하면 사실이 드러나기 시작합니다. 균형 선은 안정적이지만 아래쪽으로 향한다는 사실 말이죠. 이 트릭을 드러내려면 "모든 틱" 모드에서 EA를 실행하기 만하면 됩니다.

참고: 대략적인 테스트 모드 ("1 분 OHLC" 및 "시가 전용")에서 EA의 테스트 결과가 너무 좋아 보인다면 "매틱" 모드에서 테스트하십시오.


"시가 전용"

이 모드에서는 테스트를 위해 선택한 기간의 OHLC 가격을 기반으로 틱이 생성됩니다. Expert Advisor의 OnTick() 함수는 시가의 바 시작 부분에서만 실행됩니다. 이 기능으로 인해 중지 수준 및 보류 중은 지정된 가격과 다른 가격으로 트리거 될 수 있습니다 (특히 더 높은 기간에서 테스트 할 때). 대신 Expert Advisor의 평가 테스트를 신속하게 실행할 수 있는 기회가 있습니다.

"시가 전용" 모드에서 틱 생성시 예외는 W1 및 MN1 기간입니다. 이 기간 동안 틱은 주 또는 월의 OHLC 가격이 아닌 매일 OHLC 가격에 대해 생성됩니다.

"시가 전용" 모드에서 EURUSD H1에 대한 Expert Advisor를 테스트한다고 가정합니다. 이 경우 총 틱 (컨트롤) 수는 테스트 간격 내에서 4*1 시간 바 수를 넘지 않습니다. 그러나 OnTick() 핸들러는 1 시간가 열릴 때만 호출됩니다. 올바른 테스트에 필요한 검사는 나머지 틱 (EA에서 "숨겨진")에서 발생합니다.
  • 증거금 요구 사항 계산;
  • 손절매 및 이익 실현 수준의 트리거;
  • 보류중인 주문의 트리거;
  • 만료된 보류 주문 제거.

오픈 포지션이나 미결 주문이 없는 경우 숨겨진 틱에 대해 이러한 확인을 수행 할 필요가 없으며 속도 증가가 상당할 수 있습니다. 이 "시가 전용" 모드는 바 개장시에만 거래를 처리하고 보류중인 주문과 손절(StopLoss) 및 이익 실현(TakeProfit) 주문을 사용하지 않는 테스트 전략에 적합합니다. 이러한 전략의 경우 필요한 테스트 정확도가 유지됩니다.

모든 모드에서 테스트 할 수 있는 EA의 예로 표준 패키지의 이동 평균 Expert Advisor를 사용해 보겠습니다. 이 EA의 논리는 모든 결정이 바가 열릴 때 이루어지고 대기 주문을 사용하지 않고 즉시 거래가 수행되는 방식으로 구축됩니다.

2010.01.09에서 2010.31.12까지의 간격으로 EURUSD H1에 대한 EA 테스트를 실행하고 그래프를 비교합니다. 그림은 세 가지 모드 모두에 대한 테스트 보고서의 균형 그래프를 보여줍니다.


그림 4. 표준 패키지의 Moving Average.mq5 EA의 테스트 그래프는 테스트 모드에 의존하지 않습니다 (확대하려면 이미지를 클릭하십시오)

보시다시피, 다른 테스트 모드의 그래프는 표준 패키지의 이동 평균 EA에 대해 정확히 동일합니다.

"시가 전용" 모드에는 몇 가지 제한 사항이 있습니다.

  • 무작위 지연 실행 모드를 사용할 수 없습니다.
  • 테스트를 거친 Expert Advisor에서는 테스트 / 최적화에 사용된 것보다 낮은 시간대 의 데이터에 액세스 할 수 없습니다. 예를 들어 H1 기간에 테스트/최적화를 실행하는 경우 H2, H3, H4 등의 데이터에 액세스 할 수 있지만 M30, M20, M10 등은 액세스 할 수 없습니다. 또한 액세스되는 더 높은 기간은 테스트 기간의 배수여야 합니다. 예를 들어 M20에서 테스트를 실행하면 M30의 데이터에 액세스 할 수 없지만 H1에는 액세스 할 수 있습니다. 이러한 제한은 테스트 / 최적화 중에 생성된 바에서 더 낮거나 여러 시간 프레임의 데이터를 얻을 수 없다는 것과 관련이 있습니다.
  • 다른 시간대의 데이터 액세스에 대한 제한은 Expert Advisor가 데이터를 사용하는 다른 기호에도 적용됩니다. 이 경우 각 기호에 대한 제한은 테스트/최적화 중에 액세스 한 첫 번째 시간 프레임에 따라 다릅니다. EURUSD H1에서 테스트하는 동안 Expert Advisor가 GBPUSD M20의 데이터에 액세스한다고 가정합니다. 이 경우 Expert Advisor는 EURUSD H1, H2 등의 데이터와 GBPUSD M20, H1, H2 등의 데이터를 추가로 사용할 수 있습니다.

참고: "시가 전용" 모드는 테스트 시간이 가장 빠르지만 모든 거래 전략에 적합하지는 않습니다. 거래 시스템의 특성에 따라 원하는 테스트 모드를 선택하십시오. 

틱 생성 모드에 대한 섹션을 마무리하기 위해 2011.01.11 21:00:00-2011.01.11 21:30:00 간격으로 두 개의 M15 바에 대해 EURUSD의 다양한 틱 생성 모드를 시각적으로 비교해 보겠습니다.

틱은 WriteTicksFromTester.mq5 EA를 사용하여 다른 파일에 저장되었으며 이러한 파일 이름의 끝은 filenamEveryTick, filenameOHLC 및 filenameOpenPrice input-parameters에 지정됩니다.

그림 5. WriteTicksFromTester Expert Advisor의 시작 및 종료 날짜 (변수 시작 및 종료)를 지정할 수 있습니다.

세 개의 틱 시퀀스가있는 세 개의 파일을 얻기 위해 ( "모든 틱", "1 분 OHLC" 및 "시가 전용" 모드 각각에 대해) EA는 단일 실행으로 해당 모드에서 세 번 실행되었습니다. 그런 다음이 세 파일의 데이터가 TicksFromTester.mq5 인디케이터를 사용하여 차트에 표시되었습니다. 인디케이터 코드는이 글에 첨부되어 있습니다.


그림 6. 세 가지 테스트 모드에서 MetaTrader 5 터미널의 전략 테스터에있는 틱 시퀀스

기본적으로 MQL5 언어의 모든 파일 작업은 "파일 샌드 박스" 내에서 이루어지며 테스트 중에 EA는 자체 "파일 샌드 박스" 에만 액세스 할 수 있습니다. 인디케이터와 EA가 테스트 중에 하나의 폴더에있는 파일로 작업하기 위해 플래그 FILE_COMMON을 사용했습니다. EA의 코드 예 :

//--- open the file
   file=FileOpen(filename,FILE_WRITE|FILE_CSV|FILE_COMMON,";");
//--- check file handle
   if(file==INVALID_HANDLE)
     {
      PrintFormat("Error in opening of file %s for writing. Error code=%d",filename,GetLastError());
      return;
     }
   else
     {
      PrintFormat("The file will be created in %s folder",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
     }

인디케이터의 데이터를 읽기 위해 플래그 FILE_COMMON도 사용했습니다. 이를 통해 한 폴더에서 다른 폴더로 필요한 파일을 수동으로 전송하지 않아도 되었습니다.

//--- open the file
   int file=FileOpen(fname,FILE_READ|FILE_CSV|FILE_COMMON,";");
//--- check file handle
   if(file==INVALID_HANDLE)
     {
      PrintFormat("Error in open of file %s for reading. Error code=%d",fname,GetLastError());
      return;
     }
   else
     {
      PrintFormat("File will be opened from %s",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
     }


확산 시뮬레이션

매수 호가와 매도 호가 사이의 가격 차이를 스프레드라고합니다. 테스트 중에 스프레드는 모델링되지 않고 과거 데이터에서 가져옵니다. 스프레드가 기록 데이터에서 0보다 작거나 같으면 요청된 기록 데이터의 시간에 대한 스프레드가 테스트 에이전트에 의해 사용됩니다.

전략 테스터에서 스프레드는 항상 유동적인 것으로 간주됩니다. 즉, SymbolInfoInteger(symbol, SYMBOL_SPREAD_FLOAT)는 항상 true를 반환합니다.

또한 과거 데이터에는 틱 값과 거래량이 포함됩니다. 데이터 저장 및 검색을 위해 특별한 MqlRates 구조를 사용합니다.

struct MqlRates
  {
   datetime time;         // opening bar time
   double   open;         // opening price Open
   double   high;         // the highest price High
   double   low;          // the lowest price Low
   double   close;        // the closing price Close
   long     tick_volume;  // the tick volume
   int      spread;       // spread
   long     real_volume;  // market volume 
  };


클라이언트 터미널의 전역 변수

테스트 중에 클라이언트 터미널의 전역 변수 도 에뮬레이션되지만 터미널에서 볼 수있는 현재 터미널의 전역 변수와는 관련이 없습니다. F3 버튼. 이는 테스트 중에 터미널의 전역 변수를 사용하는 모든 작업이 클라이언트 터미널 외부 (테스트 에이전트 내)에서 발생 함을 의미합니다.


테스트 중 지표 ​​계산

실시간 모드에서는 인디케이터 값이 매 틱마다 계산됩니다. 전략 테스터는 지표 계산을위한 비용 효율적인 모델을 채택했습니다. EA 실행 직전에 지표가 다시 계산됩니다. 이는 인디케이터 재 계산이 OnTick(), OnTrade() 및 OnTimer() 함수를 호출하기 전에 수행됨을 의미합니다.

iCustom() 또는 IndicatorCreate()에 의해 핸들이 생성된 특정 이벤트 처리기, 모든 인디케이터에서 인디케이터에 대한 호출이 있는지 여부는 중요하지 않습니다. 함수는 이벤트 핸들러를 호출하기 전에 다시 계산됩니다.

결과적으로 "모든 틱" 모드에서 테스트 할 때 OnTick() 함수를 호출하기 전에 인디케이터 계산이 수행됩니다.

EventSetTimer() 함수를 사용하여 EA에서 타이머가 켜져 있으면 OnTimer() 핸들러를 호출하기 전에 인디케이터가 다시 계산됩니다. 따라서 최적이 아닌 방식으로 작성된 지표를 사용하면 테스트 시간을 크게 늘릴 수 있습니다.


테스트 중 기록로드

테스트된 기호의 내역은 테스트 프로세스를 시작하기 전에 거래 서버에서 터미널에 의해 동기화되고 로드됩니다. 처음에 터미널은 나중에 요청하지 않기 위해 사용 가능한 모든 기호 내역을 로드합니다. 또한 새 데이터만 로드됩니다.

테스트 에이전트는 테스트 시작 직후 클라이언트 터미널에서 테스트된 기호의 이력을 받습니다. 테스트 과정에서 다른 기기의 데이터가 사용되는 경우 (예 : 다중 통화 Expert Advisor) 테스트 에이전트는 해당 데이터에 대한 첫 번째 호출 중에 클라이언트 단말기에 필요한 내역을 요청합니다. 터미널에서 과거 데이터를 사용할 수 있으면 즉시 테스트 에이전트로 전달됩니다. 데이터를 사용할 수 없는 경우 터미널은 서버에서 데이터를 요청하고 다운로드 한 다음 테스트 에이전트로 전달합니다.

거래 운영에 대한 교차 환율을 계산하려면 추가 상품의 데이터도 필요합니다. 예를 들어 USD 입금 통화로 EURCHF에 대한 전략을 테스트 할 때 첫 번째 거래 작업을 처리하기 전에 테스트 에이전트는 클라이언트 터미널에서 EURUSD 및 USDCHF의 이력 데이터를 요청하지만 전략에는 이 기호들에 대한 직접 사용 호출이 포함되어 있지 않습니다.

다중 통화 전략을 테스트하기 전에 필요한 모든 기록 데이터를 클라이언트 터미널에 다운로드하는 것이 좋습니다. 이렇게하면 필요한 데이터 다운로드와 관련된 테스트/최적화 지연을 방지 할 수 있습니다. 예를 들어 적절한 차트를 열고 기록 시작 부분으로 스크롤하여 기록을 다운로드 할 수 있습니다. 터미널에 기록을 강제로드하는 예는 MQL5 참조의 데이터에 대한 액세스 구성 섹션에서 확인할 수 있습니다.

터미널은 에이전트가 터미널에서 테스트된 기호의 내역을 처음 요청할 때 한 번만 거래 서버에서 내역을 로드합니다. 기록은 트래픽을 줄이기 위해 압축된 형태로 로드됩니다.
테스트 에이전트는 차례로 터미널에서 압축된 형태로 기록을 받습니다. 다음 테스트 중에 테스터는 이전에 테스터를 실행 한 이후에 필요한 데이터를 사용할 수 있으므로 터미널에서 이력을 로드하지 않습니다.


다중 통화 테스트

전략 테스터 (Strategy Tester)를 사용하면 여러 기호를 거래하면서 전략 테스트를 수행 할 수 있습니다. 이러한 EA는 원래 이전 플랫폼에서는 단일 기호에 대해서만 테스트가 수행 되었기 때문에 일반적으로 다중 통화 Expert Advisors라고 합니다. MetaTrader 5 터미널의 전략 테스터에서 사용 가능한 모든 기호에 대한 거래를 모델링 할 수 있습니다.

테스터는 기호 데이터를 처음 호출하는 동안 자동으로 클라이언트 터미널 (거래 서버가 아님)에서 사용된 기호의 내역을 로드합니다.

테스트 에이전트는 테스트 시작시 지표 계산을 위해 이력에 필요한 데이터를 제공하기 위해 작은 여백으로 누락된 이력만 다운로드합니다. 기간 D1 이하의 경우 다운로드 내역의 최소 볼륨은 1 년입니다.

따라서 M15 기간(각 바는 15분)으로 2010.11.01-2010.12.01(1개월 간격 테스트)에 대한 테스트를 실행하할 경우, 이 단말기는 2010년 한 해 동안 기기에 대한 이력을 요청할 것입니다. 주간 기간 동안 약 2 년 (1 년에는 52 주)에 해당하는 100 개의 바 이력을 요청합니다. 매월 테스트를 위해 에이전트 8 년 (12 개월 x 8 년 = 96 개월)의 이력을 요청합니다.

필요한 바가 없는 경우 테스트 시작 날짜가 과거에서 현재로 자동으로 이동되어 테스트 전에 필요한 바 예약을 제공합니다.

테스트 중에 "시장 감시(Market Watch)"도 에뮬레이션되어기호에 대한 정보를 얻을 수 있습니다.

기본적으로 테스트 시작시 전략 테스터의 "시장 감시"에는 테스트가 실행되는 기호인 하나의 기호만 있습니다. 필요한 모든 기호는 참조 될 때 전략 테스터 (터미널 아님!)의 "시장 감시"에 자동으로 연결됩니다.  

다중 통화 Expert Advisor의 테스트를 시작하기 전에 터미널의 "시장 감시"에서 테스트에 필요한 기호를 선택하고 필요한 데이터를 로드해야 합니다. "외래" 기호를 처음 호출하는 동안 이력은 테스트 에이전트와 클라이언트 터미널간에 자동으로 동기화됩니다. "외래"기호는 테스트가 실행되는 기호가 아닌 다른 기호입니다.

"기타"기호 데이터에 대한 참조는 다음과 같은 경우에 발생합니다.

"기타" 기호를 처음 호출하는 순간 테스트 프로세스가 중지되고 터미널에서 테스트 에이전트로 기호/시간 프레임에 대한 기록이 다운로드됩니다. 동시에 이 기호에 대한 틱 시퀀스 생성이 이루어집니다.

선택한 틱 생성 모드에 따라 각 기호에 대해 개별 틱 시퀀스가 ​​생성됩니다. OnInit() 핸들러에서 SymbolSelect()를 호출하여 원하는 기호에 대한 내역을 명시적으로 요청할 수도 있습니다. 내역 다운로드는 Expert Advisor의 테스트 직전에 이루어집니다.

따라서 MetaTrader 5 클라이언트 터미널에서 다중 통화 테스트를 수행하기 위해 추가 노력이 필요하지 않습니다. 클라이언트 터미널에서 해당 기호의 차트를 열기만하면 됩니다. 이 데이터가 포함된 경우 모든 필수 기호에 대해 거래 서버에서 이력이 자동으로 업로드됩니다.


전략 테스터의 시간 시뮬레이션

테스트 중에 현지 시간 TimeLocal()은 항상 서버 시간 TimeTradeServer()와 같습니다. 차례로 서버 시간은 항상 GMT 시간(TimeGMT())에 해당하는 시간과 동일합니다. 이렇게 하면 이러한 모든 기능이 테스트 중에 동일한 시간에 표시됩니다.

전략 테스터에서 GMT, Local 및 서버 시간의 차이가없는 것은 서버에 연결되지 않은 경우 의도적으로 수행됩니다. 테스트 결과는 연결 여부에 관계없이 항상 동일해야 합니다. 서버 시간에 대한 정보는 로컬에 저장되지 않으며 서버에서 가져옵니다.

 

전략 테스터의 OnTimer() 함수

MQL5는 타이머 이벤트를 처리 할 수 있는 기회를 제공합니다. OnTimer() 핸들러의 호출은 테스트 모드에 관계없이 수행됩니다.

즉, 테스트가 H4 기간 동안 "시가 전용"모드에서 실행되고 EA에 초당 호출로 설정된 타이머가 있는 경우 각 H4 바가 열릴 때 OnTick() 핸들러가 한 번 호출되고 OnTimer() 핸들러는 14400 번 호출됩니다 (3600 초 * 4 시간). EA의 테스트 시간이 늘어나는 양은 EA의 논리에 따라 다릅니다.

타이머의 주어진 빈도에서 테스트 시간의 의존성을 확인하기 위해 거래 작업이 없는 간단한 EA가 작성되었습니다.

//--- input parameters
input int      timer=1;              // timer value, sec
input bool     timer_switch_on=true; // timer on
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- run the timer if  timer_switch_on==true
   if(timer_switch_on)
     {
      EventSetTimer(timer);
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- stop the timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
// take no actions, the body of the handler is empty
  }
//+------------------------------------------------------------------+

테스트 시간 측정은 타이머 매개 변수의 다른 값 (타이머 이벤트주기)에서 수행되었습니다. 얻은 데이터에서 테스트 시간을 타이머 기간의 함수로 플로팅합니다.

그림 7. 타이머 기간의 함수로서의 시간 테스트

매개 변수 타이머가 작을수록 EventSetTimer(Timer) 함수를 초기화하는 동안 OnTimer() 핸들러 호출 사이의 기간 (Period)이 작다는 것을 알 수 있습니다. 동일한 다른 조건에서 테스트 시간 T가 더 큽니다.


전략 테스터의 Sleep() 함수

Sleep() 함수를 사용하면 EA 또는 스크립트가 그래프에서 작업 할 때 mql5-프로그램 실행을 잠시 중단 할 수 있습니다. 이는 데이터를 요청할 때 유용 할 수 있습니다. 데이터는 요청 당시 준비되지 않았으며 준비 될 때까지 기다려야 합니다. Sleep() 함수 사용에 대한 자세한 예는 데이터 액세스 배열 섹션에서 찾을 수 있습니다.

테스트 프로세스는 Sleep() 호출에 의해 지연되지 않습니다. Sleep()를 호출하면 생성된 틱이 지정된 지연 내에 "재생"되어 보류중인 주문이 트리거 될 수 있습니다. 중지 등 Sleep() 호출 후 전략 테스터에서 시뮬레이션된 시간은 Sleep 함수의 매개 변수에 지정된 간격만큼 증가합니다.

Sleep() 함수 실행의 결과로 전략 테스터의 현재 시간이 테스트 기간을 초과 한 경우 "테스트 중 무한 절전 루프가 감지되었습니다"라는 오류 메시지가 표시됩니다. 이 오류가 발생하면 테스트 결과가 거부되지 않고 모든 계산이 전체 볼륨 (거래 수, 침하 등)에서 수행되고이 테스트 결과가 터미널로 전달됩니다.

Sleep() 함수는 OnDeinit()에서 작동하지 않습니다. 호출된 후에 테스트 시간이 테스트 간격의 범위를 초과하도록 보장되기 때문입니다.

그림 7. MetaTrader 5 단말기의 전략 테스터에서 Sleep() 기능을 사용하는 방법

그림 8. MetaTrader 5 단말기의 전략 테스터에서 Sleep() 기능을 사용하는 방법


수학적 계산에서 최적화 문제에 전략 테스터 사용

MetaTrader 5 터미널의 테스터는 거래 전략을 테스트하는 것뿐만 아니라 수학적 계산에도 사용할 수 있습니다. 이를 사용하려면 "수학 계산" 모드를 선택해야 합니다.

이 경우 OnInit(), OnTester(), OnDeinit()의 세 가지 함수만 호출됩니다. "수학 계산" 모드에서 전략 테스터는 틱을 생성하지 않고 기록을 다운로드하지 않습니다.

전략 테스터는 시작 날짜를 종료 날짜보다 크게 지정한 경우에도 "수학 계산"모드에서 작동합니다.

테스터를 사용하여 수학적 문제를 해결할 때 히스토리 업로드 및 틱 생성이 발생하지 않습니다.

MetaTrader 5 전략 테스터에서 해결하기 위한 일반적인 수학적 문제 - 많은 변수가있는 함수의 극값을 검색합니다.

이를 해결하려면 다음을 수행해야 합니다.

  • 함수 값 계산은 OnTester() 함수에 있어야 합니다.
  • 기능 매개 변수는 Expert Advisor의 입력 변수로 정의되어야 합니다.

EA를 컴파일하고 "전략 테스터" 창을 엽니다. "입력 매개 변수" 탭에서 필요한 입력 변수를 선택하고 각 기능 변수에 대한 시작, 중지 및 단계 값을 지정하여 매개 변수 값 세트를 정의하십시오.

최적화 유형- "느린 전체 알고리즘" (매개 변수 공간 전체 검색) 또는 "빠른 유전자 기반 알고리즘"을 선택합니다. 함수의 극한값을 간단히 검색하려면 빠른 최적화를 선택하는 것이 좋지만 전체 변수 세트에 대한 값을 계산하려면 느린 최적화를 사용하는 것이 가장 좋습니다.

"수학 계산" 모드를 선택하고 "시작" 버튼을 사용하여 최적화 절차를 실행합니다. 최적화 할 때 전략 테스터는 함수의 최대값을 검색합니다. 국소 최솟값을 찾으려면 OnTester 함수에서 계산된 함수 값의 역을 반환합니다.

return(1/function_value);

function_value가 0이 아닌지 확인해야 합니다. 그렇지 않으면 0으로 나누는 치명적 오류를 얻을 수 있기 때문입니다.

더 편리하고 최적화 결과를 왜곡하지 않는 또 다른 방법이 있습니다. 사실 이는 해당 글을 읽은 한 독자가 제안한 부분입니다.

return(-function_value);

이 옵션을 사용하면 0과 같은지 function_value_를 검사 할 필요가 없으며, 최적화 결과의 3D 표현의 표면은 동일한 모양을 갖지만 원본과 미러링됩니다.

예를 들어, 저희는 sink() 함수를 제공합니다:

이 함수의 극한값을 찾기위한 EA 코드는 OnTester()에 배치됩니다.

//+------------------------------------------------------------------+
//|                                                         Sink.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input double   x=-3.0; // start=-3, step=0.05, stop=3
input double   y=-3.0; // start=-3, step=0.05, stop=3
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double sink=MathSin(x*x+y*y);
//---
   return(sink);
  }
//+------------------------------------------------------------------+
최적화를 수행하고 2D 그래프 형태로 최적화 결과를 확인합니다.

그림 9. 싱크 (x*x+y*y)의 전체 최적화 결과는 2D 그래프로 작동합니다.

주어진 매개 변수 쌍 (x, y)에 대한 값이 좋을수록 색상의 채도가 높아집니다. sink() 공식의 형태에서 예상했듯이, 그 값은 중심이 (0,0) 인 동심원을 형성합니다. 3D 그래프에서 sink 함수에 단일 전역 극값이 없음을 알 수 있습니다.

싱크 기능의 3D 그래프


"시가 전용" 모드의 바 동기화

MetaTrader 5 클라이언트 터미널의 테스터를 통해 소위 "다중 통화" EA를 확인할 수 있습니다. 다중 통화 EA - 둘 이상의 기호로 거래하는 EA입니다.

여러 기호에서 거래되는 전략 테스트는 테스터에게 몇 가지 추가 기술 요구 사항을 부과합니다.

  • 이 기호에 대한 틱 생성,
  • 이 기호에 대한 인디케이터 값 계산,
  • 이 기호에 대한 증거금 요구 사항 계산,
  • 모든 거래 기호에 대해 생성된 틱 시퀀스 동기화.

전략 테스터는 선택한 거래 모드에 따라 각 상품에 대한 틱 시퀀스를 생성하고 처리합니다. 동시에 다른 기호에서 바가 열린 방식에 관계없이 각 기호에 대한 새로운 바가 열립니다. 즉, 다중 통화 EA를 테스트 할 때 상황이 발생할 수 있습니다 (그리고 종종 그렇습니다). 한 상품의 경우 새로운 바가 이미 열렸고 다른 상품에서는 열리지 않았습니다. 따라서 테스트에서는 모든 것이 실제처럼 발생합니다.

"모든 틱" 및 "1 분 OHLC" 테스트 모드를 사용하는 한 테스터의 이력에 대한 실제 시뮬레이션은 문제를 일으키지 않습니다. 이러한 모드에서는 하나의 캔들스틱에 대해 충분한 틱이 생성되어 다른 기호의 바가 동기화 될 때까지 기다릴 수 있습니다. 그러나 거래 상품의 바 동기화가 필수적인 경우 "시가 전용" 모드에서 다중 통화 전략을 어떻게 테스트합니까? 이 모드에서 EA는 바가 열리는 시간에 해당하는 한 틱에서만 호출됩니다.

예를 들어 설명하겠습니다. EURUSD에서 EA를 테스트하고 EURUSD에서 새로운 시간에 대한 캔들스틱이 열리면이 사실을 쉽게 인식 할 수 있습니다. "시가 전용" 모드에서 테스트 할 때 이벤트 NewTick은 테스트 기간에 바가 열리는 순간에 해당합니다. 그러나 EA에서 사용되는 USDJPY 기호로 새 캔들스틱이 열렸다는 보장은 없습니다.

정상적인 상황에서는 OnTick() 함수의 작업을 완료하고 다음 틱에서 USDJPY에 대한 새로운 바의 출현을 확인하는 것으로 충분합니다. 그러나 "시가 전용" 모드에서 테스트 할 때는 다른 틱이 없으므로이 모드는 다중 통화 EA를 테스트하는 데 적합하지 않은 것처럼 보일 수 있습니다. 그러나 이는 그렇지 않습니다. MetaTrader 5의 테스터가 실제와 똑같이 작동한다는 것을 잊지 마십시오. Sleep()! 함수를 사용하여 다른 기호에서 새로운 바가 열릴 때까지 기다릴 수 있습니다.

EA Synchronize_Bars_Use_Sleep.mq5의 코드는 "시가 전용" 모드에서 바 동기화의 예를 보여줍니다.

//+------------------------------------------------------------------+
//|                                   Synchronize_Bars_Use_Sleep.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input string   other_symbol="USDJPY";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- check symbol
   if(_Symbol==other_symbol)
     {
      PrintFormat("You have to specify the other symbol in input parameters or select other symbol in Strategy Tester!");
      //--- forced stop testing
      return(-1);
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- static variable, used for storage of last bar time
   static datetime last_bar_time=0;
//--- sync flag
   static bool synchonized=false;

//--- if static variable isn't initialized
   if(last_bar_time==0)
     {
      //--- it's first call, save bar time and exit
      last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
      PrintFormat("The last_bar_time variable is initialized with value %s",TimeToString(last_bar_time));
     }

//--- get open time of the last bar of chart symbol
   datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
//--- if times aren't equal
   if(curr_time!=last_bar_time)
     {
      //--- save open bar time to the static variable
      last_bar_time=curr_time;
      //--- not synchronized
      synchonized=false;
      //--- print message
      PrintFormat("A new bar has appeared on symbol %s at %s",_Symbol,TimeToString(TimeCurrent()));
     }
//--- open time of the other symbol's bar
   datetime other_time;

//--- loop until the open time of other symbol become equal to curr_time
   while(!(curr_time==(other_time=(datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)) && !synchonized))
     {
      PrintFormat("Waiting 5 seconds..");
      //--- wait 5 seconds and call SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)
      Sleep(5000);
     }
//--- bars are synchronized
   synchonized=true;
   PrintFormat("Open bar time of the chart symbol %s: is %s",_Symbol,TimeToString(last_bar_time));
   PrintFormat("Open bar time of the symbol %s: is %s",other_symbol,TimeToString(other_time));
//--- TimeCurrent() is not useful, use TimeTradeServer()
   Print("The bars are synchronized at ",TimeToString(TimeTradeServer(),TIME_SECONDS));
  }
//+------------------------------------------------------------------+

동기화 사실이 설정된 현재 시간을 표시하는 EA의 마지막 줄을 확인합니다.

   Print("The bars synchronized at ",TimeToString(TimeTradeServer(),TIME_SECONDS));

현재 시간을 표시하기 위해 TimeCurrent() 대신 TimeTradeServer() 함수를 사용했습니다. TimeCurrent() 함수는 Sleep() 사용 후 변경되지 않는 마지막 틱 시간을 반환합니다. "시가 전용" 모드에서 EA를 문지르면 바 동기화에 대한 메시지가 표시됩니다.


마지막 틱 도착 시간이 아니라 현재 서버 시간을 가져와야 하는 경우 TimeCurrent() 대신 TimeTradeServer() 함수를 사용하십시오.

타이머를 사용하여 바를 동기화하는 또 다른 방법이 있습니다. 이러한 EA의 예는 이 글에 첨부된 Synchronize_Bars_Use_OnTimer.mq5입니다.


테스터의 IndicatorRelease() 함수

단일 테스트를 완료하면 도구 차트가 자동으로 열리고 완료된 거래와 EA에서 사용된 지표가 표시됩니다. 이는 진입 점과 출구 점을 시각적으로 확인하고 지표 값과 비교하는 데 도움이 됩니다.  

참고: 테스트 완료 후 자동으로 열리는 차트에 표시되는 지표는 테스트 완료 후 새로 계산됩니다. 이러한 지표가 테스트된 EA에서 사용된 경우에도 마찬가지입니다.

그러나 어떤 경우에는 프로그래머가 거래 알고리즘에 관련된 지표에 대한 정보를 숨기고 싶을 수 있습니다. 예를 들어, EA의 코드는 소스 코드의 제공없이 실행 파일로 대여 또는 판매됩니다. 이를 위해 IndicatorRelease() 함수가 적합합니다.

터미널이 클라이언트 터미널의 디렉토리/프로필/템플릿에 tester.tpl이라는 이름으로 템플릿을 설정하면 열린 차트에 적용됩니다. 부재시 기본 템플릿이 적용됩니다. (default.tpl).

IndicatorRelease() 함수는 원래 더 이상 필요하지 않은 경우 인디케이터의 계산 부분을 해제하기 위한 것입니다. 이를 통해 각 틱이 인디케이터 계산을 요구하기 때문에 메모리와 CPU 리소스를 모두 절약 할 수 있습니다. 두 번째 목적은 단일 테스트 실행 후 테스트 차트에 인디케이터가 표시되지 않도록 하는 것입니다.

테스트 후 차트에 인디케이터가 표시되지 않도록하려면 OnDeinit() 핸들러의 인디케이터 핸들을 사용하여 IndicatorRelease()를 호출합니다. OnDeinit() 함수는 항상 완료 후 테스트 차트가 표시되기 전에 호출됩니다.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   bool hidden=IndicatorRelease(handle_ind);
   if(hidden) Print("IndicatorRelease() successfully completed");
   else Print("IndicatorRelease() returned false. Error code ",GetLastError());
  }
차트에 인디케이터가 표시되지 않도록하려면 단일 테스트가 완료된 후 OnDeinit() 핸들러에서 IndicatorRelease() 함수를 사용합니다.


테스터에서 이벤트 처리

EA에 OnTick() 핸들러가 있어야만 MetaTrader 5 테스터의 과거 데이터를 테스트 할 수 있습니다. EA ti에 다음 기능 처리기 중 하나 이상이 포함되어 있으면 충분합니다.

  • OnTick() - 새로운 틱 도착 이벤트 핸들러;
  • OnTrade() - 거래 이벤트 핸들러;
  • OnTimer() - 타이머로부터의 신호 도착 이벤트 핸들러;
  • OnChartEvent() - 클라이언트 이벤트 처리기.

EA에서 테스트 할 때 OnChartEvent() 함수를 사용하여 맞춤 이벤트를 처리 할 수 ​​있지만 인디케이터에서는 이 함수를 테스터에서 호출 할 수 없습니다. 인디케이터에 OnChartEvent() 이벤트 핸들러 가 있고 이 인디케이터가 테스트된 EA에서 사용되는 경우에도 인디케이터 자체는 사용자 정의를 수신하지 않습니다. 이벤트.

테스트 중에 인디케이터는 EventChartCustom() 함수를 사용하여 맞춤 이벤트를 생성 할 수 있으며 EA는 OnChartEvent()에서 이 이벤트를 처리 할 수 ​​있습니다.


테스트 에이전트

MetaTrader 5 클라이언트 터미널에서의 테스트는 테스트 에이전트를 사용하여 수행됩니다. 로컬 에이전트가 자동으로 생성되고 활성화됩니다. 기본 로컬 개체 수는 컴퓨터의 코어 수에 해당합니다.

각 테스트 에이전트에는 클라이언트 터미널과 관련이 없는 전역 변수의 자체 복사본이 있습니다. 터미널 자체는 작업을 로컬 및 원격 에이전트에 배포하는 디스패처입니다. 지정된 매개 변수를 사용하여 EA 테스트 작업을 실행한 후 에이전트는 결과를 터미널에 반환합니다. 단일 테스트에서는 하나의 에이전트만 사용됩니다.

에이전트는 터미널에서 수신 한 내역을 기기 이름별로 별도의 폴더에 저장하므로 EURUSD의 내역은 EURUSD라는 폴더에 저장됩니다. 또한 기기의 내역는 출처별로 구분됩니다. 히스토리 저장 구조는 다음과 같습니다.

tester_catalog\Agent-IPaddress-Port\bases\name_source\history\symbol_name

예를 들어 MetaQuotes-Demo 서버의 EURUSD 기록은 tester_catalog\Agent-127.0.0.1-3000\bases\MetaQuotes-Demo\EURUSD 폴더에 저장할 수 있습니다.

테스트 완료 후 로컬 에이전트는 대기 모드로 전환되어 다음 호출을 시작하는 데 시간을 낭비하지 않도록 5분 동안 다음 작업을 기다립니다. 대기 기간이 끝난 후에만 ​​로컬 에이전트가 종료되고 CPU 메모리에서 언로드됩니다.

테스트가 일찍 완료되면 사용자 측 ("취소"버튼)과 클라이언트 터미널이 닫히면 모든 로컬 에이전트가 즉시 작업을 중지하고 메모리에서 언로드됩니다.


터미널과 에이전트 간의 데이터 교환

테스트를 실행할 때 클라이언트 터미널은 에이전트에 여러 매개 변수 블록을 보낼 준비를 합니다.
  • 테스트를위한 입력 매개 변수 (시뮬레이션 모드, 테스트 간격, 기기, 최적화 기준 등)
  • "Market Watch"에서 선택한 기호 목록
  • 테스트 기호의 사양 (계약 규모, 손절매 및 이익 실현 설정을위한 시장의 허용 마진 등)
  • 테스트를 거친 Expery Advisor 및 입력 매개 변수의 값
  • 추가 파일에 대한 정보 (라이브러리, 인디케이터, 데이터 파일 - # property tester_ ...)

    tester_indicator

    "indicator_name.ex5"형식의 맞춤 인디케이터 이름입니다. 테스트가 필요한 인디케이터는 해당 매개 변수가 상수 문자열을 통해 설정된 경우 iCustom() 함수 호출에서 자동으로 정의됩니다. 다른 모든 경우 (IndicatorCreate() 함수 사용 또는 인디케이터 이름을 설정하는 매개 변수에서 상수가 아닌 문자열 사용)의 경우 이 속성이 필요합니다.

    tester_file

    확장자 표시가 있는 테스터의 파일 이름 (상수 문자열)입니다. 지정된 파일이 테스터에게 전달됩니다. 테스트 할 입력 파일은 필요한 경우 항상 지정해야 합니다.

    tester_library

    확장자가 큰 따옴표로 묶인 라이브러리 이름입니다. 라이브러리에는 확장자 dll 또는 ex5가 있을 수 있습니다. 테스트가 필요한 라이브러리는 자동으로 정의됩니다. 그러나 사용자 정의 인디케이터가 라이브러리를 사용하는 경우이 속성이 필요합니다.

매개 변수의 각 블록에 대해 MD5 해시 형식의 디지털 지문이 생성되어 에이전트로 전송됩니다. MD5 해시는 각 세트마다 고유하며 볼륨은 계산된 정보의 양보다 훨씬 더 작습니다.

에이전트는 블록의 해시를 수신하고 이미 가지고 있는 블록과 비교합니다. 지정된 매개 변수 블록의 지문이 에이전트에 없거나 수신된 해시가 기존 해시와 다른 경우 에이전트는 이 매개 변수 블록을 요청합니다. 이렇게 하면 터미널과 에이전트 간의 트래픽이 줄어 듭니다.

테스트 후 에이전트는 "테스트 결과" 및 "최적화 결과" 탭에 표시되는 모든 실행 결과를 터미널로 반환합니다. 수신된 수익, 거래 수, Sharpe 계수, 결과 OnTester() 함수 등

최적화하는 동안 터미널은 작은 패키지의 에이전트에게 테스트 작업을 전달하며 각 패키지에는 여러 작업이 포함됩니다 (각 작업은 입력 매개 변수 집합을 사용하는 단일 테스트를 의미함). 이렇게하면 터미널과 에이전트 간의 교환 시간이 줄어 듭니다.

에이전트는 보안상의 이유로 터미널 (EA, 인디케이터, 라이브러리 등)에서 얻은 EX5 파일을 하드 디스크에 기록하지 않으므로 에이전트가 실행중인 컴퓨터는 전송된 데이터를 사용할 수 없습니다. DLL을 포함한 다른 모든 파일은 샌드 박스에 기록됩니다. 원격 에이전트에서는 DLL을 사용하여 EA를 테스트 할 수 없습니다.

테스트 결과는 필요할 때 빠르게 액세스 할 수 있도록 터미널에 의해 특수한 결과 캐시 (결과 캐시)에 추가됩니다. 각 매개 변수 세트에 대해 터미널은 재실행을 피하기 위해 이전 실행에서 이미 사용 가능한 결과에 대한 결과 캐시를 검색합니다. 이러한 매개 변수 집합의 결과를 찾을 수 없는 경우 에이전트는 테스트를 수행 할 작업을 받습니다.

터미널과 에이전트 간의 모든 트래픽은 암호화됩니다.


모든 클라이언트 터미널의 공유 폴더 사용

모든 테스트 에이전트는 서로 및 클라이언트 터미널과 격리됩니다. 각 에이전트에는 로그가 기록되는 자체 폴더가 있습니다. 또한 에이전트 테스트 중 모든 파일 작업은 agent_name/MQL5/Files 폴더에서 발생합니다. 그러나 파일을 여는 동안 FILE_COMMON 플래그를 지정하면 모든 클라이언트 터미널에 대한 공유 폴더를 통해 로컬 에이전트와 클라이언트 터미널 간의 상호 작용을 구현할 수 있습니다.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- the shared folder for all of the client terminals
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- draw out the name of this folder
   PrintFormat("Open the file in the shared folder of the client terminals %s", common_folder);
//--- open a file in the shared folder (indicated by FILE_COMMON flag)
   handle=FileOpen(filename,FILE_WRITE|FILE_READ|FILE_COMMON);
   ... further actions
//---
   return(0);
  }


DLL 사용

최적화 속도를 높이기 위해 로컬뿐만 아니라 원격 에이전트도 사용할 수 있습니다. 이 경우 원격 에이전트에 대한 몇 가지 제한 사항이 있습니다. 우선, 원격 에이전트는 Print() 함수 실행 결과를 로그에 표시하지 않으며, 포지션 열기 및 닫기에 대한 메시지를 표시합니다. 로그에 최소한의 정보가 표시되어 잘못 작성된 EA가 제거 에이전트가 작동중인 컴퓨터를 메시지와 함께 폐기하지 못하도록 방지합니다.

두 번째 제한 - EA를 테스트 할 때 DLL 사용 금지. DLL 호출은 보안상의 이유로 원격 에이전트에서 절대적으로 금지됩니다. 로컬 에이전트에서 테스트된 EA의 DLL 호출은 "DLL 가져 오기 허용" 권한이 있는 경우에만 허용됩니다.

그림 10. mql5-programs의 "DLL 가져 오기 허용"옵션

참고: DLL 호출 허용이 필요한 EA (스크립트, 인디케이터)에서 수신한 것을 사용하는 경우, 터미널 설정에서 이 옵션을 허용 할 때 가정하는 위험을 인식해야 합니다. EA가 어떻게 사용되는지에 관계없이 - 테스트 또는 차트 실행에 사용됩니다.


결론

이 글는 MetaTrader 5 클라이언트 터미널에서 EA 테스트를 빠르게 마스터하는 데 도움이 되는 기본 사항을 다룹니다.

  • 틱 생성의 세 가지 모드;
  • 테스트 중 지표 ​​값 계산;
  • 다중 통화 테스트;
  • 테스트 중 시간 시뮬레이션;
  • 전략 테스터에서 OnTimer(), OnSleep() 및 IndicatorRelease() 함수의 작업;
  • DLL 호출 중 에이전트 테스트 작업;
  • 모든 클라이언트 터미널에 공유 폴더를 사용합니다;
  • "시가 전용" 모드에서 바 동기화;
  • 이벤트 처리.

클라이언트 터미널의 전략 테스터의 주요 임무는 MQL5 프로그래머의 최소한의 노력으로 필요한 데이터의 정확성을 보장하는 것입니다. 개발자는 기록 데이터에 대한 거래 전략을 테스트하기 위해 코드를 다시 작성할 필요가 없도록 많은 작업을 수행했습니다. 테스트의 기본 사항을 아는 것으로 충분하며 올바르게 작성된 EA는 테스터와 차트의 온라인 모드에서도 동일하게 작동합니다.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/239

MQL5에서 리소스 사용 MQL5에서 리소스 사용
MQL5 프로그램은 일상적인 계산을 자동화 할 뿐만 아니라 완전한 기능을 갖춘 그래픽 환경을 만들어 주기도 합니다. 진정한 인터랙티브 컨트롤을 만드는 기능은 이제 고전적인 프로그래밍 언어의 기능과 거의 동일합니다. MQL5에서 본격적인 독립 실행형 프로그램을 작성하려면 리소스를 사용하십시오. 리소스가 있는 프로그램은 유지 관리 및 배포가 더 쉽습니다.
MetaTrader 5에서의 거래 이벤트 MetaTrader 5에서의 거래 이벤트
거래 계정의 현재 상태를 모니터링한다는 것은 오픈 포지션과 주문을 통제한다는 것을 의미합니다. 거래 신호가 진정한 거래가 되기 전, 이는 거래 서버로의 요청으로써 클라이언트 터미널에서 전송되어야 하며, 이 때 거래 서버는 처리 대기 중인 주문 대기열에 배치될 것입니다. 거래 서버에 의한 수락하거나, 만료 시 삭제하거나, 거래 기준으로 거래를 수행하는 등과 관련된 이러한 모든 조치에는 거래 이벤트가 뒤따르게 되고, 이 때 거래 서버는 터미널에 이런 사항에 대해 알려주게 됩니다.
MQL5 마법사 : 새 버전 MQL5 마법사 : 새 버전
이 문서에는 업데이트된 MQL5 마법사에서 사용할 수있는 새로운 기능에 대한 설명이 포함되어 있습니다. 수정된 신호 아키텍처를 통해 다양한 시장 패턴의 조합을 기반으로 거래 로봇을 만들 수 있습니다. 이 글에 포함된 예제는 Expert Advisor의 대화 형 생성 절차를 설명합니다.
매매봇 프로토타입 매매봇 프로토타입
본 문서는 매매 시스템의 알고리즘과 요소들을 만드는 원리를 요약하고 체계화합니다. 본 문서는 익스퍼트 알고리즘 디자인을 다룹니다. 예시로서 빠르고 손쉬운 매매 시스템에 쓰일 수 있는 CExpertAdvisor 클래스가 사용될 것입니다.