이벤트 핸들링 함수

MQL5 언어는 일부 사전 정의된 이벤트의 처리를 제공합니다. 이러한 이벤트를 처리하기 위한 함수는 MQL5 프로그램에 정의되어야 합니다. 함수 이름, 반환 유형, 매개변수 구성(있는 경우) 및 해당 유형은 이벤트 핸들러 함수에 대한 설명과 엄격히 일치해야 합니다.

클라이언트 터미널의 이벤트 핸들러는 반환 값 유형 및 매개 변수 유형별로 이 이벤트 또는 해당 이벤트를 처리하는 함수를 식별합니다. 아래 설명에 해당하지 않는 다른 매개변수가 해당 함수에 지정되거나 다른 반환 유형이 지정된 경우 해당 함수는 이벤트 핸들러로 사용되지 않습니다.

OnStart

OnStart() 함수는 Start 이벤트 핸들러이며, 이는 자동으로 오직 스크립트 실행을 위해 작동합니다. 이는 매개 변수가 없는 void 유형이어야 합니다:

void OnStart();

OnStart() 함수의 경우, 반환 값으로 int 유형이 명시될 수 있습니다.

OnInit

OnInit() 함수는 Init 이벤트 핸들러입니다. 이는 매개 변수가 없는 void 또는 int 유형이어야 합니다:

void OnInit();

Init 이벤트는 Expert Advisor 또는 지표가 다운로드된 후 즉시 생성되며 스크립트에 대해서는 생성되지 않습니다. OnInit() 함수는 초기화에 사용됩니다. OnInit()의 반환 값에 int 타입이 있는 경우 0이 아닌 반환 코드는 실패한 초기화를 의미하며, Deinit 이벤트가 초기화 취소 사유 코드 REASON_INITFAILED와 함께 생성됩니다.

INIT_FAILED를 반환하면 EA가 차트에서 강제로 언로드됩니다.

INIT_FAILED를 반환하면 지표가 차트에서 언로드되지 않습니다. 차트에 남아 있는 지표는 작동하지 않습니다. — 이벤트 핸들러는 지표에서 호출되지 않습니다.

Expert Advisor의 입력 매개 변수를 최적화하려면 ENUM_INIT_RETCODE 열거 값을 반환 코드로 사용하는 것이 좋습니다. 이 값은 가장 적절한 테스팅 에이전트 선택을 포함하여 최적화 과정을 구성하는 데 사용됩니다. 테스트를 시작하기 전에 Expert Advisor를 초기화하는 동안 TerminalInfoInteger() 함수를 사용하여 에이전트의 구성 및 리소스(코어 수, 사용 가능한 메모리 양 등)에 대한 정보를 요청할 수 있습니다. 수집된 정보에 따라 Expert Advisor를 최적화하는 동안 이 테스트 에이전트를 사용하도록 허용하거나 사용을 거부할 수 있습니다.

ENUM_INIT_RETCODE

식별자

설명

INIT_SUCCEEDED

Expert Advisor의 성공적인 초기화를 통해 테스트를 계속할 수 있습니다.

이 코드는 Null 값과 동일합니다 – Expert Advisor가 테스터에서 성공적으로 초기화되었습니다.

INIT_FAILED

초기화 실패; 치명적인 오류로 인해 테스트를 계속할 필요가 없습니다. 예를 들어 Expert Advisor 작업에 필요한 지표를 만들지 못했습니다.

이 반환 값이 0이 아닌 다른 값이라면 - 테스터에서 Expert Advisor를 초기화하지 못했다는 것을 뜻합니다.

INIT_PARAMETERS_INCORRECT

이 값은 입력 매개 변수의 잘못된 집합을 의미합니다. 이 반환 코드가 포함된 결과 문자열은 일반 최적화 테이블에서 빨간색으로 강조 표시됩니다.

Expert Advisor의 지정된 매개 변수 집합에 대한 테스트가 실행되지 않으며 에이전트는 새 작업을 자유롭게 받을 수 있습니다.

이 값을 수신하면 전략 테스터가 이 작업을 다른 에이전트에 전달하여 재시도할 수 없습니다.

INIT_AGENT_NOT_SUITABLE

초기화 중 오류가 발생하지 않지만, 어떤 이유로 인해 에이전트가 테스트에 적합하지 않습니다. 예를 들어 메모리 부족, OpenCL 서포트 없음 등이 있습니다.

