Chương trình đầu tiên
Hãy thử thêm vào tập lệnh một cái gì đó đơn giản nhưng minh họa để chứng minh hoạt động của nó. Hãy đổi tên tập lệnh đã sửa đổi thành HelloChart.mq5
.
Trong nhiều sách giáo khoa lập trình, ví dụ ban đầu in ra lời chào "Hello, world" mang tính nghi lễ. Trong MQL5, một lời chào tương tự có thể xuất hiện như sau:
void OnStart()
{
Print("Hello, world");
}
2
3
4
Nhưng chúng ta sẽ làm cho nó có nhiều thông tin hơn:
void OnStart()
{
Print("Hello, ", Symbol());
}
2
3
4
Vì vậy, chúng ta chỉ thêm một chuỗi với một số cấu trúc ngôn ngữ.
Ở đây, Print
là tên của hàm được nhúng trong terminal và có mục đích hiển thị các thông báo trong nhật ký Expert Advisors
(tab Expert Advisors
trong cửa sổ Tools
; mặc dù tên của nó là Expert Advisors
, tab này thu thập các thông báo từ các chương trình MQL thuộc mọi loại). Không giống như hàm OnStart
mà chúng ta đang định nghĩa độc lập, hàm Print
được định nghĩa cho chúng ta trước và mãi mãi. Print
là một trong nhiều hàm nhúng xây dựng MQL5 API (giao diện lập trình ứng dụng).
Dòng mới trong mã của chúng ta biểu thị câu lệnh gọi hàm Print
gửi vào đó danh sách các đối số (trong dấu ngoặc đơn) sẽ được in trong nhật ký. Các đối số trong danh sách được phân tách bằng dấu phẩy. Trong trường hợp này, có hai đối số: Dòng "Hello"
và gọi một hàm nhúng khác - Symbol
, trả về tên của biểu tượng đang hoạt động trên biểu đồ hiện tại (giá trị thu được từ nó sẽ ngay lập tức được đưa vào danh sách các đối số của hàm Print
, vào vị trí mà hàm Symbol
đã được gọi).
Hàm Symbol
không có tham số nào và do đó không có dữ liệu nào được gửi vào hàm này bên trong dấu ngoặc đơn.
Ví dụ, nếu tập lệnh nằm trên biểu đồ "EURUSD"
, thì việc gọi hàm Symbol()
sẽ trả về "EURUSD"
và, xét về chương trình đang được thực thi, câu lệnh liên quan đến việc gọi hàm Print
sẽ có giao diện mới: Print("Hello, ", "EURUSD")
. Tất nhiên, theo quan điểm của người dùng, tất cả các lệnh gọi hàm này và việc thay thế động các kết quả trung gian đều diễn ra suôn sẻ và ngay lập tức. Tuy nhiên, đối với một lập trình viên, điều quan trọng là phải nhận thức đầy đủ cách chương trình được thực thi từng bước để tránh các lỗi logic và đạt được sự tuân thủ nghiêm ngặt với kế hoạch đã hình thành.
Dòng "Hello"
trong dấu ngoặc kép được gọi là literal, tức là một chuỗi ký tự cố định mà máy tính nhận dạng là một văn bản, vì nó vốn như vậy (vì nó được giới thiệu trong mã nguồn của chương trình).
Do đó, câu lệnh in ở trên phải in từng đối số một vào nhật ký, điều này sẽ dẫn đến việc nối hai dòng và thu được kết quả "Hello, EURUSD"
.
Điều quan trọng là dấu phẩy bên trong dấu ngoặc kép sẽ được in trong nhật ký như một phần của dòng và không được xử lý theo bất kỳ cách đặc biệt nào. Không giống như vậy, dấu phẩy được đặt sau dấu ngoặc kép đóng và trước khi gọi Symbol()
là ký tự phân cách trong danh sách đối số, tức là ảnh hưởng đến hành vi của chương trình. Nếu dấu phẩy đầu tiên bị bỏ qua, chương trình sẽ không mất tính chính xác, mặc dù nó sẽ in từ "Hello"
mà không có dấu phẩy sau đó. Tuy nhiên, nếu dấu phẩy thứ hai bị bỏ qua, chương trình sẽ ngừng được biên dịch, vì cú pháp của danh sách đối số hàm sẽ bị hỏng: Tất cả các giá trị trong đó (trong trường hợp của chúng ta, đây là hai dòng) phải được phân tách bằng dấu phẩy.
Lỗi biên dịch sẽ xuất hiện như sau:
'Symbol' - some operator expected HelloChart.mq5 16 19
Trình biên dịch 'kêu ca' về việc thiếu thứ gì đó trước khi đề cập đến Symbol
. Điều này sẽ phá vỡ quá trình biên dịch và tệp thực thi của chương trình không được tạo. Do đó, chúng ta sẽ đặt lại dấu phẩy.
Ví dụ này cho chúng ta thấy việc tuân thủ nghiêm ngặt cú pháp của ngôn ngữ là quan trọng như thế nào. Các ký tự giống nhau có thể hoạt động khác nhau, ở các phần khác nhau của chương trình. Do đó, ngay cả một sự thiếu sót nhỏ cũng có thể rất quan trọng. Ví dụ, hãy lưu ý dấu chấm phẩy ở cuối dòng gọi Print
. Dấu chấm phẩy có nghĩa là kết thúc câu lệnh ở đây. Nếu chúng ta quên đặt nó, có thể xảy ra lỗi biên dịch lạ.
Để thấy điều này, chúng ta sẽ thử xóa dấu chấm phẩy này và biên dịch lại tập lệnh. Điều này dẫn đến việc nhận được các lỗi mới với mô tả về vấn đề và vị trí của nó trong mã nguồn.
'}' - semicolon expected HelloChart.mq5 17 1
'}' - unexpected end of program HelloChart.mq5 17 1
2
Lỗi đầu tiên chỉ rõ sự vắng mặt của dấu chấm phẩy mà trình biên dịch mong đợi. Lỗi thứ hai được lan truyền: Dấu ngoặc nhọn đóng báo hiệu kết thúc chương trình đã được phát hiện trước khi câu lệnh hiện tại kết thúc. Theo ý kiến của trình biên dịch, nó vẫn tiếp tục, vì nó chưa gặp dấu chấm phẩy. Rõ ràng là cách sửa lỗi: Dấu chấm phẩy phải được đặt lại đúng vị trí trong câu lệnh.
Hãy biên dịch và khởi chạy tập lệnh cố định. Mặc dù tập lệnh được thực thi rất nhanh và được xóa khỏi biểu đồ ngay lập tức và một bản ghi xác nhận hoạt động của tập lệnh xuất hiện trong nhật ký Experts.
HelloChart (EURUSD,H1) Hello, EURUSD