Lý Thuyết Cơ Bản Của Ngôn Ngữ MQL4 - MQL5

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Vì lý thuyết có 2 nội dung bằng tiếng anh và tiếng việt, mà bác EWA đã cất công dịch sang tiếng việt bên SVOL ! Vì thế đỡ mất công viết lại, Lãng xin phép copy về cho chi bộ đọc nội dung cơ bản của ngôn ngữ lập trình MQL4 - MQL5, Sau này , ta gọi tắt là ngôn ngữ MQL cho nhanh. TKS bác EWA đã cất công post bài trên SVOL! TKS!

Lãng sẽ update thêm nội dung cho phù hợp và hoàn thiện bài viết cơ bản này!



 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 01: Giới thiệu ngôn ngữ lập trình MQL4

Chào mừng bạn đến với khóa học ngôn ngữ lập trình MQL4





Trong loạt bài này, xin giới thiệu đến bạn những bí ẩn và phức tạp từ ngôn ngữ lập trình MQL4 bằng cách trình bày những kiến thức khái quát bằng ví dụ minh hoạ trực quan.

Trong chuỗi bài học này, các bạn sẽ tìm hiểu cách sử dụng MQL4 bằng cách xây dựng các hệ thống cố vấn (Expert Advisors), các chỉ báo kỹ thuật tùy chỉnh (Custom Indicators) và các kịch bản (Scripts).

Nếu bạn biết lập trình ngôn ngữ C (hoặc biến thể của nó như C++) thì bạn sẽ biết nhiều về MQL4 trước khi chúng ta bắt đầu những bài học này, nếu bạn không viết được bất kỳ ngôn ngữ lập trình nào trước đây thì cũng không hề gì, chúng ta sẽ cùng tìm hiểu khái niệm về ngôn ngữ lập trình nói chúng.

Nào, chúng ta cùng bắt đầu nhé!

MQL4 ư? Là gì, tại sao và ở đâu?

MQL4 là dạng viết tắt của cụm từ MetaQuotes Language 4. MetaQuotes là công ty xây dựng ra phần mềm giao dịch Metatrader. Và để giúp cho phần mềm này mạnh mẽ hơn các phần mềm giao dịch khác, công ty đã phát triển nó bằng một ngôn ngữ lập trình đi kèm giúp người dùng viết được các chiến thuật giao dịch riêng của mình.

Ngôn ngữ lập trình MQL4 là một ngôn ngữ tích hợp mới để lập trình cho các chiến lược kinh doanh. Ngôn ngữ này cho phép tạo ra các hệ thống cố vấn (Expert Advisors) riêng của nhà đầu tư, giúp quản lý quá trình giao dịch tự động và có khả năng thực hiện các chiến lược giao dịch riêng của nhà đầu tư. Người sử dụng có thể tạo các Chỉ báo kỹ thuật tùy chỉnh (Custom Indicators), Kịch bản (Scripts) và Thư viện chức năng (Libraries) bằng sự trợ giúp của MQL 4.

Công cụ MetaEditor 4 nêu bật những thành phần khác nhau của MQL4 được sử dụng để viết mã lập trình. Nó giúp người dùng dễ dàng định hướng trong văn bản hệ thống cố vấn.

Các chương trình được viết bằng ngôn ngữ MQL4 có những đặc trưng và mục đích khác nhau:

Hệ thống cố vấn (Expert Advisors) là một hệ thống giao dịch kỹ thuật được liên kết đến một biểu đồ nào đó. Hệ thống cố vấn không chỉ có thể thông báo cho bạn biết về một khả năng xuất hiện giá rẻ mà còn có thể thực hiện các giao dịch trên tài khoản một cách tự động đồng thời hướng các giao dịch đó đến máy chủ tiếp nhận giao dịch. Giống như hầu hết các hệ thống giao dịch, phần mềm MetaTrader 4 hỗ trợ kiểm tra các chiến lược trên dữ liệu giá lịch sử bằng cách hiển thị trên biểu đồ các điểm mà tại đó các giao dịch bắt đầu và kết thúc. EA là chương trình có thể giúp bạn thực hiện các lệnh một cách tự động.

Các chỉ báo kỹ thuật tùy chỉnh (Custom Indicators) là một hệ thống cho phép tạo ra các chỉ báo kỹ thuật bên cạnh các chỉ báo đã được tích hợp trong phần mềm Metatrader4. Giống như các chỉ báo tích hợp, chúng không thể tạo các giao dịch một cách tự động mà chỉ có mục đích thực hiện các chức năng phân tích.

Kịch bản (Scripts) là các chương trình được thiết kế để tiến hành một số chức năng riêng biệt. Không giống như các hệ thống cố vấn, Script không chạy theo hướng giá và không có quyền truy cập vào các chức năng chỉ báo.

Thư viện (Libraries) là nơi lưu trữ chức năng người dùng bao gồm những chương trình người dùng sử dụng thường xuyên.

Để viết mã MQL4, bạn có thể chọn một trong hai cách, cách khó và cách dễ.

I. Cách khó:

Cách khó là sử dụng công cụ xử lý văn bản ưa thích của bạn và lệnh command prompt (lệnh cmd trong Windows) để soạn thảo chương trình.

Công cụ Notepad là lựa chọn không tồi, nhưng đừng quên hai điều:

[FONT=&quot;](1) [/FONT]Lưu file mà bạn đã tạo dưới định dạng văn bản thuần túy

[FONT=&quot;](2) [/FONT]Lưu file bằng đuôi .mp4 (để dễ dàng mở lại tệp bằng công cụ MetaEditor) song bạn cũng có thể lưu nó bằng đuôi khác mà bạn thích.

Sau khi lưu chương trình của bạn, có một bước phụ để giúp mã của bạn hoạt động được. Đó là bước biên dịch.

Biên dịch tức là chuyển kịch bạn có thể đọc được mà bạn vừa viết đến ngôn ngữ mà máy tính hiểu được.

Phần mềm MetaTrader đã có trình biên dịch riêng của nó (chương trình sẽ chuyển đổi kịch bạn của bạn đến ngôn ngữ máy tính) gọi là MetaLang.exe.

MetaLang.exe là một chương trình có 2 tham số và xuất ra một file có đuôi .ex4 (file mà MetaTrader hiểu được). Tham số thứ nhất là tham số options và lựa chọn duy nhất có sẵn là –q (thoát). Tham số thứ hai là đường dẫn đầy đủ đến tệp .mql.

Cú pháp sẽ có dạng như thế này:

Metalang [options…] filename

Ví dụ:

1 – Tìm đường dẫn metalang.exe, nó sẽ có cùng đường dẫn đến phần mềm MetaTrader (giả sử ở đây là D:program Files/MetaTrader4)

2 – Tạo một tệp bó (batch) và đặt tên dưới dạng compile.bat (hoặc bất kỳ tên nào bạn thích)

