Cài đặt biểu đồ: PlotIndexSetInteger
API MQL5 cung cấp các hàm sau để cấu hình biểu đồ: PlotIndexSetInteger
, PlotIndexSetDouble
, và PlotIndexSetString
. Các thuộc tính kiểu số nguyên cũng có thể được đọc qua PlotIndexGetInteger
. Chúng ta chủ yếu quan tâm đến các thuộc tính kiểu số nguyên.
Hàm PlotIndexSetInteger
có hai dạng. Chúng ta sẽ thấy sự khác biệt của chúng sau một chút.
bool PlotIndexSetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int value)
bool PlotIndexSetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int modifier, int value)
Hàm này đặt giá trị của thuộc tính của một biểu đồ đồ họa tại index
được chỉ định. Giá trị của index
phải nằm trong khoảng từ 0 đến P - 1, trong đó P là số lượng biểu đồ được chỉ định bởi chỉ thị #property indicator_plots
. Thuộc tính được xác định bởi tham số property
: các giá trị cho phép nên được lấy từ liệt kê ENUM_PLOT_PROPERTY_INTEGER (xem bên dưới). Giá trị của thuộc tính được truyền trong tham số value
.
Dạng thứ hai của hàm được sử dụng cho các thuộc tính áp dụng cho nhiều thành phần (thuộc cùng một thuộc tính). Cụ thể, đối với một số loại biểu đồ, có thể gán một tập hợp màu thay vì một màu duy nhất. Trong trường hợp này, bạn có thể sử dụng tham số modifier
để thay đổi bất kỳ màu nào trong tập hợp này.
Khi thành công, hàm trả về true
; nếu không, trả về false
.
Bảng sau cung cấp các thuộc tính ENUM_PLOT_PROPERTY_INTEGER có sẵn.
Định danh | Mô tả | Kiểu thuộc tính |
---|---|---|
PLOT_ARROW | Mã mũi tên từ phông Wingdings cho biểu đồ DRAW_ARROW | uchar |
PLOT_ARROW_SHIFT | Độ lệch dọc của mũi tên cho biểu đồ DRAW_ARROW | int |
PLOT_DRAW_BEGIN | Chỉ số của thanh đầu tiên (từ trái sang phải) nơi dữ liệu bắt đầu | int |
PLOT_DRAW_TYPE | Kiểu biểu đồ (plot) | ENUM_DRAW_TYPE |
PLOT_SHOW_DATA | Cờ để hiển thị giá trị biểu đồ trong Data window (true — hiển thị, false — không hiển thị) | bool |
PLOT_SHIFT | Dịch chuyển đồ họa chỉ báo dọc theo trục thời gian tính bằng thanh (dương sang phải, âm sang trái) | int |
PLOT_LINE_STYLE | Kiểu vẽ đường | ENUM_LINE_STYLE |
PLOT_LINE_WIDTH | Độ dày đường tính bằng pixel (1 - 5) | int |
PLOT_COLOR_INDEXES | Số lượng màu (1 - 64) | int |
PLOT_LINE_COLOR | Màu hiển thị | color (modifier — số màu) |
Dần dần chúng ta sẽ tìm hiểu tất cả các thuộc tính, nhưng hiện tại, chúng ta sẽ tập trung vào ba thuộc tính chính: PLOT_DRAW_TYPE, PLOT_LINE_STYLE, và PLOT_LINE_COLOR.
Các chỉ báo trong MetaTrader 5 hỗ trợ một số kiểu vẽ được định nghĩa trước. Chúng xác định cách hiển thị trực quan và cấu trúc cần thiết của các bộ đệm với dữ liệu ban đầu để hiển thị.
Tổng cộng có 10 kiểu biểu đồ cơ bản như vậy, và ở cấp độ MQL5, chúng được mô tả bằng các định danh trong liệt kê ENUM_DRAW_TYPE. Thuộc tính PLOT_DRAW_TYPE nên được gán một trong các giá trị ENUM_DRAW_TYPE.
Kiểu hiển thị, ví dụ | Mô tả | Số lượng bộ đệm |
---|---|---|
DRAW_NONEIndDeltaVolume.mq5 | Không hiển thị gì trên biểu đồ, nhưng giá trị của bộ đệm tương ứng có sẵn trong Data Window | 1 |
DRAW_LINEIndLabelHighLowClose.mq5 , IndWPR.mq5 , IndUnityPercent.mq5 | Đường cong theo giá trị bộ đệm (các phần tử "rỗng" tạo ra khoảng trống trong đường) | 1 |
DRAW_SECTION | Các đoạn thẳng tạo thành đa tuyến giữa các phần tử "không rỗng" của bộ đệm (nếu không có khoảng trống, tương tự DRAW_LINE) | 1 |
DRAW_ARROWIndReplica3.mq5 , IndFractals.mq5 | Ký tự (nhãn) | 1 |
DRAW_HISTOGRAMIndDeltaVolume.mq5 | Biểu đồ cột từ đường zero đến giá trị bộ đệm | 1 |
DRAW_HISTOGRAM2IndLabelHighLowClose.mq5 | Biểu đồ cột giữa các giá trị của các phần tử đôi từ hai bộ đệm chỉ báo | 2 |
DRAW_ZIGZAGIndFractalsZigZag.mq5 | Các đoạn thẳng tạo thành đa tuyến giữa các phần tử "không rỗng" liên tiếp của hai bộ đệm (tương tự DRAW_SECTION, nhưng cho phép đoạn dọc trên một thanh) | 2 |
DRAW_FILLING | Tô màu kênh giữa hai đường bằng giá trị đôi trong hai bộ đệm | 2 |
DRAW_BARSIndSubChartSimple.mq5 | Hiển thị dạng thanh: bốn giá mỗi thanh được hiển thị trong bốn bộ đệm liền kề, theo thứ tự OHLC | 4 |
DRAW_CANDLESIndSubChartSimple.mq5 | Hiển thị nến: bốn giá mỗi thanh được hiển thị trong bốn bộ đệm liền kề, theo thứ tự OHLC | 4 |
Bảng này không liệt kê tất cả các phần tử ENUM_DRAW_TYPE. Có các phiên bản tương tự của cùng các biểu đồ với hỗ trợ tô màu từng phần tử (thanh). Chúng ta sẽ trình bày chúng trong một phần riêng Tô màu từng phần tử của biểu đồ. Tài liệu MQL5 cung cấp ví dụ cho tất cả các loại, và trong phạm vi cuốn sách này, có một số ngoại lệ: sự hiện diện của các chỉ báo demo được chỉ ra bên cạnh tên loại.
Trong mọi trường hợp, bao gồm cả DRAW_NONE, dữ liệu từ bộ đệm có sẵn trong các chương trình khác thông qua hàm CopyBuffer
.
Một tính năng bổ sung của kiểu DRAW_NONE là các giá trị của bộ đệm như vậy không tham gia vào việc tự động co giãn biểu đồ, được bật mặc định cho các chỉ báo hiển thị trong cửa sổ phụ.
Kiểu đường được xác định bởi thuộc tính PLOT_LINE_STYLE, cũng có một liệt kê với các giá trị ENUM_LINE_STYLE hợp lệ.
Định danh | Mô tả |
---|---|
STYLE_SOLID | Đường liền |
STYLE_DASH | Đường gạch |
STYLE_DOT | Đường chấm |
STYLE_DASHDOT | Đường chấm gạch |
STYLE_DASHDOTDOT | Gạch-hai chấm |
Cuối cùng, màu của đường được đặt bởi thuộc tính PLOT_LINE_COLOR. Trong trường hợp đơn giản nhất, thuộc tính này chứa một màu duy nhất cho toàn bộ biểu đồ. Đối với một số loại biểu đồ, đặc biệt là DRAW_CANDLES, bạn có thể chỉ định nhiều màu bằng tham số modifier. Chúng ta sẽ thảo luận điều này sau (xem ví dụ IndSubChartSimple.mq5
trong phần Chỉ báo đa tiền tệ và đa khung thời gian).
Ba thuộc tính trên đủ để thể hiện chỉ báo IndReplica2.mq5
. Hãy thêm hai tham số đầu vào DrawType
và LineStyle
lần lượt thuộc kiểu ENUM_DRAW_TYPE và ENUM_LINE_STYLE, sau đó gọi hàm PlotIndexSetInteger
nhiều lần trong OnInit
để đặt các thuộc tính hiển thị của chỉ báo.
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
input ENUM_DRAW_TYPE DrawType = DRAW_LINE;
input ENUM_LINE_STYLE LineStyle = STYLE_SOLID;
double buffer[];
int OnInit()
{
// đăng ký một mảng làm bộ đệm chỉ báo
SetIndexBuffer(0, buffer);
// đặt các thuộc tính của biểu đồ số 0
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DrawType);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, LineStyle);
PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrBlue);
return INIT_SUCCEEDED;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Đối với thuộc tính PLOT_LINE_COLOR, chúng ta không tạo biến đầu vào, vì thuộc tính này và một số thuộc tính khác có thể truy cập trực tiếp từ hộp thoại thuộc tính của bất kỳ chỉ báo nào, trong tab Colors
. Theo mặc định, tức là ngay sau khi chỉ báo được khởi chạy, màu đường sẽ là xanh lam. Nhưng màu sắc, cũng như độ dày và kiểu đường, có thể được thay đổi trong hộp thoại (trên tab được chỉ định). Tham số LineStyle
của chúng ta phần nào trùng lặp với ô Style
tương ứng trong bảng Colors
. Tuy nhiên, nó mang lại lợi thế bổ sung. Các điều khiển tiêu chuẩn của hộp thoại không cho phép bạn chọn kiểu khi độ rộng đường lớn hơn 1. Khi sử dụng biến đầu vào LineStyle
, chúng ta có thể nhận được, ví dụ, một đường chấm gạch với độ rộng 3 pixel đã cho.
Việc điền dữ liệu vào bộ đệm trong OnCalculate
vẫn không thay đổi so với IndReplica1.mq5
.
Sau khi biên dịch và khởi chạy chỉ báo trên biểu đồ, chúng ta nhận được hình ảnh mong đợi: một đường màu xanh tại giá đóng trên biểu đồ, và các giá đóng tương ứng của các thanh trong Data window
.
Bằng cách thay đổi tham số đầu vào DrawType
, chúng ta có thể thay đổi cách dữ liệu từ bộ đệm được hiển thị. Trong trường hợp này, bạn chỉ nên chọn các kiểu yêu cầu một bộ đệm duy nhất. Bất kỳ kiểu đồ họa nào khác (DRAW_HISTOGRAM2, DRAW_ZIGZAG, DRAW_FILLING, DRAW_BARS, DRAW_CANDLES) đơn giản là không thể hoạt động trên một bộ đệm duy nhất và sẽ không hiển thị gì. Cũng không có ý nghĩa khi chọn các kiểu cấu trúc với tô màu (bắt đầu bằng từ "Color"), vì chúng yêu cầu một bộ đệm bổ sung với số màu trên mỗi thanh (như đã đề cập, chúng ta sẽ làm quen với khả năng này trong phần Tô màu từng phần tử của biểu đồ).
Các tùy chọn hiển thị DRAW_LINE, DRAW_SECTION, DRAW_HISTOGRAM, và DRAW_ARROW được hiển thị dưới đây.
Các kiểu biểu đồ một bộ đệm
Nếu không có các kiểu được chọn đặc biệt khác nhau, STYLE_SOLID cho DRAW_LINE và STYLE_DOT cho DRAW_SECTION, các kiểu vẽ này sẽ giống nhau, vì tất cả các phần tử trong bộ đệm của chúng ta đều có giá trị "không rỗng". Theo mặc định, giá trị "rỗng" có nghĩa là hằng số đặc biệt EMPTY_VALUE, mà chúng ta không sử dụng. Các đoạn trong DRAW_SECTION được vẽ bằng cách bỏ qua các phần tử "rỗng", và điều này chỉ trở nên rõ ràng nếu có bất kỳ phần tử nào như vậy. Chúng ta sẽ nói về việc cài đặt các phần tử "rỗng" trong phần Hiển thị khoảng trống dữ liệu.
Biểu đồ cột từ đường zero DRAW_HISTOGRAM thường được sử dụng trong các chỉ báo có cửa sổ riêng, nhưng ở đây nó được hiển thị cho mục đích trình diễn. Chúng ta sẽ tạo một chỉ báo trong cửa sổ phụ với kiểu hiển thị này trong phần Chờ dữ liệu và quản lý khả năng hiển thị (xem ví dụ IndDeltaVolume.mq5
).
Đối với kiểu DRAW_ARROW, hệ thống mặc định sử dụng ký tự hình tròn đầy (mã 159), nhưng bạn có thể thay đổi nó thành thứ khác bằng cách gọi PlotIndexSetInteger(index, PLOT_ARROW, code)
.
Mã và giao diện của các ký tự phông Wingdings có thể được tìm thấy trong Trợ giúp MQL5.
Trong một phiên bản sửa đổi khác của chỉ báo IndReplica3.mq5
, chúng ta thêm các tham số đầu vào để chọn ký tự "mũi tên" (ArrowCode
), cũng như để dịch chuyển các nhãn này trên biểu đồ theo chiều dọc (Arrow padding
) và ngang (TimeShift
).
input uchar ArrowCode = 159;
input int ArrowPadding = 0;
input int TimeShift = 0;
2
3
Dịch chuyển dọc theo thang giá được chỉ định bằng pixel (giá trị dương nghĩa là dịch xuống, giá trị âm nghĩa là dịch lên). Dịch chuyển ngang theo thang thời gian được đặt bằng thanh (giá trị dương là dịch sang phải, về tương lai, và giá trị âm là sang trái, về quá khứ). Các biến đầu vào mới được truyền vào các lệnh gọi PlotIndexSetInteger
trong OnInit
.
int OnInit()
{
...
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_ARROW);
PlotIndexSetInteger(0, PLOT_ARROW, ArrowCode);
PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, ArrowPadding);
PlotIndexSetInteger(0, PLOT_SHIFT, TimeShift);
...
}
2
3
4
5
6
7
8
9
Ảnh chụp màn hình sau đây cho thấy một ví dụ của IndReplica3.mq5
trên biểu đồ với cài đặt 117 (hình kim cương), -50 (50 điểm lên), 3 (3 thanh sang phải/phía trước).
Biểu đồ phân tán với dịch chuyển nhãn dọc và ngang
Chỉ báo mặc định của chúng ta dựa trên kiểu giá Close
(mặc dù người dùng có thể thay đổi điều này trong hộp thoại thuộc tính, trong danh sách thả xuống Apply to
). Nếu cần, bạn có thể gán một cài đặt ban đầu khác bằng chỉ thị:
#property indicator_applied_price PRICE_TYPE
Ở đây, thay vì PRICE_TYPE, bạn nên chỉ định bất kỳ hằng số nào từ liệt kê ENUM_APPLIED_PRICE. Nó cũng bao gồm PRICE_CLOSE, tương ứng với mặc định. Ví dụ, chỉ thị sau được thêm vào mã nguồn sẽ khiến chỉ báo dựa trên giá điển hình theo mặc định.
#property indicator_applied_price PRICE_TYPICAL
Một lần nữa, chúng ta lưu ý rằng cài đặt này chỉ chỉ định mặc định. Biến tích hợp _AppliedTo
cho phép bạn tìm ra kiểu giá thực tế mà chỉ báo được xây dựng dựa trên đó. Nếu chỉ báo được xây dựng theo mô tả của một chỉ báo khác, thì chỉ có thể biết được sự thật này, nhưng không phải tên của chỉ báo cụ thể cung cấp dữ liệu.
Để tìm ra trạng thái hiện tại của các thuộc tính từ liệt kê ENUM_PLOT_PROPERTY_INTEGER trong mã nguồn, hãy sử dụng hàm PlotIndexGetInteger
.
int PlotIndexGetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property)
int PlotIndexGetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int modifier)
Hàm này thường được sử dụng cùng với PlotIndexSetInteger
để sao chép các thuộc tính vẽ từ đường này sang đường khác, hoặc để đọc các thuộc tính từ các tệp mqh phổ quát được bao gồm trong mã nguồn của các chỉ báo khác nhau.
Thật không may, các hàm tương tự PlotIndexGetDouble
và PlotIndexGetString
không được cung cấp.