Sự kiện chính của Cố vấn Chuyên gia: OnTick
Sự kiện OnTick
được thiết bị đầu cuối tạo ra cho Cố vấn Chuyên gia khi một tick mới xuất hiện chứa giá của ký hiệu làm việc trên biểu đồ hiện tại mà Cố vấn Chuyên gia đang chạy. Để xử lý sự kiện này, hàm OnTick
phải được định nghĩa trong mã của Cố vấn Chuyên gia. Nó có nguyên mẫu sau.
void OnTick(void)
Như bạn thấy, hàm này không có tham số. Nếu cần, giá trị của giá mới và các đặc điểm tick khác nên được yêu cầu bằng cách gọi SymbolInfoTick
.
Từ góc độ phản ứng với sự kiện tick mới, trình xử lý này tương tự như OnCalculate
trong các chỉ báo. Tuy nhiên, OnCalculate
chỉ có thể được định nghĩa trong các chỉ báo, còn OnTick
chỉ trong Cố vấn Chuyên gia (nói chính xác hơn, hàm OnTick
trong mã của chỉ báo, tập lệnh hoặc dịch vụ sẽ bị bỏ qua).
Đồng thời, Cố vấn Chuyên gia không nhất thiết phải chứa trình xử lý OnTick
. Ngoài sự kiện này, Cố vấn Chuyên gia có thể xử lý các sự kiện OnTimer
, OnBookEvent
và OnChartEvent
và thực hiện tất cả các hoạt động giao dịch cần thiết từ chúng.
Tất cả các sự kiện trong Cố vấn Chuyên gia được xử lý lần lượt theo thứ tự đến, vì Cố vấn Chuyên gia, giống như tất cả các chương trình MQL khác, là đơn luồng. Nếu đã có một sự kiện OnTick
trong hàng đợi hoặc sự kiện đó đang được xử lý, thì các sự kiện OnTick
mới sẽ không được xếp hàng.
Một sự kiện OnTick
được tạo ra bất kể giao dịch tự động bị vô hiệu hóa hay bật (nút Algo trading
trong giao diện thiết bị đầu cuối). Giao dịch tự động bị vô hiệu hóa chỉ có nghĩa là hạn chế gửi yêu cầu giao dịch từ Cố vấn Chuyên gia nhưng không ngăn Cố vấn Chuyên gia chạy.
Cần nhớ rằng các sự kiện tick chỉ được tạo ra cho một ký hiệu, đó là ký hiệu của biểu đồ hiện tại. Nếu Cố vấn Chuyên gia là đa tiền tệ, thì việc lấy tick từ các ký hiệu khác nên được tổ chức theo cách thay thế, ví dụ, sử dụng chỉ báo gián điệp EventTickSpy.mq5
hoặc đăng ký các sự kiện sổ lệnh thị trường, như trong MarketBookQuasiTicks.mq5
.
Ví dụ đơn giản, hãy xem xét Cố vấn Chuyên gia ExpertEvents.mq5
. Nó định nghĩa các trình xử lý cho tất cả các sự kiện thường được sử dụng để khởi chạy các thuật toán giao dịch. Chúng ta sẽ nghiên cứu một số sự kiện khác (OnTrade
, OnTradeTransaction
, cũng như các sự kiện kiểm tra) sau này.
Tất cả các trình xử lý gọi hàm trợ giúp display
, hàm này xuất thời gian hiện tại (nhãn bộ đếm hệ thống tính bằng mili giây) và tên trình xử lý trong một bình luận nhiều dòng.
#define N_LINES 25
#include <MQL5Book/Comments.mqh>
void Display(const string message)
{
ChronoComment((string)GetTickCount() + ": " + message);
}
2
3
4
5
6
7
Sự kiện OnTick
sẽ được gọi tự động khi có tick mới đến. Đối với các sự kiện bộ đếm thời gian và sổ lệnh, bạn cần kích hoạt các trình xử lý tương ứng bằng cách sử dụng các lệnh gọi EventSetTimer
và MarketBookAdd
từ OnInit
.
void OnInit()
{
Print(__FUNCTION__);
EventSetTimer(2);
if(!MarketBookAdd(_Symbol))
{
Print("MarketBookAdd failed:", _LastError);
}
}
void OnTick()
{
Display(__FUNCTION__);
}
void OnTimer()
{
Display(__FUNCTION__);
}
void OnBookEvent(const string &symbol)
{
if(symbol == _Symbol) // chỉ phản ứng với sổ lệnh của ký hiệu "của chúng ta"
{
Display(__FUNCTION__);
}
}
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
Sự kiện thay đổi biểu đồ cũng có sẵn: nó có thể được sử dụng để giao dịch dựa trên đánh dấu bằng các đối tượng đồ họa, bằng cách nhấn nút hoặc phím nóng, cũng như khi nhận được các sự kiện tùy chỉnh từ các chương trình khác, ví dụ, các chỉ báo như EventTickSpy.mq5
.
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
Display(__FUNCTION__);
}
void OnDeinit(const int)
{
Print(__FUNCTION__);
MarketBookRelease(_Symbol);
Comment("");
}
2
3
4
5
6
7
8
9
10
11
Ảnh chụp màn hình sau đây cho thấy kết quả hoạt động của Cố vấn Chuyên gia trên biểu đồ.
Bình luận với các sự kiện thuộc nhiều loại khác nhau trong Cố vấn Chuyên gia
Lưu ý rằng sự kiện OnBookEvent
(nếu được phát cho một ký hiệu) đến thường xuyên hơn OnTick
.