3 – Viết những dòng dưới đây vào tệp bó rồi lưu nó:

cd D:\Program Files\MetaTrader4 metalang –q "D:\Program Files\MetaTrader4\my_first_mql4_script.mq4"

(Nhớ đừng quên thay đổi đường dẫn đến phần mềm MetaTrader đã được cài đặt)

4 – Chạy tệp bó và nếu bạn là người may mắn thì bạn sẽ thấy một cửa sổ như thế này:



Như thế bạn sẽ có file xuất my_first_mql4_script.mq4.

II. Cách dễ:

Để mở chương trình lập trình MQL thì ta có thể nhấn phím F4 là nó sẽ hiện ra giao diện lập trình MetaEditor:



MetaTrader đi kèm với một công cụ phát triển ứng dụng thích hợp (IDE) tốt gọi là MetaEditor có những tính năng sau:

1 - Một trình soạn thảo văn bản có đặc tính làm nổi bật các cấu trúc khác nhau của ngôn ngữ MQL4 trong khi bạn đang viết hoặc đang đọc mã.

2 – Dễ dàng biên dịch chương trình của bạn, chỉ cần click phím F5 và MetaEditor sẽ làm tất cả công việc nặng nhọc cho bạn và tạo ra file .ex4. Ngoài ra cũng dễ dàng thấy lỗi trong chương trình của bạn (trong tab Error).

3 – Tích hợp một cuốn từ điển giúp bạn có thể truy cập bằng cách làm nổi bật từ khóa mà bạn muốn biết thêm về nó rồi nhấn phím F1.


Bài học hôm nay chỉ đến đây thôi, trong những bài tới chúng ta sẽ tìm hiểu nhiều hơn về MetaEditor. Trong bài học kế tiếp chúng ta sẽ nghiên cứu về cú pháp của MQL4.



.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
BÀI TẬP BÀI HỌC 01




Câu 1: Những loại chương trình nào bạn có thể viết trong ngôn ngữ MQL4?

Câu 2: Những câu sau đây đúng hay sai, nếu sai thì giải thích lý do tại sao?

(1) Hệ thống cố vấn (EA) là một chương trình giúp bạn sử dụng những chức năng của các chỉ báo kỹ thuật và nó không thể thực hiện tự động các lệnh của bạn.

(2) Tệp nguồn của mã mà bạn viết trong ngôn ngữ MQL4 được lưu theo tệp có đuôi .mqh, trong khi .mq4 là đuôi của những tệp đầu đề trong MQL4 mà bạn có thể kèm trong mã khi cần thiết.

(3) Metalang.exe là trình biên dịch đi kèm với MQL4, công việc của nó là đưa mã nguồn mà bạn viết vào MQL4 và tạo ra tệp có đuôi .ex4 mà bạn có thể tải nó trong phần mềm MetaTrader.

Câu 3: Bạn đã quyết định không sử dụng MetaEditor và bạn sử dụng Notepad để viết mã MQL4 của mình, hãy cho biết các bước cần thiết để biên dịch chương trình của bạn.

Giả sử: Bạn đã cài đặt phần mềm MetaTrader trong đường dẫn C:\Program Files\MetaTrader 4. Bạn lưu file mã nguồn dưới dạng my_first_mql4_script.mq4 ở cùng đường dẫn của phần mềm MetaTrader.

[/GON]

ĐÁP ÁN BÀI TẬP BÀI HỌC 01



[GON]Câu 1: Những loại chương trình bạn có thể viết trong ngôn ngữ MQL4 bao gồm:

1. Hệ thống cố vấn (Expert Advisors)

2. Chỉ báo kỹ thuật tùy chỉnh (Custom Indicators)

3. Kịch bản (Scripts)

4. Thư viện (Libraries)

Câu 2:

Câu (1) sai, đó là giải thích cho chương trình Chỉ báo kỹ thuật tùy chỉnh (Custom Indicator) còn giải thích cho chương trình Hệ thống cố vấn (Expert Advisor) là:

Hệ thống cố vấn là chương trình có thể thực hiện tự động các lệnh cho bạn. Chẳng hạn nó có thể thực hiện tự động các lệnh thị trường (mua/bán), lệnh dừng lỗ, hoãn hoặc thay thế các lệnh và lệnh chốt lời.

Câu (2) sai. “.mq4” là tệp nguồn của mã MQL4, trong khi “.mqh” là tệp đầu đề mà bạn có thể kèm vào mã của bạn bằng “#include” khi cần thiết.

Câu (3) đúng.

Câu 3:

(1) – Tạo một tệp bó (batch) và đặt tên dưới dạng compile.bat (hoặc bất kỳ tên nào bạn thích)

(2) – Viết những dòng dưới đây vào tệp bó rồi lưu nó:

cd C:\Program Files\MetaTrader4 metalang –q "C:\Program Files\MetaTrader4\my_first_mql4_script.mq4"

(3) Chạy tệp bó và bạn sẽ có “my_first_mql4_script.ex4” ở cùng đường dẫn.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 02: Cú pháp MQL4

Bài hôm nay chúng ta bàn về những quy tắc cú pháp của ngôn ngữ MQL4.


Như chúng ta biết ở bài trước, nếu bạn biết lập trình ngôn ngữ C (hoặc biến thể của nó như C++) thì bạn sẽ biết nhiều về MQL4 trước khi chúng ta bắt đầu những bài học này. Đó là do cú pháp MQL4 rất giống với cú pháp của ngôn ngữ lập trình C.

Định nghĩa từ cú pháp của một ngôn ngữ lập trình như sau:

“Bộ các biệt ngữ cho phép và những tham chiếu của chúng và trật tự từ đúng trong biểu thức được gọi là cú pháp ngôn ngữ” (Wikipedia).

Vì thế khi nghiên cứu cú pháp của ngôn ngữ MQL4 chúng ta nghiên cứu ngữ pháp và những quy tắc viết của nó bao gồm:

- Định dạng

- Chú giải

- Định danh

- Biệt ngữ

Chúng ta hãy lần lượt mổ xẻ từng phần như sau:

1. Định dạng

Khi bạn viết mã, bạn có thể tự do sử dụng các bộ khoảng trống, tab và dòng nguồn cấp dữ liệu được sử dụng như là dấu tách. Bạn có thể sử dụng bất kỳ biểu tượng nào thay vì một trong những biểu tượng đó. Để nâng cao khả năng hiểu văn bản, bạn nên sử dụng các biểu tượng tab.

Ví dụ tất cả những dòng sau đây hợp lệ trong ngôn ngữ MQL4:




Nhưng như bạn thấy, dòng đầu tiên dễ đọc và dễ hiểu hơn. Song chú ý trường hợp ngoại lệ:

(1) Không thể sử dụng dòng mới trong phần “biên dịch điều khiển”