이 코드가 반환된 후 에이전트는 이 최적화가 끝날 때까지 작업을 수신하지 않습니다.

void 유형의 OnInit() 함수는 항상 성공적인 초기화를 나타냅니다.

OnDeinit

OnDeinit() 함수는 초기화 취소 중에 호출되며, 이는 Deinit 이벤트 핸들러입니다. 이 매개 변수는 void 유형으로 선언되어야 하며 const int 유형의 매개 변수가 하나 있어야 하며, 이는 초기화 해제 사유 코드를 포함해야 합니다. 만약 다른 유형이 선언된 경우, 컴파일러는 경고를 생성하지만 함수는 호출되지 않습니다. 스크립트의 경우 Deinit 이벤트가 생성되지 않으므로 OnDeinit() 함수를 스크립트에서 사용할 수 없습니다.

void OnDeinit(const int reason);

Deinit 이벤트는 다음과 같은 경우 Expert Advisor 및 지표에 대해 생성됩니다:

  • mql5 프로그램이 부착된 심볼 또는 차트 기간의 변경으로 인한 재초기화 전;
  • 입력 매개 변수 변경으로 인한 재초기화 전;
  • mql5 프로그램을 언로드하기 전.

OnTick

NewTick 이벤트는 Expert Advisor 만 Expert Advisor가 부착된 차트에 심볼에 대한 새 틱이 수신될 때 생성됩니다. 커스텀 지표 또는 스크립트에 OnTick() 함수를 정의하는 것은 NewTick 이벤트가 생성되지 않기 때문에 무용지물입니다.

Tick 이벤트는 Expert Advisor에 대해서만 생성되지만 Expert Advisor에 대해 NewTick 이벤트가 생성될 뿐만 아니라 Timer, BookEvent 및 ChartEvent 이벤트 이벤트도 생성되므로 Expert Advisor에 OnTick() 함수가 필요하지는 않습니다. 이것은 매개 변수가 없는 void 유형으로 선언되어야 합니다:

void OnTick();

OnTimer

OnTimer() 함수는 Expert Advisor 및 지표에 대해서만 시스템 타이머에 의해 생성되는 타이머 이벤트가 발생할 때 호출되며 - 이는 스크립트에서 사용할 수 없습니다. 이벤트 발생 빈도는 EventSetTimer() 함수가 수신할 이 이벤트에 대한 알림을 구독할 때 설정됩니다.

EventKillTimer() 함수를 사용하여 특정 Expert Advisor에 대한 타이머 이벤트 수신을 취소할 수 있습니다. 함수는 매개 변수 없이 void 유형으로 정의되어야 합니다:

void OnTimer();

OnInit() 함수에서 EventSetTimer() 함수를 한 번 호출하고 OnDeinit() 함수에서 EventKillTimer() 함수를 한 번 호출하는 것이 좋습니다.

모든 Expert Advisor는 물론 모든 지표가 자체 타이머로 작동하며 이 타이머로부터만 이벤트를 수신합니다. mql5 프로그램 작동이 중지되는 즉시 타이머가 생성되었지만 EventKillTimer() 함수에 의해 비활성화되지 않은 경우 강제로 삭제됩니다.

OnTrade

이 함수는 거래 이벤트가 발생할 때 호출되는데, 이는 주문포지션 오픈, 주문 내역거래 내역을 변경시 나타납니다. 거래 활동(보류 주문 오프닝, 포지션 오픈/클로징, 설정 중지, 보류 주문 트리거 등)이 수행되면 주문 및/또는 거래의 내역과 현재 주문 목록이 그에 따라 변경됩니다.

void OnTrade();

유저는 (거래전략조건에 따라 요구되는 경우) 그러한 이벤트가 접수되었을 때 거래계좌 상태에 대한 검증을 코드에 독립적으로 구현해야 합니다. OrderSend() 함수 호출이 성공적으로 완료되어 true 값을 반환한 경우, 거래 서버가 실행을 위해 주문을 대기열에 넣고 티켓 번호를 할당했음을 의미합니다. 서버가 이 주문을 처리하는 즉시 거래 이벤트가 생성됩니다. 또한 사용자가 티켓 값을 기억하면 OnTrade() 이벤트 처리 중에 이 값을 사용하여 주문에 무슨 일이 발생했는지 확인할 수 있습니다.

OnTradeTransaction

