실행 중인 프로그램

각 스크립트, 각 서비스 및 각 Expert Advisor는 고유한 개별 스레드에서 실행됩니다. 하나의 심볼에 따라 계산된 모든 지표는 서로 다른 차트에 연결되어 있더라도 동일한 스레드에서 작동합니다. 따라서, 하나의 심볼에 있는 모든 지표는 하나의 쓰레드의 자원을 공유합니다.

틱 처리 및 내역 동기화와 같은 심볼와 관련된 다른 모든 작업도 지표와 동일한 스레드에서 일관되게 수행됩니다. 즉, 지표에서 무한 동작을 수행하면 해당 심볼과 관련된 다른 모든 이벤트가 수행되지 않습니다.

Expert Advisor를 실행할 때는 실제 거래 환경이 있고 필요한 기호와 기간의 내역에 액세스 할 수 있는지 확인하고 터미널과 서버 간에 데이터를 동기화합니다. 이러한 모든 절차에서 터미널은 5초 미만의 시작 지연을 제공하며, 그 후 Expert Advisor가 사용 가능한 데이터로 시작됩니다. 따라서 서버에 연결되지 않은 경우, Expert Advisor 시작 시간이 지연될 수 있습니다.

아래 표에는 MQL5 프로그램의 간략한 요약이 나와 있습니다:

Program

Running

참고

Service

별도의 스레드, 서비스의 스레드 수는 서비스 수와 같습니다

루프 서비스가 다른 프로그램의 실행을 중단할 수 없습니다

Script

별도의 스레드, 스크립트의 스레드 수는 스크립트 수와 같습니다

루프된 스크립트는 다른 프로그램의 실행을 중단할 수 없습니다

Expert Advisor

별도의 스레드인 Expert Advisor의 스레드 수는 Expert Advisor의 수와 동일합니다

루프가 있는 Expert Advisor는 다른 프로그램의 실행을 중단할 수 없습니다

Indicator

심볼에 있는 모든 지표에 대한 하나의 스레드. 스레드 수는 지시자가 있는 심볼 수와 같습니다

한 지표에 무한 루프가 있으면 이 심볼에 있는 다른 모든 지표가 중지됩니다

프로그램이 차트에 연결된 직후 클라이언트 터미널 메모리에 업로드되고 글로벌 변수가 초기화됩니다. 클래스 유형의 일부 글로벌 변수에 생성자가 있는 경우, 글로벌 변수를 초기화하는 동안 이 생성자가 호출됩니다.

그 후 프로그램은 클라이언트 터미널에서 이벤트에 대기할 것입니다. 각 mql5-프로그램에는 적어도 하나의 event-handler가 있어야 하며, 그렇지 않으면 로드된 프로그램이 실행되지 않습니다. 이벤트 핸들러에는 미리 정의된 이름, 매개 변수 및 반환 유형이 있습니다.

유형

함수명

Parameter

어플리케이션

코멘트

int

OnInit

none

Expert Advisor 및 지표

Init 이벤트 핸들러. void return 타입을 사용할 수 있습니다.

void

OnDeinit

const int reason

Expert Advisor 및 지표

Deinit 이벤트 핸들러.

void

OnStart

none

스크립트 및 서비스

Start 이벤트 핸들러.

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 &TickVolume[],

const long &Volume[],

const int &Spread[]

지표

모든 가격에 대한 이벤트 핸들러를 계산.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

지표

계산: 단순 데이터 배열에서 이벤트 핸들러를.

지표에는 두 개의 이벤트 핸들러를 동시에 가질 수 없습니다.

이 경우 유일한 이벤트 핸들러를 데이터 배열로 사용할 것입니다.

void

OnTick

none

Expert Advisor

NewTick 이벤트 핸들러. 새 틱 수신 이벤트가 처리되는 동안 이 유형의 다른 이벤트는 수신되지 않습니다.

void

OnTimer

none

Expert Advisor 및 지표

타이머 이벤트 핸들러.

void

OnTrade

none

Expert Advisor

트레이드 이벤트 핸들러.

double

OnTester

none

Expert Advisor

테스터 이벤트 핸들러.

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

Expert Advisor 및 지표

ChartEvent 이벤트 핸들러.

void

OnBookEvent

const string &symbol_name

Expert Advisor 및 지표

BookEvent 이벤트 핸들러.