Bạn sẽ biết nhiều hơn về “biên dịch điều khiển” trong bài học kế tiếp nhưng chỉ nhớ đây là một ngoại lệ.

Ví dụ dòng kế tiếp trong mã sau đây là không hợp lệ và trình biên dịch sẽ báo lỗi:

#property
copyright "Copyright © 2004, MetaQuotes Software Corp."

Đây là “biên dịch điều khiển” hợp lệ:

#property copyright "Copyright © 2004, MetaQuotes Software Corp."

(2) Không thể sử dụng dòng hoặc khoảng trắng mới ở giữa các giá trị hằng số, các từ định danh hoặc từ khóa.

Ví dụ đây là hợp lệ:

extern int MA_Period=13

Theo dòng trên thì, “extern” và “int” là các từ khóa, “MA_Period” là từ định danh và “13” là giá trị hằng số. Bạn sẽ biết thêm về chúng trong những bài học tiếp theo.

Ví dụ những dòng sau đây là không hợp lệ:

extern int MA_Period=1
3;

Hoặc

extern int MA_Period=1 3;

(Chú ý khoảng tab giữa 1 và 3)

Hoặc

ex
tern int MA_Period=13;

2. Chú giải

Để làm cho ngôn ngữ lập trình dễ sử dụng hơn, bất kỳ ngôn ngữ lập trình nào cũng có hiểu viết chú giải của nó.

Bạn sử dụng các chủ giải để viết các dòng mã mà trình biên dịch sẽ bỏ qua nhưng nó làm cho mã của bạn rõ ràng và dễ hiểu. Giả sử bạn viết một chương trình vào mùa hè và vào mùa đông bạn muốn đọc nó. Nếu không có các chú giải, thậm chí bạn là người tạo ra mã, thì bạn không thể hiểu tất cả những dòng khó hiểu đó.

Ngôn ngữ MQL4 (và C/C++) sử dụng 2 kiểu chú giải:

(1) Chú giải dòng đơn

Chú giải dòng đơn bắt đầu bằng biểu tượng //, kết thúc bằng một dòng mới và có thể được lồng nhau vào các chú giải nhiều dòng.

Ví dụ:

//Đây là một chú giải
extern int MA_Period=13;

extern int MA_Period=13;//Đây là một chú giải khác

(2) Chú giải nhiều dòng

Chú giải nhiều dòng bắt đầu bằng biểu tượng /* và kết thúc bằng biểu tượng */. Những chú giải như thế không thể được lồng vào nhau. Và bạn có thể chú giải nhiều hơn một dòng bằng cách đặt dấu /* ở đầu dòng đầu tiên, và dấu */ ở cuối dòng cuối cùng.

Ví dụ:

/*đây

chú giải
nhiều
dòng*/

Bạn có thể lồng các chú giải dòng đơn vào trong chú giải nhiều dòng như thế này:

/*đây

chú giải //một chú giải khác được lồng ở đây
nhiều
dòng*/

Đây là một chú giải hợp lệ:

extern int /*HELLO! I’m a comment*/ MA_Period=13;

Nhưng đây là chú giải không hợp lệ:

extern int //test MA_Period=13;

Các chú giải được phép sử dụng ở nơi có các khoảng trống và chấp nhận các khoảng trống.

Ví dụ:



3. Định danh

Các từ định danh được sử dụng làm tên của các biến, hàm và kiểu dữ liệu.

Ví dụ MA_Period ở đây là từ định danh:

extern int MA_Period=13;

Có vài quy tắc và giới hạn đối với việc lựa chọn các từ định danh:

(1) Độ dài của một từ định danh không thể vượt quá 31 ký tự.

(2) Từ định danh phải bắt đầu bằng một chữ cái (chữ in hoa hoặc in thường như a đến z hoặc A đến Z được công nhận là các ký hiệu khác nhau) hoặc dấu gạch chân (_), các ký hiệu có thể sử dụng là các số từ 0 đến 9 nhưng ký hiệu đầu tiên không thể là một con số.

(3) Từ định danh không trùng với bất kỳ từ biệt ngữ nào (bạn sẽ thấy danh mục các biệt ngữ ở phần kế tiếp).

(4) Từ định danh có phân biệt chữ hoa / chữ thường. Vì vậy MA_PERIOD không giống ma_period hay MA_Period

Ví dụ:



4. Biệt ngữ:

Có những từ mà ngôn ngữ sử dụng chúng vì những mục đích đặc biệt. Vì thế chúng được dành riêng cho việc sử dụng riêng biệt trong ngôn ngữ và bạn không thể sử dụng chúng làm tên từ định danh hay vì mục đích khác.

Các từ được liệt kê dưới đây được xem là các biệt ngữ:



Ví dụ những dòng dưới đây trong mã là không hợp lệ:

extern int datatime =13;
int extern =20;
double continue =0;

Hy vọng các bạn sẽ thích thú với bài học này. Bài kế tiếp chúng ta bàn về “kiểu dữ liệu MQL4”. Vì thế hãy sẵn sàng nhé, công việc nặng nhọc thực sự sắp đến rồi!


.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
BÀI TẬP BÀI HỌC 02



Câu 1: Cú pháp trong ngôn ngữ MQL4 là việc nghiên cứu ngữ pháp và các quy tắc viết của nó bao gồm những thành phần nào?

Câu 2: Câu nào trong những câu sau là sai, tại sao?

(1) Khi bạn viết mã, bạn có thể tự do sử dụng bất kỳ khoảng trống, tab và các dòng trống mà bạn muốn tách biệt mã và dòng mã của mình để giúp chúng có thể đọc được.

(2) Bạn có thể sử dụng biểu tượng // để chú giải nhiều dòng mà bắt đầu bằng // và kết thúc bằng //.

(3) Những từ khóa sau đây là biệt ngữ trong ngôn ngữ MQL4 mà bạn có thể sử dụng làm tên cho các từ định danh trong mã.

bool, white, Color, case, break, do, Extern

Câu 3: Cái nào trong những dòng mã sau đây là hợp lệ và không hợp lệ, tại sao?

(1)

extern int /*HELLO! I’m a comment*/ MA_Period=13;

(2)

int 3Periods;

(3)

string_MyString = “Welcome”;


(4)

double
MacdCurrent,
MacdPrevious,
SignalCurrent;

(5)

color Color= C'128,128,128' ;


ĐÁP ÁN BÀI TẬP BÀI HỌC 02



Câu 1: Cú pháp trong ngôn ngữ MQL4 là việc nghiên cứu ngữ pháp và các quy tắc viết của nó bao gồm những thành phần sau đây:

- Định dạng

- Chú giải

- Định danh

- Biệt ngữ

Câu 2:

Câu (1): Đúng

Câu (2): Sai

Biểu tượng // được sử dụng cho chú giải dòng đơn; chủ giải nhiều dòng bắt đầu bằng /* và kết thúc bằng */