거래 계정에 대해 몇 가지 명확한 작업을 수행하면 상태가 변경됩니다. 그러한 액션은 다음을 포함합니다:

  • OrderSendOrderSendAsync 함수를 사용하여 클라이언트 터미널의 모든 MQL5 응용 프로그램에서 거래 요청을 전송하고 해당 추가 실행을 수행;
  • 터미널 그래픽 인터페이스 및 추가 실행을 통해 거래 요청 전송;
  • 서버에서 주문 보류 및 주문 활성화 중지;
  • 거래 서버 측에서 작업 수행.

이러한 조치의 결과로 다음과 같은 매매 거래가 수행됩니다:

  • 거래 요청 처리;
  • 오픈 주문 변경;
  • 주문 내역 변경;
  • 거래 내역 변경;
  • 포지션 변경.

예를 들어, 시장 매수 주문을 보낼 때 처리되고, 계정에 대한 적절한 매수 주문이 생성되며, 주문이 실행되어 열린 주문 목록에서 삭제되고, 주문 기록에 추가되고, 적절한 거래가 기록에 추가되고, 새로운 포지션이 생성됩니다. 이 모든 행동은 거래 트랜잭션입니다. 그러한 거래가 터미널에 도착하는 것은 TradeTransaction 이벤트 입니다. 이는 OnTradeTransaction 핸들러를 호출합니다

void  OnTradeTransaction(
   const MqlTradeTransaction   trans,        // 거래 트랜잭션 구조
   const MqlTradeRequest&        request,      // 요청 구조
   const MqlTradeResult&         result        // 결과 구조
   );

핸들러에는 세 가지 매개 변수가 있습니다:

  • trans - 이 매개 변수는 MqlTradeTransaction 구조를 가져오는데, 이는 거래 계정에 적용되는 거래 트랜잭션을 설명합니다;
  • request - 이 매개 변수는 거래 요청을 설명하는 MqlTradeRequest 구조를 가져옵니다;
  • result - 이 매개 변수는 거래 요청 실행 결과를 설명하는 MqlTradeResult 구조를 가져옵니다.

마지막 두 요청결과 매개 변수는 TRADE_TRANSACTION_REQUEST 유형 트랜잭션에 대한 값으로 채워지며 type 매개 변수(trans 변수)에서 트랜잭션 데이터를 수신할 수 있습니다. 이 경우, request_id 필드 (result 변수의) request trade request ID를 포함하며, 이 ID의 실행 후에는 거래 트랜잭션 (trans 변수에 설명된)이 수행됩니다. 요청 ID를 사용하면 수행된 작업(OrderSend 또는 OrderSendAsync 함수 호출)을 OnTradeTransaction()로 보낸 작업의 결과와 연결할 수 있습니다.

터미널에서 수동으로 전송되거나 OrderSend()/OrderSendAsync() 함수를 통해 전송된 거래 요청 한 번으로 거래 서버에서 여러 개의 연속 트랜잭션이 발생할 수 있습니다. 이러한 거래의 터미널 도착 우선순위는 보장되지 않습니다. 따라서 거래 알고리즘을 개발할 때 트랜잭션 그룹이 하나씩 차례로 도착할 것이라고 예상해서는 안 됩니다.

  • 모든 유형의 거래 트랜잭션은 ENUM_TRADE_TRANSACTION_TYPE 열거값에 설명되어 있습니다.
  • 거래 트랜잭션을 설명하는 MqlTradeTransaction 구조는 거래 유형에 따라 다양한 방식으로 채워집니다. 예를 들어 TRADE_TRANSACTION_REQUEST 유형 트랜잭션의 경우 유형 필드(트레이드 트래잭션 타입)만 분석해야 합니다. 추가 데이터에 대해 OnTradeTransaction 함수의 두 번째 및 세 번째 매개 변수(요청 및 결과)를 분석해야 합니다. 자세한 내용은 "거래 트랜잭션 구조"를 참조하십시오.
  • 거래 설명은 주문, 거래 및 포지션(예: 의견)과 관련하여 사용 가능한 모든 정보를 전달하지는 않습니다. OrderGet*, HistoryOrderGet*, HistoryDealGet*PositionGet* 함수는 더 확장된 정보를 얻기 위해 사용해야 합니다.

클라이언트 계정에 거래 트랜잭션을 적용한 후에는 터미널 거래 대기열에 일관되게 배치되며, 터미널에 도착하는 순서대로 OnTradeTransaction 진입 포인트로 일관되게 전송됩니다.

