Cuộn biểu đồ dọc theo trục thời gian
Người dùng MetaTrader 5 quen thuộc với bảng điều hướng nhanh của biểu đồ, mở ra bằng cách nhấp đúp vào góc trái của dòng thời gian hoặc nhấn phím Space
hoặc Input
. Khả năng tương tự cũng có thể thực hiện bằng lập trình bằng cách sử dụng hàm ChartNavigate
.
bool ChartNavigate(long chartId, ENUM_CHART_POSITION position, int shift = 0)
Hàm này dịch chuyển biểu đồ chartId
theo số lượng thanh được chỉ định so với vị trí biểu đồ được xác định trước, được chỉ định bởi tham số position
. Nó thuộc kiểu liệt kê ENUM_CHART_POSITION
với các phần tử sau.
Định danh | Mô tả |
---|---|
CHART_BEGIN | Đầu biểu đồ (giá cũ nhất) |
CHART_CURRENT_POS | Vị trí hiện tại |
CHART_END | Cuối biểu đồ (giá mới nhất) |
Tham số shift
đặt số lượng thanh mà biểu đồ cần được dịch chuyển. Giá trị dương dịch chuyển biểu đồ sang phải (về phía cuối), và giá trị âm dịch chuyển biểu đồ sang trái (về phía đầu).
Hàm trả về true
nếu thành công hoặc false
nếu có lỗi.
Để kiểm tra hàm, chúng ta sẽ tạo một script đơn giản ChartNavigate.mq5
. Với sự trợ giúp của các biến đầu vào, người dùng có thể chọn điểm bắt đầu và độ dịch chuyển tính bằng thanh.
#property script_show_inputs
input ENUM_CHART_POSITION Position = CHART_CURRENT_POS;
input int Shift = 0;
void OnStart()
{
ChartSetInteger(0, CHART_AUTOSCROLL, false);
const int start = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);
ChartNavigate(0, Position, Shift);
const int stop = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);
Print("Moved by: ", stop - start, ", from ", start, " to ", stop);
}
2
3
4
5
6
7
8
9
10
11
12
13
Nhật ký hiển thị số của thanh đầu tiên hiển thị trước và sau khi di chuyển.
Một ví dụ thực tế hơn sẽ là script ChartSynchro.mq5
, cho phép cuộn đồng bộ qua tất cả các biểu đồ mà nó đang chạy, phản hồi lại việc người dùng cuộn thủ công qua một trong các biểu đồ. Do đó, bạn có thể đồng bộ hóa các cửa sổ của các khung thời gian khác nhau của cùng một công cụ hoặc phân tích các chuyển động giá song song trên các công cụ khác nhau.
void OnStart()
{
datetime bar = 0; // vị trí hiện tại (thời gian của thanh đầu tiên hiển thị)
const string namePosition = __FILE__; // tên biến toàn cục
ChartSetInteger(0, CHART_AUTOSCROLL, false); // tắt cuộn tự động
while(!IsStopped())
{
const bool active = ChartGetInteger(0, CHART_BRING_TO_TOP);
const int move = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);
// biểu đồ hoạt động là dẫn đầu, còn lại là phụ
if(active)
{
const datetime first = iTime(_Symbol, _Period, move);
if(first != bar)
{
// nếu vị trí thay đổi, lưu vào biến toàn cục
bar = first;
GlobalVariableSet(namePosition, bar);
Comment("Chart ", ChartID(), " scrolled to ", bar);
}
}
else
{
const datetime b = (datetime)GlobalVariableGet(namePosition);
if(b != bar)
{
// nếu giá trị biến toàn cục thay đổi, điều chỉnh vị trí
bar = b;
const int difference = move - iBarShift(_Symbol, _Period, bar);
ChartNavigate(0, CHART_CURRENT_POS, difference);
Comment("Chart ", ChartID(), " forced to ", bar);
}
}
Sleep(250);
}
Comment("");
}
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
Việc căn chỉnh được thực hiện theo ngày và giờ của thanh đầu tiên hiển thị (CHART_FIRST_VISIBLE_BAR
). Script trong vòng lặp kiểm tra giá trị này và, nếu nó hoạt động trên biểu đồ đang hoạt động, ghi nó vào biến toàn cục. Các script trên các biểu đồ khác đọc biến này và điều chỉnh vị trí của chúng tương ứng với ChartNavigate
. Các tham số chỉ định chuyển động tương đối của biểu đồ (CHART_CURRENT_POS
), và số lượng thanh cần di chuyển được định nghĩa là sự khác biệt giữa số hiện tại của thanh đầu tiên hiển thị và số đọc từ biến toàn cục.
Hình ảnh sau cho thấy kết quả của việc đồng bộ hóa biểu đồ H1 và M15 cho EURUSD.
Ví dụ về script đồng bộ hóa vị trí biểu đồ
Sau khi chúng ta làm quen với hệ thống sự kiện trên biểu đồ, chúng ta sẽ chuyển đổi script này thành một chỉ báo và loại bỏ vòng lặp vô hạn.