Câu (3): Sai

Không phải tất cả những từ khóa ở đây đều là biệt ngữ.

bool, case và break là biệt ngữ trong khi white và do không phải là biệt ngữ.

Color không phải là biệt ngữ nhưng color là biệt ngữ.

Extern không phải là biệt ngữ nhưng extern là biệt ngữ.

Câu 3:

Mã (1) hợp lệ.

Mã (2) không họp lệ vì không thể bắt đầu tên từ định danh bằng một con số.

Các mã (3), (4) và (5) đều hợp lệ.


.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 03: Các kiểu dữ liệu MQL4


1. Kiểu dữ liệu là gì?

Bất kỳ ngôn ngữ lập trình nào cũng có một bộ tên các đại diện ghi nhớ dữ liệu. Chẳng hạn nếu bộ nhớ chứa các con số giữa -2147483648 đến 2147483647 thì phần lớn các ngôn ngữ lập trình sẽ đặt tên dữ liệu này là kiểu dữ liệu “số nguyên”.

2. Biến là gì?


Biến là tên ám chỉ các phần của bộ nhớ ở đó dữ liệu được lưu trữ. Để dễ hình dung hơn, thử tưởng tượng bộ nhớ là một chuỗi các ô khác nhau thì ô là khu vực lưu trữ bộ nhớ bằng đơn vị byte.

* Để sử dụng mô ô lưu trữ dữ liệu, ô phải được đặt tên; quá trình này được gọi là khai báo biến.

* Trong quá trình khai báo biến, bạn sử dụng một từ để báo cho máy tính biết kiểu và phạm vi của ô mà bạn muốn sử dụng, từ này gọi là từ khóa.

* Sẽ có ích nếu bạn đặt cho ô một tên có ý nghĩa liên quan đến kiểu thông tin giúp cho việc tìm kiếm dữ liệu dễ dàng hơn, tên này gọi là biến hằng số.

* Dữ liệu được đặt trong một ô bằng cách gán dữ liệu cho ô đó.

* Khi chúng ta đặt giá trị của ô mà mình đã tạo ra ở cùng dòng khai báo biến thì quá trình này gọi là khởi tạo.

Khi chúng ta tạo một biến thì chúng ta sẽ báo cho máy tính biết rằng chúng ta muốn nó gán một dung lượng bộ nhớ riêng biệt (theo đơn vị byte) cho biến của chúng ta, vì lưu trữ một con số đơn lẻ, một ký tự hoặc một số lớn sẽ không chiếm cùng không gian trong bộ nhớ, do đó máy tính sẽ hỏi về kiểu dữ liệu nào và dung lượng dữ liệu bao nhiêu. Kiểu dữ liệu là nhằm điều đó.

Chẳng hạn nếu chúng ta báo dòng mã sau đây cho máy tính:

int MyVariable=0;

Thì đó nghĩa là chúng ta đang yêu cầu máy tính đặt một ô có dung lượng 4 byte cho biến của chúng ta có tên “MyVariable’.

Trong ví dụ này chúng ta đã sử dụng:

int là từ khóa
int là kiểu dữ liệu số nguyên
int là khai báo biến
Myvariable là hằng số của biến
=0 là khởi tạo biến

Chúng ta sẽ biết nhiều hơn về biến trong những bài học tiếp theo.

Trong ngôn ngữ MQL4 có các kiểu dữ liệu sau đây:

- Kiểu dữ liệu số nguyên (int)
- Kiểu dữ liệu luận lý (bool)
- Kiểu dữ liệu ký tự (char)
- Kiểu dữ liệu chuỗi (string)
- Kiểu dữ liệu dấu chấm động (double)
- Kiểu dữ liệu màu sắc (color)
- Kiểu dữ liệu thời gian (datetime)

3. Kiểu dữ liệu số nguyên

Số nguyên là số có thể bắt đầu bằng dấu một dấu + hoặc một dấu - và gồm các con số. Giá trị số nguyên nằm trong phạm vi giữa -2147483648 đến 2147483647.

Ngôn ngữ MQL4 thể hiện số nguyên dưới dạng thập phân hoặc thập lục phân.

Ví dụ:

12, 3, 2134, 0, -230
0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7

Chúng ta sử dụng từ khóa int để tạo một biến số nguyên.

Ví dụ:

int intInteger = 0;
int intAnotherInteger = -100;
int intHexInteger = 0x12;

Ký hiệu thập phân là cách viết các số theo hệ đếm cơ số 10 sử dụng 10 số (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) để chỉ số lượng. Những con số này thường được sử dụng với một dấu thập phân (ví dụ dấu phẩy) để chỉ bắt đầu một phân số và bắt đầu bằng dấu + hoặc dấu – để biểu đạt số dương và số âm.

Ví dụ:

12, 111, -956, 1007

Thập lục phân là hệ đếm cơ số 16 gồm 16 ký tự gồm các số từ 0 đến 9, các chữ cái từ a đến f hoặc từ A đến F đại diện cho các giá trị từ 10 đến 15; chúng bắt đầu với 0x hoặc 0X.

Ví dụ, số thập phân 79, với biểu thị nhị phân là 01001111, có thể được viết thành 4F trong hệ thập lục phân (4 = 0100, F = 1111).

Ví dụ các số thập lục phân: 0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7

4. Kiểu dữ liệu luận lý

Biến luận lý là một kiểu dữ liệu có thể chỉ giữ hai giá trị: giá trị true (thực) hoặc false (giả) hoặc biểu thị số của chúng là 1 hoặc 0 tương ứng. Và nó chiếm 1 bit trong bộ nhớ. Trong ngôn ngữ MQL4, true, True hoặc TRUE, false, False hoặc FALSE là tương đương nhau.

Chúng ta sử dụng từ khóa bool để tạo một biến luận lý (từ bool viết tắt của boolean để tưởng nhớ nhà toán học vĩ đại Boole George).

Ví dụ:


bool a = true;
bool b = false;
bool c = 1;
bool 1 = true;
bool bFlag = 1;
bool bBool = FALSE;
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
6. Kiểu dữ liệu chuỗi