OnTradeTransaction 핸들러를 사용하여 Expert Advisor가 거래 트랜잭션을 처리할 때 터미널은 새로 도착한 거래 트랜잭션을 계속 처리합니다. 따라서 OnTradeTransaction 작업 중에 거래 계정의 상태가 이미 변경될 수 있습니다. 예를 들어, MQL5 프로그램이 새 순서를 추가하는 이벤트를 처리하는 동안 이 프로그램이 실행되어 열린 순서 목록에서 삭제되고 기록으로 이동할 수 있습니다. 또한 어플리케이션에는 이러한 이벤트가 통지됩니다.

트랜잭션 대기열 길이는 1024개의 요소로 구성됩니다. OnTradeTransaction이 새 트랜잭션을 너무 오래 처리하면 대기열에 있는 이전 트랜잭션이 새 트랜잭션으로 대체될 수 있습니다.

  • 일반적으로 OnTrade 및 OnTradeTransaction 요청 수의 정확한 비율은 없습니다. 하나의 OnTrade 호출은 하나 이상의 OnTradeTransaction 호출에 해당합니다.
  • OnTrade는 적절한 OnTradeTransaction 호출 후에 호출됩니다.

OnTester

OnTester() 함수는 선택한 간격에 대한 Expert Advisor의 기록 테스트가 끝난 후 자동으로 생성되는 Tester 이벤트의 핸들러입니다. 함수는 매개 변수 없이 double 유형으로 정의되어야 합니다:

double OnTester();

이 함수는 OnDeinit() 호출 직전에 호출되며 반환 값의 유형이 같습니다 - double. OnTester()는 Expert Advisors의 테스트 중에만 사용 가능합니다. 주요 목적은 입력 파라미터의 유전적 최적화에서 Custom max 기준으로 사용되는 특정 값을 계산하는 것입니다.

유전적 최적화에서는 내림차순 정렬이 한 세대 내의 결과에 적용됩니다. 즉, 최적화 기준의 관점에서 최상의 결과는 가장 큰 값을 가지는 것입니다(OnTester 함수에 의해 반환되는 커스텀 최대 최적화 기준 값이 고려됨). 이러한 정렬에서 최악의 값은 끝에 배치되고 더 멀리 던져지며 다음 세대의 형성에는 참여하지 않는 것입니다.

OnTesterInit

OnTesterInit() 함수는 전략 테스터에서 Expert Advisor 최적화가 시작되기 전에 자동으로 생성되는 TesterInit 이벤트의 핸들러입니다. 이 함수는 반드시 void 타입으로 정의되어야 합니다. 이것에는 매개 변수가 없습니다:

void OnTesterInit();

최적화가 시작되면 OnTesterDeinit() 또는 OnTesterPass() 핸들러가 있는 Expert Advisor가 테스터에 지정된 기호와 기간이 포함된 별도의 터미널 차트에 자동으로 로드되고 TesterInit 이벤트를 수신합니다. 이 함수는 최적화 결과 처리를 위한 최적화 시작 전 Expert Advisor 초기화에 사용됩니다.

OnTesterPass

OnTesterPass() 함수는 전략 테스터에서 Expert Advisor 최적화 중에 프레임이 수신되면 자동으로 생성되는 TesterPass 이벤트의 핸들러입니다. 이 함수는 반드시 void 타입으로 정의되어야 합니다. 이것에는 매개 변수가 없습니다:

void OnTesterPass();

OnTesterPass() 핸들러가 있는 Expert Advisor는 테스트를 위해 지정된 심볼/주기가 있는 별도의 터미널 차트에 자동으로 로드되며 최적화 중에 프레임이 수신되면 TesterPass 이벤트를 가져옵니다. 이 함수는 완료를 기다리지 않고 "즉석에서" 최적화 결과를 동적으로 처리하는 데 사용됩니다. 프레임은 FrameAdd() 함수를 사용하여 추가되며, 이 함수는 OnTester() 핸들의 단일 패스가 끝난 후 호출할 수 있습니다.

OnTesterDeinit

OnTesterDeinit()는 전략 테스터에서 Expert Advisor 최적화가 종료된 후 자동으로 생성되는 TesterDeinit 이벤트의 핸들러입니다. 이 함수는 반드시 void 타입으로 정의되어야 합니다. 이것에는 매개 변수가 없습니다:

void OnTesterDeinit();

