Đọc dữ liệu từ biểu đồ có độ dịch chuyển
Chỉ báo mới của chúng ta, UseDemoAll
, gần như đã sẵn sàng. Chúng ta chỉ cần xem xét thêm một điểm nữa.
Trong chỉ báo phụ, một số biểu đồ có thể có độ dịch chuyển được thiết lập bởi thuộc tính PLOT_SHIFT. Ví dụ, với độ dịch chuyển dương, các phần tử của chuỗi thời gian được dịch chuyển vào tương lai và hiển thị bên phải của thanh có chỉ số 0. Điều kỳ lạ là các chỉ số của chúng lại là số âm. Khi di chuyển sang phải, các số này càng giảm: -1, -2, -3, v.v. Cách đánh địa chỉ này cũng ảnh hưởng đến hàm CopyBuffer
. Khi chúng ta sử dụng dạng đầu tiên của CopyBuffer
, tham số offset
được đặt là 0 sẽ tham chiếu đến phần tử có thời gian hiện tại trong chuỗi thời gian. Nhưng nếu bản thân chuỗi thời gian bị dịch chuyển sang phải, chúng ta sẽ nhận được dữ liệu bắt đầu từ phần tử được đánh số N, trong đó N là giá trị độ dịch chuyển trong chỉ báo nguồn. Đồng thời, các phần tử nằm trong bộ đệm của chúng ta bên phải chỉ số N sẽ không được điền dữ liệu, và "rác" sẽ còn lại trong đó.
Để minh họa vấn đề, hãy bắt đầu với một chỉ báo không có độ dịch chuyển: Awesome Oscillator
hoàn toàn phù hợp với yêu cầu này. Hãy nhớ rằng UseDemoAll
sao chép tất cả các giá trị vào các mảng của nó, và mặc dù chúng không hiển thị trên biểu đồ do tỷ lệ giá và chỉ số của chỉ báo khác nhau, chúng ta có thể kiểm tra thông qua Data Window
. Dù chúng ta di chuyển con trỏ chuột đến đâu trên biểu đồ, giá trị của chỉ báo trong cửa sổ phụ trong Data Window
và trong các bộ đệm của UseDemoAll
sẽ khớp nhau. Ví dụ, trong hình ảnh dưới đây, bạn có thể thấy rõ rằng trên thanh giờ tại 16:00, cả hai giá trị đều bằng 0.001797.
Dữ liệu chỉ báo AO trong bộ đệm UseDemoAll
Bây giờ, trong cài đặt của UseDemoAll
, chúng ta chọn chỉ báo iGator
(Gator Oscillator
). Để đơn giản, hãy xóa trường chứa các tham số của Gator
, để nó sẽ được xây dựng với các tham số mặc định. Trong trường hợp này, độ dịch chuyển của biểu đồ dạng cột là 5 thanh (về phía trước), điều này được thấy rõ trên biểu đồ.
Dữ liệu chỉ báo Gator trong bộ đệm UseDemoAll mà không điều chỉnh cho độ dịch chuyển tương lai
Đường thẳng đứng màu đen đánh dấu thanh giờ 16:00. Tuy nhiên, giá trị của chỉ báo Gator
trong Data Window
và trong các mảng của chúng ta đọc từ cùng một chỉ báo lại khác nhau. Màu vàng trong UseDemoAll
đánh dấu các bộ đệm chứa rác.
Nếu chúng ta kiểm tra dữ liệu cách 5 thanh về quá khứ, tại 11:00 (đường thẳng đứng màu cam), chúng ta sẽ tìm thấy các giá trị mà Gator
xuất ra tại 16:00. Các giá trị đúng theo cặp của biểu đồ cột trên và dưới được đánh dấu bằng màu xanh lá cây và hồng tương ứng.
Để giải quyết vấn đề này, chúng ta phải thêm vào UseDemoAll
một biến đầu vào để người dùng chỉ định độ dịch chuyển của biểu đồ, sau đó thực hiện điều chỉnh cho nó khi gọi CopyBuffer
.
input int IndicatorShift = 0; // Độ dịch chuyển biểu đồ
...
int OnCalculate(ON_CALCULATE_STD_SHORT_PARAM_LIST)
{
...
for(int k = 0; k < m; ++k)
{
const int n = buffers[k].copy(Handle, k,
-IndicatorShift, rates_total - prev_calculated + 1);
...
}
}
2
3
4
5
6
7
8
9
10
11
12
Thật không may, không thể tìm ra thuộc tính PLOT_SHIFT cho một chỉ báo bên thứ ba từ MQL5.
Hãy kiểm tra xem việc giới thiệu độ dịch chuyển 5 sửa chữa tình huống với chỉ báo Gator (với cài đặt mặc định) như thế nào.
Dữ liệu chỉ báo Gator trong bộ đệm UseDemoAll sau khi điều chỉnh cho độ dịch chuyển tương lai
Bây giờ, các giá trị của UseDemoAll
tại thanh 16:00 tương ứng với dữ liệu thực tế từ Gator từ tương lai ảo 5 thanh phía trước (đường thẳng đứng màu tím nhạt tại 21:00).
Bạn có thể thắc mắc tại sao chỉ có 2 bộ đệm được hiển thị trong cửa sổ Gator
trong khi của chúng ta có 4. Vấn đề là biểu đồ cột màu của Gator
sử dụng một bộ đệm bổ sung để mã hóa màu sắc. Nhưng chỉ có hai màu, đỏ và xanh lá cây, và chúng ta thấy chúng trong các mảng của mình dưới dạng 0 hoặc 1.