Kiểu dữ liệu chuỗi là một mảng các ký tự được kèm trong dấu nháy kép (").

Mảng các ký tự là mảng gắn kết các ký tự nối tiếp nhau, bắt đầu bằng chỉ số 0. Sau ký tự cuối cùng của dữ liệu, một ký tự rỗng (NULL) được đặt tại vị trí mảng kế tiếp.

Một ký tự NULL là ký tự đặc biệt (được biểu thị bằng mã ASCII là 0) được sử dụng để đánh dấu sự kết thúc của kiểu dữ liệu chuỗi này.

Sau đây là ví dụ đơn giản về hằng số chuỗi "hello" trong mảng ký tự.

Ngôn ngữ MQL4 giới hạn phạm vi biến chuỗi đến 225 ký tự và bất kỳ ký tự nào vượt trên 255 ký tự sẽ báo lỗi này: chuỗi quá dài (tối đa 255 ký tự) [too long string (255 characters maximum).

Bạn có thể sử dụng bất kỳ ký tự đặc biệt nào - đã đề cập ở phần trước - trong hằng số chuỗi bằng cách đặt trước nó bằng dấu xuyệt ngược (\).

Chúng ta có thể sử dụng từ khóa string để tạo biến chuỗi.

Ví dụ:

string str1 = "Hello world1, with you coders guru";
string str2 = "Copyright © 2005,\ "Sanvangonline Forum\ ". "; //Chú ý cách sử dụng ký tự (").
string str3 = "1234567890";



7. Kiểu dữ liệu dấu chấm động


Số dấu chấm động là số thực (tức là số có thể chứa phần phân số bên cạnh phần nguyên được phân cách bằng dấu chấm (.).

Ví dụ: 3.0, -115.5, 15, 0.0001

Giá trị dao động của số dấu chấm động là giữa 2.2e-308 đến 1.8e+308.

Chúng ta sử dụng từ khóa double để tạo biến dấu chấm động.

Ví dụ:

double dblNumber1 = 1000000000000000;

double dblNumber2 = 1/4;

double dblNumber3 = 5.75;



8. Kiểu dữ liệu màu sắc


Kiểu dữ liệu màu sắc là kiểu dữ liệu đặc biệt của ngôn ngữ MQL4 chỉ định màu sắc xuất hiện trên biểu đồ phần mềm MetaTrader khi bạn tạo Hệ thống cố vấn (EA) hoặc chỉ báo tùy chỉnh và người dùng có thể thay đổi nó từ tab thuộc tính (properties) trên EA hay chỉ báo tùy chỉnh.

Bạn có thể tạo hằng số biến màu sắc theo 3 cách:

(1) Theo tên màu sắc: Đối với các màu sắc phổ biến (được gọi là bộ màu web) bạn có thể chỉ định tên màu sắc cho biến màu sắc (xem danh mục bộ màu web).



(2) Theo đại diện ký tự (ngôn ngữ MQL4 đặt tên này): Theo phương pháp này, bạn có thể dùng từ khóa C theo sau bằng 2 dấu nháy đơn ('). Giữa 2 dấu nháy đơn bạn có thể đặt giá trị màu đỏ (red), màu xanh lục (green) và màu xanh dương (blue), được gọi là giá trị RGB của màu. Các giá trị tỷ số của một thành phần màu sắc nằm trong phạm vi từ 0 đến 255. Và bạn có thể viết những giá trị này dưới dạng thập phân hoặc thập lục phân.

(3) Theo giá trị nguyên: Mỗi màu sắc trong bộ màu web có giá trị nguyên của nó mà bạn có thể viết dưới dạng thập phân hoặc thập lục phân. Và bạn có thể chỉ định giá trị nguyên của màu cho biến màu sắc. Dạng màu thập lục phân trông giống thế này 0xBBGGRR trong đó RR là giá trị màu màu đỏ, GG là giá trị màu xanh lục, và BB là giá trị màu xanh dương.

Ví dụ:



Chúng ta dùng từ khóa color để tạo biến màu sắc.

Ví dụ:

color clr1 = Red;

color clr1 = C'128,128,128';

color clr1 = 32768;
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
9. Kiểu dữ liệu thời gian:

Kiểu dữ liệu thời gian là kiểu dữ liệu đặc biệt trong ngôn ngữ MQL4, có thể được biểu thị dưới dạng một dòng ngang bao gồm 6 phần chỉ giá trị năm (year), tháng (month), ngày (date), giờ (hours), phút (minutes) và giây (seconds). Bạn đặt biến thời gian bằng cách sử dụng từ khóa D theo sau bằng 2 dấu nháy đơn ('). Giữa 2 dấu nháy đơn bạn viết một dòng ký tự bao gồm 6 phần giá trị nói trên. Hằng số thời gian có thể thay đổi từ ngày 01 tháng 01 năm 1970 đến ngày 31 tháng 12 năm 2037.


Ví dụ:




Chúng ta sử dụng từ khóa datetime để tạo biến thời gian.

Ví dụ:


datetime dtMyBirthDay= D'1972.10.19 12:00:00'
datetime dt1= D'2005.10.22 04:30:00'

Ở bài học kế tiếp chúng ta sẽ bàn về “Phép toán và biểu thức”.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 04: Phép toán và biểu thức

1. Phép toán và biểu thức là gì?


Chúng ta biết rõ các phép toán. Nếu bảo rằng cộng trừ nhân chia (+, -, *, /) là các phép toán số học cơ bản thì bạn sẽ nhớ rất nhanh phép toán có nghĩa là gì.

Một số ký tự và chuỗi ký tự có tầm quan trọng đặc biệt. Chúng được gọi là dấu phép toán,
Ví dụ:

+ - * / % các dấu phép toán số học
&& || các dấu phép toán logic
= += *= các dấu phép toán gán.

Các dấu phép toán được sử dụng trong các biểu thức và có nghĩa khi sử dụng tương thích với các toán hạng.

Các dấu chấm câu cũng được chú trọng. Chúng là dấu ngoặc đơn, dấu ngoặc vuông, dấu phẩy, dấm hai chấm, và dấu chấm phẩy.

Các dấu phép toán, các dấu chấm câu, các khoảng trống được sử dụng để phân biệt các thành phần ngôn ngữ với nhau.

Từ định danh (bạn còn nhớ chứ, nếu không, hãy xem lại bài cú pháp) cùng với phép toán tạo ra các biểu thức. Hãy xem ví dụ dưới đây:

x = (y*z)/w;

x, y, z và w là từ định danh
=, * và / là toán tử
Cả dòng trên là biểu thức

Khi các biểu thức kết hợp với nhau thì tạo thành khai báo. Và khi các khai báo kết hợp với nhau thì tạo thành hàm và khi các hàm kết hợp với nhau thì tạo ra chương trình.

Trong phần còn lại của bài học này, chúng ta sẽ bàn về các loại toán tử.



2. Toán tử số học

Trong ngôn ngữ MQL4 có 9 phép toán số học. Dưới đây là danh mục các phép toán số học và cách sử dụng chúng:



Một số ví dụ về toán từ lấy phần dư:

10%5 = 0
>> Nếu chia 10 cho 5 sẽ được 2 và không có giá trị dư, vì thế số dư là 0.

10%8 = 2
>> Nếu chia 10 cho 8 sẽ được 1 (1*8 = 8) vì thế số dư là (10 – 8) 2.

100%15 = 0


>> Nếu chia 100 cho 15 sẽ được 6 (6*15 = 90) vì thế số dư là (100 – 90) 10.

Thế còn 6%8 thì sao?

>> Kết quả là 6 bởi vì nếu chia 6 cho 8 sẽ được 0 (8*0 = 0) vậy số dư là (6 – 0) 6.

Chú ý bạn không thể kết hợp toán tử tăng và toán tử giảm với các biểu thức khác. Ví dụ bạn không thể khai báo:
A = (B++)*5;


Nhưng bạn có thể viết nó lại như thế này:

A++;
B=A*5;

Hai dòng trên có thể giải thích như sau:

int A=1; //đặt A bằng 1
int B;
A++; // tăng A thêm 1, bây giờ A=2
B=A*5; //tức là B=2*5
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
3. Toán tử so sánh

Toán tử so sánh dùng để so sánh 2 giá trị (toán hạng) và trả lại kết quả đúng hay sai phụ thuộc vào kết quả so sánh. Nó giống như câu hỏi “Có phải John cao hơn Alfred? – Đúng / Không đúng?”

Kết quả sẽ chỉ sai nếu biểu thức cho kết quả số 0 và đúng nếu biểu thức cho kết quả là số bất kỳ khác số 0.

Ví dụ:





Trong ngôn ngữ MQL4 có 6 toán tử so sánh. Dưới đây là danh mục các toán tử so sánh và cách sử dụng của chúng:




4. Toán tử luận lý

Toán tử luận lý nói chung bắt nguồn từ đại số Boolean, là một phương pháp toán gán các giá trị đúng của các khái niệm theo một cách trừu tượng mà không đã động đến các khái niệm thực sự có nghĩa như thế nào. Giá trị đúng của một khái niệm trong giá trị Boolean có thể chỉ có một trong hai giá trị khả thi: đúng hoặc sai.

Dưới đây là danh mục các toán tử luận lý và cách sử dụng của chúng:


 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
5. Toán tử thao tác bit

Toán tử thao tác bit tương tự như toán tử luận lý, ngoại trừ chúng ở phạm vi nhỏ hơn – phép biểu diễn số liệu nhị phân.

Sau đây là danh mục toán tử thao tác bit và cách sử dụng của chúng trong ngôn ngữ MQL4:



* Chú ý: Cả hai toán hạng liên quan đến toán tử thao tác bít phải là số nguyên.

6. Các toán tử khác

Còn vài toán tử được sử dụng trong ngôn ngữ MQL4 và không thuộc về một trong những loại toán tử nêu ở trên, đó là:
(1) Toán tử truy cập mảng: []
(2) Toán tử gọi hàm: ()
(3) Toán tử phân cách: ,

Chúng ta sẽ biết nhiều hơn về mảng và hàm ở những bài học tiếp theo, ở đây chỉ cần biết khái quát tên gọi các toán tử như thế thôi nhé.

 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Độ ưu tiên của toán tử

Nếu bạn không cố ý xác định trật tự ở đó bạn muốn các phép toán trong một biểu thức phức hợp được biểu hiện thì trật tự được quyết định bởi độ ưu tiên được gán cho các toán tử được sử dụng trong biểu thức. Các toán tử có độ ưu tiên cao hơn được đánh giá trước tiên. Ví dụ, toán tử chia có độ ưu tiên cao hơn toán tử cộng. Vì thế hai khai báo sau đây là tương đương:

x + y / 100
x + (y / 100) //rõ ràng, được khuyến khích dùng

Khi viết các biểu thức phức hợp, nên đặt các toán tử được đánh giá trước trong dấu ngoặc đơn () để giúp cho mã dễ đọc hơn.

Bảng sau đây cho thấy độ ưu tiên được gán cho các toán tử trong ngôn ngữ MQL4. Các toán tử trong bảng này được liệt kê theo thứ tự ưu tiên. Toán tử ở vị trí càng cao trong bảng thì độ ưu tiên của nó càng cao. Các toán tử có độ ưu tiên cao hơn được đánh giá trước các toán tử có độ ưu tiên tương đối thấp hơn. Các toán tử cùng nhóm có độ ưu tiên tương đương nhau. Khi các toán tử có độ ưu tiên bằng nhau xuất hiện trong cùng biểu thức thì một quy tắc chi phối đó là cái nào được đánh giá trước. Tất cả các toán tử nhị phân trừ toán tử gán đều được đánh giá từ trái sang phải. Các toán tử gán được đánh giá từ phải sang trái.



 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 05: Vòng lặp và quyết định

Việc kiểm soát luồng dữ liệu thông thường của chương trình bạn viết trong ngôn ngữ MQL4 (và trong nhiều ngôn ngữ khác) thực hiện từ trên xuống dưới, lần lượt từng khai báo.

Một khai báo là một dòng mã báo cho máy tính biết việc phải làm. Ví dụ:

Print("Hello Word");
return 0;

Dấu chấm phẩy ( ; ) ở cuối khai báo là một phần quan trọng của cú pháp nhưng thường dễ quên, và điều đó dẫn đến 90% lỗi xuất hiện trong mã.


Nhưng việc thực thi mã từ trên xuống dưới không phải là trường hợp duy nhất và nó có hai ngoại lệ, đó là vòng lặp và quyết định.

Các chương trình bạn viết giống như con người quyết định điều phải làm khi phản ứng với những tình huống thay đổi. Trong những trường hợp này, luồng kiểm soát dữ liệu nhảy từ phần này sang phần khác của chương trình. Các khai báo gây ra điều đó được gọi là khai báo kiểm soát. Các khai báo kiểm soát bao gồm vòng lặp và quyết định.
Vòng lặp

Vòng lặp khiến cho một bộ phận của chương trình được lặp lại trong một khoảng thời gian nào đó. Và việc lặp lại này tiếp tục trong khi một điều kiện nào đó đúng và kết thúc khi nó trở thành sai. Khi vòng lặp kết thúc nó vượt qua khai báo kiểm soát để đến khai báo kế tiếp sau phần vòng lặp.

Trong ngôn ngữ MQL4 có hai kiểu vòng lặp:

(1) Vòng lặp for

Vòng lặp for được xem là vòng lặp dễ nhất vì tất cả các thành phần kiểm soát của nó được tập trung ở một vị trí. Vòng lặp for thực thi một phần mã trong một khoảng thời gian cố định.


Ví dụ:

int j;
for(j=0;j<15;j++)
Print(j);


Đoạn mã này hoạt động như thế nào?

Khai báo for bao gồm từ khóa for, theo sau là dấu ngoặc đơn chứa ba biểu thức cách nhau bằng dấu chấm phẩy:


for(j=0;j<15;j++)

Ba biểu thức này gồm biểu thức khởi tạo, biểu thức thử nghiệm và biểu thức tăng:

j=0  biểu thức khởi tạo
j<15  biểu thức thử nghiệm
j++  biểu thức tăng


Phần thân của vòng lặp là mã được thực thi với số vòng lặp cố định:

Print(j);

Cái này thực thi phần thân của vòng lặp trong ví dụ trong 15 lần.


Chú ý khai báo for không theo sau bởi dấu chấm phẩy. Đó là do khai báo for và phần thân vòng lặp cùng được xem là khai báo chương trình.



 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Biểu thức khởi tạo

Biểu thức khởi tạo được thực thi chỉ một lần, khi vòng lặp lần đầu tiên khởi tạo. Và mục đích của nó là cho biến vòng lặp một giá trị khởi đầu (là 0 ở ví dụ trong bài).

Bạn có thể khai báo biến vòng lặp bên ngoài (trước) vòng lặp như ví dụ:

int j;

Hoặc có thể tạo khai báo bên trong hai dấu ngoặc của vòng lặp như thế này:

for(int j=0;j<15;j++)

Hai dòng trước của mã tương đương nhau, ngoại trừ phạm vi của mỗi biến (bạn sẽ biết thêm về khai báo biến và phạm vi của biến trong bài học về biến).

Phương pháp khai báo bên ngoài giúp mỗi dòng trong mã được liên kết để biết về biến, trong khi khai báo bên trong chỉ giúp mỗi vòng lặp for để biết về biến.

Bạn có thể sử dụng nhiều hơn một biểu thức khởi tạo trong vòng lặp for bằng cách phân cách chúng bằng dấu phẩy (,) như thế này:

int i;
int j;
for(i=0, j=0;i<15;i++)
Print(i);


Biểu thức thử nghiệm

Biểu thức thử nghiệm luôn là biểu thức so sánh sử dụng các toán tử so sánh (xem lại phần các toán tử so sánh ở bài học trước).
Biểu thức thử nghiệm được đánh giá bởi vòng lặp mỗi khi vòng lặp thực thi để quyết định xem vòng lặp sẽ tiếp tục hay dừng lại.

Nó sẽ tiếp tục nếu kết quả của biểu thức là đúng và nó sẽ dừng nếu kết quả là sai.

Trong ví dụ ở trên, phần thân của vòng lặp sẽ tiếp tục in i (Print(i)) trong khi trường hợp j<15 là đúng. Ví dụ j = 0,1,2,3,4,5,6,7,8,9,10,11,12,13 và 14. Và khi j đạt 15 thì vòng lặp sẽ dừng và vòng điều khiển chuyển đến khai báo sau vòng lặp.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Biểu thức tăng

Biểu thức tăng thay đổi giá trị của biến vòng lặp (j theo ví dụ ở đây) bằng cách tăng giá trị của no thêm 1. Nó thực thi khi bước cuối cùng trong các bước vòng lặp, sau khi khởi tạo biến vòng lặp, thử nghiệm biểu thức thử nghiệm và thực thi phần thân của vòng lặp.

Hình dưới đây minh họa biểu đồ dòng của vòng lặp for:



Giống như biểu thức khởi tạo, trong biểu thức tăng, có thể sử dụng nhiều hơn một biểu thức tăng trong vòng lặp for bằng cách phân cách chúng bằng dấu phẩy (,) như thế này:

int i;
int j;
for(i=0,j=0;i<15,i<;i++,j++)
Print(i);

Nhưng chỉ có thể sử dụng một biểu thức thử nghiệm.

Cần chú ý thêm về biểu thức tăng, đó là không chỉ có thể tăng biến vòng lặp mà còn có thể thực hiện nó giống như giảm biến vòng lặp như thế này:

int i;
for(i=15;i>0,i<;i--)
Print(i);

Ví dụ trên sẽ khởi tạo i đến 15 và bắt đầu vòng lặp, mỗi lần nó giảm 1 từ i và kiểm tra biểu thức thử nghiệm (i>0). Chương trình sẽ tạo ra kết quả nay: 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Nhiều khai báo trong thân vòng lặp

Ở ví dụ trên đây sử dụng chỉ một khai báo trong thân vòng lặp, nhưng không phải lúc nào cũng vậy. Chúng ta có thể sử dụng nhiều khai báo trong thân vòng lặp được giới hạn bằng các dấu ngoặc móc như thế này:

for(int i=1;i<=15;i++)
{
Print(i);
PlaySound("alert.wav");
}

Trong ví dụ trên, thân vòng lặp chứa hai khai báo, chương trình sẽ thực thi khai báo thứ nhất rồi đến khai báo thứ hai mỗi khi vòng lặp thực thi. Đừng quên đặt một dấu chấm phẩy ( ; ) ở cuối mỗi khai báo.

Khai báo break

Khi từ khóa break xuất hiện trong vòng lặp for (và cũng trong vòng lặp while và khai báo switch) việc thực thi vòng lặp sẽ kết thúc và lệnh điều khiển chuyển đến khai báo theo sau là phần vòng lặp.

Ví dụ:

for(int i=0;i<15;i++)
{
if(i==10)
break
Print(i);
}

Ví dụ trên sẽ thực thi vòng lặp cho đến khi i chạm 10, trong trường hợp đó từ khóa break sẽ kết thúc vòng lặp. Mã này sẽ tạo ra các giá trị: 0,1,2,3,4,5,6,7,8,9.

Khai báo continue

Khai báo break giúp kết thúc vòng lặp, trong khi khai báo continue giúp chuyển về đầu vòng lặp (các dấu ngoặc đơn).

Ví dụ:

for(int i=0;i<15;i++)
{
if(i==10)
continue;
Print(i)
}

Ví dụ trên sẽ thực thi vòng lặp cho đến khi i chạm 10, trong trường hợp đó từ khóa continue sẽ đưa vòng lặp trở về đầu của vòng lặp mà không in i lần thứ 10.

Chú ý:

Có thể lượt bỏ một phần hoặc tất cả các biểu thức trong vòng lặp for nếu muốn, ví dụ:



Vòng lặp này giống như vòng lặp while có biểu thức thử nghiệm luôn trả về true.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Vòng lặp while

Vòng lặp while thường được dùng khi bạn biết vòng lặp sẽ được thực thi bao nhiều lần. Điều gì sẽ xảy ra nếu bạn không biết bạn muốn thực thi vòng lặp bao nhiêu lần?

Vòng lặp while giống như vòng lặp for cũng có biểu thức thử nghiệm. Nhưng nó không có biểu thức khởi tạo hay biểu thức tăng.

Ví dụ:

int i=0;
while(i<15)
{
Print(i);
i++;
}

Ở ví dụ trên cần chú ý:

* Biến vòng lặp khai báo và khởi tạo trước vòng lặp, bạn không thể khai báo hoặc khởi tạo nó bên trong các dấu ngoặc đơn của vòng lặp while giống như ở vòng lặp for.

* Khai báo i++ ở đây không phải là biểu thức tăng mà thân vòng lặp phải chứa khai báo làm thay đổi biến vòng lặp, nếu không thì vòng lặp sẽ không bao giờ kết thúc.

Ví dụ trên đây hoạt động ra sao?

Khai báo while chỉ chứa biểu thức thử nghiệm, và nó sẽ kiểm tra trong mỗi vòng lặp, nếu khai báo đúng thì vòng lặp sẽ tiếp tục, nếu sai thì vòng lặp sẽ kết thúc và lệnh điều khiển chuyển đến khai báo sau phần vòng lặp.

Ở ví dụ trên, vòng lặp sẽ thực thi cho đến khi i chạm 16 và trong trường hợp này i<15=false và vòng lặp kết thúc.

Dưới đây là biểu đồ hoạt động của vòng lặp while:



Vòng lặp while cũng có những điểm giống với vòng lặp for như:

* Có thể sử dụng khai báo break và khai báo continue

* Có thể sử dụng khai báo đơn hoặc nhiều khai báo trong thân vòng lặp, trong trường hợp sử dụng nhiều khai báo thì phải giới hạn chúng bằng các dấu ngoặc móc

* Có thể lược bỏ các biểu thức trong vòng lặp, ví dụ:



while(true)
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Bài 06: Vòng lặp và quyết định (Phần 2)

Trong bài học trước, chúng ta bàn về vòng lặp. Và chúng ta đã biết rằng vòng lặp là một trong hai cách mà chúng ta sử dụng để thay đổi dòng chuyển thông thường của việc thực thi chương trình từ đỉnh xuống đáy. Cách thứ hai là quyết định.

Quyết định trong một chương trình tạo ra bước nhảy một lần đến phần khác của chương trình, tùy thuộc vào giá trị của biểu thức. Dưới đây là những kiểu khai báo quyết định trong ngôn ngữ MQL4.

Khai báo if

Khai báo if là khai báo quyết định đơn giảm nhất, ví dụ:

if( x < 100)
Print("hi");

Ở đây từ khóa if được theo sau bởi các dấu ngoặc đơn, bên trong các dấu ngoặc đơn là biểu thức thử nghiệm ( x < 100), khi kết quả biểu thức là đúng thì phần thân của khai báo if sẽ thực thi (Print("hi")
và nếu nó sai thì lệnh điều khiến chuyển đến khai báo theo sau khối if.

Dưới đây là biểu đồ hoạt động của khai báo if:



Nhiều khai báo trong thân lệnh if

Giống như vòng lặp, thân lệnh if có thể chứa nhiều hơn một khai báo được giới hạn bởi các dấu ngoặc móc.

Ví dụ:

if(current_price==stop_loss)
{
Print("you have to close the order");
PlaySound("warning.wav");
}

Chú ý biểu tượng == trong biểu thức thử nghiệm; nó là một trong những toán tử so sánh đã được giới thiệu trong bài học số 04 (Toán tử và biểu thức). Nếu bạn quên và sử dụng toán tử gán = thì mã sẽ tạo ra nhiều lỗi.

Chú ý:

Các cấu trúc vòng lặp và quyết định có thể được lòng vào nhau, có thể lồng khai báo if vào trong vòng lặp, lồng vòng lặp bên trong khai báo if, lồng khai báo if bên trong khai báo if...

Ví dụ:

for(int i=2 ; i<10 ; i++)
if(i%2==2)
{
Print("It's not a prime number")
PlaySound("warning.wav");
}

Chú ý: Bạn sẽ thấy rằng có hai dấu ngoặc móc quanh thân vòng lặp bởi vì khai báo if và khai báo bên trong thân của nó chỉ được xem là một khai báo đơn lẻ.
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Khai báo if ... else

Khai báo if cho phép bạn thực hiện một điều gì đó nếu một điều kiện đúng. Giả sử chúng ta muốn thực hiện một điều khác nếu điều kiện đó sai thì chúng ta phải sử dụng khai báo if... else.

Ví dụ:

if(current_price>stop_loss)
Print("It's too late to stop, please stop!");
else
Print("you are playing well today!");

Nếu biểu thức thử nghiệm trong khai báo if là đúng thì chương trình cho một thông báo, nếu sai thì nó in ra thông báo khác.

Dưới đây là biểu đồ hoạt động của khai báo if...else.



Các khai báo if...else lồng nhau

Bạn có thể lồng khai báo if...else vào khai báo if, lồng khai báo if...else vào khai báo if...else, v.v..

Ví dụ:

if(current_price>stop_loss)
Print("It's too late to stop, please stop!");
if(current_price==stop_loss)
Print("It's time to stop!");
else
Print("you are playing well today!");

Có một vấn đề trong việc lồng các khai báo if...else với nhau, bạn có thể vô tình gắn một phần else với phần if sai. Để giải quyết trường hợp này có thể thực một trong hai điều sau đây:

(1) Bạn có thể giới hạn các cặp if...else bằng các dấu ngoặc móc như thế này:

if(current_price>stop_loss)
{
Print("It's too late to stop, please stop!");
if(current_price==stop_loss)
Print("It's time to stop!");
else
Print("you are playing well today!");
}

(2) Nếu không thực hiện giải pháp thứ nhất (trong trường hợp có nhiều khai báo if...else hoặc bạn lười không muốn làm điều đó) thì thực hiện như quy tắc sau: gắn phần else với phần if gần nhất (ở đây là dòng if(current_price==stop_loss)).
 
Chỉnh sửa cuối:

LangTu

<br><font color=blue><b>"Thiên Ngoại Hữu Thiên"</f
Khai báo switch

Nếu có một cây quyết định lớn và tất cả các quyết định phụ thuộc vào giá trị của cùng biến thì bạn có thể sử dụng khai báo switch ở đây.
Ví dụ:

switch(x)
{
case 'A ':
Print("CASE A");
break;
case 'B':
case 'C':
Print("CASE B or C");
break;
default:
Print("NOT A, B or C");
break;
}

Theo ví dụ trên, từ khóa switch theo sau bởi các dấu ngoặc đơn, bên trong các dấu ngoặc đnn là hằng số switch, hằng số này có thể là hằng số nguyên, hằng số ký tự hoặc biểu thức hằng số. Biểu thức hằng số không bao gồm cả biến, ví dụ:

case X + Y: là một hằng số switch không hợp lý.

Cách thức hoạt động của ví dụ ở trên như sau:

Khai báo switch gán hằng số x với một trong những hằng số tình huống.

Nếu x== 'A' thì chương trình sẽ in "CASE A" và khai báo break sẽ điều khiển thoát khỏi khai báo switch.

Nếu x== 'B' hoặc x== 'C' thì chương trình sẽ in "CASE B or C" do không có khai báo break sau case 'B'.

Nếu x!= bất kỳ hằng số case nào thì khai báo switch sẽ thực thi case mặc định và in "NOT A, B or C".
 
Chỉnh sửa cuối:
Top