TesterDeinit() 핸들러가 있는 Expert Advisor는 최적화를 시작할 때 차트에 자동으로 로드되고 완료 후 TesterDeinit을 수신합니다. 이 함수는 모든 최적화 결과를 최종 처리하는 데 사용됩니다.

OnBookEvent

OnBookEvent() 함수는 BookEvent 핸들러입니다. BookEvent는 시장 심도가 변경될 때 Expert Advisor 및 지표에 대해 생성됩니다. 이는 void 형식이어야 하며 문자열 유형의 매개 변수가 하나 있어야 합니다:

void OnBookEvent (const stringsymbol);

심볼에 대한 BookEvent 이벤트를 수신하려면 MarketBookAdd() 함수를 사용하여 이 심볼에 대한 이벤트를 수신하려면 사전 구독만 하면 됩니다. 특정 심볼에 대한 BookEvent 이벤트 수신을 취소하려면, MarketBookRelease()를 호출하십시오.

다른 이벤트와는 달리, BookEvent 이벤트는 방송됩니다. 즉, 하나의 Expert Advisor 구독자가 MarketBookAdd를 사용하여 BookEvent 이벤트 수신하면 OnBookEvent() 핸들러가 있는 다른 모든 Expert Advisor가 이 이벤트를 수신합니다. 따라서 const string& symbol 매개 변수로 핸들러에 전달되는 심볼명을 분석해야 합니다.

OnChartEvent

OnChartEvent()는 ChartEvent 이벤트 그룹의 핸들러입니다:

  • CHARTEVENT_KEYDOWN — 차트 창에 포커스가 맞춰진 경우 키 입력 이벤트;
  • CHARTEVENT_MOUSE_MOVE — 마우스 이동 이벤트 및 마우스 클릭 이벤트 (CHART_EVENT_MOUSE_MOVE=true 가 차트에 대해 설정된 경우);
  • CHARTEVENT_OBJECT_CREATE — 그래픽 객체 생성 이벤트 (CHART_EVENT_OBJECT_CREATE=true 가 차트에 대해 설정된 경우);
  • CHARTEVENT_OBJECT_CHANGE — 특성 다이럴로그를 통해 객체 특성이 변경될 경우;
  • CHARTEVENT_OBJECT_DELETE — 그래픽 객체 삭제 이벤트 (CHART_EVENT_OBJECT_DELETE=true 가 차트에 대해 설정된 경우);
  • CHARTEVENT_CLICK — 차트에서 마우스를 클릭하는 이벤트;
  • CHARTEVENT_OBJECT_CLICK — 차트에 속한 그래픽 객체를 마우스로 클릭하는 이벤트;
  • CHARTEVENT_OBJECT_DRAG — 마우스를 사용한 그래픽 객체 이동 이벤트;
  • CHARTEVENT_OBJECT_ENDEDIT — 그 LabelEdit 그래픽 개체의 입력 상자에서 끝난 텍스트 편집의 이벤트;
  • CHARTEVENT_CHART_CHANGE  — 차트 변경 이벤트;
  • CHARTEVENT_CUSTOM+n — 사용자 이벤트의 ID로, 여기서 n은 0에서 65535 사이의 범위입니다.
  • CHARTEVENT_CUSTOM_LAST — 커스텀 이벤트의 마지막 허용 ID(CHARTEVENT_CUSTOM +65535).

이 함수는 Expert Advisor 및 지표에서만 호출할 수 있습니다. 함수는 4개의 매개 변수를 가진 보이드 유형이어야 합니다:

void OnChartEvent(const int id,         // Event ID
                  const long& lparam,   // long 타입 이벤트의 매개 변수
                  const double& dparam, // double 타입 이벤트의 매개 변수
                  const string& sparam  // string 타입 이벤트의 매개 변수
  );

각 이벤트 유형에 대해 OnChartEvent() 함수의 입력 매개 변수에는 이 이벤트 처리에 필요한 한정된 값이 있습니다. 이러한 매개 변수를 통과하는 이벤트 및 값은 아래 표에 나열되어 있습니다.

Event

id 매개 변수 값

lparam 매개변수 값

dparam 매개변수 값

sparam 매개변수 값

키 입력 이벤트

CHARTEVENT_KEYDOWN

누른 키의 코드

반복 횟수(사용자가 키를 누른 결과로 키 입력이 반복되는 횟수)

키보드 버튼의 상태를 설명하는 비트 마스크의 문자열 값

