Làm việc với tệp
Rất khó để tìm một chương trình không sử dụng đầu vào-đầu ra dữ liệu. Chúng ta đã biết rằng các chương trình MQL có thể nhận cài đặt thông qua biến đầu vào và xuất thông tin ra nhật ký, như chúng ta đã sử dụng điều này trong hầu hết các script thử nghiệm. Nhưng trong hầu hết các trường hợp, điều này là không đủ.
Ví dụ, một phần đáng kể trong việc tùy chỉnh chương trình bao gồm lượng dữ liệu không thể chứa trong các tham số đầu vào. Một chương trình có thể cần được tích hợp với một số công cụ phân tích bên ngoài, tức là tải thông tin thị trường ở định dạng tiêu chuẩn hoặc chuyên biệt, xử lý và sau đó tải nó vào terminal dưới dạng mới, cụ thể là tín hiệu giao dịch, tập hợp trọng số mạng nơ-ron hoặc hệ số cây quyết định. Hơn nữa, việc duy trì một nhật ký riêng cho chương trình MQL có thể rất tiện lợi.
Hệ thống tệp cung cấp các cơ hội phổ quát nhất cho những nhiệm vụ như vậy. API MQL5 cung cấp một loạt các hàm để làm việc với tệp, bao gồm các hàm để tạo, xóa, tìm kiếm, ghi và đọc tệp. Chúng ta sẽ nghiên cứu tất cả điều này trong chương này.
Tất cả các thao tác tệp trong MQL5 bị giới hạn trong một khu vực đặc biệt trên đĩa, được gọi là sandbox (hộp cát). Điều này được thực hiện vì lý do bảo mật để không chương trình MQL nào có thể được sử dụng cho mục đích xấu và gây hại cho máy tính hoặc hệ điều hành của bạn.
Người dùng nâng cao có thể tránh giới hạn này bằng các biện pháp đặc biệt, mà chúng ta sẽ thảo luận sau. Nhưng điều này chỉ nên được thực hiện trong các trường hợp đặc biệt, đồng thời tuân thủ các biện pháp phòng ngừa và chấp nhận mọi trách nhiệm.
Đối với mỗi instance của terminal được cài đặt trên máy tính, thư mục gốc của sandbox nằm ở <terminal_data_folder>/MQL5/Files/
. Từ MetaEditor, bạn có thể mở thư mục dữ liệu bằng lệnh File -> Open Data Folder
. Nếu bạn có đủ quyền truy cập trên máy tính, thư mục này thường là cùng nơi mà terminal được cài đặt. Nếu bạn không có quyền cần thiết, đường dẫn sẽ trông như thế này:
X:/Users/<user_name>/AppData/Roaming/MetaQuotes/Terminal/<instance_id>/MQL5/Files/
Ở đây, X
là ký tự ổ đĩa nơi hệ thống được cài đặt, <user_name>
là tên đăng nhập người dùng Windows, <instance_id>
là định danh duy nhất của instance terminal. Thư mục Users
cũng có bí danh là Documents and Settings
.
Lưu ý rằng trong trường hợp kết nối từ xa đến máy tính qua RDP (Giao thức Máy tính Từ xa), terminal sẽ luôn sử dụng thư mục
Roaming
và các thư mục con của nó ngay cả khi bạn có quyền quản trị.
Hãy nhớ rằng thư mục MQL5 trong thư mục dữ liệu là nơi lưu trữ tất cả các chương trình MQL: cả mã nguồn và tệp ex5 đã biên dịch. Mỗi loại chương trình MQL, bao gồm chỉ báo, Expert Advisors, script và các loại khác, có một thư mục con riêng trong thư mục MQL5. Vì vậy, thư mục Files
để làm việc với tệp nằm ngay cạnh chúng.
Ngoài sandbox riêng của mỗi bản sao terminal trên máy tính, còn có một sandbox chung, được chia sẻ cho tất cả các terminal: chúng có thể giao tiếp qua đó. Đường dẫn đến nó chạy qua thư mục chính của người dùng Windows và có thể khác nhau tùy thuộc vào phiên bản hệ điều hành. Ví dụ, trong các cài đặt tiêu chuẩn của Windows 7, 8 và 10, nó trông như thế này:
X:/Users/<user_name>/AppData/Roaming/MetaQuotes/Terminal/Common/Files/
Một lần nữa, thư mục này có thể dễ dàng truy cập qua MetaTrader: chạy lệnh File -> Open Shared Data Folder
, và bạn sẽ ở trong thư mục Common.
Một số loại chương trình MQL (Expert Advisors và chỉ báo) có thể được thực thi không chỉ trong terminal mà còn trong tester. Khi chạy trong đó, sandbox chung vẫn có thể truy cập được, và thay vì sandbox của một instance đơn lẻ, một thư mục bên trong agent thử nghiệm được sử dụng. Thông thường, nó trông như thế này:
X:/<terminal_path>/Tester/Agent-IP-port/MQL5/Files/
Điều này có thể không hiển thị trong chính chương trình MQL, tức là tất cả các hàm tệp hoạt động hoàn toàn giống nhau. Tuy nhiên, từ góc độ người dùng, có thể cảm thấy như có vấn đề gì đó. Ví dụ, nếu chương trình lưu kết quả công việc của nó vào một tệp, tệp đó sẽ bị xóa trong thư mục agent của tester sau khi quá trình chạy hoàn tất (như thể tệp chưa từng được tạo). Cách tiếp cận thường lệ này được thiết kế để ngăn dữ liệu có giá trị tiềm năng của một chương trình rò rỉ sang chương trình khác có thể được thử nghiệm trên cùng agent sau đó (đặc biệt vì các agent có thể được chia sẻ). Các công nghệ khác được cung cấp để chuyển tệp đến các agent và trả kết quả từ agent về terminal, điều mà chúng ta sẽ thảo luận trong Phần thứ năm của sách.
Để vượt qua giới hạn sandbox, bạn có thể sử dụng khả năng của Windows để gán liên kết tượng trưng (symbolic links) cho các đối tượng hệ thống tệp. Trong trường hợp của chúng ta, các kết nối (junction) là phù hợp nhất để chuyển hướng truy cập đến các thư mục trên máy tính cục bộ. Chúng được tạo bằng lệnh sau (có nghĩa là dòng lệnh Windows):
mklink /J new_name existing_target
Tham số new_name
là tên của thư mục ảo mới sẽ trỏ đến thư mục thực existing_target
.
Để tạo kết nối đến các thư mục bên ngoài ngoài sandbox, nên tạo một thư mục chuyên dụng bên trong MQL5/Files, ví dụ, Links
. Sau đó, khi vào thư mục này, bạn có thể thực thi lệnh trên bằng cách chọn new_name
và thay thế đường dẫn thực bên ngoài sandbox làm existing_target
. Ví dụ, lệnh sau sẽ tạo trong thư mục Links
một liên kết mới có tên Settings
, cung cấp quyền truy cập vào thư mục MQL5/Presets:
mklink /J Settings "..\..\Presets\"
Đường dẫn tương đối "...." giả định rằng lệnh được thực thi trong thư mục MQL5/Files/Links đã chỉ định. Sự kết hợp của hai dấu chấm ".." chỉ ra việc chuyển từ thư mục hiện tại sang thư mục cha. Được chỉ định hai lần, sự kết hợp này hướng dẫn đi lên hai cấp trong hệ thống đường dẫn. Kết quả là, thư mục đích (existing_target
) sẽ được tạo thành MQL5/Presets. Nhưng trong tham số existing_target
, bạn cũng có thể chỉ định một đường dẫn tuyệt đối.
Bạn có thể xóa các liên kết tượng trưng như các tệp thông thường (nhưng tất nhiên, trước tiên bạn nên đảm bảo rằng đó là thư mục có biểu tượng mũi tên ở góc dưới bên trái, tức là liên kết, chứ không phải thư mục gốc). Nên làm điều này ngay lập tức khi bạn không còn cần vượt ra ngoài sandbox. Thực tế là các thư mục ảo được tạo ra trở nên доступные cho tất cả các chương trình MQL, không chỉ của bạn, và không biết các chương trình của người khác có thể sử dụng sự tự do bổ sung này như thế nào.
Nhiều phần của chương này liên quan đến tên tệp. Chúng hoạt động như các định danh phần tử hệ thống tệp và có các quy tắc tương tự, bao gồm một số hạn chế.
Lưu ý rằng tên tệp không thể chứa một số ký tự đóng vai trò đặc biệt trong hệ thống tệp ('<', '>', '/', '\', '"', ':', '|', '*', '?'), cũng như bất kỳ ký tự nào có mã từ 0 đến 31 bao gồm cả hai.
Các tên tệp sau cũng được dành sẵn cho việc sử dụng đặc biệt trong hệ điều hành và không thể sử dụng: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.
Cần lưu ý rằng hệ thống tệp Windows không thấy sự khác biệt cơ bản giữa các chữ cái in hoa và in thường, vì vậy các tên như "Name", "NAME", và "name" đều đề cập đến cùng một phần tử.
Windows cho phép sử dụng cả dấu gạch chéo ngược '\' và dấu gạch chéo xuôi '/' làm ký tự phân cách giữa các thành phần đường dẫn (thư mục con và tệp). Tuy nhiên, dấu gạch chéo ngược cần được che chắn (tức là thực sự viết hai lần) trong các chuỗi MQL5, vì ký tự '' tự nó là đặc biệt: nó được sử dụng để xây dựng các chuỗi ký tự điều khiển, chẳng hạn như '\r', '\n', '\t' và các ký tự khác (xem phần Kiểu ký tự). Ví dụ, các đường dẫn sau là tương đương: "MQL5Book/file.txt" và "MQL5Book\file.txt".
Ký tự chấm '.' đóng vai trò là phân cách giữa tên và phần mở rộng. Nếu một phần tử hệ thống tệp có nhiều dấu chấm trong định danh của nó, thì phần mở rộng là đoạn bên phải của dấu chấm cuối cùng, và mọi thứ bên trái của nó là tên. Tiêu đề (trước dấu chấm) hoặc phần mở rộng (sau dấu chấm) có thể trống. Ví dụ, tên tệp không có phần mở rộng là "text", và tệp không có tên (chỉ có phần mở rộng) là ".txt".
Tổng độ dài của đường dẫn và tên tệp trong Windows có giới hạn. Đồng thời, để quản lý tệp trong MQL5, cần lưu ý rằng đường dẫn đến sandbox sẽ được thêm vào đường dẫn và tên của chúng, tức là sẽ còn ít không gian hơn được phân bổ cho tên của các đối tượng tệp trong các lời gọi hàm MQL. Theo mặc định, giới hạn độ dài tổng thể là hằng số hệ thống MAX_PATH, bằng 260. Bắt đầu từ Windows 10 (build 1607), bạn có thể tăng giới hạn này lên 32767. Để làm điều này, bạn cần lưu văn bản sau vào tệp .reg và chạy nó bằng cách thêm vào Windows Registry.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
2
Đối với các phiên bản Windows khác, bạn có thể sử dụng các giải pháp thay thế từ dòng lệnh. Cụ thể, bạn có thể rút ngắn đường dẫn bằng cách sử dụng các kết nối đã thảo luận ở trên (bằng cách tạo một thư mục ảo với đường dẫn ngắn). Bạn cũng có thể sử dụng lệnh shell -
subst
, ví dụ,subst z: c:\very\long\path
(xem Trợ giúp Windows để biết chi tiết).