Cơ sở dữ liệu SQLite
MetaTrader 5 cung cấp hỗ trợ tích hợp cho cơ sở dữ liệu SQLite. Đây là một hệ quản trị cơ sở dữ liệu (DBMS) nhẹ nhưng đầy đủ chức năng. Theo truyền thống, các hệ thống như vậy tập trung vào xử lý các bảng dữ liệu, nơi các bản ghi cùng loại được lưu trữ với một tập hợp các thuộc tính chung, và các mối quan hệ (liên kết hoặc quan hệ) khác nhau có thể được thiết lập giữa các bản ghi của các loại khác nhau (tức là các bảng), do đó các cơ sở dữ liệu này còn được gọi là cơ sở dữ liệu quan hệ. Chúng ta đã xem xét các ví dụ về những kết nối như vậy giữa các cấu trúc của lịch kinh tế, nhưng cơ sở dữ liệu lịch được lưu trữ bên trong terminal, và các chức năng của phần này sẽ cho phép bạn tạo ra các cơ sở dữ liệu tùy ý từ các chương trình MQL.
Chuyên môn của DBMS về các cấu trúc dữ liệu này cho phép tối ưu hóa — tăng tốc và đơn giản hóa — nhiều thao tác phổ biến như sắp xếp, tìm kiếm, lọc, tổng hợp hoặc tính toán các hàm tổng hợp khác cho khối lượng dữ liệu lớn.
Tuy nhiên, cũng có mặt trái: lập trình DBMS yêu cầu ngôn ngữ SQL (Structured Query Language) riêng, và kiến thức thuần túy về MQL5 sẽ không đủ. Không giống như MQL5, thuộc nhóm ngôn ngữ imperative
(những ngôn ngữ sử dụng các toán tử chỉ ra cái gì, như thế nào, theo thứ tự nào để thực hiện), SQL là declarative
, tức là nó mô tả dữ liệu ban đầu và kết quả mong muốn, mà không chỉ định cách thức và thứ tự thực hiện các phép tính. Ý nghĩa của thuật toán trong SQL được mô tả dưới dạng các truy vấn SQL. Một truy vấn là tương tự của một toán tử MQL5 riêng biệt, được hình thành dưới dạng chuỗi sử dụng cú pháp đặc biệt.
Thay vì lập trình các vòng lặp và so sánh phức tạp, chúng ta có thể chỉ cần gọi các hàm SQLite (ví dụ, DatabaseExecute
hoặc Database Prepare
) bằng cách truyền các truy vấn SQL cho chúng. Để lấy kết quả truy vấn vào một cấu trúc MQL5 đã sẵn sàng, bạn có thể sử dụng hàm DatabaseReadBind
. Điều này sẽ cho phép bạn đọc tất cả các trường của bản ghi (cấu trúc) cùng một lúc trong một lần gọi.
Với sự trợ giúp của các hàm cơ sở dữ liệu, việc tạo bảng, thêm bản ghi vào chúng, thực hiện sửa đổi và thực hiện các lựa chọn theo các điều kiện phức tạp trở nên dễ dàng, ví dụ, cho các nhiệm vụ như:
- Lấy lịch sử giao dịch và báo giá
- Lưu trữ kết quả tối ưu hóa và kiểm tra
- Chuẩn bị và trao đổi dữ liệu với các gói phân tích khác
- Phân tích dữ liệu lịch kinh tế
- Lưu trữ cài đặt và trạng thái của các chương trình MQL5
Ngoài ra, một loạt các hàm thông dụng, thống kê và toán học có thể được sử dụng trong các truy vấn SQL. Hơn nữa, các biểu thức có sự tham gia của chúng có thể được tính toán ngay cả khi không tạo bảng.
SQLite không yêu cầu ứng dụng riêng, cấu hình và quản trị, không đòi hỏi nhiều tài nguyên và hỗ trợ hầu hết các lệnh của tiêu chuẩn SQL92 phổ biến. Một tiện ích bổ sung là toàn bộ cơ sở dữ liệu nằm trong một tệp duy nhất trên ổ cứng của máy tính người dùng và có thể dễ dàng được chuyển hoặc sao lưu. Tuy nhiên, để tăng tốc các thao tác đọc, ghi và sửa đổi, cơ sở dữ liệu cũng có thể được mở/tạo trong RAM với cờ DATABASE_OPEN_MEMORY, tuy nhiên, trong trường hợp này, cơ sở dữ liệu như vậy chỉ có sẵn cho chương trình cụ thể này và không thể được sử dụng cho công việc chung của nhiều chương trình.
Điều quan trọng cần lưu ý là sự đơn giản tương đối của SQLite, so với các DBMS đầy đủ tính năng, đi kèm với một số hạn chế. Cụ thể, SQLite không có một quy trình chuyên dụng (dịch vụ hệ thống hoặc ứng dụng) cung cấp quyền truy cập tập trung vào cơ sở dữ liệu và API quản lý bảng, đó là lý do tại sao quyền truy cập song song, chia sẻ vào cùng một cơ sở dữ liệu (tệp) từ các quy trình khác nhau không được đảm bảo. Vì vậy, nếu bạn cần đọc và ghi vào cơ sở dữ liệu đồng thời từ các tác nhân tối ưu hóa thực thi các phiên bản của cùng một Expert Advisor, bạn sẽ cần viết mã trong đó để đồng bộ hóa quyền truy cập (nếu không, dữ liệu được ghi và đọc sẽ ở trạng thái không nhất quán: sau cùng, thứ tự ghi, sửa đổi, xóa và đọc từ các quy trình đồng thời không đồng bộ là ngẫu nhiên). Hơn nữa, các nỗ lực thay đổi cơ sở dữ liệu cùng lúc có thể dẫn đến việc chương trình MQL nhận được lỗi "database busy" (và thao tác được yêu cầu không được thực hiện). Kịch bản duy nhất không yêu cầu đồng bộ hóa các thao tác song song với SQLite là khi chỉ có các thao tác đọc được thực hiện.
Chúng ta sẽ trình bày chỉ những điều cơ bản của SQL ở mức độ cần thiết để bắt đầu áp dụng nó. Mô tả đầy đủ về cú pháp và cách hoạt động của SQL nằm ngoài phạm vi của cuốn sách này. Hãy xem tài liệu trên trang web SQLite. Tuy nhiên, xin lưu ý rằng MQL5 và MetaEditor hỗ trợ một tập hợp con giới hạn của các lệnh và cấu trúc cú pháp SQL.
MQL Wizard
trong MetaEditor có tùy chọn nhúng để tạo cơ sở dữ liệu, ngay lập tức đề nghị tạo bảng đầu tiên bằng cách xác định danh sách các trường của nó. Ngoài ra, Navigator
cung cấp một tab riêng để làm việc với cơ sở dữ liệu.
Sử dụng Wizard
hoặc menu ngữ cảnh của Navigator
, bạn có thể tạo một cơ sở dữ liệu trống (một tệp trên đĩa, được đặt mặc định trong thư mục MQL5/Files
) với các định dạng được hỗ trợ (*.db, *.sql, *.sqlite và các định dạng khác). Ngoài ra, trong menu ngữ cảnh, bạn có thể nhập toàn bộ cơ sở dữ liệu từ tệp sql hoặc các bảng riêng lẻ từ tệp csv.
Một cơ sở dữ liệu hiện có hoặc đã tạo có thể dễ dàng được mở thông qua cùng menu đó. Sau đó, các bảng của nó sẽ xuất hiện trong Navigator
, và khu vực chính bên phải của cửa sổ sẽ hiển thị một bảng điều khiển với các công cụ để gỡ lỗi truy vấn SQL và một bảng với các kết quả. Ví dụ, nhấp đúp vào tên bảng thực hiện một truy vấn nhanh tất cả các trường của bản ghi, tương ứng với câu lệnh "SELECT * FROM 'table'" xuất hiện trong trường nhập ở trên cùng.
Xem cơ sở dữ liệu SQLite trong MetaEditor
Bạn có thể chỉnh sửa yêu cầu và nhấp vào nút Execute
để kích hoạt nó. Các lỗi cú pháp SQL tiềm ẩn được xuất ra trong nhật ký.
Để biết thêm chi tiết về Wizard
, việc nhập/xuất cơ sở dữ liệu và làm việc tương tác với chúng, vui lòng xem tài liệu MetaEditor.