클라이언트 터미널은 해당하는 오픈 차트에 새 이벤트를 보냅니다. 차트(chart events) 또는 mql5-programs (커스텀 이벤트)에서 이벤트를 생성할 수도 있습니다. CHART_EVENT_OBJECT_CREATECHART_EVENT_OBJECT_DELETE 차트 속성을 설정하여 차트에 그래픽 개체를 생성 또는 삭제하는 이벤트를 생성하거나 생성할 수 있습니다. 각 MQL5 프로그램과 각 차트에는 모든 새 수신 이벤트가 추가되는 고유한 이벤트 대기열이 있습니다.

프로그램은 실행되는 차트에서만 이벤트를 수신합니다. 모든 이벤트가 수신되는 순서대로 차례로 처리됩니다. 대기열에 이미 NewTick 이벤트가 있거나 이 이벤트가 현재 처리 중인 경우 새 NewTick 이벤트가 MQL5 프로그램의 대기열에 배치되지 않습니다. 마찬가지로, ChartEvent가 이미 대기열에 있거나 이 이벤트가 처리 중인 경우 이러한 종류의 새 이벤트는 대기열에 포함되지 않습니다. 타이머 이벤트는 동일한 방식으로 처리됩니다. Timer 이벤트가 대기열에 있거나 처리 중인 경우 새 타이머 이벤트가 대기열에 있지 않습니다.

이벤트 대기열의 크기는 제한적이지만 충분하므로 제대로 작성된 프로그램을 위한 대기열 오버플로가 발생하지 않습니다. 대기열 오버플로의 경우 새 이벤트가 대기열 없이 삭제됩니다.

이벤트를 처리하기 위해 무한 루프를 사용하지 않는 것이 좋습니다. 단일 Start 이벤트를 처리하는 스크립트 및 서비스가 예외일 수 있습니다.

Libraries는 어떤 이벤트도 처리하지 않습니다.

 

지표 및 Expert Advisor에서 금지되는 함수

지표, 스크립트 및 Expert Advisor는 MQL5로 작성된 실행 가능한 프로그램입니다. 그것들은 다양한 종류의 작업을 위해 설계되었습니다. 따라서 프로그램 종류에 따라 특정 기능의 사용에 대한 몇 가지 제한이 있습니다. 지표에서는 다음 기능이 금지됩니다:

 

지표용으로 설계된 모든 함수는 Expert Advisor 및 스크립트에서 금지됩니다:

라이브러리는 독립적인 프로그램이 아니며 스크립트, 지표 또는 Expert Advisor라고 부르는 MQL5 프로그램의 컨텍스트에서 실행됩니다. 따라서 위의 제한 사항은 호출된 라이브러리에 적용됩니다.

 

서비스에서 금지된 함수

서비스는 어떤 이벤트도 차트에 바인딩되어 있지 않으므로 수락하지 않습니다. 서비스에서는 다음 기능을 사용할 수 없습니다:

ExpertRemove();

EventSetMillisecondTimer();

EventSetTimer();

EventKillTimer();

SetIndexBuffer();

IndicatorSetDouble();

IndicatorSetInteger();

IndicatorSetString();

PlotIndexSetDouble();

PlotIndexSetInteger();

PlotIndexSetString();

PlotIndexGetInteger();

 

지표의 로딩 및 언로딩

지표는 다음과 같은 경우에 로드됩니다:

  • 지표가 차트에 첨부됨;
  • 터미널 시작(터미널 정지 전에 지표가 차트에 부착된 경우);
  • 템플릿 로드(차트에 첨부된 지표가 템플릿에 지정된 경우);
  • 프로필 변경(지표가 프로필 차트 중 하나에 연결된 경우);
  • 지표가 첨부된 차트의 심볼 및/또는 타임프레임 변경;
  • 터미널이 연결된 계정의 변경;
  • 지표의 재작성에 성공한 이후(지표가 차트에 부착된 경우);
  • 지표의 입력 파라미터 변경.

 

다음과 같은 경우 지표가 언로드됩니다:

  • 차트에서 지표를 분리할 때;
  • 터미널 정지(지표가 차트에 첨부된 경우);
  • 템플릿 로드(지표가 차트에 연결된 경우);
  • 지표가 첨부된 차트의 마감;
  • 프로필 변경(지표가 변경된 프로필의 차트 중 하나에 연결된 경우);
  • 지표가 첨부된 차트의 심볼 및/또는 타임프레임 변경;
  • 터미널이 연결된 계정의 변경;

 

