Tô màu biểu đồ theo từng mục
Ngoài các kiểu vẽ tiêu chuẩn được liệt kê trước đó trong ENUM_DRAW_TYPE
, nền tảng cung cấp các biến thể của chúng với khả năng tô màu riêng lẻ cho các giá trị trên mỗi thanh. Để thực hiện điều này, một bộ đệm chỉ báo bổ sung được sử dụng, trong đó lưu trữ các số màu. Các số này tham chiếu đến các phần tử trong một mảng đặc biệt chứa tập hợp các màu do lập trình viên định nghĩa. Số lượng màu tối đa là 64.
Bảng sau liệt kê các phần tử ENUM_DRAW_TYPE
hỗ trợ màu và số lượng bộ đệm cần thiết để vẽ chúng, bao gồm 1 bộ đệm chứa các chỉ số màu.
Kiểu hiển thị | Mô tả | Số lượng bộ đệm |
---|---|---|
DRAW_COLOR_LINE | Đường đa màu | 1+1 |
DRAW_COLOR_SECTION | Các đoạn đa màu | 1+1 |
DRAW_COLOR_ARROW | Mũi tên đa màu | 1+1 |
DRAW_COLOR_HISTOGRAM | Biểu đồ cột đa màu từ đường zero | 1+1 |
DRAW_COLOR_HISTOGRAM2 | Biểu đồ cột đa màu giữa các giá trị cặp của hai bộ đệm chỉ báo | 2+1 |
DRAW_COLOR_ZIGZAG | ZigZag đa màu | 2+1 |
DRAW_COLOR_BARS | Thanh đa màu | 4+1 |
DRAW_COLOR_CANDLES | Nến đa màu | 4+1 |
Khi liên kết bộ đệm với biểu đồ, hãy nhớ rằng một bộ đệm màu bổ sung phải được chỉ định trong tham số đầu tiên của SetIndexBuffer
với số ngay sau các bộ đệm dữ liệu. Ví dụ, để tô màu một đường sử dụng một bộ đệm dữ liệu và một bộ đệm màu, dữ liệu được đánh số 0 và màu của nó được đánh số 1:
double ColorLineData[];
double ColorLineColors[];
void OnInit()
{
SetIndexBuffer(0, ColorLineData, INDICATOR_DATA);
SetIndexBuffer(1, ColorLineColors, INDICATOR_COLOR_INDEX);
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_LINE);
...
}
2
3
4
5
6
7
8
9
10
Tập hợp màu ban đầu trong bảng màu cho biểu đồ N có thể được chỉ định bằng chỉ thị #property indicator_colorN
. Nó chỉ định các màu cần thiết, phân tách bằng dấu phẩy dưới dạng hằng số tên hoặc ký tự màu. Ví dụ, mục sau trong chỉ báo sẽ chọn 6 màu tiêu chuẩn để tô màu biểu đồ thứ 0 (đánh số bắt đầu từ 1 trong các chỉ thị):
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan
Tiếp theo trong chương trình, bạn không nên chỉ định chính màu sẽ hiển thị cấu trúc đồ họa, mà chỉ chỉ số của nó. Việc đánh số trong bảng màu được thực hiện như trong một mảng thông thường, bắt đầu từ 0. Vì vậy, nếu bạn cần đặt màu xanh lá cây cho thanh thứ i, chỉ cần đặt chỉ số của màu xanh lá cây từ bảng màu vào bộ đệm màu, tức là 2 trong trường hợp này.
ColorLineColors[i]=2; // tham chiếu đến phần tử với màu clrGreen
Tập hợp màu để tô màu không được cố định một lần và mãi mãi, nó có thể được thay đổi động bằng hàm PlotIndexSetInteger(index, PLOT_LINE_COLOR, color)
.
Ví dụ, để thay thế màu clrGreen
trong bảng màu trên bằng clrGray
, sử dụng lệnh gọi sau:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrGray);
Hãy áp dụng tô màu vào chỉ báo WPR của chúng ta. Tệp mới là IndColorWPR.mq5
. Các thay đổi liên quan đến các lĩnh vực sau.
Số lượng bộ đệm đã được tăng thêm 1. Ba màu thay vì một.
#property indicator_buffers 2
#property indicator_plots 1
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrDodgerBlue,clrGreen,clrRed
2
3
4
Thêm một mảng mới dưới bộ đệm màu và đăng ký nó trong OnInit
.
double WPRColors[];
void OnInit()
{
...
SetIndexBuffer(1, WPRColors, INDICATOR_COLOR_INDEX);
...
}
2
3
4
5
6
7
8
Nếu bạn không đặt kiểu bộ đệm INDICATOR_COLOR_INDEX
(tức là với lệnh gọi SetIndexBuffer(1, WPRColors)
nó sẽ được coi là INDICATOR_DATA
theo mặc định), nó sẽ trở nên hiển thị trong Data Window
.
Trong hàm OnCalculate
, bên trong vòng lặp làm việc, hãy thêm tô màu dựa trên phân tích giá trị của thanh thứ i. Theo mặc định, chúng ta sử dụng màu với chỉ số 0, tức là màu clrDodgerBlue
trước đây. Nếu giá trị chỉ báo di chuyển vào vùng trên, chúng được tô sáng bằng màu 2 (clrRed
), và nếu chúng vào vùng dưới, chúng được tô màu bằng 1 (clrGreen
).
int OnCalculate(ON_CALCULATE_STD_FULL_PARAM_LIST)
{
...
for(int i = fmax(prev_calculated - 1, WPRPeriod - 1);
i < rates_total && !IsStopped(); i++)
{
...
WPRColors[i] = 0;
if(WPRBuffer[i] > -20) WPRColors[i] = 2;
else if(WPRBuffer[i] < -80) WPRColors[i] = 1;
}
return rates_total;
}
2
3
4
5
6
7
8
9
10
11
12
13
Đây là cách nó trông trên màn hình.
Chỉ báo WPR với các vùng quá mua và quá bán được tô màu
Lưu ý rằng đoạn đường được sơn màu thay thế nếu điểm cuối của nó (thanh) nằm trong vùng trên hoặc dưới. Trong trường hợp này, giá trị trước đó có thể nằm trong vùng trung tâm, điều này có thể tạo ấn tượng rằng màu không đúng. Tuy nhiên, đây là hành vi chính xác, phù hợp với cách triển khai hiện tại và cách nền tảng sử dụng màu.
Màu của đoạn biểu đồ đường DRAW_COLOR_LINE
giữa hai thanh liền kề được xác định bởi màu của thanh bên phải (gần đây hơn).
Nếu bạn muốn chỉ tô màu những đoạn mà cả hai thanh liền kề đều nằm trong cùng một vùng, hãy sửa đổi mã thành như sau:
WPRColors[i] = 0;
if(WPRBuffer[i] > -20 && WPRBuffer[i - 1] > -20) WPRColors[i] = 2;
else if(WPRBuffer[i] < -80 && WPRBuffer[i - 1] < -80) WPRColors[i] = 1;
2
3
Ngoài ra, hãy nhớ rằng chúng ta đã thêm vào mã nguồn việc thiết lập tiêu đề và độ chính xác của biểu diễn giá trị (2 ký tự). So sánh hình ảnh mới với hình ảnh cũ sẽ cho phép bạn nhận thấy những khác biệt trực quan này. Đặc biệt, tiêu đề giờ đây trông như "%R(14)"
, và thang giá trị dọc gọn gàng hơn nhiều.
Khía cạnh cuối cùng mà chúng ta sẽ thay đổi trong chỉ báo IndColorWPR.mq5
là bỏ qua việc vẽ trên các thanh ban đầu.