마우스 이벤트 (property CHART_EVENT_MOUSE_MOVE=true 가 차트에 대해 설정된 경우)

CHARTEVENT_MOUSE_MOVE

X 좌표

Y 좌표

마우스 버튼의 상태를 설명하는 비트 마스크의 문자열 값

그래픽 객체 생성 이벤트 (CHART_EVENT_OBJECT_CREATE=true 가 차트에 대해 설정된 경우)

CHARTEVENT_OBJECT_CREATE

생성된 그래픽 개체의 이름

속성 대화상자를 통한 객체 속성 변경 이벤트

CHARTEVENT_OBJECT_CHANGE

수정된 그래픽 개체의 이름

그래픽 객체 삭제 이벤트 (CHART_EVENT_OBJECT_DELETE=true 가 차트에 대해 설정된 경우)

CHARTEVENT_OBJECT_DELETE

삭제된 그래픽 개체의 이름

차트를 마우스로 클릭하는 이벤트

CHARTEVENT_CLICK

X 좌표

Y 좌표

차트에 속한 그래픽 개체를 마우스로 클릭하는 이벤트

CHARTEVENT_OBJECT_CLICK

X 좌표

Y 좌표

이벤트가 발생한 그래픽 개체의 이름

마우스를 사용하여 그래픽 개체를 드래그하는 이벤트

CHARTEVENT_OBJECT_DRAG

이동된 그래픽 개체의 이름

레이블 편집 그래픽 객체의 입력 상자에서 완료된 텍스트 편집 이벤트

CHARTEVENT_OBJECT_ENDEDIT

다음의 이름: 텍스트 편집이 완료된 LabelEdit 그래픽 객체

차트 변경 이벤트

CHARTEVENT_CHART_CHANGE

N 넘버 이하의 유저 이벤트 ID

CHARTEVENT_CUSTOM+N

EventChartCustom() 함수에 의해 설정된 값

EventChartCustom() 함수에 의해 설정된 값

EventChartCustom() 함수에 의해 설정된 값

OnCalculate

OnCalculate() 함수는 Calculate 이벤트로 지표 값을 계산해야 하는 경우에만 커스텀 지표에서 호출됩니다. 이 문제는 일반적으로 지표가 계산된 기호에 대해 새 눈금이 수신될 때 발생합니다. 이 지표는 이 심볼의 가격 차트에 첨부할 필요가 없습니다.

OnCalculate() 함수는 int 타입으로만 반환합니다. 두 가지 가능한 정의가 있습니다. 한 지표 내에서 두 가지 버전의 함수를 모두 사용할 수 없습니다.

첫 번째 양식은 단일 데이터 버퍼에서 계산할 수 있는 지표를 위한 것입니다. 이러한 지표의 예로는 커스텀 이동 평균이 있습니다.

int OnCalculate (const int rates_total,      // price[] 배열의 크기
                 const int prev_calculated,  // 이전 호출에서 처리된 막대
                 const int begin,            // 중요한 데이터가 시작되는 곳
                 const double& price[]       // 계산할 배열
   );

price[] 배열로 시계열 중 하나 또는 일부 지표의 계산된 버퍼를 통과할 수 있습니다. price[] 배열에서 인덱싱의 방향을 결정하려면 ArrayGetAsSeries()를 호출하십시오. 기본값에 의존하지 않으려면 함께 작동해야 하는 배열에 대해 무조건 ArraySetAsSeries() 함수를 호출해야 합니다.

사용자가 지표를 시작할 때 "파라미터" 탭에서 price[] 배열로 사용할 시계열 또는 지표를 선택할 수 있습니다. 이렇게 하려면 "적용 대상" 필드의 드롭다운 목록에서 필요한 항목을 지정해야 합니다.

지표를 계산할 시계열 선택

다른 mql5 프로그램으로부터 커스텀 지표의 값을 수신하려면 후속 작업에 대한 지표 핸들을 반환하는 iCustom() 함수를 사용합니다. 적절한 price[] 배열 또는 다른 지표의 핸들을 지정할 수도 있습니다. 이 매개 변수는 커스텀 지표의 입력 변수 목록에서 마지막으로 전송되어야 합니다.
예:

void OnStart()
  {
//---
   string terminal_path=TerminalInfoString(STATUS_TERMINAL_PATH);
   int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT"Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL);
   if(handle_customMA>0)
      Print("handle_customMA = ",handle_customMA);
   else
      Print("열 수 없거나 EX5 파일이 아닙니다 '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving Average.ex5'");
  }

