Máy chủ web dựa trên Node.js
Để tổ chức phần máy chủ của các dự án của chúng ta, chúng ta cần một máy chủ web. Chúng ta sẽ sử dụng Node.js, một trong những máy chủ nhẹ nhất và tiên tiến nhất về công nghệ. Các kịch bản phía máy chủ cho nó có thể được viết bằng JavaScript, cùng ngôn ngữ được sử dụng trong các trình duyệt cho các trang web tương tác. Điều này thuận tiện từ quan điểm viết mã thống nhất cho phần máy khách và máy chủ của hệ thống; phần máy khách của bất kỳ dịch vụ web nào, theo quy tắc, sớm hay muộn cũng cần thiết, ví dụ, để quản trị, đăng ký và hiển thị các thống kê đẹp mắt về việc sử dụng dịch vụ.
Bất kỳ ai biết MQL5 thì gần như cũng biết JavaScript, vì vậy hãy tin vào bản thân. Những khác biệt chính được thảo luận trong phần bên lề.
MQL5 so với JavaScript
JavaScript là một ngôn ngữ thông dịch, không giống như MQL5 được biên dịch. Đối với chúng ta là các nhà phát triển, điều này làm cho cuộc sống dễ dàng hơn vì chúng ta không cần giai đoạn biên dịch riêng để có một chương trình hoạt động. Đừng lo lắng về hiệu suất của JavaScript: tất cả các runtime JavaScript đều sử dụng biên dịch JIT (vừa kịp thời) của JavaScript theo nhu cầu, tức là lần đầu tiên một mô-đun được truy cập. Quá trình này diễn ra tự động, ngầm định, một lần mỗi phiên, sau đó kịch bản được thực thi dưới dạng đã biên dịch.
MQL5 thuộc nhóm ngôn ngữ có kiểu tĩnh, nghĩa là khi mô tả biến, chúng ta phải chỉ định rõ ràng kiểu của chúng, và trình biên dịch theo dõi tính tương thích kiểu. Ngược lại, JavaScript là ngôn ngữ có kiểu động: kiểu của một biến được xác định bởi giá trị chúng ta đặt vào nó và có thể thay đổi trong suốt vòng đời của biến. Điều này mang lại sự linh hoạt nhưng đòi hỏi sự cẩn thận để tránh các lỗi không lường trước.
JavaScript, theo một nghĩa nào đó, là một ngôn ngữ hướng đối tượng hơn MQL5, bởi vì hầu hết mọi thực thể trong đó đều là đối tượng. Ví dụ, một hàm cũng là một đối tượng, và một lớp, như một mô tả về các thuộc tính của đối tượng, cũng là một đối tượng (của nguyên mẫu).
JavaScript tự động "thu gom rác", tức là giải phóng bộ nhớ được chương trình ứng dụng cấp phát cho các đối tượng. Trong MQL5, chúng ta phải đảm bảo gọi kịp thời
delete
cho các đối tượng động.Cú pháp JavaScript chứa nhiều "phím tắt" tiện lợi để viết các cấu trúc mà trong MQL5 phải được thực hiện dài dòng hơn. Ví dụ, để truyền một tham số trỏ đến một hàm khác vào một hàm nhất định trong MQL5, chúng ta cần mô tả kiểu của con trỏ đó bằng typedef, định nghĩa riêng một hàm khớp với nguyên mẫu này, và chỉ sau đó mới truyền định danh của nó dưới dạng tham số. Trong JavaScript, bạn có thể định nghĩa hàm bạn đang trỏ đến (toàn bộ!) trực tiếp trong danh sách đối số thay vì một tham số con trỏ.
Nếu bạn là một nhà phát triển web hoặc đã quen thuộc với Node.js, bạn có thể bỏ qua các bước cài đặt và cấu hình.
Bạn có thể tải Node.js từ trang chính thức nodejs.org. Việc cài đặt có sẵn ở nhiều phiên bản khác nhau, ví dụ, sử dụng trình cài đặt hoặc giải nén kho lưu trữ. Kết quả của việc cài đặt, bạn sẽ nhận được một tệp thực thi trong thư mục được chỉ định node.exe
cùng với một số tệp và thư mục hỗ trợ.
Nếu Node.js không được thêm vào đường dẫn hệ thống bởi trình cài đặt, điều này có thể được thực hiện cho người dùng Windows hiện tại bằng cách chạy lệnh sau trong thư mục nơi Node.js được cài đặt (nơi có tệp node.exe
):
setx PATH "%CD%"
Ngoài ra, bạn có thể chỉnh sửa các biến môi trường Windows từ hộp thoại thuộc tính hệ thống (Computer
-> Properties
-> Extra options
-> Environment Variables
; loại hộp thoại cụ thể phụ thuộc vào phiên bản của hệ điều hành). Dù sao đi nữa, bằng cách này, chúng ta sẽ đảm bảo khả năng chạy Node.js từ bất kỳ thư mục nào trên máy tính, điều này sẽ hữu ích cho chúng ta sau này.
Bạn có thể kiểm tra hoạt động của Node.js bằng cách chạy các lệnh sau (trong dòng lệnh Windows):
node -v
npm version
2
Lệnh đầu tiên xuất ra phiên bản của Node.js, và lệnh thứ hai xuất ra phiên bản của một dịch vụ tích hợp quan trọng của Node.js, trình quản lý gói npm
.
Gói là một mô-đun sẵn sàng sử dụng bổ sung chức năng cụ thể cho Node.js. Bản thân Node.js rất nhỏ, và nếu không có các gói, nó sẽ đòi hỏi rất nhiều mã hóa thường xuyên.
Các gói được yêu cầu nhiều nhất được lưu trữ trong một kho tập trung trên web và có thể được tải xuống và cài đặt trên một bản sao cụ thể của Node.js hoặc toàn cục (cho tất cả các bản sao của Node.js nếu có nhiều bản trên máy). Việc cài đặt một gói vào một bản sao cụ thể được thực hiện bằng lệnh sau:
npm install <package name>
Chạy nó trong thư mục nơi Node.js được cài đặt. Lệnh này sẽ đặt gói cục bộ và sẽ không ảnh hưởng đến các bản sao khác của Node.js đã tồn tại hoặc có thể xuất hiện trên máy tính sau này, với các chỉnh sửa không mong đợi.
Cụ thể, chúng ta cần gói ws, gói này triển khai giao thức WebSocket. Nghĩa là, bạn cần chạy lệnh:
npm install ws
và đợi quá trình hoàn tất. Kết quả là, thư mục <nodejs_install_path>/node_modules/
sẽ chứa một thư mục con mới ws
với nội dung cần thiết (bạn có thể xem tệp README.md với mô tả của gói để đảm bảo đó là thư viện giao thức WebSocket).
Gói này chứa cả triển khai của máy chủ và máy khách. Nhưng thay vì cái sau, chúng ta sẽ viết của riêng mình trong MQL5.
Toàn bộ chức năng của máy chủ Node.js được tập trung trong thư mục /node_modules
. Nó có thể được so sánh về mục đích với thư mục chuẩn MQL5/Include
trong MetaTrader 5. Khi viết các chương trình ứng dụng trong JavaScript, chúng ta sẽ bao gồm hoặc "nhập" các mô-đun cần thiết theo cách đặc biệt, tương tự như việc bao gồm các tệp tiêu đề mqh bằng chỉ thị #include
trong MQL5.