Expert Advisor의 로딩 및 언로딩

Expert Advisor는 다음과 같은 경우에 로드됩니다:

  • 차트에 Expert Advisor를 첨부할 때;
  • 터미널 시작(터미널 종료 전에 Expert Advisor가 차트에 첨부된 경우);
  • 템플릿 로드(차트에 첨부된 Expert Advisor가 템플릿에 지정된 경우);
  • 프로파일 변경(Expert Advisor가 프로파일 차트 중 하나에 연결된 경우);
  • 계정 번호가 동일한 경우임에도 계정에 대한 연결(서버의 터미널 승인 전에 Expert Advisor를 차트에 첨부한 경우).
     

다음과 같은 경우 Expert Advisors는 언로드됩니다:

  • 차트에서 Expert Advisor를 분리할 때;
  • 차트에 새 Expert Advisor가 첨부되었는데 다른 Expert Advisor가 이미 첨부되어 있는 경우, 해당 Expert Advisor는 언로드됩니다.
  • 터미널 종료(Expert Advisor를 차트에 첨부한 경우);
  • 템플릿 로드(Expert Advisor가 차트에 첨부된 경우);
  • Expert Advisor가 첨부된 차트 마감.
  • 프로필 변경(Expert Advisor가 변경된 프로필의 차트 중 하나에 첨부된 경우);
  • 터미널이 연결된 계정의 변경(서버의 터미널 승인 전에 Expert Advisor를 차트에 첨부한 경우);

Expert Advisor가 연결된 차트의 심볼이나 타임프레임이 변경되는 경우 Expert Advisor는 로드되거나 언로드되지 않습니다. 이 경우 클라이언트 터미널은 이후 이전 심볼/타임프레임에서 OnDeinit() 핸들러를 호출하고 새 심볼/타임프레임에서 OnInit()를 호출하며, 글로벌 변수와 정적 변수의 값은 재설정되지 않습니다. 초기화가 완료되기 전에 Expert Advisor에 수신된 모든 이벤트 (OnInit() 함수)는 건너뜁니다.

 

스크립트의 로딩 및 언로딩

스크립트는 차트에 연결된 후 즉시 로드되고 작업을 완료한 후 즉시 언로드됩니다. OnInit() 및 OnDeinit()는 스크립트에서는 호출되지 않습니다.

프로그램이 언로드되면(차트에서 삭제됨) 클라이언트 터미널은 글로벌 변수의 초기화를 수행하고 이벤트 대기열을 삭제합니다. 이 경우 초기화 해제는 모든 string-유형 변수의 재설정, 동적 배열 객체의 할당 해제 및 소멸자 호출을 의미합니다.

 

서비스의 로딩 및 언로딩

터미널 종료 시점에 서비스를 시작한 경우 터미널 시작 후 바로 서비스가 로드됩니다. 서비스는 작업을 마친 후 즉시 언로드됩니다.

서비스에는 네트워크 기능을 사용해 커스텀 심볼을 만들고 업데이트하는 등 데이터 수신 및 처리 루프를 무한대로 구현할 수 있는 단일 OnStart() 핸들러가 있습니다.

지표와 스크립트, Expert Advisor와는 달리 서비스는 특정 차트에 구속되지 않으므로 서비스를 시작할 수 있는 별도의 메커니즘이 제공됩니다. 새 서비스 인스턴스는 "서비스 추가" 명령을 사용하여 네비게이터에 작성됩니다. 적절한 인스턴스 메뉴를 사용하여 서비스 인스턴스를 시작, 중지 및 제거할 수 있습니다. 모든 인스턴스를 관리하기 위해 서비스 메뉴를 사용하십시오.

 

Expert Advisor 작업에 대한 이해를 높이기 위해 다음 Expert Advisor의 코드를 컴파일하고 로드/언로드, 템플릿 변경, 심볼 변경, 타임프레임 변경 등의 작업을 수행하는 것이 좋습니다.

예:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass constructor"); }
   ~CTestClass() { Print("CTestClass destructor"); }
  };
CTestClass global;
//+------------------------------------------------------------------+
//| Expert 초기화 함수                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Initialization");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert 초기화 취소 함수                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("근거와 함께 초기화 취소",reason);
  }
//+------------------------------------------------------------------+
//| Expert 틱 함수                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+

참고 항목

Client terminal events, Event handlers