이 예제에서, 전달돈 마지막 매개 변수는 (ENUM_APPLIED_PRICE 열거값 에서) PRICE_TYPICAL 값이며, 이는(High+Low+Close)/3 으로 얻은 일반적인 가격을 기반으로 커스텀 지표가 작성됨을 나타냅니다. 이 매개변수가 지정되지 않은 경우 지표는 PRICE_CLOSE 값(즉, 각 막대의 종가)을 기반으로 작성됩니다.

지표 핸들러가 price[] 배열을 지정하는 마지막 매개 변수로 전달되는 것을 보여주는 또 다른 예는 iCustom() 함수에 대한 설명에 나와 있습니다.
 

두 번째 형태는 계산에 두 개 이상의 시계열이 사용되는 다른 모든 지표에 사용됩니다.

int OnCalculate (const int rates_total,      // 입력 시계열의 크기
                 const int prev_calculated,  // 이전 호출에서 처리한 막대
                 const datetime& time[],     // 시간
                 const double& open[],       // 시가
                 const double& high[],       // 고가
                 const double& low[],        // 저가
                 const double& close[],      // 종가
                 const long& tick_volume[],  // 틱 볼륨
                 const long& volume[],       // 실제 거래량
                 const int& spread[]         // 스프레드
   );

open[], high[], low[] 및 close[]의 파라미터에는 현재 기간의 시가, 고가, 저가, 종가의 배열이 포함됩니다. time[] 매개 변수에는 시가가 있는 배열이 포함되며, spread[] 매개 변수에는 스프레드의 내역이 포함된 배열이 있습니다(거래된 증권에 대해 제공된 경우). volume[]과 tick_volume[]의 매개 변수에는 각각 거래 내역과 틱 볼륨 내역이 포함됩니다.

time[], open[], high[], low[], close[], tick_volume[], volume[] 및 spread[]의 인덱싱을 확인하려면, ArrayGetAsSeries()를 호출하십시오. 기본값에 의존하지 않으려면 해당 어레이에 대해 무조건적으로 ArraySetAsSeries() 함수를 호출해야 하며, 이는 함께 사용할 수 없습니다.

첫 번째 rates_total 매개 변수는 계산에 사용할 수 있는 막대의 수를 포함하며 차트에서 사용할 수 있는 막대의 수에 해당합니다.

OnCalculate()의 반환 값과 prev_calculated의 두 번째 입력 매개 변수 사이의 연결성에 유의해야 합니다. 함수 호출 중, prev_calculated 매개 변수는 OnCalculate()에 의해반환된 값을 포함하며, 이는 이전 호출 중의 것입니다. 따라서 이 함수의 이전 실행 이후 변경되지 않은 막대에 대한 반복적인 계산을 피하기 위해 커스텀 지표를 계산하는 경제적 알고리즘이 가능합니다.

이를 위해 일반적으로 현재 함수 호출의 막대 수를 포함하는 rates_total 매개변수의 값을 반환하는 것으로 충분합니다. OnCalculate() 가격 데이터의 마지막 호출이 변경된 경우(더 깊은 히스토리 다운로드 또는 히스토리 공백이 채워짐) 터미널에 의해 입력 매개변수 prev_calculated 값이 0으로 설정됩니다.

참고: OnCalculate가 0을 반환하면 클라이언트 터미널의 데이터 창에 지표 값이 표시되지 않습니다.

이것을 더 잘 이해하기 위해 아래에 첨부된 코드를 시작하는 것이 유용할 것입니다.

지표 예제:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Line
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- 지표 버퍼
double         LineBuffer[];
//+------------------------------------------------------------------+
//| 커스텀 지표 초기화 함수                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 지표 버퍼 매핑
   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 커스텀 지표 반복 함수                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- 현재 심볼 및 차트 기간에 사용할 수 있는 막대 수를 가져옵니다.
   int bars=Bars(Symbol(),0);
   Print("Bars = ",bars,", rates_total = ",rates_total,",  prev_calculated = ",prev_calculated);
   Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
//--- 다음 호출에 대해 prev_calculated 값을 반환합니다
   return(rates_total);
  }
//+------------------------------------------------------------------+

더 보기

프로그램 실행, 클라이언트 터미널 이벤트, 이벤트 작업