Chạy Chương trình
Mỗi script, mỗi dịch vụ và mỗi Expert Advisor chạy trong một luồng riêng biệt. Tất cả các chỉ báo được tính toán trên một biểu tượng, ngay cả khi chúng được gắn vào các biểu đồ khác nhau, đều hoạt động trong cùng một luồng. Do đó, tất cả các chỉ báo trên một biểu tượng chia sẻ tài nguyên của một luồng.
Tất cả các hành động khác liên quan đến một biểu tượng, như xử lý tick và đồng bộ hóa lịch sử, cũng được thực hiện nhất quán trong cùng luồng với các chỉ báo. Điều này có nghĩa là nếu một hành động vô hạn được thực hiện trong một chỉ báo, tất cả các sự kiện khác liên quan đến biểu tượng của nó sẽ không bao giờ được thực hiện.
Khi chạy một Expert Advisor, hãy đảm bảo rằng nó có môi trường giao dịch thực tế và có thể truy cập lịch sử của biểu tượng và khoảng thời gian cần thiết, đồng thời đồng bộ hóa dữ liệu giữa terminal và máy chủ. Đối với tất cả các quy trình này, terminal cung cấp độ trễ khởi động không quá 5 giây, sau đó Expert Advisor sẽ được khởi động với dữ liệu có sẵn. Do đó, trong trường hợp không có kết nối với máy chủ, điều này có thể dẫn đến sự chậm trễ trong việc khởi động Expert Advisor.
Bảng dưới đây chứa tóm tắt ngắn gọn về các chương trình MQL5:
Chương trình | Chạy | Ghi chú |
---|---|---|
Dịch vụ | Một luồng riêng, số lượng luồng cho dịch vụ bằng số lượng dịch vụ | Một dịch vụ vòng lặp không thể làm gián đoạn việc chạy của các chương trình khác |
Script | Một luồng riêng, số lượng luồng cho script bằng số lượng script | Một script vòng lặp không thể làm gián đoạn việc chạy của các chương trình khác |
Expert Advisor | Một luồng riêng, số lượng luồng cho Expert Advisor bằng số lượng Expert Advisor | Một Expert Advisor vòng lặp không thể làm gián đoạn việc chạy của các chương trình khác |
Chỉ báo | Một luồng cho tất cả các chỉ báo trên một biểu tượng. Số lượng luồng bằng số lượng biểu tượng có chỉ báo | Một vòng lặp vô hạn trong một chỉ báo sẽ dừng tất cả các chỉ báo khác trên biểu tượng này |
Ngay sau khi một chương trình được gắn vào biểu đồ, nó được tải lên bộ nhớ của terminal khách hàng, đồng thời các biến toàn cục được khởi tạo. Nếu một biến toàn cục thuộc kiểu lớp có hàm tạo, hàm tạo này sẽ được gọi trong quá trình khởi tạo biến toàn cục.
Sau đó, chương trình chờ một sự kiện từ terminal khách hàng. Mỗi chương trình MQL5 phải có ít nhất một trình xử lý sự kiện, nếu không chương trình đã tải sẽ không được thực thi. Các trình xử lý sự kiện có tên, tham số và kiểu trả về được định nghĩa trước.
Kiểu | Tên hàm | Tham số | Ứng dụng | Bình luận |
---|---|---|---|---|
int | OnInit | không có | Expert Advisors và chỉ báo | Trình xử lý sự kiện Init. Cho phép sử dụng kiểu trả về void. |
void | OnDeinit | const int reason | Expert Advisors và chỉ báo | Trình xử lý sự kiện Deinit. |
void | OnStart | không có | Script và dịch vụ | Trình xử lý sự kiện 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[] | Chỉ báo | Trình xử lý sự kiện Calculate cho tất cả giá. |
int | OnCalculate | const int rates_total , const int prev_calculated , const int begin , const double &price[] | Chỉ báo | Trình xử lý sự kiện Calculate trên mảng dữ liệu đơn. Chỉ báo không thể có hai trình xử lý sự kiện cùng lúc. Trong trường hợp này, chỉ một trình xử lý sự kiện sẽ hoạt động trên mảng dữ liệu. |
void | OnTick | không có | Expert Advisors | Trình xử lý sự kiện NewTick. Trong khi sự kiện nhận tick mới đang được xử lý, không có sự kiện loại này khác được nhận. |
void | OnTimer | không có | Expert Advisors và chỉ báo | Trình xử lý sự kiện Timer. |
void | OnTrade | không có | Expert Advisors | Trình xử lý sự kiện Trade. |
double | OnTester | không có | Expert Advisors | Trình xử lý sự kiện Tester. |
void | OnChartEvent | const int id , const long &lparam , const double &dparam , const string &sparam | Expert Advisors và chỉ báo | Trình xử lý sự kiện ChartEvent. |
void | OnBookEvent | const string &symbol_name | Expert Advisors và chỉ báo | Trình xử lý sự kiện BookEvent. |
Terminal khách hàng gửi các sự kiện mới đến các biểu đồ đang mở tương ứng. Sự kiện cũng có thể được tạo ra bởi biểu đồ (sự kiện biểu đồ) hoặc chương trình MQL5 (sự kiện tùy chỉnh). Việc tạo sự kiện về việc tạo hoặc xóa các đối tượng đồ họa trên biểu đồ có thể được bật hoặc tắt bằng cách thiết lập thuộc tính biểu đồ CHART_EVENT_OBJECT_CREATE và CHART_EVENT_OBJECT_DELETE. Mỗi chương trình MQL5 và mỗi biểu đồ có hàng đợi sự kiện riêng, nơi tất cả các sự kiện mới đến được thêm vào.
Một chương trình chỉ nhận các sự kiện từ biểu đồ mà nó chạy trên đó. Tất cả các sự kiện được xử lý lần lượt theo thứ tự nhận được. Nếu hàng đợi đã có sự kiện NewTick, hoặc sự kiện này đang được xử lý, thì sự kiện NewTick mới không được đặt vào hàng đợi của chương trình MQL5. Tương tự, nếu ChartEvent đã có trong hàng đợi, hoặc sự kiện này đang được xử lý, thì không có sự kiện mới loại này được xếp hàng. Các sự kiện hẹn giờ được xử lý theo cách tương tự – nếu sự kiện Timer đang ở trong hàng đợi hoặc đang được xử lý, sự kiện hẹn giờ mới không được xếp hàng.
Hàng đợi sự kiện có kích thước giới hạn nhưng đủ lớn, để việc tràn hàng đợi đối với các chương trình được viết tốt là khó xảy ra. Trong trường hợp hàng đợi bị tràn, các sự kiện mới sẽ bị loại bỏ mà không được xếp hàng.
Nên tránh sử dụng các vòng lặp vô hạn để xử lý sự kiện. Các ngoại lệ có thể là script và dịch vụ xử lý một sự kiện Start duy nhất.
Thư viện không xử lý bất kỳ sự kiện nào.
Các hàm bị cấm trong Chỉ báo và Expert Advisors
Chỉ báo, script và Expert Advisors là các chương trình thực thi được viết bằng MQL5. Chúng được thiết kế cho các loại nhiệm vụ khác nhau. Do đó, có một số hạn chế đối với việc sử dụng một số hàm, tùy thuộc vào loại chương trình. Các hàm sau bị cấm trong chỉ báo:
Tất cả các hàm được thiết kế cho chỉ báo đều bị cấm trong Expert Advisors và script:
- SetIndexBuffer()
- IndicatorSetDouble()
- IndicatorSetInteger()
- IndicatorSetString()
- PlotIndexSetDouble()
- PlotIndexSetInteger()
- PlotIndexSetString()
- PlotIndexGetInteger
Thư viện không phải là chương trình độc lập và được thực thi trong bối cảnh của chương trình MQL5 đã gọi nó: script, chỉ báo hoặc Expert Advisor. Do đó, các hạn chế trên áp dụng cho thư viện được gọi.
Các hàm bị cấm trong dịch vụ
Dịch vụ không chấp nhận bất kỳ sự kiện nào, vì chúng không gắn với biểu đồ. Các hàm sau bị cấm trong dịch vụ:
- ExpertRemove()
- EventSetMillisecondTimer()
- EventSetTimer()
- EventKillTimer()
- SetIndexBuffer()
- IndicatorSetDouble()
- IndicatorSetInteger()
- IndicatorSetString()
- PlotIndexSetDouble()
- PlotIndexSetInteger()
- PlotIndexSetString()
- PlotIndexGetInteger()
Tải và Gỡ bỏ Chỉ báo
Chỉ báo được tải trong các trường hợp sau:
- Một chỉ báo được gắn vào biểu đồ
- Khởi động terminal (nếu chỉ báo đã được gắn vào biểu đồ trước khi tắt terminal)
- Tải mẫu (nếu chỉ báo gắn vào biểu đồ được chỉ định trong mẫu)
- Thay đổi hồ sơ (nếu chỉ báo được gắn vào một trong các biểu đồ của hồ sơ)
- Thay đổi biểu tượng và/hoặc khung thời gian của biểu đồ mà chỉ báo được gắn vào
- Thay đổi tài khoản mà terminal được kết nối
- Sau khi biên dịch lại thành công một chỉ báo (nếu chỉ báo đã được gắn vào biểu đồ)
- Thay đổi tham số đầu vào của chỉ báo
Chỉ báo được gỡ bỏ trong các trường hợp sau:
- Khi tháo chỉ báo khỏi biểu đồ
- Tắt terminal (nếu chỉ báo đã được gắn vào biểu đồ)
- Tải mẫu (nếu một chỉ báo được gắn vào biểu đồ)
- Đóng biểu đồ mà chỉ báo được gắn vào
- Thay đổi hồ sơ (nếu chỉ báo được gắn vào một trong các biểu đồ của hồ sơ đã thay đổi)
- Thay đổi biểu tượng và/hoặc khung thời gian của biểu đồ mà chỉ báo được gắn vào
- Thay đổi tài khoản mà terminal được kết nối
- Thay đổi tham số đầu vào của chỉ báo
Tải và Gỡ bỏ Expert Advisors
Expert Advisors được tải trong các trường hợp sau:
- Khi gắn một Expert Advisor vào biểu đồ
- Khởi động terminal (nếu Expert Advisor đã được gắn vào biểu đồ trước khi tắt terminal)
- Tải mẫu (nếu Expert Advisor gắn vào biểu đồ được chỉ định trong mẫu)
- Thay đổi hồ sơ (nếu Expert Advisor được gắn vào một trong các biểu đồ của hồ sơ)
- Kết nối với một tài khoản, ngay cả khi số tài khoản giống nhau (nếu Expert Advisor đã được gắn vào biểu đồ trước khi terminal được xác thực trên máy chủ)
Expert Advisors được gỡ bỏ trong các trường hợp sau:
- Khi tháo Expert Advisor khỏi biểu đồ
- Nếu một Expert Advisor mới được gắn vào biểu đồ, trong khi một Expert Advisor khác đã được gắn, Expert Advisor này sẽ bị gỡ bỏ
- Tắt terminal (nếu Expert Advisor đã được gắn vào biểu đồ)
- Tải mẫu (nếu một Expert Advisor được gắn vào biểu đồ)
- Đóng biểu đồ mà Expert Advisor được gắn vào
- Thay đổi hồ sơ (nếu Expert Advisor được gắn vào một trong các biểu đồ của hồ sơ đã thay đổi)
- Thay đổi tài khoản mà terminal được kết nối (nếu Expert Advisor đã được gắn vào biểu đồ trước khi terminal được xác thực trên máy chủ)
- Gọi hàm ExpertRemove()
Trong trường hợp biểu tượng hoặc khung thời gian của biểu đồ mà Expert Advisor được gắn vào thay đổi, Expert Advisors không được tải hoặc gỡ bỏ. Trong trường hợp này, terminal khách hàng lần lượt gọi các trình xử lý OnDeinit() trên biểu tượng/khung thời gian cũ và OnInit() trên biểu tượng/khung thời gian mới (nếu có), giá trị của các biến toàn cục và biến tĩnh không bị đặt lại. Tất cả các sự kiện đã nhận được cho Expert Advisor trước khi quá trình khởi tạo hoàn tất (hàm OnInit()) sẽ bị bỏ qua.
Tải và Gỡ bỏ Script
Script được tải ngay sau khi chúng được gắn vào biểu đồ và được gỡ bỏ ngay sau khi hoàn thành hoạt động. OnInit()
và OnDeinit()
không được gọi cho script.
Khi một chương trình được gỡ bỏ (xóa khỏi biểu đồ), terminal khách hàng thực hiện việc hủy khởi tạo các biến toàn cục và xóa hàng đợi sự kiện. Trong trường hợp này, hủy khởi tạo có nghĩa là đặt lại tất cả các biến kiểu chuỗi, giải phóng các đối tượng mảng động và gọi các hàm hủy của chúng nếu có.
Tải và Gỡ bỏ Dịch vụ
Dịch vụ được tải ngay sau khi khởi động terminal nếu chúng đã được khởi chạy tại thời điểm terminal tắt. Dịch vụ được gỡ bỏ ngay sau khi hoàn thành công việc.
Dịch vụ có một trình xử lý OnStart()
duy nhất, trong đó bạn có thể triển khai một vòng lặp nhận và xử lý dữ liệu vô hạn, ví dụ như tạo và cập nhật các biểu tượng tùy chỉnh bằng cách sử dụng các hàm mạng.
Không giống như Expert Advisors, chỉ báo và script, dịch vụ không gắn với một biểu đồ cụ thể, do đó một cơ chế riêng được cung cấp để khởi chạy chúng. Một phiên bản dịch vụ mới được tạo trong Navigator bằng lệnh "Add Service". Một phiên bản dịch vụ có thể được khởi chạy, dừng và xóa bằng menu tương ứng của phiên bản. Để quản lý tất cả các phiên bản, sử dụng menu dịch vụ.
Để hiểu rõ hơn về hoạt động của Expert Advisor, chúng tôi khuyên bạn nên biên dịch mã của Expert Advisor sau đây và thực hiện các hành động tải/gỡ bỏ, thay đổi mẫu, thay đổi biểu tượng, thay đổi khung thời gian, v.v.:
Ví dụ:
//+------------------------------------------------------------------+
//| TestExpert.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| 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 initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("Initialization");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print("Deinitialization with reason",reason);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Xem thêm